From 043f411ad1c8ab5a46e43877410058f9bcfcc54c Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 1 Jun 2021 11:53:24 -0400 Subject: [PATCH] Fix getReleases returning inconsistent data types (#2924) --- src/main/helm/helm-release-manager.ts | 16 ++++++++-------- src/renderer/api/endpoints/helm-releases.api.ts | 11 +++++------ src/renderer/api/kube-object.ts | 4 ++-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/helm/helm-release-manager.ts b/src/main/helm/helm-release-manager.ts index 492474c151..9ec1237c07 100644 --- a/src/main/helm/helm-release-manager.ts +++ b/src/main/helm/helm-release-manager.ts @@ -22,7 +22,7 @@ import * as tempy from "tempy"; import fse from "fs-extra"; import * as yaml from "js-yaml"; -import { promiseExec} from "../promise-exec"; +import { promiseExec } from "../promise-exec"; import { helmCli } from "./helm-cli"; import type { Cluster } from "../cluster"; import { toCamelCase } from "../../common/utils/camelCase"; @@ -39,7 +39,7 @@ export async function listReleases(pathToKubeconfig: string, namespace?: string) return output; } output.forEach((release: any, index: number) => { - output[index] = toCamelCase(release); + output[index] = toCamelCase(release); }); return output; @@ -49,9 +49,9 @@ export async function listReleases(pathToKubeconfig: string, namespace?: string) } -export async function installChart(chart: string, values: any, name: string | undefined, namespace: string, version: string, pathToKubeconfig: string){ +export async function installChart(chart: string, values: any, name: string | undefined, namespace: string, version: string, pathToKubeconfig: string) { const helm = await helmCli.binaryPath(); - const fileName = tempy.file({name: "values.yaml"}); + const fileName = tempy.file({ name: "values.yaml" }); await fse.writeFile(fileName, yaml.safeDump(values)); @@ -81,7 +81,7 @@ export async function installChart(chart: string, values: any, name: string | un export async function upgradeRelease(name: string, chart: string, values: any, namespace: string, version: string, cluster: Cluster) { const helm = await helmCli.binaryPath(); - const fileName = tempy.file({name: "values.yaml"}); + const fileName = tempy.file({ name: "values.yaml" }); await fse.writeFile(fileName, yaml.safeDump(values)); @@ -119,7 +119,7 @@ export async function getRelease(name: string, namespace: string, cluster: Clust export async function deleteRelease(name: string, namespace: string, pathToKubeconfig: string) { try { const helm = await helmCli.binaryPath(); - const { stdout } = await promiseExec(`"${helm}" delete ${name} --namespace ${namespace} --kubeconfig ${pathToKubeconfig}`); + const { stdout } = await promiseExec(`"${helm}" delete ${name} --namespace ${namespace} --kubeconfig ${pathToKubeconfig}`); return stdout; } catch ({ stderr }) { @@ -173,8 +173,8 @@ async function getResources(name: string, namespace: string, cluster: Cluster) { const pathToKubeconfig = await cluster.getProxyKubeconfigPath(); const { stdout } = await promiseExec(`"${helm}" get manifest ${name} --namespace ${namespace} --kubeconfig ${pathToKubeconfig} | "${kubectl}" get -n ${namespace} --kubeconfig ${pathToKubeconfig} -f - -o=json`); - return stdout; + return JSON.parse(stdout).items; } catch { - return { stdout: JSON.stringify({ items: [] }) }; + return []; } } diff --git a/src/renderer/api/endpoints/helm-releases.api.ts b/src/renderer/api/endpoints/helm-releases.api.ts index 1eb5356465..9a4a05875c 100644 --- a/src/renderer/api/endpoints/helm-releases.api.ts +++ b/src/renderer/api/endpoints/helm-releases.api.ts @@ -28,6 +28,7 @@ import type { ItemObject } from "../../item.store"; import { KubeObject } from "../kube-object"; import type { JsonApiData } from "../json-api"; import { buildURLPositional } from "../../../common/utils/buildUrl"; +import type { KubeJsonApiData } from "../kube-json-api"; interface IReleasePayload { name: string; @@ -46,7 +47,7 @@ interface IReleasePayload { } interface IReleaseRawDetails extends IReleasePayload { - resources: string; + resources: KubeJsonApiData[]; } export interface IReleaseDetails extends IReleasePayload { @@ -102,10 +103,8 @@ export async function listReleases(namespace?: string): Promise { export async function getRelease(name: string, namespace: string): Promise { const path = endpoint({ name, namespace }); - - const details = await apiBase.get(path); - const items: KubeObject[] = JSON.parse(details.resources).items; - const resources = items.map(item => KubeObject.create(item)); + const { resources: rawResources, ...details } = await apiBase.get(path); + const resources = rawResources.map(KubeObject.create); return { ...details, @@ -194,7 +193,7 @@ export class HelmRelease implements ItemObject { getChart(withVersion = false) { let chart = this.chart; - if(!withVersion && this.getVersion() != "" ) { + if (!withVersion && this.getVersion() != "") { const search = new RegExp(`-${this.getVersion()}`); chart = chart.replace(search, ""); diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 7b5b51cffc..b72beb9383 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -97,7 +97,7 @@ export class KubeObject(object: unknown, verifyItem:(val: unknown) => val is T): object is KubeJsonApiDataList { + static isJsonApiDataList(object: unknown, verifyItem: (val: unknown) => val is T): object is KubeJsonApiDataList { return ( isObject(object) && hasTypedProperty(object, "kind", isString)