From 19a58da54c43632a2f81aaca6d8218aaa860c1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Fri, 9 Sep 2022 14:15:57 +0200 Subject: [PATCH] Alerting: make sure to update contact point references when updating (#54896) (#54952) (cherry picked from commit e41f78a56d9c63bffa68f21270196c91054cbd19) --- .../ngalert/provisioning/contactpoints.go | 13 ++++ .../provisioning/contactpoints_test.go | 72 ++++++++++++++++++- 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/pkg/services/ngalert/provisioning/contactpoints.go b/pkg/services/ngalert/provisioning/contactpoints.go index 6dd4a70c1c8..73086ba50b5 100644 --- a/pkg/services/ngalert/provisioning/contactpoints.go +++ b/pkg/services/ngalert/provisioning/contactpoints.go @@ -418,6 +418,7 @@ groupLoop: // If we're renaming, we'll need to fix up the macro receiver group for consistency. // Firstly, if we're the only receiver in the group, simply rename the group to match. Done! if len(receiverGroup.GrafanaManagedReceivers) == 1 { + replaceReferences(receiverGroup.Name, target.Name, cfg.AlertmanagerConfig.Route) receiverGroup.Name = target.Name receiverGroup.GrafanaManagedReceivers[i] = target configModified = true @@ -460,3 +461,15 @@ groupLoop: return configModified } + +func replaceReferences(oldName, newName string, routes ...*apimodels.Route) { + if len(routes) == 0 { + return + } + for _, route := range routes { + if route.Receiver == oldName { + route.Receiver = newName + } + replaceReferences(oldName, newName, route.Routes...) + } +} diff --git a/pkg/services/ngalert/provisioning/contactpoints_test.go b/pkg/services/ngalert/provisioning/contactpoints_test.go index 1ee91f59b1b..01bf10fdb73 100644 --- a/pkg/services/ngalert/provisioning/contactpoints_test.go +++ b/pkg/services/ngalert/provisioning/contactpoints_test.go @@ -319,6 +319,16 @@ func TestStitchReceivers(t *testing.T) { }, expModified: true, expCfg: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "receiver-1", + Routes: []*definitions.Route{ + { + Receiver: "receiver-1", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{ @@ -362,7 +372,7 @@ func TestStitchReceivers(t *testing.T) { }, }, { - name: "rename with only one receiver in group, renames group", + name: "rename with only one receiver in group, renames group and references", new: &definitions.PostableGrafanaReceiver{ UID: "abc", Name: "new-receiver", @@ -370,6 +380,16 @@ func TestStitchReceivers(t *testing.T) { }, expModified: true, expCfg: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "new-receiver", + Routes: []*definitions.Route{ + { + Receiver: "new-receiver", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{ @@ -421,6 +441,16 @@ func TestStitchReceivers(t *testing.T) { }, expModified: true, expCfg: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "receiver-1", + Routes: []*definitions.Route{ + { + Receiver: "receiver-1", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{ @@ -472,6 +502,16 @@ func TestStitchReceivers(t *testing.T) { }, expModified: true, expCfg: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "receiver-1", + Routes: []*definitions.Route{ + { + Receiver: "receiver-1", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{ @@ -533,6 +573,16 @@ func TestStitchReceivers(t *testing.T) { }, expModified: true, expCfg: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "receiver-1", + Routes: []*definitions.Route{ + { + Receiver: "receiver-1", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{ @@ -604,6 +654,16 @@ func TestStitchReceivers(t *testing.T) { func createTestConfigWithReceivers() *definitions.PostableUserConfig { return &definitions.PostableUserConfig{ AlertmanagerConfig: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "receiver-1", + Routes: []*definitions.Route{ + { + Receiver: "receiver-1", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{ @@ -652,6 +712,16 @@ func createTestConfigWithReceivers() *definitions.PostableUserConfig { func createInconsistentTestConfigWithReceivers() *definitions.PostableUserConfig { return &definitions.PostableUserConfig{ AlertmanagerConfig: definitions.PostableApiAlertingConfig{ + Config: definitions.Config{ + Route: &definitions.Route{ + Receiver: "receiver-1", + Routes: []*definitions.Route{ + { + Receiver: "receiver-1", + }, + }, + }, + }, Receivers: []*definitions.PostableApiReceiver{ { Receiver: config.Receiver{