From 9da41140aa08fed89b452d978c600148056f0759 Mon Sep 17 00:00:00 2001 From: Konrad Lalik Date: Wed, 1 Jun 2022 15:38:23 +0200 Subject: [PATCH] Alerting: Fix external alertmanager duplication (#49980) * Fix external alertmanager duplication * Add tests --- .../hooks/useExternalAMSelector.test.ts | 37 +++++++++++++++++++ .../unified/hooks/useExternalAmSelector.ts | 30 +++++++-------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/public/app/features/alerting/unified/hooks/useExternalAMSelector.test.ts b/public/app/features/alerting/unified/hooks/useExternalAMSelector.test.ts index bf613686bf1..2a30a8a757b 100644 --- a/public/app/features/alerting/unified/hooks/useExternalAMSelector.test.ts +++ b/public/app/features/alerting/unified/hooks/useExternalAMSelector.test.ts @@ -127,4 +127,41 @@ describe('useExternalAmSelector', () => { }, ]); }); + + it('The number of alert managers should match config entries when there are multiple entries of the same url', () => { + useSelectorMock.mockImplementation((callback) => { + return callback( + createMockStoreState( + [ + { url: 'same/url/to/am/api/v2/alerts' }, + { url: 'same/url/to/am/api/v2/alerts' }, + { url: 'same/url/to/am/api/v2/alerts' }, + ], + [], + ['same/url/to/am', 'same/url/to/am', 'same/url/to/am'] + ) + ); + }); + + const alertmanagers = useExternalAmSelector(); + + expect(alertmanagers.length).toBe(3); + expect(alertmanagers).toEqual([ + { + url: 'same/url/to/am', + actualUrl: 'same/url/to/am/api/v2/alerts', + status: 'active', + }, + { + url: 'same/url/to/am', + actualUrl: 'same/url/to/am/api/v2/alerts', + status: 'active', + }, + { + url: 'same/url/to/am', + actualUrl: 'same/url/to/am/api/v2/alerts', + status: 'active', + }, + ]); + }); }); diff --git a/public/app/features/alerting/unified/hooks/useExternalAmSelector.ts b/public/app/features/alerting/unified/hooks/useExternalAmSelector.ts index 0a87417fefc..51a58075a13 100644 --- a/public/app/features/alerting/unified/hooks/useExternalAmSelector.ts +++ b/public/app/features/alerting/unified/hooks/useExternalAmSelector.ts @@ -18,7 +18,7 @@ export function useExternalAmSelector(): AlertmanagerConfig[] | [] { } const enabledAlertmanagers: AlertmanagerConfig[] = []; - const droppedAlertmanagers: AlertmanagerConfig[] = discoveredAlertmanagers?.droppedAlertManagers.map((am) => ({ + const droppedAlertmanagers: AlertmanagerConfig[] = discoveredAlertmanagers.droppedAlertManagers.map((am) => ({ url: am.url.replace(SUFFIX_REGEX, ''), status: 'dropped', actualUrl: am.url, @@ -32,24 +32,20 @@ export function useExternalAmSelector(): AlertmanagerConfig[] | [] { actualUrl: '', }); } else { - let found = false; - for (const activeAM of discoveredAlertmanagers.activeAlertManagers) { - if (activeAM.url === `${url}/api/v2/alerts`) { - found = true; - enabledAlertmanagers.push({ - url: activeAM.url.replace(SUFFIX_REGEX, ''), + const matchingActiveAM = discoveredAlertmanagers.activeAlertManagers.find( + (am) => am.url === `${url}/api/v2/alerts` + ); + matchingActiveAM + ? enabledAlertmanagers.push({ + url: matchingActiveAM.url.replace(SUFFIX_REGEX, ''), status: 'active', - actualUrl: activeAM.url, + actualUrl: matchingActiveAM.url, + }) + : enabledAlertmanagers.push({ + url: url, + status: 'pending', + actualUrl: '', }); - } - } - if (!found) { - enabledAlertmanagers.push({ - url: url, - status: 'pending', - actualUrl: '', - }); - } } }