2025-04-01 10:38:02 +09:00

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 ?? {});
});
});