diff --git a/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts b/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts index 4beb828a95..9820551576 100644 --- a/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts +++ b/packages/core/src/features/helm-charts/installing-chart/installing-helm-chart-from-new-tab.test.ts @@ -71,7 +71,7 @@ describe("installing helm chart from new tab", () => { ); }); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { listClusterHelmReleasesMock = asyncFn(); mainDi.override(listClusterHelmReleasesInjectable, () => listClusterHelmReleasesMock); }); @@ -403,8 +403,8 @@ describe("installing helm chart from new tab", () => { await flushPromises(); await listClusterHelmReleasesMock.resolve({ - callWasSuccessful: true, - response: [], + isOk: true, + value: [], }); }); diff --git a/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts b/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts index 8fc823f5e9..04a6c38470 100644 --- a/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts +++ b/packages/core/src/features/helm-charts/upgrade-chart/upgrade-chart-new-tab.test.ts @@ -49,7 +49,7 @@ describe("New Upgrade Helm Chart Dock Tab", () => { navigateToHelmReleases = windowDi.inject(navigateToHelmReleasesInjectable); }); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { listClusterHelmReleasesMock = asyncFn(); mainDi.override(listClusterHelmReleasesInjectable, () => listClusterHelmReleasesMock); }); @@ -88,8 +88,8 @@ describe("New Upgrade Helm Chart Dock Tab", () => { describe("when helm releases resolves", () => { beforeEach(async () => { await listClusterHelmReleasesMock.resolve({ - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { app_version: "some-app-version", name: "some-name", diff --git a/packages/core/src/features/helm-releases/main/handle-get-helm-release.injectable.ts b/packages/core/src/features/helm-releases/main/handle-get-helm-release.injectable.ts index 2925e0640f..be7d382ecd 100644 --- a/packages/core/src/features/helm-releases/main/handle-get-helm-release.injectable.ts +++ b/packages/core/src/features/helm-releases/main/handle-get-helm-release.injectable.ts @@ -3,6 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getRequestChannelListenerInjectable } from "@k8slens/messaging"; +import { result } from "@k8slens/utilities"; import getHelmReleaseInjectable from "../../../main/helm/helm-service/get-helm-release.injectable"; import getClusterByIdInjectable from "../../cluster/storage/common/get-by-id.injectable"; import { getHelmReleaseChannel } from "../common/channels"; @@ -17,16 +18,19 @@ const handleGetHelmReleaseInjectable = getRequestChannelListenerInjectable({ const cluster = getClusterById(clusterId); if (!cluster) { - return { - callWasSuccessful: false, - error: `Cluster with id "${clusterId}" not found`, - }; + return result.error(`Cluster with id "${clusterId}" not found`); } - return getHelmRelease({ + const helmResult = await getHelmRelease({ cluster, ...args, }); + + if (helmResult.isOk) { + return helmResult; + } + + return result.error(helmResult.error.message); }; }, id: "handle-get-helm-release", diff --git a/packages/core/src/features/helm-releases/main/handle-list-helm-releases.injectable.ts b/packages/core/src/features/helm-releases/main/handle-list-helm-releases.injectable.ts index 6fbff5fb1b..8dddd8222f 100644 --- a/packages/core/src/features/helm-releases/main/handle-list-helm-releases.injectable.ts +++ b/packages/core/src/features/helm-releases/main/handle-list-helm-releases.injectable.ts @@ -4,6 +4,7 @@ */ import { getRequestChannelListenerInjectable } from "@k8slens/messaging"; +import { result } from "@k8slens/utilities"; import listClusterHelmReleasesInjectable from "../../../main/helm/helm-service/list-helm-releases.injectable"; import getClusterByIdInjectable from "../../cluster/storage/common/get-by-id.injectable"; import { listHelmReleasesChannel } from "../common/channels"; @@ -19,10 +20,7 @@ const handleListHelmReleasesInjectable = getRequestChannelListenerInjectable({ const cluster = getClusterById(clusterId); if (!cluster) { - return { - callWasSuccessful: false, - error: `Cluster with id "${clusterId}" not found`, - }; + return result.error(`Cluster with id "${clusterId}" not found`); } return listClusterHelmReleases(cluster, namespace); diff --git a/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts b/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts index 0e681a225e..7bb8475a94 100644 --- a/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts +++ b/packages/core/src/features/helm-releases/showing-details-for-helm-release.test.ts @@ -77,7 +77,7 @@ describe("showing details for helm release", () => { windowDi.override(requestHelmChartValuesInjectable, () => requestHelmChartValuesMock); }); - builder.beforeApplicationStart(({ mainDi }) => { + await builder.beforeApplicationStart(({ mainDi }) => { listClusterHelmReleasesMock = asyncFn(); mainDi.override(listClusterHelmReleasesInjectable, () => listClusterHelmReleasesMock); }); @@ -128,12 +128,12 @@ describe("showing details for helm release", () => { it("when releases resolve but there is none, renders", async () => { await listClusterHelmReleasesMock.resolve({ - callWasSuccessful: true, - response: [], + isOk: true, + value: [], }); await listClusterHelmReleasesMock.resolve({ - callWasSuccessful: true, - response: [], + isOk: true, + value: [], }); expect(rendered.baseElement).toMatchSnapshot(); @@ -144,8 +144,8 @@ describe("showing details for helm release", () => { await listClusterHelmReleasesMock.resolveSpecific( ([, namespace]) => namespace === "some-namespace", { - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { app_version: "some-app-version", name: "some-name", @@ -162,8 +162,8 @@ describe("showing details for helm release", () => { await listClusterHelmReleasesMock.resolveSpecific( ([, namespace]) => namespace === "some-other-namespace", { - callWasSuccessful: true, - response: [ + isOk: true, + value: [ { app_version: "some-other-app-version", name: "some-other-name", diff --git a/packages/core/src/main/helm/helm-service/get-helm-release-data.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release-data.injectable.ts index 3317046e42..b7f2552625 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release-data.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release-data.injectable.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import type { AsyncResult } from "@k8slens/utilities"; -import { isObject, json } from "@k8slens/utilities"; +import { result, isObject, json } from "@k8slens/utilities"; import { getInjectable } from "@ogre-tools/injectable"; import type { HelmReleaseData } from "../../../features/helm-releases/common/channels"; import execHelmInjectable from "../exec-helm/exec-helm.injectable"; @@ -12,7 +12,7 @@ export type GetHelmReleaseData = ( name: string, namespace: string, kubeconfigPath: string, -) => AsyncResult; +) => AsyncResult; const getHelmReleaseDataInjectable = getInjectable({ id: "get-helm-release-data", @@ -20,7 +20,7 @@ const getHelmReleaseDataInjectable = getInjectable({ const execHelm = di.inject(execHelmInjectable); return async (releaseName, namespace, proxyKubeconfigPath) => { - const result = await execHelm([ + const helmResult = await execHelm([ "status", releaseName, "--namespace", @@ -31,35 +31,23 @@ const getHelmReleaseDataInjectable = getInjectable({ "json", ]); - if (!result.callWasSuccessful) { - return { - callWasSuccessful: false, - error: `Failed to execute helm: ${result.error}`, - }; + if (!helmResult.isOk) { + return result.wrapError("Failed to execute 'helm status'", helmResult); } - const parseResult = json.parse(result.response); + const parseResult = json.parse(helmResult.value); - if (!parseResult.callWasSuccessful) { - return { - callWasSuccessful: false, - error: `Failed to parse helm response: ${parseResult.error}`, - }; + if (!parseResult.isOk) { + return result.wrapError("Failed to parse result from 'helm status'", parseResult); } - const release = parseResult.response; + const release = parseResult.value; if (!isObject(release) || Array.isArray(release)) { - return { - callWasSuccessful: false, - error: `Helm response is not an object: ${JSON.stringify(release)}`, - }; + return result.error(new Error(`Result from 'helm status' is not an object: ${JSON.stringify(release)}`)); } - return { - callWasSuccessful: true, - response: release as unknown as HelmReleaseData, - }; + return result.ok(release as unknown as HelmReleaseData); }; }, }); diff --git a/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts b/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts index 8dac2fdb42..9004ef7747 100644 --- a/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts +++ b/packages/core/src/main/helm/helm-service/get-helm-release.injectable.ts @@ -6,6 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable"; import type { Cluster } from "../../../common/cluster/cluster"; import kubeconfigManagerInjectable from "../../kubeconfig-manager/kubeconfig-manager.injectable"; import type { AsyncResult } from "@k8slens/utilities"; +import { result } from "@k8slens/utilities"; import getHelmReleaseResourcesInjectable from "./get-helm-release-resources/get-helm-release-resources.injectable"; import type { HelmReleaseDataWithResources } from "../../../features/helm-releases/common/channels"; import getHelmReleaseDataInjectable from "./get-helm-release-data.injectable"; @@ -16,7 +17,7 @@ export interface GetHelmReleaseArgs { namespace: string; } -export type GetHelmRelease = (args: GetHelmReleaseArgs) => AsyncResult; +export type GetHelmRelease = (args: GetHelmReleaseArgs) => AsyncResult; const getHelmReleaseInjectable = getInjectable({ id: "get-helm-release", @@ -36,10 +37,7 @@ const getHelmReleaseInjectable = getInjectable({ ); if (!releaseResult.isOk) { - return { - isOk: false, - error: `Failed to get helm release data: ${releaseResult.error}`, - }; + return result.wrapError("Failed to get helm release data", releaseResult); } const resourcesResult = await getHelmReleaseResources( @@ -49,19 +47,13 @@ const getHelmReleaseInjectable = getInjectable({ ); if (!resourcesResult.isOk) { - return { - isOk: false, - error: `Failed to get helm release resources: ${resourcesResult.error}`, - }; + return result.wrapError("Failed to get helm release resources", resourcesResult); } - return { - isOk: true, - value: { - ...releaseResult.value, - resources: resourcesResult.value, - }, - }; + return result.ok({ + ...releaseResult.value, + resources: resourcesResult.value, + }); }; }, diff --git a/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts b/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts index 965b8798a2..93a9574ec6 100644 --- a/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts +++ b/packages/core/src/main/helm/helm-service/update-helm-release.injectable.ts @@ -55,7 +55,7 @@ const updateHelmReleaseInjectable = getInjectable({ const releaseResult = await getHelmRelease({ cluster, releaseName, namespace }); if (!releaseResult.isOk) { - throw releaseResult.error; // keep the same interface + throw releaseResult.error.message; // keep the same interface } return { diff --git a/packages/core/src/main/helm/list-helm-releases.injectable.ts b/packages/core/src/main/helm/list-helm-releases.injectable.ts index 8b99fabc16..a9417e4f9e 100644 --- a/packages/core/src/main/helm/list-helm-releases.injectable.ts +++ b/packages/core/src/main/helm/list-helm-releases.injectable.ts @@ -5,10 +5,10 @@ import { getInjectable } from "@ogre-tools/injectable"; import execHelmInjectable from "./exec-helm/exec-helm.injectable"; import type { AsyncResult } from "@k8slens/utilities"; -import { isObject } from "@k8slens/utilities"; +import { json, result, isObject } from "@k8slens/utilities"; import type { ListedHelmRelease } from "../../features/helm-releases/common/channels"; -export type ListHelmReleases = (pathToKubeconfig: string, namespace?: string) => AsyncResult; +export type ListHelmReleases = (pathToKubeconfig: string, namespace?: string) => AsyncResult; const listHelmReleasesInjectable = getInjectable({ id: "list-helm-releases", @@ -32,18 +32,20 @@ const listHelmReleasesInjectable = getInjectable({ args.push("--kubeconfig", pathToKubeconfig); - const result = await execHelm(args); + const helmResult = await execHelm(args); - if (!result.isOk) { - return { - isOk: false, - error: `Failed to list helm releases: ${result.error}`, - }; + if (!helmResult.isOk) { + return result.wrapError("Failed to list helm releases", helmResult); } - const rawOutput = JSON.parse(result.value); - const output = Array.isArray(rawOutput) - ? rawOutput.filter(isObject) + const parseResult = json.parse(helmResult.value); + + if (!parseResult.isOk) { + return result.wrapError("Failed to parse response from 'helm ls --all'", parseResult); + } + + const output = Array.isArray(parseResult.value) + ? parseResult.value.filter(isObject) : []; return { diff --git a/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts b/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts index e9a5aeb0f5..56fe63ab30 100644 --- a/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts +++ b/packages/core/src/renderer/components/helm-releases/release-details/release-details-model/request-detailed-helm-release.injectable.ts @@ -4,6 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import type { AsyncResult } from "@k8slens/utilities"; +import { result } from "@k8slens/utilities"; import requestHelmReleaseInjectable from "../../../../../features/helm-releases/renderer/request–helm-release.injectable"; import type { GetHelmReleaseArgs, HelmReleaseDataWithResources } from "../../../../../features/helm-releases/common/channels"; import requestListHelmReleasesInjectable from "../../../../../features/helm-releases/renderer/request-list-helm-releases.injectable"; @@ -15,7 +16,7 @@ export interface DetailedHelmRelease { details: HelmReleaseDataWithResources; } -export type RequestDetailedHelmRelease = (args: GetHelmReleaseArgs) => AsyncResult; +export type RequestDetailedHelmRelease = (args: GetHelmReleaseArgs) => AsyncResult; const requestDetailedHelmReleaseInjectable = getInjectable({ id: "request-detailed-helm-release", @@ -26,34 +27,28 @@ const requestDetailedHelmReleaseInjectable = getInjectable({ return async ({ clusterId, namespace, releaseName }) => { const listReleasesResult = await requestListHelmReleases({ clusterId, namespace }); - const detailsResult = await requestHelmRelease({ clusterId, releaseName, namespace }); - if (!listReleasesResult.callWasSuccessful) { + if (!listReleasesResult.isOk) { return listReleasesResult; } - const release = listReleasesResult.response.find( - (rel) => rel.name === releaseName && rel.namespace === namespace, - ); - - if (!release) { - return { - isOk: false, - error: `Release ${releaseName} didn't exist in ${namespace} namespace.`, - }; - } + const detailsResult = await requestHelmRelease({ clusterId, releaseName, namespace }); if (!detailsResult.isOk) { return detailsResult; } - return { - isOk: true, - value: { - release: toHelmRelease(release), - details: detailsResult.value, - }, - }; + const release = listReleasesResult.value + .find((rel) => rel.name === releaseName && rel.namespace === namespace); + + if (!release) { + return result.error(`Release ${releaseName} didn't exist in ${namespace} namespace.`); + } + + return result.ok({ + release: toHelmRelease(release), + details: detailsResult.value, + }); }; }, }); diff --git a/packages/core/src/renderer/components/helm-releases/releases.injectable.ts b/packages/core/src/renderer/components/helm-releases/releases.injectable.ts index 468890bac6..9eecb4166c 100644 --- a/packages/core/src/renderer/components/helm-releases/releases.injectable.ts +++ b/packages/core/src/renderer/components/helm-releases/releases.injectable.ts @@ -37,8 +37,8 @@ const releasesInjectable = getInjectable({ return iter.chain([releaseResults].flat().values()) .filterMap((result) => { - if (result.callWasSuccessful) { - return result.response; + if (result.isOk) { + return result.value; } logger.warn("Failed to list helm releases", { error: result.error });