Alerting: Fix panic when reparenting receivers to groups following an attempted rename via Provisioning (#67167)

This commit is contained in:
Alexander Weaver 2023-04-24 20:23:23 -05:00 committed by GitHub
parent 1a347bfb7b
commit 117636e8ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 287 additions and 1 deletions

View File

@ -453,7 +453,7 @@ groupLoop:
// Otherwise, we only want to rename the receiver we are touching... NOT all of them. // Otherwise, we only want to rename the receiver we are touching... NOT all of them.
// Check to see whether a different group with the name we want already exists. // Check to see whether a different group with the name we want already exists.
for i, candidateExistingGroup := range cfg.AlertmanagerConfig.Receivers { for _, candidateExistingGroup := range cfg.AlertmanagerConfig.Receivers {
// If so, put our modified receiver into that group. Done! // If so, put our modified receiver into that group. Done!
if candidateExistingGroup.Name == target.Name { if candidateExistingGroup.Name == target.Name {
// Drop it from the old group... // Drop it from the old group...

View File

@ -493,6 +493,292 @@ func TestStitchReceivers(t *testing.T) {
}, },
}, },
}, },
{
name: "rename to another, larger group",
initial: &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{
Name: "receiver-1",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "1",
Name: "receiver-1",
Type: "slack",
},
{
UID: "2",
Name: "receiver-1",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-2",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "3",
Name: "receiver-2",
Type: "slack",
},
{
UID: "4",
Name: "receiver-2",
Type: "slack",
},
{
UID: "5",
Name: "receiver-2",
Type: "slack",
},
},
},
},
},
},
},
new: &definitions.PostableGrafanaReceiver{
UID: "2",
Name: "receiver-2",
Type: "slack",
},
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{
Name: "receiver-1",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "1",
Name: "receiver-1",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-2",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "3",
Name: "receiver-2",
Type: "slack",
},
{
UID: "4",
Name: "receiver-2",
Type: "slack",
},
{
UID: "5",
Name: "receiver-2",
Type: "slack",
},
{
UID: "2",
Name: "receiver-2",
Type: "slack",
},
},
},
},
},
},
},
{
name: "rename when there are many groups",
initial: &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{
Name: "receiver-1",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "1",
Name: "receiver-1",
Type: "slack",
},
{
UID: "2",
Name: "receiver-1",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-2",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "3",
Name: "receiver-2",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-3",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "4",
Name: "receiver-4",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-4",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "5",
Name: "receiver-4",
Type: "slack",
},
},
},
},
},
},
},
new: &definitions.PostableGrafanaReceiver{
UID: "2",
Name: "receiver-4",
Type: "slack",
},
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{
Name: "receiver-1",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "1",
Name: "receiver-1",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-2",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "3",
Name: "receiver-2",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-3",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "4",
Name: "receiver-4",
Type: "slack",
},
},
},
},
{
Receiver: config.Receiver{
Name: "receiver-4",
},
PostableGrafanaReceivers: definitions.PostableGrafanaReceivers{
GrafanaManagedReceivers: []*definitions.PostableGrafanaReceiver{
{
UID: "5",
Name: "receiver-4",
Type: "slack",
},
{
UID: "2",
Name: "receiver-4",
Type: "slack",
},
},
},
},
},
},
},
{ {
name: "rename to a name that doesn't exist, creates new group and moves", name: "rename to a name that doesn't exist, creates new group and moves",
new: &definitions.PostableGrafanaReceiver{ new: &definitions.PostableGrafanaReceiver{