From 57750639cde822ce191b4ef9227585eaa0a1abec Mon Sep 17 00:00:00 2001 From: Peter Holmberg Date: Mon, 25 Oct 2021 14:40:45 +0200 Subject: [PATCH] Alerting: Prevent alerting routes from working if alerting is not enabled (#40521) * show alerting not enabled when not enabled * correct navmodel index * use correct config values --- .../features/alerting/FeatureTogglePage.tsx | 31 ++++ public/app/features/alerting/routes.tsx | 160 ++++++++++++++++++ public/app/routes/routes.tsx | 144 +--------------- 3 files changed, 193 insertions(+), 142 deletions(-) create mode 100644 public/app/features/alerting/FeatureTogglePage.tsx create mode 100644 public/app/features/alerting/routes.tsx diff --git a/public/app/features/alerting/FeatureTogglePage.tsx b/public/app/features/alerting/FeatureTogglePage.tsx new file mode 100644 index 00000000000..57fb28b554a --- /dev/null +++ b/public/app/features/alerting/FeatureTogglePage.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import Page from 'app/core/components/Page/Page'; +import { useNavModel } from 'app/core/hooks/useNavModel'; + +export default function FeatureTogglePage() { + const navModel = useNavModel('alert-list'); + + return ( + + +

Alerting is not enabled

+ To enable alerting, enable it in the Grafana config: +
+
+            {`[unified_alerting]
+enable = true
+`}
+          
+
+
+ For legacy alerting +
+            {`[alerting]
+enable = true
+`}
+          
+
+
+
+ ); +} diff --git a/public/app/features/alerting/routes.tsx b/public/app/features/alerting/routes.tsx new file mode 100644 index 00000000000..b767df008c5 --- /dev/null +++ b/public/app/features/alerting/routes.tsx @@ -0,0 +1,160 @@ +import React from 'react'; +import { Redirect } from 'react-router-dom'; +import { SafeDynamicImport } from 'app/core/components/DynamicImports/SafeDynamicImport'; +import { config } from 'app/core/config'; +import { RouteDescriptor } from 'app/core/navigation/types'; + +const alertingRoutes = [ + { + path: '/alerting', + // eslint-disable-next-line react/display-name + component: () => , + }, + { + path: '/alerting/list', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertRuleListIndex" */ 'app/features/alerting/AlertRuleListIndex') + ), + }, + { + path: '/alerting/ng/list', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertRuleList" */ 'app/features/alerting/AlertRuleList') + ), + }, + { + path: '/alerting/routes', + roles: () => ['Admin', 'Editor'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertAmRoutes" */ 'app/features/alerting/unified/AmRoutes') + ), + }, + { + path: '/alerting/silences', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') + ), + }, + { + path: '/alerting/silence/new', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') + ), + }, + { + path: '/alerting/silence/:id/edit', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') + ), + }, + { + path: '/alerting/notifications', + roles: config.unifiedAlertingEnabled ? () => ['Editor', 'Admin'] : undefined, + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') + ), + }, + { + path: '/alerting/notifications/templates/new', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') + ), + }, + { + path: '/alerting/notifications/templates/:id/edit', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') + ), + }, + { + path: '/alerting/notifications/receivers/new', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') + ), + }, + { + path: '/alerting/notifications/receivers/:id/edit', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') + ), + }, + { + path: '/alerting/notifications/global-config', + roles: () => ['Admin', 'Editor'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') + ), + }, + { + path: '/alerting/notification/new', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "NewNotificationChannel" */ 'app/features/alerting/NewNotificationChannelPage') + ), + }, + { + path: '/alerting/notification/:id/edit', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "EditNotificationChannel"*/ 'app/features/alerting/EditNotificationChannelPage') + ), + }, + { + path: '/alerting/groups/', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertGroups" */ 'app/features/alerting/unified/AlertGroups') + ), + }, + { + path: '/alerting/new', + pageClass: 'page-alerting', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertingRuleForm"*/ 'app/features/alerting/unified/RuleEditor') + ), + }, + { + path: '/alerting/:id/edit', + pageClass: 'page-alerting', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertingRuleForm"*/ 'app/features/alerting/unified/RuleEditor') + ), + }, + { + path: '/alerting/:sourceName/:id/view', + pageClass: 'page-alerting', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertingRule"*/ 'app/features/alerting/unified/RuleViewer') + ), + }, + { + path: '/alerting/:sourceName/:name/find', + pageClass: 'page-alerting', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertingRedirectToRule"*/ 'app/features/alerting/unified/RedirectToRuleViewer') + ), + }, + { + path: '/alerting/admin', + roles: () => ['Admin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "AlertingAdmin" */ 'app/features/alerting/unified/Admin') + ), + }, +]; + +export function getAlertingRoutes(cfg = config): RouteDescriptor[] { + if (cfg.alertingEnabled || cfg.unifiedAlertingEnabled) { + return alertingRoutes; + } + + return alertingRoutes.map((route) => ({ + ...route, + component: SafeDynamicImport( + () => import(/* webpackChunkName: "Alerting feature toggle page"*/ 'app/features/alerting/FeatureTogglePage') + ), + })); +} diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index 5cfde164306..96587b2d9ad 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -11,6 +11,7 @@ import ErrorPage from 'app/core/components/ErrorPage/ErrorPage'; import { getPluginsAdminRoutes } from 'app/features/plugins/routes'; import { contextSrv } from 'app/core/services/context_srv'; import { getLiveRoutes } from 'app/features/live/pages/routes'; +import { getAlertingRoutes } from 'app/features/alerting/routes'; export const extraRoutes: RouteDescriptor[] = []; @@ -330,148 +331,6 @@ export function getAppRoutes(): RouteDescriptor[] { // controller: 'AppPageCtrl', // controllerAs: 'ctrl', // }, - { - path: '/alerting', - // eslint-disable-next-line react/display-name - component: () => , - }, - { - path: '/alerting/list', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertRuleListIndex" */ 'app/features/alerting/AlertRuleListIndex') - ), - }, - { - path: '/alerting/ng/list', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertRuleList" */ 'app/features/alerting/AlertRuleList') - ), - }, - { - path: '/alerting/routes', - roles: () => ['Admin', 'Editor'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertAmRoutes" */ 'app/features/alerting/unified/AmRoutes') - ), - }, - { - path: '/alerting/silences', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') - ), - }, - { - path: '/alerting/silence/new', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') - ), - }, - { - path: '/alerting/silence/:id/edit', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') - ), - }, - { - path: '/alerting/notifications', - roles: config.unifiedAlertingEnabled ? () => ['Editor', 'Admin'] : undefined, - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/templates/new', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/templates/:id/edit', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/receivers/new', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/receivers/:id/edit', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/global-config', - roles: () => ['Admin', 'Editor'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notification/new', - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "NewNotificationChannel" */ 'app/features/alerting/NewNotificationChannelPage') - ), - }, - { - path: '/alerting/notification/:id/edit', - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "EditNotificationChannel"*/ 'app/features/alerting/EditNotificationChannelPage') - ), - }, - { - path: '/alerting/groups/', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertGroups" */ 'app/features/alerting/unified/AlertGroups') - ), - }, - { - path: '/alerting/new', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingRuleForm"*/ 'app/features/alerting/unified/RuleEditor') - ), - }, - { - path: '/alerting/:id/edit', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingRuleForm"*/ 'app/features/alerting/unified/RuleEditor') - ), - }, - { - path: '/alerting/:sourceName/:id/view', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingRule"*/ 'app/features/alerting/unified/RuleViewer') - ), - }, - { - path: '/alerting/:sourceName/:name/find', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "AlertingRedirectToRule"*/ 'app/features/alerting/unified/RedirectToRuleViewer') - ), - }, - { - path: '/alerting/admin', - roles: () => ['Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingAdmin" */ 'app/features/alerting/unified/Admin') - ), - }, { path: '/playlists', component: SafeDynamicImport( @@ -522,6 +381,7 @@ export function getAppRoutes(): RouteDescriptor[] { }, ...getPluginsAdminRoutes(), ...getLiveRoutes(), + ...getAlertingRoutes(), ...extraRoutes, { path: '/*',