73 lines
3.1 KiB
TypeScript
73 lines
3.1 KiB
TypeScript
import { createAction, createReducer } from '@reduxjs/toolkit';
|
|
import { remove } from 'lodash';
|
|
|
|
import { AlertManagerCortexConfig, MuteTimeInterval } from 'app/plugins/datasource/alertmanager/types';
|
|
|
|
import { removeTimeIntervalFromRoute, renameTimeInterval } from '../../utils/alertmanager';
|
|
|
|
export const addMuteTimingAction = createAction<{ interval: MuteTimeInterval }>('muteTiming/add');
|
|
export const updateMuteTimingAction = createAction<{
|
|
interval: MuteTimeInterval;
|
|
originalName: string;
|
|
}>('muteTiming/update');
|
|
export const deleteMuteTimingAction = createAction<{ name: string }>('muteTiming/delete');
|
|
|
|
const initialState: AlertManagerCortexConfig = {
|
|
alertmanager_config: {},
|
|
template_files: {},
|
|
};
|
|
|
|
/**
|
|
* This reducer will manage action related to mute timings and make sure all operations on the alertmanager
|
|
* configuration happen immutably and only mutate what they need.
|
|
*/
|
|
export const muteTimingsReducer = createReducer(initialState, (builder) => {
|
|
builder
|
|
// add a mute timing to the alertmanager configuration
|
|
.addCase(addMuteTimingAction, (draft, { payload }) => {
|
|
const { interval } = payload;
|
|
draft.alertmanager_config.time_intervals = (draft.alertmanager_config.time_intervals ?? []).concat(interval);
|
|
})
|
|
// add a mute timing to the alertmanager configuration
|
|
// make sure we update the mute timing in either the deprecated or the new time intervals property
|
|
.addCase(updateMuteTimingAction, (draft, { payload }) => {
|
|
const { interval, originalName } = payload;
|
|
const nameHasChanged = interval.name !== originalName;
|
|
|
|
const timeIntervals = draft.alertmanager_config.time_intervals ?? [];
|
|
const muteTimeIntervals = draft.alertmanager_config.mute_time_intervals ?? [];
|
|
|
|
const existingIntervalIndex = timeIntervals.findIndex(({ name }) => name === originalName);
|
|
if (existingIntervalIndex !== -1) {
|
|
timeIntervals[existingIntervalIndex] = interval;
|
|
}
|
|
|
|
const existingMuteIntervalIndex = muteTimeIntervals.findIndex(({ name }) => name === originalName);
|
|
if (existingMuteIntervalIndex !== -1) {
|
|
muteTimeIntervals[existingMuteIntervalIndex] = interval;
|
|
}
|
|
|
|
if (nameHasChanged && draft.alertmanager_config.route) {
|
|
draft.alertmanager_config.route = renameTimeInterval(
|
|
interval.name,
|
|
originalName,
|
|
draft.alertmanager_config.route
|
|
);
|
|
}
|
|
})
|
|
// delete a mute timing from the alertmanager configuration, since the configuration might be using the "deprecated" mute_time_intervals
|
|
// let's also check there
|
|
.addCase(deleteMuteTimingAction, (draft, { payload }) => {
|
|
const { name } = payload;
|
|
const { alertmanager_config } = draft;
|
|
const { time_intervals = [], mute_time_intervals = [] } = alertmanager_config;
|
|
|
|
// remove the mute timings from the legacy and new time intervals definition
|
|
remove(time_intervals, (interval) => interval.name === name);
|
|
remove(mute_time_intervals, (interval) => interval.name === name);
|
|
|
|
// remove the mute timing from all routes
|
|
alertmanager_config.route = removeTimeIntervalFromRoute(name, alertmanager_config.route ?? {});
|
|
});
|
|
});
|