mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: Chore - remove unused alerting upgradeApi (#91250)
This commit is contained in:
parent
782b725d87
commit
562380079f
@ -89,7 +89,6 @@ export const alertingApi = createApi({
|
|||||||
'AlertmanagerAlerts',
|
'AlertmanagerAlerts',
|
||||||
'AlertmanagerSilences',
|
'AlertmanagerSilences',
|
||||||
'OnCallIntegrations',
|
'OnCallIntegrations',
|
||||||
'OrgMigrationState',
|
|
||||||
'DataSourceSettings',
|
'DataSourceSettings',
|
||||||
'GrafanaLabels',
|
'GrafanaLabels',
|
||||||
'CombinedAlertRule',
|
'CombinedAlertRule',
|
||||||
|
@ -1,444 +0,0 @@
|
|||||||
import { FetchError, isFetchError } from '@grafana/runtime';
|
|
||||||
|
|
||||||
import {
|
|
||||||
createErrorNotification,
|
|
||||||
createSuccessNotification,
|
|
||||||
createWarningNotification,
|
|
||||||
} from '../../../../core/copy/appNotification';
|
|
||||||
import { notifyApp } from '../../../../core/reducers/appNotification';
|
|
||||||
import { ObjectMatcher } from '../../../../plugins/datasource/alertmanager/types';
|
|
||||||
|
|
||||||
import { alertingApi } from './alertingApi';
|
|
||||||
|
|
||||||
export interface OrgMigrationSummary {
|
|
||||||
newDashboards: number;
|
|
||||||
newAlerts: number;
|
|
||||||
newChannels: number;
|
|
||||||
removed: boolean;
|
|
||||||
hasErrors: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface OrgMigrationState {
|
|
||||||
orgId: number;
|
|
||||||
migratedDashboards: DashboardUpgrade[];
|
|
||||||
migratedChannels: ContactPair[];
|
|
||||||
errors: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DashboardUpgrade {
|
|
||||||
migratedAlerts: AlertPair[];
|
|
||||||
dashboardId: number;
|
|
||||||
dashboardUid: string;
|
|
||||||
dashboardName: string;
|
|
||||||
folderUid: string;
|
|
||||||
folderName: string;
|
|
||||||
newFolderUid?: string;
|
|
||||||
newFolderName?: string;
|
|
||||||
provisioned: boolean;
|
|
||||||
error?: string;
|
|
||||||
warning: string;
|
|
||||||
|
|
||||||
isUpgrading: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AlertPair {
|
|
||||||
legacyAlert: LegacyAlert;
|
|
||||||
alertRule?: AlertRuleUpgrade;
|
|
||||||
error?: string;
|
|
||||||
|
|
||||||
isUpgrading: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ContactPair {
|
|
||||||
legacyChannel: LegacyChannel;
|
|
||||||
contactPoint?: ContactPointUpgrade;
|
|
||||||
provisioned: boolean;
|
|
||||||
error?: string;
|
|
||||||
|
|
||||||
isUpgrading: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LegacyAlert {
|
|
||||||
id: number;
|
|
||||||
dashboardId: number;
|
|
||||||
panelId: number;
|
|
||||||
name: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface AlertRuleUpgrade {
|
|
||||||
uid: string;
|
|
||||||
title: string;
|
|
||||||
sendsTo: string[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LegacyChannel {
|
|
||||||
id: number;
|
|
||||||
name: string;
|
|
||||||
type: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ContactPointUpgrade {
|
|
||||||
name: string;
|
|
||||||
type: string;
|
|
||||||
routeMatchers: ObjectMatcher[];
|
|
||||||
}
|
|
||||||
|
|
||||||
function isFetchBaseQueryError(error: unknown): error is { error: FetchError } {
|
|
||||||
return typeof error === 'object' && error != null && 'error' in error;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const upgradeApi = alertingApi.injectEndpoints({
|
|
||||||
endpoints: (build) => ({
|
|
||||||
upgradeChannel: build.mutation<OrgMigrationSummary, { channelId: number; skipExisting: boolean }>({
|
|
||||||
query: ({ channelId, skipExisting }) => ({
|
|
||||||
url: `/api/v1/upgrade/channels/${channelId}${skipExisting ? '?skipExisting=true' : ''}`,
|
|
||||||
method: 'POST',
|
|
||||||
showSuccessAlert: false,
|
|
||||||
showErrorAlert: false,
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted({ channelId }, { dispatch, queryFulfilled }) {
|
|
||||||
try {
|
|
||||||
dispatch(
|
|
||||||
upgradeApi.util.updateQueryData('getOrgUpgradeSummary', undefined, (draft) => {
|
|
||||||
const index = (draft.migratedChannels ?? []).findIndex((pair) => pair.legacyChannel?.id === channelId);
|
|
||||||
if (index !== -1) {
|
|
||||||
draft.migratedChannels[index].isUpgrading = true;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
const { data } = await queryFulfilled;
|
|
||||||
if (data.hasErrors) {
|
|
||||||
dispatch(notifyApp(createWarningNotification(`Failed to upgrade notification channel '${channelId}'`)));
|
|
||||||
} else {
|
|
||||||
if (data.removed) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(
|
|
||||||
`Notification channel '${channelId}' not found, removed from list of upgrades`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createSuccessNotification(`Upgraded notification channel '${channelId}'`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (isFetchBaseQueryError(e) && isFetchError(e.error)) {
|
|
||||||
dispatch(notifyApp(createErrorNotification('Request failed', e.error.data.message)));
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createErrorNotification(`Request failed`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
upgradeAllChannels: build.mutation<OrgMigrationSummary, { skipExisting: boolean }>({
|
|
||||||
query: ({ skipExisting }) => ({
|
|
||||||
url: `/api/v1/upgrade/channels${skipExisting ? '?skipExisting=true' : ''}`,
|
|
||||||
method: 'POST',
|
|
||||||
showSuccessAlert: false,
|
|
||||||
showErrorAlert: false,
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted({ skipExisting }, { dispatch, queryFulfilled }) {
|
|
||||||
try {
|
|
||||||
const { data } = await queryFulfilled;
|
|
||||||
if (data.hasErrors) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createWarningNotification(
|
|
||||||
`Issues while upgrading ${data.newChannels} ${skipExisting ? 'new ' : ''}notification channels`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(
|
|
||||||
`Upgraded ${data.newChannels} ${skipExisting ? 'new ' : ''}notification channels`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (isFetchBaseQueryError(e) && isFetchError(e.error)) {
|
|
||||||
dispatch(notifyApp(createErrorNotification('Request failed', e.error.data.message)));
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createErrorNotification(`Request failed`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
upgradeAlert: build.mutation<OrgMigrationSummary, { dashboardId: number; panelId: number; skipExisting: boolean }>({
|
|
||||||
query: ({ dashboardId, panelId, skipExisting }) => ({
|
|
||||||
url: `/api/v1/upgrade/dashboards/${dashboardId}/panels/${panelId}${skipExisting ? '?skipExisting=true' : ''}`,
|
|
||||||
method: 'POST',
|
|
||||||
showSuccessAlert: false,
|
|
||||||
showErrorAlert: false,
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted({ dashboardId, panelId }, { dispatch, queryFulfilled }) {
|
|
||||||
try {
|
|
||||||
dispatch(
|
|
||||||
upgradeApi.util.updateQueryData('getOrgUpgradeSummary', undefined, (draft) => {
|
|
||||||
const index = (draft.migratedDashboards ?? []).findIndex((du) => du.dashboardId === dashboardId);
|
|
||||||
if (index !== -1) {
|
|
||||||
const alertIndex = (draft.migratedDashboards[index]?.migratedAlerts ?? []).findIndex(
|
|
||||||
(pair) => pair.legacyAlert?.panelId === panelId
|
|
||||||
);
|
|
||||||
if (alertIndex !== -1) {
|
|
||||||
draft.migratedDashboards[index].migratedAlerts[alertIndex].isUpgrading = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
const { data } = await queryFulfilled;
|
|
||||||
if (data.hasErrors) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createWarningNotification(`Failed to upgrade alert from dashboard '${dashboardId}', panel '${panelId}'`)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
if (data.removed) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(
|
|
||||||
`Alert from dashboard '${dashboardId}', panel '${panelId}' not found, removed from list of upgrades`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(`Upgraded alert from dashboard '${dashboardId}', panel '${panelId}'`)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (isFetchBaseQueryError(e) && isFetchError(e.error)) {
|
|
||||||
dispatch(notifyApp(createErrorNotification('Request failed', e.error.data.message)));
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createErrorNotification(`Request failed`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
upgradeDashboard: build.mutation<OrgMigrationSummary, { dashboardId: number; skipExisting: boolean }>({
|
|
||||||
query: ({ dashboardId, skipExisting }) => ({
|
|
||||||
url: `/api/v1/upgrade/dashboards/${dashboardId}${skipExisting ? '?skipExisting=true' : ''}`,
|
|
||||||
method: 'POST',
|
|
||||||
showSuccessAlert: false,
|
|
||||||
showErrorAlert: false,
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted({ dashboardId, skipExisting }, { dispatch, queryFulfilled }) {
|
|
||||||
try {
|
|
||||||
dispatch(
|
|
||||||
upgradeApi.util.updateQueryData('getOrgUpgradeSummary', undefined, (draft) => {
|
|
||||||
const index = (draft.migratedDashboards ?? []).findIndex((du) => du.dashboardId === dashboardId);
|
|
||||||
if (index !== -1) {
|
|
||||||
draft.migratedDashboards[index].isUpgrading = true;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
const { data } = await queryFulfilled;
|
|
||||||
if (data.hasErrors) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createWarningNotification(
|
|
||||||
`Issues while upgrading ${data.newAlerts} ${
|
|
||||||
skipExisting ? 'new ' : ''
|
|
||||||
}alerts from dashboard '${dashboardId}'`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
if (data.removed) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(`Dashboard '${dashboardId}' not found, removed from list of upgrades`)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(
|
|
||||||
`Upgraded ${data.newAlerts} ${skipExisting ? 'new ' : ''}alerts from dashboard '${dashboardId}'`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (isFetchBaseQueryError(e) && isFetchError(e.error)) {
|
|
||||||
dispatch(notifyApp(createErrorNotification('Request failed', e.error.data.message)));
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createErrorNotification(`Request failed`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
upgradeAllDashboards: build.mutation<OrgMigrationSummary, { skipExisting: boolean }>({
|
|
||||||
query: ({ skipExisting }) => ({
|
|
||||||
url: `/api/v1/upgrade/dashboards${skipExisting ? '?skipExisting=true' : ''}`,
|
|
||||||
method: 'POST',
|
|
||||||
showSuccessAlert: false,
|
|
||||||
showErrorAlert: false,
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted({ skipExisting }, { dispatch, queryFulfilled }) {
|
|
||||||
try {
|
|
||||||
const { data } = await queryFulfilled;
|
|
||||||
if (data.hasErrors) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createWarningNotification(
|
|
||||||
`Issues while upgrading ${data.newAlerts} ${skipExisting ? 'new ' : ''}alerts in ${
|
|
||||||
data.newDashboards
|
|
||||||
} dashboards`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(
|
|
||||||
`Upgraded ${data.newAlerts} ${skipExisting ? 'new ' : ''}alerts in ${data.newDashboards} dashboards`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (isFetchBaseQueryError(e) && isFetchError(e.error)) {
|
|
||||||
dispatch(notifyApp(createErrorNotification('Request failed', e.error.data.message)));
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createErrorNotification(`Request failed`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
upgradeOrg: build.mutation<OrgMigrationSummary, { skipExisting: boolean }>({
|
|
||||||
query: ({ skipExisting }) => ({
|
|
||||||
url: `/api/v1/upgrade/org${skipExisting ? '?skipExisting=true' : ''}`,
|
|
||||||
method: 'POST',
|
|
||||||
showSuccessAlert: false,
|
|
||||||
showErrorAlert: false,
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted({ skipExisting }, { dispatch, getCacheEntry, queryFulfilled }) {
|
|
||||||
try {
|
|
||||||
const { data } = await queryFulfilled;
|
|
||||||
if (data.hasErrors) {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createWarningNotification(
|
|
||||||
`Issues while upgrading ${data.newAlerts} ${skipExisting ? 'new ' : ''}alerts in ${
|
|
||||||
data.newDashboards
|
|
||||||
} dashboards and ${data.newChannels} ${skipExisting ? 'new ' : ''}notification channels`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
dispatch(
|
|
||||||
notifyApp(
|
|
||||||
createSuccessNotification(
|
|
||||||
`Upgraded ${data.newAlerts} ${skipExisting ? 'new ' : ''}alerts in ${
|
|
||||||
data.newDashboards
|
|
||||||
} dashboards and ${data.newChannels} ${skipExisting ? 'new ' : ''}notification channels`
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (isFetchBaseQueryError(e) && isFetchError(e.error)) {
|
|
||||||
dispatch(notifyApp(createErrorNotification('Request failed', e.error.data.message)));
|
|
||||||
} else {
|
|
||||||
dispatch(notifyApp(createErrorNotification(`Request failed`)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
cancelOrgUpgrade: build.mutation<void, void>({
|
|
||||||
query: () => ({
|
|
||||||
url: `/api/v1/upgrade/org`,
|
|
||||||
method: 'DELETE',
|
|
||||||
}),
|
|
||||||
invalidatesTags: ['OrgMigrationState'],
|
|
||||||
async onQueryStarted(undefined, { dispatch }) {
|
|
||||||
// This helps prevent flickering of old tables after the cancel button is clicked.
|
|
||||||
try {
|
|
||||||
dispatch(
|
|
||||||
upgradeApi.util.updateQueryData('getOrgUpgradeSummary', undefined, (draft) => {
|
|
||||||
const defaultState: OrgMigrationState = {
|
|
||||||
orgId: 0,
|
|
||||||
migratedDashboards: [],
|
|
||||||
migratedChannels: [],
|
|
||||||
errors: [],
|
|
||||||
};
|
|
||||||
Object.assign(draft, defaultState);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} catch {}
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
getOrgUpgradeSummary: build.query<OrgMigrationState, void>({
|
|
||||||
query: () => ({
|
|
||||||
url: `/api/v1/upgrade/org`,
|
|
||||||
}),
|
|
||||||
providesTags: ['OrgMigrationState'],
|
|
||||||
transformResponse: (summary: OrgMigrationState): OrgMigrationState => {
|
|
||||||
summary.migratedDashboards = summary.migratedDashboards ?? [];
|
|
||||||
summary.migratedChannels = summary.migratedChannels ?? [];
|
|
||||||
summary.errors = summary.errors ?? [];
|
|
||||||
|
|
||||||
// Sort to show the most problematic rows first.
|
|
||||||
summary.migratedDashboards.forEach((dashUpgrade) => {
|
|
||||||
// dashUpgrade.isUpgrading = false;
|
|
||||||
dashUpgrade.migratedAlerts = dashUpgrade.migratedAlerts ?? [];
|
|
||||||
dashUpgrade.error = dashUpgrade.error ?? '';
|
|
||||||
dashUpgrade.warning = dashUpgrade.warning ?? '';
|
|
||||||
dashUpgrade.migratedAlerts.sort((a, b) => {
|
|
||||||
const byError = (b.error ?? '').localeCompare(a.error ?? '');
|
|
||||||
if (byError !== 0) {
|
|
||||||
return byError;
|
|
||||||
}
|
|
||||||
return (a.legacyAlert?.name ?? '').localeCompare(b.legacyAlert?.name ?? '');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
summary.migratedDashboards.sort((a, b) => {
|
|
||||||
const byErrors = (b.error ?? '').localeCompare(a.error ?? '');
|
|
||||||
if (byErrors !== 0) {
|
|
||||||
return byErrors;
|
|
||||||
}
|
|
||||||
const byNestedErrors =
|
|
||||||
b.migratedAlerts.filter((a) => a.error).length - a.migratedAlerts.filter((a) => a.error).length;
|
|
||||||
if (byNestedErrors !== 0) {
|
|
||||||
return byNestedErrors;
|
|
||||||
}
|
|
||||||
const byWarnings = (b.warning ?? '').localeCompare(a.warning ?? '');
|
|
||||||
if (byWarnings !== 0) {
|
|
||||||
return byWarnings;
|
|
||||||
}
|
|
||||||
const byFolder = a.folderName.localeCompare(b.folderName);
|
|
||||||
if (byFolder !== 0) {
|
|
||||||
return byFolder;
|
|
||||||
}
|
|
||||||
return a.dashboardName.localeCompare(b.dashboardName);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Sort contacts.
|
|
||||||
summary.migratedChannels.sort((a, b) => {
|
|
||||||
const byErrors = (b.error ? 1 : 0) - (a.error ? 1 : 0);
|
|
||||||
if (byErrors !== 0) {
|
|
||||||
return byErrors;
|
|
||||||
}
|
|
||||||
return (a.legacyChannel?.name ?? '').localeCompare(b.legacyChannel?.name ?? '');
|
|
||||||
});
|
|
||||||
|
|
||||||
return summary;
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
}),
|
|
||||||
});
|
|
Loading…
Reference in New Issue
Block a user