diff --git a/public/app/features/alerting/unified/components/notification-policies/NotificationPoliciesList.tsx b/public/app/features/alerting/unified/components/notification-policies/NotificationPoliciesList.tsx index 5e85c5f575c..dccaafedd2f 100644 --- a/public/app/features/alerting/unified/components/notification-policies/NotificationPoliciesList.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/NotificationPoliciesList.tsx @@ -27,7 +27,6 @@ import { useAddPolicyModal, useAlertGroupsModal, useDeletePolicyModal, useEditPo import { Policy } from './Policy'; import { TIMING_OPTIONS_DEFAULTS } from './timingOptions'; import { - isRouteProvisioned, useAddNotificationPolicy, useDeleteNotificationPolicy, useNotificationPolicyRoute, @@ -101,7 +100,6 @@ export const NotificationPoliciesList = () => { return; }, [defaultPolicy]); const routeProvenance = defaultPolicy?.provenance; - const isRootRouteProvisioned = rootRoute ? isRouteProvisioned(rootRoute) : false; // useAsync could also work but it's hard to wait until it's done in the tests // Combining with useEffect gives more predictable results because the condition is in useEffect @@ -247,7 +245,6 @@ export const NotificationPoliciesList = () => { currentRoute={defaults(rootRoute, TIMING_OPTIONS_DEFAULTS)} contactPointsState={contactPointsState.receivers} readOnly={!hasConfigurationAPI} - provisioned={isRootRouteProvisioned} provenance={routeProvenance} alertManagerSourceName={selectedAlertmanager} onAddPolicy={openAddModal} diff --git a/public/app/features/alerting/unified/components/notification-policies/Policy.test.tsx b/public/app/features/alerting/unified/components/notification-policies/Policy.test.tsx index 62f9a57ad73..1bec449dd6f 100644 --- a/public/app/features/alerting/unified/components/notification-policies/Policy.test.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/Policy.test.tsx @@ -351,7 +351,6 @@ describe('Policy', () => { onAddPolicy={noop} onDeletePolicy={noop} onShowAlertInstances={noop} - provisioned provenance={KnownProvenance.File} /> ); @@ -378,7 +377,6 @@ describe('Policy', () => { onAddPolicy={noop} onDeletePolicy={noop} onShowAlertInstances={noop} - provisioned provenance={KnownProvenance.ConvertedPrometheus} /> ); @@ -477,35 +475,36 @@ describe('useCreateDropdownMenuActions', () => { { isAutoGenerated: false, isDefaultPolicy: true, - provisioned: false, + provenance: undefined, expectedMenu: ['edit-policy', 'export-policy'], }, { isAutoGenerated: false, isDefaultPolicy: true, - provisioned: true, + provenance: KnownProvenance.File, expectedMenu: ['edit-policy', 'export-policy'], }, { isAutoGenerated: false, isDefaultPolicy: false, - provisioned: false, + provenance: undefined, expectedMenu: ['edit-policy', 'delete-policy'], }, { isAutoGenerated: false, isDefaultPolicy: false, - provisioned: true, + provenance: KnownProvenance.File, expectedMenu: ['edit-policy', 'delete-policy'], }, - { isAutoGenerated: true, isDefaultPolicy: true, provisioned: true, expectedMenu: ['edit-policy'] }, - { isAutoGenerated: true, isDefaultPolicy: false, provisioned: false, expectedMenu: ['edit-policy'] }, - { isAutoGenerated: true, isDefaultPolicy: true, provisioned: false, expectedMenu: ['edit-policy'] }, - { isAutoGenerated: true, isDefaultPolicy: false, provisioned: true, expectedMenu: ['edit-policy'] }, + { isAutoGenerated: true, isDefaultPolicy: true, provenance: KnownProvenance.File, expectedMenu: ['edit-policy'] }, + { isAutoGenerated: true, isDefaultPolicy: false, provenance: undefined, expectedMenu: ['edit-policy'] }, + { isAutoGenerated: true, isDefaultPolicy: true, provenance: undefined, expectedMenu: ['edit-policy'] }, + { isAutoGenerated: true, isDefaultPolicy: false, provenance: KnownProvenance.File, expectedMenu: ['edit-policy'] }, ]; - testCases.forEach(({ isAutoGenerated, isDefaultPolicy, provisioned, expectedMenu }) => { - it(`Having all the permissions returns ${expectedMenu.length} menu items for isAutoGenerated=${isAutoGenerated}, isDefaultPolicy=${isDefaultPolicy}, provisioned=${provisioned}`, () => { + testCases.forEach(({ isAutoGenerated, isDefaultPolicy, provenance, expectedMenu }) => { + const provisionedStatus = provenance ? 'provisioned' : 'not provisioned'; + it(`Having all the permissions returns ${expectedMenu.length} menu items for isAutoGenerated=${isAutoGenerated}, isDefaultPolicy=${isDefaultPolicy}, ${provisionedStatus}`, () => { useAlertmanagerAbilitiesMock.mockReturnValue([ [true, true], [true, true], @@ -515,7 +514,7 @@ describe('useCreateDropdownMenuActions', () => { useCreateDropdownMenuActions( isAutoGenerated, isDefaultPolicy, - provisioned, + provenance, openDetailModal, currentRoute, toggleShowExportDrawer, diff --git a/public/app/features/alerting/unified/components/notification-policies/Policy.tsx b/public/app/features/alerting/unified/components/notification-policies/Policy.tsx index d638273e006..adb537b16a3 100644 --- a/public/app/features/alerting/unified/components/notification-policies/Policy.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/Policy.tsx @@ -31,12 +31,14 @@ import { AlertmanagerGroup, MatcherOperator, ObjectMatcher, + ROUTES_META_SYMBOL, Receiver, RouteWithID, } from 'app/plugins/datasource/alertmanager/types'; import { AlertmanagerAction, useAlertmanagerAbilities, useAlertmanagerAbility } from '../../hooks/useAbilities'; import { getAmMatcherFormatter } from '../../utils/alertmanager'; +import { isProvisionedResource } from '../../utils/k8s/utils'; import { MatcherFormatter, normalizeMatchers } from '../../utils/matchers'; import { createContactPointLink, createContactPointSearchLink, createMuteTimingLink } from '../../utils/misc'; import { routeAdapter } from '../../utils/routeAdapter'; @@ -60,7 +62,6 @@ interface PolicyComponentProps { receivers?: Receiver[]; contactPointsState?: ReceiversState; readOnly?: boolean; - provisioned?: boolean; provenance?: string; inheritedProperties?: InheritableProperties; routesMatchingFilters?: RoutesMatchingFilters; @@ -89,7 +90,6 @@ const Policy = (props: PolicyComponentProps) => { receivers = [], contactPointsState, readOnly = false, - provisioned = false, provenance, alertManagerSourceName, currentRoute, @@ -109,6 +109,9 @@ const Policy = (props: PolicyComponentProps) => { const styles = useStyles2(getStyles); + // Compute provisioned status from provenance + const provisioned = isProvisionedResource(provenance); + const contactPoint = currentRoute.receiver; const continueMatching = currentRoute.continue ?? false; @@ -183,7 +186,7 @@ const Policy = (props: PolicyComponentProps) => { const dropdownMenuActions: JSX.Element[] = useCreateDropdownMenuActions( isAutoGenerated, isDefaultPolicy, - provisioned, + provenance, onEditPolicy, currentRoute, toggleShowExportDrawer, @@ -361,6 +364,9 @@ const Policy = (props: PolicyComponentProps) => { then the child policy should not be editable either */ const isThisChildReadOnly = readOnly || provisioned || isAutoGenerated; + // Extract provenance from child route (can be in metadata symbol or top-level) + const childProvenance = child[ROUTES_META_SYMBOL]?.provenance ?? child.provenance; + return ( { routesMatchingFilters={routesMatchingFilters} matchingInstancesPreview={matchingInstancesPreview} isAutoGenerated={isThisChildAutoGenerated} - provisioned={provisioned} + provenance={childProvenance} /> ); })} @@ -542,7 +548,7 @@ function MetadataRow({ export const useCreateDropdownMenuActions = ( isAutoGenerated: boolean, isDefaultPolicy: boolean, - provisioned: boolean, + provenance: string | undefined, onEditPolicy: (route: RouteWithID, isDefault?: boolean, readOnly?: boolean) => void, currentRoute: RouteWithID, toggleShowExportDrawer: () => void, @@ -558,6 +564,9 @@ export const useCreateDropdownMenuActions = ( AlertmanagerAction.ExportNotificationPolicies, ]); + // Compute provisioned status from provenance + const provisioned = isProvisionedResource(provenance); + const dropdownMenuActions = []; const showExportAction = exportPoliciesAllowed && exportPoliciesSupported && isDefaultPolicy && !isAutoGenerated; const showEditAction = updatePoliciesSupported && updatePoliciesAllowed;