Files
grafana/public/app/features/alerting/unified/components/amroutes/AmRootRoute.tsx
Nathan Rodman 49505b9a3b Alerting: fgac for notification policies and contact points (#46939)
* add FGAC actions for silences table

* redirect users without permissions

* add permissions checks to routes

* add fgac to notifications and contact points

* fgac for notification policies

* fix mute timing authorization

* use consistent naming for checking grafana alertmanager

* tests for fgac in contact points and notification policies

* bump up timeout on rule editor test

* use new permissions util

* break out route evaluation into util

* Remove test timeout

* Change permissions for the alert-notifiers endpoint

* Use signed in handler for alert-notifiers when unified alerting enabled

Co-authored-by: Konrad Lalik <konrad.lalik@grafana.com>
2022-04-06 18:24:33 +02:00

85 lines
2.5 KiB
TypeScript

import React, { FC } from 'react';
import { css } from '@emotion/css';
import { GrafanaTheme2 } from '@grafana/data';
import { Button, useStyles2 } from '@grafana/ui';
import { AmRouteReceiver, FormAmRoute } from '../../types/amroutes';
import { AmRootRouteForm } from './AmRootRouteForm';
import { AmRootRouteRead } from './AmRootRouteRead';
import { isVanillaPrometheusAlertManagerDataSource } from '../../utils/datasource';
import { Authorize } from '../../components/Authorize';
import { getNotificationsPermissions } from '../../utils/access-control';
export interface AmRootRouteProps {
isEditMode: boolean;
onEnterEditMode: () => void;
onExitEditMode: () => void;
onSave: (data: Partial<FormAmRoute>) => void;
receivers: AmRouteReceiver[];
routes: FormAmRoute;
alertManagerSourceName: string;
}
export const AmRootRoute: FC<AmRootRouteProps> = ({
isEditMode,
onSave,
onEnterEditMode,
onExitEditMode,
receivers,
routes,
alertManagerSourceName,
}) => {
const styles = useStyles2(getStyles);
const permissions = getNotificationsPermissions(alertManagerSourceName);
const isReadOnly = isVanillaPrometheusAlertManagerDataSource(alertManagerSourceName);
return (
<div className={styles.container} data-testid="am-root-route-container">
<div className={styles.titleContainer}>
<h5 className={styles.title}>
Root policy - <i>default for all alerts</i>
</h5>
{!isEditMode && !isReadOnly && (
<Authorize actions={[permissions.update]}>
<Button icon="pen" onClick={onEnterEditMode} size="sm" type="button" variant="secondary">
Edit
</Button>
</Authorize>
)}
</div>
<p>
All alerts will go to the default contact point, unless you set additional matchers in the specific routing
area.
</p>
{isEditMode ? (
<AmRootRouteForm
alertManagerSourceName={alertManagerSourceName}
onCancel={onExitEditMode}
onSave={onSave}
receivers={receivers}
routes={routes}
/>
) : (
<AmRootRouteRead routes={routes} />
)}
</div>
);
};
const getStyles = (theme: GrafanaTheme2) => {
return {
container: css`
background-color: ${theme.colors.background.secondary};
color: ${theme.colors.text.secondary};
padding: ${theme.spacing(2)};
`,
titleContainer: css`
color: ${theme.colors.text.primary};
display: flex;
flex-flow: row nowrap;
`,
title: css`
flex: 100%;
`,
};
};