Skip to content

Commit 6d6fb31

Browse files
Fix deleting mute timings that are in use (#1608)
Closes #1601 When deleting a mute timing, the provider has to start with removing it from all notification policies where it's in-use
1 parent 0d0e1cc commit 6d6fb31

File tree

2 files changed

+105
-2
lines changed

2 files changed

+105
-2
lines changed

internal/resources/grafana/resource_alerting_mute_timing.go

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,24 @@ func createMuteTiming(ctx context.Context, data *schema.ResourceData, meta inter
198198
params.SetXDisableProvenance(&provenanceDisabled)
199199
}
200200

201-
resp, err := client.Provisioning.PostMuteTiming(params)
201+
var resp *provisioning.PostMuteTimingCreated
202+
err := retry.RetryContext(ctx, 2*time.Minute, func() *retry.RetryError {
203+
var postErr error
204+
resp, postErr = client.Provisioning.PostMuteTiming(params)
205+
if orgID > 1 && postErr != nil {
206+
if apiError, ok := postErr.(*runtime.APIError); ok && (apiError.IsCode(500) || apiError.IsCode(404)) {
207+
return retry.RetryableError(postErr)
208+
}
209+
}
210+
if postErr != nil {
211+
return retry.NonRetryableError(postErr)
212+
}
213+
return nil
214+
})
202215
if err != nil {
203216
return diag.FromErr(err)
204217
}
218+
205219
data.SetId(MakeOrgResourceID(orgID, resp.Payload.Name))
206220
return readMuteTiming(ctx, data, meta)
207221
}
@@ -231,11 +245,44 @@ func updateMuteTiming(ctx context.Context, data *schema.ResourceData, meta inter
231245
func deleteMuteTiming(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
232246
client, _, name := OAPIClientFromExistingOrgResource(meta, data.Id())
233247

234-
_, err := client.Provisioning.DeleteMuteTiming(name)
248+
// Remove the mute timing from all notification policies
249+
policyResp, err := client.Provisioning.GetPolicyTree()
250+
if err != nil {
251+
return diag.FromErr(err)
252+
}
253+
policy := policyResp.Payload
254+
modified := false
255+
policy, modified = removeMuteTimingFromRoute(name, policy)
256+
if modified {
257+
_, err = client.Provisioning.PutPolicyTree(provisioning.NewPutPolicyTreeParams().WithBody(policy))
258+
if err != nil {
259+
return diag.FromErr(err)
260+
}
261+
}
262+
263+
_, err = client.Provisioning.DeleteMuteTiming(name)
235264
diag, _ := common.CheckReadError("mute timing", data, err)
236265
return diag
237266
}
238267

268+
func removeMuteTimingFromRoute(name string, route *models.Route) (*models.Route, bool) {
269+
modified := false
270+
for i, m := range route.MuteTimeIntervals {
271+
if m == name {
272+
route.MuteTimeIntervals = append(route.MuteTimeIntervals[:i], route.MuteTimeIntervals[i+1:]...)
273+
modified = true
274+
break
275+
}
276+
}
277+
for j, p := range route.Routes {
278+
var subRouteModified bool
279+
route.Routes[j], subRouteModified = removeMuteTimingFromRoute(name, p)
280+
modified = modified || subRouteModified
281+
}
282+
283+
return route, modified
284+
}
285+
239286
func suppressMonthDiff(k, oldValue, newValue string, d *schema.ResourceData) bool {
240287
monthNums := map[string]int{
241288
"january": 1,

internal/resources/grafana/resource_alerting_mute_timing_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,59 @@ resource "grafana_mute_timing" "my_mute_timing" {
107107
},
108108
})
109109
}
110+
111+
func TestAccMuteTiming_RemoveInUse(t *testing.T) {
112+
testutils.CheckOSSTestsEnabled(t, ">9.0.0")
113+
114+
config := func(mute bool) string {
115+
return fmt.Sprintf(`
116+
locals {
117+
use_mute = %t
118+
}
119+
120+
resource "grafana_organization" "my_org" {
121+
name = "mute-timing-test"
122+
}
123+
124+
resource "grafana_contact_point" "default_policy" {
125+
org_id = grafana_organization.my_org.id
126+
name = "default-policy"
127+
email {
128+
addresses = ["[email protected]"]
129+
}
130+
}
131+
132+
resource "grafana_notification_policy" "org_policy" {
133+
org_id = grafana_organization.my_org.id
134+
group_by = ["..."]
135+
group_wait = "45s"
136+
group_interval = "6m"
137+
repeat_interval = "3h"
138+
contact_point = grafana_contact_point.default_policy.name
139+
140+
policy {
141+
mute_timings = local.use_mute ? [grafana_mute_timing.test[0].name] : []
142+
contact_point = grafana_contact_point.default_policy.name
143+
}
144+
}
145+
146+
resource "grafana_mute_timing" "test" {
147+
count = local.use_mute ? 1 : 0
148+
org_id = grafana_organization.my_org.id
149+
name = "test-mute-timing"
150+
intervals {}
151+
}`, mute)
152+
}
153+
154+
resource.ParallelTest(t, resource.TestCase{
155+
ProtoV5ProviderFactories: testutils.ProtoV5ProviderFactories,
156+
Steps: []resource.TestStep{
157+
{
158+
Config: config(true),
159+
},
160+
{
161+
Config: config(false),
162+
},
163+
},
164+
})
165+
}

0 commit comments

Comments
 (0)