Remove a lot of usages of legacy globals (#6825)

* Remove all usages of legacy global logger

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global storageClassApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global serviceApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global secretApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global resourceQuotaApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global persistentVolumeClaimApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global nodeApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global networkPolicyApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix formatting

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global configMapApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global jobApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global cronJobApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global podApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global roleApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove exports of NonInjected components
- To improve auto-complete

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global catalogEntityRegistry

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Add lint against using legacy global works

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix lint in KubeObject file

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global catalogCategoryRegistry

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global navigation

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global navigate

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove unneeded index file

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global customResourceDefinitionStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global eventStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global podSecurityPolicyStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global storageClassStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global persistentVolumeStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global clusterRoleBindingStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global clusterRoleStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global roleBindingStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Move files around

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global roleStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global serviceAccountStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove usages of legacy global podStore

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove final uses of asLegacyGlobalForExtensionApi in application code

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix lint rule and start fixing lint errors

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make listHelmReleases injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make installHelmChart injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make deleteHelmRelease injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make getHelmReleaseValues injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make getHelmReleaseHistory injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make rollbackHelmRelease injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove unnecessary overrides from getDiForUnitTesting

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Add global override for logger

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Add global override for history

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Cleanup typing around getting injectables within jest

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Move some more overrides to global if needed

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Add global override for forcusWindow

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix lint in KubeApi

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix lint in catalog/index.ts

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove last usages of legacy global getDetailsUrl

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove last usages of legacy global showDetails

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Add functions back to extension API

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove all uses of legacy global Notification functions

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove no longer existing export

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove unnecessary overrides

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix injecting side effects by using more injectables

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix cluster role binding dialog

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix cluster role dialog

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix create service account dialog

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix history override

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Make KubeApi consume its dependencies while not breaking the extension API

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Update snapshots

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix CephFs tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix user store tests by using override of config

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in hotbar store tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Add direct devDep of memfs

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in cluster store tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in router tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in kube auth proxy tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in log resource selector tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in hotbar remove command tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in the select component tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove mock-fs as a dependency

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove no longer necessary mocks

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix namespace select filter tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove use of mockFs in the extension loader tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fixing edit-namespace-from-new-tab test

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix app paths tests by making the tests run in "production" mode

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove last vestiges of isTestEnv and the is* globals

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix delete-cluster-dialog tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix install-helm-chart-from-previously-opened-tab tests
- Split out storage initialization to a runnable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove unnecessary override of non side effect injectable

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix disable-kube-object-detail-items-when-cluster-is-not-relevant tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix reactively-hide-kube-object-detail-item tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix lint

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Update snapshots

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix sidebar-and-tab-navigation-for-core tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove need to override lensLocalStoragePath in tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Replace more overrides with global ones

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix tests

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Fix typings

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Remove no longer needed technical test

Signed-off-by: Sebastian Malton <sebastian@malton.name>

* Update snapshots

Signed-off-by: Sebastian Malton <sebastian@malton.name>

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton authored and GitHub committed 2023-01-09 16:15:37 -05:00
1 parent 900a8bbda3
commit 2b33d5eed6
530 files changed
+11320 -5399

No files matched your search

@@ -0,0 +1,37 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
export interface DeleteHelmReleaseData {
name: string;
namespace: string;
}
export type DeleteHelmRelease = (kubeconfigPath: string, data: DeleteHelmReleaseData) => Promise<string>;
const deleteHelmReleaseInjectable = getInjectable({
id: "delete-helm-release",
instantiate: (di): DeleteHelmRelease => {
const execHelm = di.inject(execHelmInjectable);
return async (kubeconfigPath, { name, namespace }) => {
const result = await execHelm([
"delete",
name,
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
]);
if (result.callWasSuccessful) {
return result.response;
}
throw result.error;
};
},
});
export default deleteHelmReleaseInjectable;
@@ -0,0 +1,39 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { HelmReleaseRevision } from "../../common/k8s-api/endpoints/helm-releases.api/request-history.injectable";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
export interface GetHelmReleaseHistoryData {
name: string;
namespace: string;
}
export type GetHelmReleaseHistory = (kubeconfigPath: string, data: GetHelmReleaseHistoryData) => Promise<HelmReleaseRevision[]>;
const getHelmReleaseHistoryInjectable = getInjectable({
id: "get-helm-release-history",
instantiate: (di): GetHelmReleaseHistory => {
const execHelm = di.inject(execHelmInjectable);
return async (kubeconfigPath, { name, namespace }) => {
const result = await execHelm([
"history",
name,
"--output", "json",
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
]);
if (result.callWasSuccessful) {
return JSON.parse(result.response);
}
throw result.error;
};
},
});
export default getHelmReleaseHistoryInjectable;
@@ -0,0 +1,49 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
export interface GetHelmReleaseValuesData {
name: string;
namespace: string;
all?: boolean;
}
export type GetHelmReleaseValues = (kubeconfigPath: string, data: GetHelmReleaseValuesData) => Promise<string>;
const getHelmReleaseValuesInjectable = getInjectable({
id: "get-helm-release-values",
instantiate: (di): GetHelmReleaseValues => {
const execHelm = di.inject(execHelmInjectable);
return async (kubeconfigPath, { name, namespace, all = false }) => {
const args = [
"get",
"values",
name,
];
if (all) {
args.push("--all");
}
args.push(
"--output", "yaml",
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
);
const result = await execHelm(args);
if (result.callWasSuccessful) {
return result.response;
}
throw result.error;
};
},
});
export default getHelmReleaseValuesInjectable;
-168
View File
@@ -1,168 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import tempy from "tempy";
import fse from "fs-extra";
import * as yaml from "js-yaml";
import { toCamelCase } from "../../common/utils/camelCase";
import type { JsonValue } from "type-fest";
import { isObject, json } from "../../common/utils";
import { asLegacyGlobalFunctionForExtensionApi } from "../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
const execHelm = asLegacyGlobalFunctionForExtensionApi(execHelmInjectable);
export async function listReleases(pathToKubeconfig: string, namespace?: string): Promise<Record<string, any>[]> {
const args = [
"ls",
"--all",
"--output", "json",
];
if (namespace) {
args.push("-n", namespace);
} else {
args.push("--all-namespaces");
}
args.push("--kubeconfig", pathToKubeconfig);
const result = await execHelm(args);
if (!result.callWasSuccessful) {
throw result.error;
}
const output = json.parse(result.response);
if (!Array.isArray(output) || output.length == 0) {
return [];
}
return output.filter(isObject).map(toCamelCase);
}
export async function installChart(chart: string, values: JsonValue, name: string | undefined = "", namespace: string, version: string, kubeconfigPath: string) {
const valuesFilePath = tempy.file({ name: "values.yaml" });
await fse.writeFile(valuesFilePath, yaml.dump(values));
const args = ["install"];
if (name) {
args.push(name);
}
args.push(
chart,
"--version", version,
"--values", valuesFilePath,
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
);
if (!name) {
args.push("--generate-name");
}
try {
const result = await execHelm(args);
if (!result.callWasSuccessful) {
throw result.error;
}
const output = result.response;
const releaseName = output.split("\n")[0].split(" ")[1].trim();
return {
log: output,
release: {
name: releaseName,
namespace,
},
};
} finally {
await fse.unlink(valuesFilePath);
}
}
export async function deleteRelease(name: string, namespace: string, kubeconfigPath: string): Promise<string> {
const result = await execHelm([
"delete",
name,
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
]);
if (result.callWasSuccessful) {
return result.response;
}
throw result.error;
}
interface GetValuesOptions {
namespace: string;
all?: boolean;
kubeconfigPath: string;
}
export async function getValues(name: string, { namespace, all = false, kubeconfigPath }: GetValuesOptions): Promise<string> {
const args = [
"get",
"values",
name,
];
if (all) {
args.push("--all");
}
args.push(
"--output", "yaml",
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
);
const result = await execHelm(args);
if (result.callWasSuccessful) {
return result.response;
}
throw result.error;
}
export async function getHistory(name: string, namespace: string, kubeconfigPath: string): Promise<JsonValue> {
const result = await execHelm([
"history",
name,
"--output", "json",
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
]);
if (result.callWasSuccessful) {
return json.parse(result.response);
}
throw result.error;
}
export async function rollback(name: string, namespace: string, revision: number, kubeconfigPath: string): Promise<void> {
const result = await execHelm([
"rollback",
name,
`${revision}`,
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
]);
if (!result.callWasSuccessful) {
throw result.error;
}
}
@@ -4,25 +4,25 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { Cluster } from "../../../common/cluster/cluster";
import { deleteRelease } from "../helm-release-manager";
import loggerInjectable from "../../../common/logger.injectable";
import type { DeleteHelmReleaseData } from "../delete-helm-release.injectable";
import deleteHelmReleaseInjectable from "../delete-helm-release.injectable";
const deleteHelmReleaseInjectable = getInjectable({
id: "delete-helm-release",
const deleteClusterHelmReleaseInjectable = getInjectable({
id: "delete-cluster-helm-release",
instantiate: (di) => {
const logger = di.inject(loggerInjectable);
const deleteHelmRelease = di.inject(deleteHelmReleaseInjectable);
return async (cluster: Cluster, releaseName: string, namespace: string) => {
return async (cluster: Cluster, data: DeleteHelmReleaseData) => {
const proxyKubeconfig = await cluster.getProxyKubeconfigPath();
logger.debug("Delete release");
logger.debug(`[CLUSTER]: Delete helm release`, data);
return deleteRelease(releaseName, namespace, proxyKubeconfig);
return deleteHelmRelease(proxyKubeconfig, data);
};
},
causesSideEffects: true,
});
export default deleteHelmReleaseInjectable;
export default deleteClusterHelmReleaseInjectable;
@@ -24,8 +24,6 @@ const getHelmChartValuesInjectable = getInjectable({
return getChartManager(repo).getValues(chartName, version);
};
},
causesSideEffects: true,
});
export default getHelmChartValuesInjectable;
@@ -24,8 +24,6 @@ const getHelmChartVersionsInjectable = getInjectable({
return getChartManager(repo).chartVersions(chartName);
};
},
causesSideEffects: true,
});
export default getHelmChartVersionsInjectable;
@@ -4,25 +4,25 @@
*/
import { getInjectable } from "@ogre-tools/injectable";
import type { Cluster } from "../../../common/cluster/cluster";
import { getHistory } from "../helm-release-manager";
import loggerInjectable from "../../../common/logger.injectable";
import type { GetHelmReleaseHistoryData } from "../get-helm-release-history.injectable";
import getHelmReleaseHistoryInjectable from "../get-helm-release-history.injectable";
const getHelmReleaseHistoryInjectable = getInjectable({
id: "get-helm-release-history",
const getClusterHelmReleaseHistoryInjectable = getInjectable({
id: "get-cluster-helm-release-history",
instantiate: (di) => {
const logger = di.inject(loggerInjectable);
const getHelmReleaseHistory = di.inject(getHelmReleaseHistoryInjectable);
return async (cluster: Cluster, releaseName: string, namespace: string) => {
return async (cluster: Cluster, data: GetHelmReleaseHistoryData) => {
const proxyKubeconfig = await cluster.getProxyKubeconfigPath();
logger.debug("Fetch release history");
logger.debug(`[CLUSTER]: Fetch release history for clusterId=${cluster.id}`, data);
return getHistory(releaseName, namespace, proxyKubeconfig);
return getHelmReleaseHistory(proxyKubeconfig, data);
};
},
causesSideEffects: true,
});
export default getHelmReleaseHistoryInjectable;
export default getClusterHelmReleaseHistoryInjectable;
@@ -3,39 +3,26 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { getValues } from "../helm-release-manager";
import loggerInjectable from "../../../common/logger.injectable";
import type { Cluster } from "../../../common/cluster/cluster";
import type { GetHelmReleaseValuesData } from "../get-helm-release-values.injectable";
import getHelmReleaseValuesInjectable from "../get-helm-release-values.injectable";
interface GetReleaseValuesArgs {
cluster: Cluster;
namespace: string;
all: boolean;
}
const getHelmReleaseValuesInjectable = getInjectable({
id: "get-helm-release-values",
const getClusterHelmReleaseValuesInjectable = getInjectable({
id: "get-cluster-helm-release-values",
instantiate: (di) => {
const logger = di.inject(loggerInjectable);
const getHelmReleaseValues = di.inject(getHelmReleaseValuesInjectable);
return async (
releaseName: string,
{ cluster, namespace, all }: GetReleaseValuesArgs,
) => {
return async (cluster: Cluster, data: GetHelmReleaseValuesData) => {
const pathToKubeconfig = await cluster.getProxyKubeconfigPath();
logger.debug("Fetch release values");
logger.debug(`[CLUSTER]: getting helm release values`, data);
return getValues(releaseName, {
namespace,
all,
kubeconfigPath: pathToKubeconfig,
});
return getHelmReleaseValues(pathToKubeconfig, data);
};
},
causesSideEffects: true,
});
export default getHelmReleaseValuesInjectable;
export default getClusterHelmReleaseValuesInjectable;
@@ -5,7 +5,7 @@
import { getInjectable } from "@ogre-tools/injectable";
import type { JsonObject } from "type-fest";
import type { Cluster } from "../../../common/cluster/cluster";
import { installChart } from "../helm-release-manager";
import installHelmChartInjectable from "../install-helm-chart.injectable";
export interface InstallChartArgs {
chart: string;
@@ -15,16 +15,21 @@ export interface InstallChartArgs {
version: string;
}
const installHelmChartInjectable = getInjectable({
id: "install-helm-chart",
const installClusterHelmChartInjectable = getInjectable({
id: "install-cluster-helm-chart",
instantiate: () => async (cluster: Cluster, data: InstallChartArgs) => {
const proxyKubeconfig = await cluster.getProxyKubeconfigPath();
instantiate: (di) => {
const installHelmChart = di.inject(installHelmChartInjectable);
return installChart(data.chart, data.values, data.name, data.namespace, data.version, proxyKubeconfig);
return async (cluster: Cluster, data: InstallChartArgs) => {
const proxyKubeconfig = await cluster.getProxyKubeconfigPath();
return installHelmChart({
...data,
kubeconfigPath: proxyKubeconfig,
});
};
},
causesSideEffects: true,
});
export default installHelmChartInjectable;
export default installClusterHelmChartInjectable;
@@ -36,8 +36,6 @@ const listHelmChartsInjectable = getInjectable({
);
};
},
causesSideEffects: true,
});
export default listHelmChartsInjectable;
@@ -5,24 +5,23 @@
import { getInjectable } from "@ogre-tools/injectable";
import type { Cluster } from "../../../common/cluster/cluster";
import loggerInjectable from "../../../common/logger.injectable";
import { listReleases } from "../helm-release-manager";
import listHelmReleasesInjectable from "../list-helm-releases.injectable";
const listHelmReleasesInjectable = getInjectable({
id: "list-helm-releases",
const listClusterHelmReleasesInjectable = getInjectable({
id: "list-cluster-helm-releases",
instantiate: (di) => {
const logger = di.inject(loggerInjectable);
const listHelmReleases = di.inject(listHelmReleasesInjectable);
return async (cluster: Cluster, namespace?: string) => {
const proxyKubeconfig = await cluster.getProxyKubeconfigPath();
logger.debug("list releases");
logger.debug(`[CLUSTER]: listing helm releases for clusterId=${cluster.id}`, { namespace });
return listReleases(proxyKubeconfig, namespace);
return listHelmReleases(proxyKubeconfig, namespace);
};
},
causesSideEffects: true,
});
export default listHelmReleasesInjectable;
export default listClusterHelmReleasesInjectable;
@@ -5,28 +5,24 @@
import { getInjectable } from "@ogre-tools/injectable";
import type { Cluster } from "../../../common/cluster/cluster";
import loggerInjectable from "../../../common/logger.injectable";
import { rollback } from "../helm-release-manager";
import type { RollbackHelmReleaseData } from "../rollback-helm-release.injectable";
import rollbackHelmReleaseInjectable from "../rollback-helm-release.injectable";
const rollbackHelmReleaseInjectable = getInjectable({
id: "rollback-helm-release",
const rollbackClusterHelmReleaseInjectable = getInjectable({
id: "rollback-cluster-helm-release",
instantiate: (di) => {
const logger = di.inject(loggerInjectable);
const rollbackHelmRelease = di.inject(rollbackHelmReleaseInjectable);
return async (
cluster: Cluster,
releaseName: string,
namespace: string,
revision: number,
) => {
return async (cluster: Cluster, data: RollbackHelmReleaseData) => {
const proxyKubeconfig = await cluster.getProxyKubeconfigPath();
logger.debug("Rollback release");
await rollback(releaseName, namespace, revision, proxyKubeconfig);
logger.debug(`[CLUSTER]: rolling back helm release for clusterId=${cluster.id}`, data);
await rollbackHelmRelease(proxyKubeconfig, data);
};
},
causesSideEffects: true,
});
export default rollbackHelmReleaseInjectable;
export default rollbackClusterHelmReleaseInjectable;
@@ -0,0 +1,93 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { dump } from "js-yaml";
import tempy from "tempy";
import type { JsonValue } from "type-fest";
import removePathInjectable from "../../common/fs/remove.injectable";
import writeFileInjectable from "../../common/fs/write-file.injectable";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
export interface InstallHelmChartData {
chart: string;
values: JsonValue;
name: string;
namespace: string;
version: string;
kubeconfigPath: string;
}
export interface InstallHelmChartResult {
log: string;
release: {
name: string;
namespace: string;
};
}
export type InstallHelmChart = (data: InstallHelmChartData) => Promise<InstallHelmChartResult>;
const installHelmChartInjectable = getInjectable({
id: "install-helm-chart",
instantiate: (di): InstallHelmChart => {
const writeFile = di.inject(writeFileInjectable);
const removePath = di.inject(removePathInjectable);
const execHelm = di.inject(execHelmInjectable);
return async ({
chart,
kubeconfigPath,
name,
namespace,
values,
version,
}) => {
const valuesFilePath = tempy.file({ name: "values.yaml" });
await writeFile(valuesFilePath, dump(values));
const args = ["install"];
if (name) {
args.push(name);
}
args.push(
chart,
"--version", version,
"--values", valuesFilePath,
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
);
if (!name) {
args.push("--generate-name");
}
try {
const result = await execHelm(args);
if (!result.callWasSuccessful) {
throw result.error;
}
const output = result.response;
const releaseName = output.split("\n")[0].split(" ")[1].trim();
return {
log: output,
release: {
name: releaseName,
namespace,
},
};
} finally {
await removePath(valuesFilePath);
}
};
},
});
export default installHelmChartInjectable;
@@ -0,0 +1,48 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
import { isObject, json, toCamelCase } from "../../common/utils";
export type ListHelmReleases = (pathToKubeconfig: string, namespace?: string) => Promise<Record<string, any>[]>;
const listHelmReleasesInjectable = getInjectable({
id: "list-helm-releases",
instantiate: (di): ListHelmReleases => {
const execHelm = di.inject(execHelmInjectable);
return async (pathToKubeconfig, namespace) => {
const args = [
"ls",
"--all",
"--output", "json",
];
if (namespace) {
args.push("-n", namespace);
} else {
args.push("--all-namespaces");
}
args.push("--kubeconfig", pathToKubeconfig);
const result = await execHelm(args);
if (!result.callWasSuccessful) {
throw result.error;
}
const output = json.parse(result.response);
if (!Array.isArray(output) || output.length == 0) {
return [];
}
return output.filter(isObject).map(toCamelCase);
};
},
});
export default listHelmReleasesInjectable;
@@ -0,0 +1,37 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import execHelmInjectable from "./exec-helm/exec-helm.injectable";
export interface RollbackHelmReleaseData {
name: string;
namespace: string;
revision: number;
}
export type RollbackHelmRelease = (kubeconfigPath: string, data: RollbackHelmReleaseData) => Promise<void>;
const rollbackHelmReleaseInjectable = getInjectable({
id: "rollback-helm-release",
instantiate: (di): RollbackHelmRelease => {
const execHelm = di.inject(execHelmInjectable);
return async (kubeconfigPath, { name, namespace, revision }) => {
const result = await execHelm([
"rollback",
name,
`${revision}`,
"--namespace", namespace,
"--kubeconfig", kubeconfigPath,
]);
if (!result.callWasSuccessful) {
throw result.error;
}
};
},
});
export default rollbackHelmReleaseInjectable;