From 798b32138dfc3aa6d2a905be7764dfcd4b3cfd04 Mon Sep 17 00:00:00 2001 From: Sonia Aguilar <33540275+soniaAguilarPeiron@users.noreply.github.com> Date: Fri, 17 Jan 2025 19:06:50 +0100 Subject: [PATCH] Alerting: Use useProduceNewAlertmanagerConfiguration for notification policies (#98615) Co-authored-by: Gilles De Mey --- .../unified/api/notificationPoliciesApi.ts | 11 - .../notification-policies/Modals.tsx | 49 ++-- .../NotificationPoliciesList.tsx | 135 +++++----- .../useNotificationPolicyRoute.test.tsx.snap | 35 +++ .../useNotificationPolicyRoute.test.tsx | 117 +++++++++ .../useNotificationPolicyRoute.ts | 245 +++++++++++++----- .../hooks/useProduceNewAlertmanagerConfig.ts | 4 +- .../notificationPolicyRoutes.test.ts.snap | 182 +++++++++++++ .../notificationPolicyRoutes.test.ts | 144 ++++++++++ .../alertmanager/notificationPolicyRoutes.ts | 82 ++++++ .../alerting/unified/utils/amroutes.test.ts | 21 +- .../alerting/unified/utils/amroutes.ts | 20 +- .../alerting/unified/utils/matchers.ts | 1 + .../alerting/unified/utils/routeTree.test.ts | 93 ++++++- .../alerting/unified/utils/routeTree.ts | 100 ++++++- .../alerting/unified/utils/rule-id.ts | 2 +- .../plugins/datasource/alertmanager/types.ts | 5 +- 17 files changed, 1039 insertions(+), 207 deletions(-) delete mode 100644 public/app/features/alerting/unified/api/notificationPoliciesApi.ts create mode 100644 public/app/features/alerting/unified/components/notification-policies/__snapshots__/useNotificationPolicyRoute.test.tsx.snap create mode 100644 public/app/features/alerting/unified/components/notification-policies/useNotificationPolicyRoute.test.tsx create mode 100644 public/app/features/alerting/unified/reducers/alertmanager/__snapshots__/notificationPolicyRoutes.test.ts.snap create mode 100644 public/app/features/alerting/unified/reducers/alertmanager/notificationPolicyRoutes.test.ts create mode 100644 public/app/features/alerting/unified/reducers/alertmanager/notificationPolicyRoutes.ts diff --git a/public/app/features/alerting/unified/api/notificationPoliciesApi.ts b/public/app/features/alerting/unified/api/notificationPoliciesApi.ts deleted file mode 100644 index 9fdc57356e1..00000000000 --- a/public/app/features/alerting/unified/api/notificationPoliciesApi.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { generatedRoutesApi } from 'app/features/alerting/unified/openapi/routesApi.gen'; - -export const routingTreeApi = generatedRoutesApi.enhanceEndpoints({ - endpoints: { - replaceNamespacedRoutingTree: { - // Stop a failed mutation from invalidating the cache, as otherwise the notification policies - // components will re-attach IDs to the routes, and then the user can't update the route anyway - invalidatesTags: (_, error) => (error ? [] : ['RoutingTree']), - }, - }, -}); diff --git a/public/app/features/alerting/unified/components/notification-policies/Modals.tsx b/public/app/features/alerting/unified/components/notification-policies/Modals.tsx index ff961b83ffb..fb76f6cadb2 100644 --- a/public/app/features/alerting/unified/components/notification-policies/Modals.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/Modals.tsx @@ -7,7 +7,6 @@ import { AlertState, AlertmanagerGroup, ObjectMatcher, RouteWithID } from 'app/p import { FormAmRoute } from '../../types/amroutes'; import { MatcherFormatter } from '../../utils/matchers'; -import { stringifyErrorLike } from '../../utils/misc'; import { InsertPosition } from '../../utils/routeTree'; import { AlertGroup } from '../alert-groups/AlertGroup'; @@ -20,9 +19,8 @@ import { NotificationPoliciesErrorAlert } from './PolicyUpdateErrorAlert'; type ModalHook = [JSX.Element, (item: T) => void, () => void]; type AddModalHook = [JSX.Element, (item: T, position: InsertPosition) => void, () => void]; type EditModalHook = [JSX.Element, (item: RouteWithID, isDefaultRoute?: boolean) => void, () => void]; - const useAddPolicyModal = ( - handleAdd: (route: Partial, referenceRoute: RouteWithID, position: InsertPosition) => void, + handleAdd: (route: Partial, referenceRoute: RouteWithID, position: InsertPosition) => Promise, loading: boolean ): AddModalHook => { const [showModal, setShowModal] = useState(false); @@ -32,6 +30,7 @@ const useAddPolicyModal = ( const handleDismiss = useCallback(() => { setReferenceRoute(undefined); setInsertPosition(undefined); + setError(undefined); setShowModal(false); }, []); @@ -41,6 +40,8 @@ const useAddPolicyModal = ( setShowModal(true); }, []); + const [error, setError] = useState(undefined); + const modalElement = useMemo( () => loading ? ( @@ -53,13 +54,14 @@ const useAddPolicyModal = ( closeOnEscape={true} title="Add notification policy" > + {error && } { if (referenceRoute && insertPosition) { - handleAdd(newRoute, referenceRoute, insertPosition); + handleAdd(newRoute, referenceRoute, insertPosition).catch(setError); } }} actionButtons={ @@ -75,7 +77,7 @@ const useAddPolicyModal = ( /> ), - [handleAdd, handleDismiss, insertPosition, loading, referenceRoute, showModal] + [error, handleAdd, handleDismiss, insertPosition, loading, referenceRoute, showModal, setError] ); return [modalElement, handleShow, handleDismiss]; @@ -83,17 +85,19 @@ const useAddPolicyModal = ( const useEditPolicyModal = ( alertManagerSourceName: string, - handleSave: (route: Partial) => void, - loading: boolean, - error?: Error + handleUpdate: (route: Partial) => Promise, + loading: boolean ): EditModalHook => { const [showModal, setShowModal] = useState(false); const [isDefaultPolicy, setIsDefaultPolicy] = useState(false); const [route, setRoute] = useState(); + const [error, setError] = useState(undefined); + const handleDismiss = useCallback(() => { setRoute(undefined); setShowModal(false); + setError(undefined); }, []); const handleShow = useCallback((route: RouteWithID, isDefaultPolicy?: boolean) => { @@ -114,13 +118,13 @@ const useEditPolicyModal = ( closeOnEscape={true} title="Edit notification policy" > - {error && } + {error && } {isDefaultPolicy && route && ( handleUpdate(values).catch(setError)} route={route} actionButtons={ @@ -137,7 +141,7 @@ const useEditPolicyModal = ( {!isDefaultPolicy && ( handleUpdate(values).catch(setError)} actionButtons={