diff --git a/internal/resources/grafana/resource_alerting_mute_timing.go b/internal/resources/grafana/resource_alerting_mute_timing.go index 773bd014f..994d74a9b 100644 --- a/internal/resources/grafana/resource_alerting_mute_timing.go +++ b/internal/resources/grafana/resource_alerting_mute_timing.go @@ -252,6 +252,34 @@ func deleteMuteTiming(ctx context.Context, data *schema.ResourceData, meta inter } } + // Remove the mute timing from alert rules + ruleResp, err := client.Provisioning.GetAlertRules() + if err != nil { + return diag.FromErr(err) + } + rules := ruleResp.Payload + for _, rule := range rules { + if rule.NotificationSettings == nil { + continue + } + + var muteTimeIntervals []string + for _, m := range rule.NotificationSettings.MuteTimeIntervals { + if m != name { + muteTimeIntervals = append(muteTimeIntervals, m) + } + } + if len(muteTimeIntervals) != len(rule.NotificationSettings.MuteTimeIntervals) { + rule.NotificationSettings.MuteTimeIntervals = muteTimeIntervals + params := provisioning.NewPutAlertRuleParams().WithBody(rule).WithUID(rule.UID) + _, err = client.Provisioning.PutAlertRule(params) + if err != nil { + return diag.FromErr(err) + } + } + } + + // Delete the mute timing params := provisioning.NewDeleteMuteTimingParams().WithName(name) _, err = client.Provisioning.DeleteMuteTiming(params) diag, _ := common.CheckReadError("mute timing", data, err) diff --git a/internal/resources/grafana/resource_alerting_mute_timing_test.go b/internal/resources/grafana/resource_alerting_mute_timing_test.go index 4a396bf1a..c8bfb3db7 100644 --- a/internal/resources/grafana/resource_alerting_mute_timing_test.go +++ b/internal/resources/grafana/resource_alerting_mute_timing_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/grafana/grafana-openapi-client-go/models" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/grafana/terraform-provider-grafana/v3/internal/testutils" @@ -143,7 +144,7 @@ func TestAccMuteTiming_RemoveInUse(t *testing.T) { contact_point = grafana_contact_point.default_policy.name } } - + resource "grafana_mute_timing" "test" { count = local.use_mute ? 1 : 0 org_id = grafana_organization.my_org.id @@ -164,3 +165,77 @@ func TestAccMuteTiming_RemoveInUse(t *testing.T) { }, }) } + +func TestAccMuteTiming_RemoveInUseInAlertRule(t *testing.T) { + testutils.CheckCloudInstanceTestsEnabled(t) // TODO: Switch to OSS when this is released: https://github.com/grafana/grafana/pull/90500 + + randomStr := acctest.RandString(6) + + config := func(mute bool) string { + return fmt.Sprintf(` + locals { + use_mute = %[2]t + } + + resource "grafana_folder" "rule_folder" { + title = "%[1]s" + } + + resource "grafana_contact_point" "default_policy" { + name = "%[1]s" + email { + addresses = ["test@example.com"] + } + } + + resource "grafana_rule_group" "this" { + name = "%[1]s" + folder_uid = grafana_folder.rule_folder.uid + interval_seconds = 60 + + rule { + name = "%[1]s" + condition = "B" + notification_settings { + contact_point = grafana_contact_point.default_policy.name + group_by = ["..."] + mute_timings = local.use_mute ? [grafana_mute_timing.test[0].name] : [] + } + data { + ref_id = "A" + query_type = "" + relative_time_range { + from = 600 + to = 0 + } + datasource_uid = "PD8C576611E62080A" + model = jsonencode({ + hide = false + intervalMs = 1000 + maxDataPoints = 43200 + refId = "A" + }) + } + } + } + + + resource "grafana_mute_timing" "test" { + count = local.use_mute ? 1 : 0 + name = "%[1]s" + intervals {} + }`, randomStr, mute) + } + + resource.ParallelTest(t, resource.TestCase{ + ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories, + Steps: []resource.TestStep{ + { + Config: config(true), + }, + { + Config: config(false), + }, + }, + }) +}