mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Feature Toggle Management: allow editing PublicPreview toggles * lint * fix a bunch of tests * tests are passing * add permissions unit tests back * fix display * close dialog after submit * use reload method after submit * make local development easier * always show editing alert in the UI * fix readme --------- Co-authored-by: Michael Mandrus <michael.mandrus@grafana.com>
78 lines
1.9 KiB
TypeScript
78 lines
1.9 KiB
TypeScript
import { getBackendSrv } from '@grafana/runtime';
|
|
|
|
export type FeatureToggle = {
|
|
name: string;
|
|
description?: string;
|
|
enabled: boolean;
|
|
stage: string;
|
|
readOnly?: boolean;
|
|
hidden?: boolean;
|
|
};
|
|
|
|
export type CurrentTogglesState = {
|
|
restartRequired: boolean;
|
|
allowEditing: boolean;
|
|
toggles: FeatureToggle[];
|
|
};
|
|
|
|
interface ResolvedToggleState {
|
|
kind: 'ResolvedToggleState';
|
|
restartRequired?: boolean;
|
|
allowEditing?: boolean;
|
|
toggles?: K8sToggleSpec[]; // not used in patch
|
|
enabled: { [key: string]: boolean };
|
|
}
|
|
|
|
interface K8sToggleSpec {
|
|
name: string;
|
|
description: string;
|
|
enabled: boolean;
|
|
writeable: boolean;
|
|
source: K8sToggleSource;
|
|
stage: string;
|
|
}
|
|
|
|
interface K8sToggleSource {
|
|
namespace: string;
|
|
name: string;
|
|
}
|
|
|
|
interface FeatureTogglesAPI {
|
|
getFeatureToggles(): Promise<CurrentTogglesState>;
|
|
updateFeatureToggles(toggles: FeatureToggle[]): Promise<void>;
|
|
}
|
|
|
|
class K8sAPI implements FeatureTogglesAPI {
|
|
baseURL = '/apis/featuretoggle.grafana.app/v0alpha1';
|
|
|
|
async getFeatureToggles(): Promise<CurrentTogglesState> {
|
|
const current = await getBackendSrv().get<ResolvedToggleState>(this.baseURL + '/current');
|
|
return {
|
|
restartRequired: Boolean(current.restartRequired),
|
|
allowEditing: Boolean(current.allowEditing),
|
|
toggles: current.toggles!.map((t) => ({
|
|
name: t.name,
|
|
description: t.description!,
|
|
enabled: t.enabled,
|
|
readOnly: !Boolean(t.writeable),
|
|
stage: t.stage,
|
|
hidden: false, // only return visible things
|
|
})),
|
|
};
|
|
}
|
|
updateFeatureToggles(toggles: FeatureToggle[]): Promise<void> {
|
|
const patchBody: ResolvedToggleState = {
|
|
kind: 'ResolvedToggleState',
|
|
enabled: {},
|
|
};
|
|
toggles.forEach((t) => {
|
|
patchBody.enabled[t.name] = t.enabled;
|
|
});
|
|
return getBackendSrv().patch(this.baseURL + '/current', patchBody);
|
|
}
|
|
}
|
|
|
|
export const getTogglesAPI = (): FeatureTogglesAPI => {
|
|
return new K8sAPI();
|
|
};
|