From feb4fbaae9fc357a0c97bc03dfdc3125c3c801b3 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Thu, 9 Sep 2021 20:50:12 +0300 Subject: [PATCH] Alerting: Fix notification channel migration (#38983) (#39053) (cherry picked from commit b56bf83c19fc8f2dafdc745f02283f7ff27a387e) --- .../sqlstore/migrations/ualert/channel.go | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/pkg/services/sqlstore/migrations/ualert/channel.go b/pkg/services/sqlstore/migrations/ualert/channel.go index a16ef11ba1e..df525cbda4e 100644 --- a/pkg/services/sqlstore/migrations/ualert/channel.go +++ b/pkg/services/sqlstore/migrations/ualert/channel.go @@ -113,14 +113,17 @@ func (m *migration) makeReceiverAndRoute(ruleUid string, channelUids []interface } m.migratedChannels[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{ UID: uid, Name: c.Name, Type: c.Type, DisableResolveMessage: c.DisableResolveMessage, Settings: settings, - SecureSettings: secureSettings, + SecureSettings: decryptedSecureSettings, }) return nil @@ -260,14 +263,17 @@ func (m *migration) addUnmigratedChannels(amConfig *PostableUserConfig, allChann } m.migratedChannels[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{ UID: uid, Name: c.Name, Type: c.Type, DisableResolveMessage: c.DisableResolveMessage, Settings: settings, - SecureSettings: secureSettings, + SecureSettings: decryptedSecureSettings, }) } receiver.GrafanaManagedReceivers = portedChannels @@ -293,7 +299,7 @@ func (m *migration) generateChannelUID() (string, bool) { // 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. // 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{} switch chanType { case "slack": @@ -316,20 +322,28 @@ func migrateSettingsToSecureSettings(chanType string, settings *simplejson.Json, 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 { - if v, ok := ss[k]; ok && v != "" { + if v, ok := decryptedSecureSettings[k]; ok && v != "" { continue } - sv := settings.Get(k).MustString() + sv := cloneSettings.Get(k).MustString() if sv != "" { - ss[k] = sv - settings.Del(k) + decryptedSecureSettings[k] = sv + cloneSettings.Del(k) } } - return settings, ss + return cloneSettings, decryptedSecureSettings, nil } func getLabelForRouteMatching(ruleUID string) (string, string) {