Alerting: Fix notification channel migration (#38983)

This commit is contained in:
Sofia Papagiannaki
2021-09-09 18:53:06 +03:00
committed by GitHub
parent 5511383070
commit b56bf83c19

View File

@ -125,14 +125,17 @@ func (m *migration) makeReceiverAndRoute(ruleUid string, orgID int64, channelUid
m.migratedChannelsPerOrg[orgID] = make(map[*notificationChannel]struct{}) m.migratedChannelsPerOrg[orgID] = make(map[*notificationChannel]struct{})
} }
m.migratedChannelsPerOrg[orgID][c] = struct{}{} m.migratedChannelsPerOrg[orgID][c] = struct{}{}
settings, secureSettings := migrateSettingsToSecureSettings(c.Type, c.Settings, c.SecureSettings) settings, decryptedSecureSettings, err := migrateSettingsToSecureSettings(c.Type, c.Settings, c.SecureSettings)
if err != nil {
return err
}
portedChannels = append(portedChannels, &PostableGrafanaReceiver{ portedChannels = append(portedChannels, &PostableGrafanaReceiver{
UID: uid, UID: uid,
Name: c.Name, Name: c.Name,
Type: c.Type, Type: c.Type,
DisableResolveMessage: c.DisableResolveMessage, DisableResolveMessage: c.DisableResolveMessage,
Settings: settings, Settings: settings,
SecureSettings: secureSettings, SecureSettings: decryptedSecureSettings,
}) })
return nil return nil
@ -293,14 +296,17 @@ func (m *migration) addUnmigratedChannels(orgID int64, amConfigs *PostableUserCo
} }
m.migratedChannelsPerOrg[orgID][c] = struct{}{} m.migratedChannelsPerOrg[orgID][c] = struct{}{}
settings, secureSettings := migrateSettingsToSecureSettings(c.Type, c.Settings, c.SecureSettings) settings, decryptedSecureSettings, err := migrateSettingsToSecureSettings(c.Type, c.Settings, c.SecureSettings)
if err != nil {
return err
}
portedChannels = append(portedChannels, &PostableGrafanaReceiver{ portedChannels = append(portedChannels, &PostableGrafanaReceiver{
UID: uid, UID: uid,
Name: c.Name, Name: c.Name,
Type: c.Type, Type: c.Type,
DisableResolveMessage: c.DisableResolveMessage, DisableResolveMessage: c.DisableResolveMessage,
Settings: settings, Settings: settings,
SecureSettings: secureSettings, SecureSettings: decryptedSecureSettings,
}) })
} }
receiver.GrafanaManagedReceivers = portedChannels receiver.GrafanaManagedReceivers = portedChannels
@ -326,7 +332,7 @@ func (m *migration) generateChannelUID() (string, bool) {
// Some settings were migrated from settings to secure settings in between. // Some settings were migrated from settings to secure settings in between.
// See https://grafana.com/docs/grafana/latest/installation/upgrading/#ensure-encryption-of-existing-alert-notification-channel-secrets. // See https://grafana.com/docs/grafana/latest/installation/upgrading/#ensure-encryption-of-existing-alert-notification-channel-secrets.
// migrateSettingsToSecureSettings takes care of that. // migrateSettingsToSecureSettings takes care of that.
func migrateSettingsToSecureSettings(chanType string, settings *simplejson.Json, secureSettings securejsondata.SecureJsonData) (*simplejson.Json, map[string]string) { func migrateSettingsToSecureSettings(chanType string, settings *simplejson.Json, secureSettings securejsondata.SecureJsonData) (*simplejson.Json, map[string]string, error) {
keys := []string{} keys := []string{}
switch chanType { switch chanType {
case "slack": case "slack":
@ -349,20 +355,28 @@ func migrateSettingsToSecureSettings(chanType string, settings *simplejson.Json,
keys = []string{"api_secret"} keys = []string{"api_secret"}
} }
ss := secureSettings.Decrypt() decryptedSecureSettings := secureSettings.Decrypt()
cloneSettings := simplejson.New()
settingsMap, err := settings.Map()
if err != nil {
return nil, nil, err
}
for k, v := range settingsMap {
cloneSettings.Set(k, v)
}
for _, k := range keys { for _, k := range keys {
if v, ok := ss[k]; ok && v != "" { if v, ok := decryptedSecureSettings[k]; ok && v != "" {
continue continue
} }
sv := settings.Get(k).MustString() sv := cloneSettings.Get(k).MustString()
if sv != "" { if sv != "" {
ss[k] = sv decryptedSecureSettings[k] = sv
settings.Del(k) cloneSettings.Del(k)
} }
} }
return settings, ss return cloneSettings, decryptedSecureSettings, nil
} }
func getLabelForRouteMatching(ruleUID string) (string, string) { func getLabelForRouteMatching(ruleUID string) (string, string) {