1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Refactor helm-release.api to use free functions instead of an object (#2264)

- Rename functions to be more descriptive

- Change all functions to be Promise based

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2021-04-20 10:51:45 -04:00 committed by GitHub
parent f17ce17fe9
commit a2be178191
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 65 additions and 67 deletions

View File

@ -6,6 +6,7 @@ import { apiBase } from "../index";
import { helmChartStore } from "../../components/+apps-helm-charts/helm-chart.store"; import { helmChartStore } from "../../components/+apps-helm-charts/helm-chart.store";
import { ItemObject } from "../../item.store"; import { ItemObject } from "../../item.store";
import { KubeObject } from "../kube-object"; import { KubeObject } from "../kube-object";
import { JsonApiData } from "../json-api";
interface IReleasePayload { interface IReleasePayload {
name: string; name: string;
@ -68,73 +69,70 @@ const endpoint = compile(`/v2/releases/:namespace?/:name?`) as (
} }
) => string; ) => string;
export const helmReleasesApi = { export async function listReleases(namespace?: string): Promise<HelmRelease[]> {
list(namespace?: string) { const releases = await apiBase.get<HelmRelease[]>(endpoint({ namespace }));
return apiBase
.get<HelmRelease[]>(endpoint({ namespace }))
.then(releases => releases.map(HelmRelease.create));
},
get(name: string, namespace: string) { return releases.map(HelmRelease.create);
const path = endpoint({ name, namespace }); }
return apiBase.get<IReleaseRawDetails>(path).then(details => { export async function getRelease(name: string, namespace: string): Promise<IReleaseDetails> {
const items: KubeObject[] = JSON.parse(details.resources).items; const path = endpoint({ name, namespace });
const resources = items.map(item => KubeObject.create(item));
return { const details = await apiBase.get<IReleaseRawDetails>(path);
...details, const items: KubeObject[] = JSON.parse(details.resources).items;
resources const resources = items.map(item => KubeObject.create(item));
};
});
},
create(payload: IReleaseCreatePayload): Promise<IReleaseUpdateDetails> { return {
const { repo, ...data } = payload; ...details,
resources
};
}
data.chart = `${repo}/${data.chart}`; export async function createRelease(payload: IReleaseCreatePayload): Promise<IReleaseUpdateDetails> {
data.values = jsYaml.safeLoad(data.values); const { repo, ...data } = payload;
return apiBase.post(endpoint(), { data }); data.chart = `${repo}/${data.chart}`;
}, data.values = jsYaml.safeLoad(data.values);
update(name: string, namespace: string, payload: IReleaseUpdatePayload): Promise<IReleaseUpdateDetails> { return apiBase.post(endpoint(), { data });
const { repo, ...data } = payload; }
data.chart = `${repo}/${data.chart}`; export async function updateRelease(name: string, namespace: string, payload: IReleaseUpdatePayload): Promise<IReleaseUpdateDetails> {
data.values = jsYaml.safeLoad(data.values); const { repo, ...data } = payload;
return apiBase.put(endpoint({ name, namespace }), { data }); data.chart = `${repo}/${data.chart}`;
}, data.values = jsYaml.safeLoad(data.values);
async delete(name: string, namespace: string) { return apiBase.put(endpoint({ name, namespace }), { data });
const path = endpoint({ name, namespace }); }
return apiBase.del(path); export async function deleteRelease(name: string, namespace: string): Promise<JsonApiData> {
}, const path = endpoint({ name, namespace });
getValues(name: string, namespace: string) { return apiBase.del(path);
const path = `${endpoint({ name, namespace })}/values`; }
return apiBase.get<string>(path); export async function getReleaseValues(name: string, namespace: string): Promise<string> {
}, const path = `${endpoint({ name, namespace })}/values`;
getHistory(name: string, namespace: string): Promise<IReleaseRevision[]> { return apiBase.get<string>(path);
const path = `${endpoint({ name, namespace })}/history`; }
return apiBase.get(path); export async function getReleaseHistory(name: string, namespace: string): Promise<IReleaseRevision[]> {
}, const path = `${endpoint({ name, namespace })}/history`;
rollback(name: string, namespace: string, revision: number) { return apiBase.get(path);
const path = `${endpoint({ name, namespace })}/rollback`; }
return apiBase.put(path, { export async function rollbackRelease(name: string, namespace: string, revision: number): Promise<JsonApiData> {
data: { const path = `${endpoint({ name, namespace })}/rollback`;
revision
} return apiBase.put(path, {
}); data: {
} revision
}; }
});
}
@autobind() @autobind()
export class HelmRelease implements ItemObject { export class HelmRelease implements ItemObject {

View File

@ -6,7 +6,7 @@ import isEqual from "lodash/isEqual";
import { observable, reaction } from "mobx"; import { observable, reaction } from "mobx";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import kebabCase from "lodash/kebabCase"; import kebabCase from "lodash/kebabCase";
import { HelmRelease, helmReleasesApi, IReleaseDetails } from "../../api/endpoints/helm-releases.api"; import { getRelease, getReleaseValues, HelmRelease, IReleaseDetails } from "../../api/endpoints/helm-releases.api";
import { HelmReleaseMenu } from "./release-menu"; import { HelmReleaseMenu } from "./release-menu";
import { Drawer, DrawerItem, DrawerTitle } from "../drawer"; import { Drawer, DrawerItem, DrawerTitle } from "../drawer";
import { Badge } from "../badge"; import { Badge } from "../badge";
@ -65,14 +65,14 @@ export class ReleaseDetails extends Component<Props> {
const { release } = this.props; const { release } = this.props;
this.details = null; this.details = null;
this.details = await helmReleasesApi.get(release.getName(), release.getNs()); this.details = await getRelease(release.getName(), release.getNs());
} }
async loadValues() { async loadValues() {
const { release } = this.props; const { release } = this.props;
this.values = ""; this.values = "";
this.values = await helmReleasesApi.getValues(release.getName(), release.getNs()); this.values = await getReleaseValues(release.getName(), release.getNs());
} }
updateValues = async () => { updateValues = async () => {

View File

@ -5,7 +5,7 @@ import { observable } from "mobx";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import { Dialog, DialogProps } from "../dialog"; import { Dialog, DialogProps } from "../dialog";
import { Wizard, WizardStep } from "../wizard"; import { Wizard, WizardStep } from "../wizard";
import { HelmRelease, helmReleasesApi, IReleaseRevision } from "../../api/endpoints/helm-releases.api"; import { getReleaseHistory, HelmRelease, IReleaseRevision } from "../../api/endpoints/helm-releases.api";
import { releaseStore } from "./release.store"; import { releaseStore } from "./release.store";
import { Select, SelectOption } from "../select"; import { Select, SelectOption } from "../select";
import { Notifications } from "../notifications"; import { Notifications } from "../notifications";
@ -39,7 +39,7 @@ export class ReleaseRollbackDialog extends React.Component<Props> {
onOpen = async () => { onOpen = async () => {
this.isLoading = true; this.isLoading = true;
const currentRevision = this.release.getRevision(); const currentRevision = this.release.getRevision();
let releases = await helmReleasesApi.getHistory(this.release.getName(), this.release.getNs()); let releases = await getReleaseHistory(this.release.getName(), this.release.getNs());
releases = releases.filter(item => item.revision !== currentRevision); // remove current releases = releases.filter(item => item.revision !== currentRevision); // remove current
releases = orderBy(releases, "revision", "desc"); // sort releases = orderBy(releases, "revision", "desc"); // sort

View File

@ -1,7 +1,7 @@
import isEqual from "lodash/isEqual"; import isEqual from "lodash/isEqual";
import { action, observable, reaction, when } from "mobx"; import { action, observable, reaction, when } from "mobx";
import { autobind } from "../../utils"; import { autobind } from "../../utils";
import { HelmRelease, helmReleasesApi, IReleaseCreatePayload, IReleaseUpdatePayload } from "../../api/endpoints/helm-releases.api"; import { createRelease, deleteRelease, HelmRelease, IReleaseCreatePayload, IReleaseUpdatePayload, listReleases, rollbackRelease, updateRelease } from "../../api/endpoints/helm-releases.api";
import { ItemStore } from "../../item.store"; import { ItemStore } from "../../item.store";
import { Secret } from "../../api/endpoints"; import { Secret } from "../../api/endpoints";
import { secretsStore } from "../+config-secrets/secrets.store"; import { secretsStore } from "../+config-secrets/secrets.store";
@ -88,16 +88,16 @@ export class ReleaseStore extends ItemStore<HelmRelease> {
&& namespaceStore.context.allNamespaces.every(ns => namespaces.includes(ns)); && namespaceStore.context.allNamespaces.every(ns => namespaces.includes(ns));
if (isLoadingAll) { if (isLoadingAll) {
return helmReleasesApi.list(); return listReleases();
} else {
return Promise // load resources per namespace
.all(namespaces.map(namespace => helmReleasesApi.list(namespace)))
.then(items => items.flat());
} }
return Promise // load resources per namespace
.all(namespaces.map(namespace => listReleases(namespace)))
.then(items => items.flat());
} }
async create(payload: IReleaseCreatePayload) { async create(payload: IReleaseCreatePayload) {
const response = await helmReleasesApi.create(payload); const response = await createRelease(payload);
if (this.isLoaded) this.loadFromContextNamespaces(); if (this.isLoaded) this.loadFromContextNamespaces();
@ -105,7 +105,7 @@ export class ReleaseStore extends ItemStore<HelmRelease> {
} }
async update(name: string, namespace: string, payload: IReleaseUpdatePayload) { async update(name: string, namespace: string, payload: IReleaseUpdatePayload) {
const response = await helmReleasesApi.update(name, namespace, payload); const response = await updateRelease(name, namespace, payload);
if (this.isLoaded) this.loadFromContextNamespaces(); if (this.isLoaded) this.loadFromContextNamespaces();
@ -113,7 +113,7 @@ export class ReleaseStore extends ItemStore<HelmRelease> {
} }
async rollback(name: string, namespace: string, revision: number) { async rollback(name: string, namespace: string, revision: number) {
const response = await helmReleasesApi.rollback(name, namespace, revision); const response = await rollbackRelease(name, namespace, revision);
if (this.isLoaded) this.loadFromContextNamespaces(); if (this.isLoaded) this.loadFromContextNamespaces();
@ -121,7 +121,7 @@ export class ReleaseStore extends ItemStore<HelmRelease> {
} }
async remove(release: HelmRelease) { async remove(release: HelmRelease) {
return super.removeItem(release, () => helmReleasesApi.delete(release.getName(), release.getNs())); return super.removeItem(release, () => deleteRelease(release.getName(), release.getNs()));
} }
async removeSelectedItems() { async removeSelectedItems() {

View File

@ -1,7 +1,7 @@
import { action, autorun, IReactionDisposer, reaction } from "mobx"; import { action, autorun, IReactionDisposer, reaction } from "mobx";
import { dockStore, IDockTab, TabId, TabKind } from "./dock.store"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.store";
import { DockTabStore } from "./dock-tab.store"; import { DockTabStore } from "./dock-tab.store";
import { HelmRelease, helmReleasesApi } from "../../api/endpoints/helm-releases.api"; import { getReleaseValues, HelmRelease } from "../../api/endpoints/helm-releases.api";
import { releaseStore } from "../+apps-releases/release.store"; import { releaseStore } from "../+apps-releases/release.store";
export interface IChartUpgradeData { export interface IChartUpgradeData {
@ -89,7 +89,7 @@ export class UpgradeChartStore extends DockTabStore<IChartUpgradeData> {
async loadValues(tabId: TabId) { async loadValues(tabId: TabId) {
this.values.clearData(tabId); // reset this.values.clearData(tabId); // reset
const { releaseName, releaseNamespace } = this.getData(tabId); const { releaseName, releaseNamespace } = this.getData(tabId);
const values = await helmReleasesApi.getValues(releaseName, releaseNamespace); const values = await getReleaseValues(releaseName, releaseNamespace);
this.values.setData(tabId, values); this.values.setData(tabId, values);
} }