Skip to content

Commit

Permalink
Alerting: Add export drawer when exporting all Grafana managed alerts (
Browse files Browse the repository at this point in the history
…#74846)

* Add export formats drawer when exporting contact points

* Add 'export by format' drawer in policies (root policy)

* Add test for showing export policies button

* Add tests for Policy.tsx

* Add tests for export functionality in receivers

* Add exporter drawer for receivers

* Fix prettier warnings

* Allow HCL only for alert rules exports

* Add tests for Policies

* Fix tests

* Refactor: Update ExportProviders types for limiting the avaliable export formats when using GrafanaExportDrawer

* Delete unused shouldShowExportOption method and tests

* Add exporter drawer when clicking export all Grafana managed alerts

* Fix test

* fix prettier

* lint

---------

Co-authored-by: Gilles De Mey <gilles.de.mey@gmail.com>
  • Loading branch information
soniaAguilarPeiron and gillesdemey committed Sep 18, 2023
1 parent 39dbd98 commit 942c477
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 12 deletions.
16 changes: 5 additions & 11 deletions public/app/features/alerting/unified/MoreActionsRuleButtons.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
import React from 'react';
import { useLocation } from 'react-router-dom';
import { useToggle } from 'react-use';

import { urlUtil } from '@grafana/data';
import { Button, Dropdown, Icon, LinkButton, Menu, MenuItem } from '@grafana/ui';

import { logInfo, LogMessages } from './Analytics';
import { GrafanaRulesExporter } from './components/export/GrafanaRulesExporter';
import { useRulesAccess } from './utils/accessControlHooks';
import { createUrl } from './utils/url';

interface Props {}

export function MoreActionsRuleButtons({}: Props) {
const { canCreateGrafanaRules, canCreateCloudRules, canReadProvisioning } = useRulesAccess();
const location = useLocation();
const [showExportDrawer, toggleShowExportDrawer] = useToggle(false);
const newMenu = (
<Menu>
{(canCreateGrafanaRules || canCreateCloudRules) && (
Expand All @@ -23,16 +25,7 @@ export function MoreActionsRuleButtons({}: Props) {
label="New recording rule"
/>
)}
{canReadProvisioning && (
<MenuItem
url={createUrl('/api/v1/provisioning/alert-rules/export', {
download: 'true',
format: 'yaml',
})}
label="Export all Grafana-managed rules"
target="_blank"
/>
)}
{canReadProvisioning && <MenuItem onClick={toggleShowExportDrawer} label="Export all Grafana-managed rules" />}
</Menu>
);

Expand All @@ -54,6 +47,7 @@ export function MoreActionsRuleButtons({}: Props) {
<Icon name="angle-down" />
</Button>
</Dropdown>
{showExportDrawer && <GrafanaRulesExporter onClose={toggleShowExportDrawer} />}
</>
);
}
4 changes: 3 additions & 1 deletion public/app/features/alerting/unified/RuleList.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ const ui = {
editCloudGroupIcon: byTestId('edit-group'),
newRuleButton: byRole('link', { name: 'New alert rule' }),
moreButton: byRole('button', { name: 'More' }),
exportButton: byRole('link', { name: /export/i }),
exportButton: byRole('menuitem', {
name: /export all grafana\-managed rules/i,
}),
editGroupModal: {
dialog: byRole('dialog'),
namespaceInput: byRole('textbox', { name: /^Namespace/ }),
Expand Down
7 changes: 7 additions & 0 deletions public/app/features/alerting/unified/api/alertRuleApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,13 @@ export const alertRuleApi = alertingApi.injectEndpoints({
responseType: 'text',
}),
}),
exportRules: build.query<string, { format: ExportFormats }>({
query: ({ format }) => ({
url: `/api/v1/provisioning/alert-rules/export`,
params: { format: format },
responseType: 'text',
}),
}),
exportReceiver: build.query<string, { receiverName: string; decrypt: boolean; format: ExportFormats }>({
query: ({ receiverName, decrypt, format }) => ({
url: `/api/v1/provisioning/contact-points/export/`,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import React, { useState } from 'react';

import { LoadingPlaceholder } from '@grafana/ui';

import { alertRuleApi } from '../../api/alertRuleApi';

import { FileExportPreview } from './FileExportPreview';
import { GrafanaExportDrawer } from './GrafanaExportDrawer';
import { allGrafanaExportProviders, ExportFormats } from './providers';

interface GrafanaRulesExporterProps {
onClose: () => void;
}

export function GrafanaRulesExporter({ onClose }: GrafanaRulesExporterProps) {
const [activeTab, setActiveTab] = useState<ExportFormats>('yaml');

return (
<GrafanaExportDrawer
activeTab={activeTab}
onTabChange={setActiveTab}
onClose={onClose}
formatProviders={Object.values(allGrafanaExportProviders)}
>
<GrafanaRulesExportPreview exportFormat={activeTab} onClose={onClose} />
</GrafanaExportDrawer>
);
}

interface GrafanaRulesExportPreviewProps {
exportFormat: ExportFormats;
onClose: () => void;
}

function GrafanaRulesExportPreview({ exportFormat, onClose }: GrafanaRulesExportPreviewProps) {
const { currentData: rulesDefinition = '', isFetching } = alertRuleApi.useExportRulesQuery({
format: exportFormat,
});

const downloadFileName = `alert-rules-${new Date().getTime()}`;

if (isFetching) {
return <LoadingPlaceholder text="Loading...." />;
}

return (
<FileExportPreview
format={exportFormat}
textDefinition={rulesDefinition}
downloadFileName={downloadFileName}
onClose={onClose}
/>
);
}

0 comments on commit 942c477

Please sign in to comment.