From 086710cefe1b3e008dfa725c495bd6d19c44457a Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Mon, 1 Mar 2021 12:38:35 -0500 Subject: [PATCH] Refactor helm-release.api to use free functions instead of an object - Rename functions to be more descriptive - Change all functions to be Promise based Signed-off-by: Sebastian Malton --- .../api/endpoints/helm-releases.api.ts | 98 +++++++++---------- .../+apps-releases/release-details.tsx | 6 +- .../release-rollback-dialog.tsx | 4 +- .../+apps-releases/release.store.ts | 20 ++-- .../components/dock/upgrade-chart.store.ts | 4 +- 5 files changed, 65 insertions(+), 67 deletions(-) diff --git a/src/renderer/api/endpoints/helm-releases.api.ts b/src/renderer/api/endpoints/helm-releases.api.ts index 9a5a6dadd0..0bb16ff799 100644 --- a/src/renderer/api/endpoints/helm-releases.api.ts +++ b/src/renderer/api/endpoints/helm-releases.api.ts @@ -6,6 +6,7 @@ import { apiBase } from "../index"; import { helmChartStore } from "../../components/+apps-helm-charts/helm-chart.store"; import { ItemObject } from "../../item.store"; import { KubeObject } from "../kube-object"; +import { JsonApiData } from "../json-api"; interface IReleasePayload { name: string; @@ -68,73 +69,70 @@ const endpoint = compile(`/v2/releases/:namespace?/:name?`) as ( } ) => string; -export const helmReleasesApi = { - list(namespace?: string) { - return apiBase - .get(endpoint({ namespace })) - .then(releases => releases.map(HelmRelease.create)); - }, +export async function listReleases(namespace?: string): Promise { + const releases = await apiBase.get(endpoint({ namespace })); - get(name: string, namespace: string) { - const path = endpoint({ name, namespace }); + return releases.map(HelmRelease.create); +} - return apiBase.get(path).then(details => { - const items: KubeObject[] = JSON.parse(details.resources).items; - const resources = items.map(item => KubeObject.create(item)); +export async function getRelease(name: string, namespace: string): Promise { + const path = endpoint({ name, namespace }); - return { - ...details, - resources - }; - }); - }, + const details = await apiBase.get(path); + const items: KubeObject[] = JSON.parse(details.resources).items; + const resources = items.map(item => KubeObject.create(item)); - create(payload: IReleaseCreatePayload): Promise { - const { repo, ...data } = payload; + return { + ...details, + resources + }; +} - data.chart = `${repo}/${data.chart}`; - data.values = jsYaml.safeLoad(data.values); +export async function createRelease(payload: IReleaseCreatePayload): Promise { + 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 { - const { repo, ...data } = payload; + return apiBase.post(endpoint(), { data }); +} - data.chart = `${repo}/${data.chart}`; - data.values = jsYaml.safeLoad(data.values); +export async function updateRelease(name: string, namespace: string, payload: IReleaseUpdatePayload): Promise { + 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) { - const path = endpoint({ name, namespace }); + return apiBase.put(endpoint({ name, namespace }), { data }); +} - return apiBase.del(path); - }, +export async function deleteRelease(name: string, namespace: string): Promise { + const path = endpoint({ name, namespace }); - getValues(name: string, namespace: string) { - const path = `${endpoint({ name, namespace })}/values`; + return apiBase.del(path); +} - return apiBase.get(path); - }, +export async function getReleaseValues(name: string, namespace: string): Promise { + const path = `${endpoint({ name, namespace })}/values`; - getHistory(name: string, namespace: string): Promise { - const path = `${endpoint({ name, namespace })}/history`; + return apiBase.get(path); +} - return apiBase.get(path); - }, +export async function getReleaseHistory(name: string, namespace: string): Promise { + const path = `${endpoint({ name, namespace })}/history`; - rollback(name: string, namespace: string, revision: number) { - const path = `${endpoint({ name, namespace })}/rollback`; + return apiBase.get(path); +} - return apiBase.put(path, { - data: { - revision - } - }); - } -}; +export async function rollbackRelease(name: string, namespace: string, revision: number): Promise { + const path = `${endpoint({ name, namespace })}/rollback`; + + return apiBase.put(path, { + data: { + revision + } + }); +} @autobind() export class HelmRelease implements ItemObject { diff --git a/src/renderer/components/+apps-releases/release-details.tsx b/src/renderer/components/+apps-releases/release-details.tsx index e139569937..626da71b2d 100644 --- a/src/renderer/components/+apps-releases/release-details.tsx +++ b/src/renderer/components/+apps-releases/release-details.tsx @@ -6,7 +6,7 @@ import isEqual from "lodash/isEqual"; import { observable, reaction } from "mobx"; import { Link } from "react-router-dom"; 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 { Drawer, DrawerItem, DrawerTitle } from "../drawer"; import { Badge } from "../badge"; @@ -65,14 +65,14 @@ export class ReleaseDetails extends Component { const { release } = this.props; this.details = null; - this.details = await helmReleasesApi.get(release.getName(), release.getNs()); + this.details = await getRelease(release.getName(), release.getNs()); } async loadValues() { const { release } = this.props; this.values = ""; - this.values = await helmReleasesApi.getValues(release.getName(), release.getNs()); + this.values = await getReleaseValues(release.getName(), release.getNs()); } updateValues = async () => { diff --git a/src/renderer/components/+apps-releases/release-rollback-dialog.tsx b/src/renderer/components/+apps-releases/release-rollback-dialog.tsx index 4aef4ec356..3b363d9e4e 100644 --- a/src/renderer/components/+apps-releases/release-rollback-dialog.tsx +++ b/src/renderer/components/+apps-releases/release-rollback-dialog.tsx @@ -5,7 +5,7 @@ import { observable } from "mobx"; import { observer } from "mobx-react"; import { Dialog, DialogProps } from "../dialog"; 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 { Select, SelectOption } from "../select"; import { Notifications } from "../notifications"; @@ -39,7 +39,7 @@ export class ReleaseRollbackDialog extends React.Component { onOpen = async () => { this.isLoading = true; 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 = orderBy(releases, "revision", "desc"); // sort diff --git a/src/renderer/components/+apps-releases/release.store.ts b/src/renderer/components/+apps-releases/release.store.ts index 1da5e61e89..faeb509b71 100644 --- a/src/renderer/components/+apps-releases/release.store.ts +++ b/src/renderer/components/+apps-releases/release.store.ts @@ -1,7 +1,7 @@ import isEqual from "lodash/isEqual"; import { action, observable, reaction, when } from "mobx"; 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 { Secret } from "../../api/endpoints"; import { secretsStore } from "../+config-secrets/secrets.store"; @@ -88,16 +88,16 @@ export class ReleaseStore extends ItemStore { && namespaceStore.context.allNamespaces.every(ns => namespaces.includes(ns)); if (isLoadingAll) { - return helmReleasesApi.list(); - } else { - return Promise // load resources per namespace - .all(namespaces.map(namespace => helmReleasesApi.list(namespace))) - .then(items => items.flat()); + return listReleases(); } + + return Promise // load resources per namespace + .all(namespaces.map(namespace => listReleases(namespace))) + .then(items => items.flat()); } async create(payload: IReleaseCreatePayload) { - const response = await helmReleasesApi.create(payload); + const response = await createRelease(payload); if (this.isLoaded) this.loadFromContextNamespaces(); @@ -105,7 +105,7 @@ export class ReleaseStore extends ItemStore { } 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(); @@ -113,7 +113,7 @@ export class ReleaseStore extends ItemStore { } 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(); @@ -121,7 +121,7 @@ export class ReleaseStore extends ItemStore { } 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() { diff --git a/src/renderer/components/dock/upgrade-chart.store.ts b/src/renderer/components/dock/upgrade-chart.store.ts index 78fb4d5072..d2573f42e2 100644 --- a/src/renderer/components/dock/upgrade-chart.store.ts +++ b/src/renderer/components/dock/upgrade-chart.store.ts @@ -1,7 +1,7 @@ import { action, autorun, IReactionDisposer, reaction } from "mobx"; import { dockStore, IDockTab, TabId, TabKind } from "./dock.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"; export interface IChartUpgradeData { @@ -89,7 +89,7 @@ export class UpgradeChartStore extends DockTabStore { async loadValues(tabId: TabId) { this.values.clearData(tabId); // reset const { releaseName, releaseNamespace } = this.getData(tabId); - const values = await helmReleasesApi.getValues(releaseName, releaseNamespace); + const values = await getReleaseValues(releaseName, releaseNamespace); this.values.setData(tabId, values); }