From c5572257bd6a32a2f05fc78f54ece428f54389fe Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 21 Apr 2023 10:03:10 -0400 Subject: [PATCH] feat: Introduce injectables to remove subNamespaces Signed-off-by: Sebastian Malton --- .../request-delete-namespace.injectable.ts | 28 +++++++++++++++++++ ...uest-delete-normal-namespace.injectable.ts | 20 +++++++++++++ ...request-delete-sub-namespace.injectable.ts | 28 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 packages/core/src/renderer/components/+namespaces/request-delete-namespace.injectable.ts create mode 100644 packages/core/src/renderer/components/+namespaces/request-delete-normal-namespace.injectable.ts create mode 100644 packages/core/src/renderer/components/+namespaces/request-delete-sub-namespace.injectable.ts diff --git a/packages/core/src/renderer/components/+namespaces/request-delete-namespace.injectable.ts b/packages/core/src/renderer/components/+namespaces/request-delete-namespace.injectable.ts new file mode 100644 index 0000000000..fbcf9f86c3 --- /dev/null +++ b/packages/core/src/renderer/components/+namespaces/request-delete-namespace.injectable.ts @@ -0,0 +1,28 @@ +/** + * 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 { Namespace } from "../../../common/k8s-api/endpoints"; +import requestDeleteNormalNamespaceInjectable from "./request-delete-normal-namespace.injectable"; +import requestDeleteSubNamespaceAnchorInjectable from "./request-delete-sub-namespace.injectable"; + +export type RequestDeleteNamespace = (namespace: Namespace) => Promise; + +const requestDeleteNamespaceInjectable = getInjectable({ + id: "request-delete-namespace", + instantiate: (di): RequestDeleteNamespace => { + const requestDeleteSubNamespaceAnchor = di.inject(requestDeleteSubNamespaceAnchorInjectable); + const requestDeleteNormalNamespace = di.inject(requestDeleteNormalNamespaceInjectable); + + return async (namespace) => { + if (namespace.isSubnamespace()) { + await requestDeleteSubNamespaceAnchor(namespace); + } + + await requestDeleteNormalNamespace(namespace); + }; + }, +}); + +export default requestDeleteNamespaceInjectable; diff --git a/packages/core/src/renderer/components/+namespaces/request-delete-normal-namespace.injectable.ts b/packages/core/src/renderer/components/+namespaces/request-delete-normal-namespace.injectable.ts new file mode 100644 index 0000000000..0bea515eeb --- /dev/null +++ b/packages/core/src/renderer/components/+namespaces/request-delete-normal-namespace.injectable.ts @@ -0,0 +1,20 @@ +/** + * 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 { Namespace } from "../../../common/k8s-api/endpoints"; +import namespaceStoreInjectable from "./store.injectable"; + +export type RequestDeleteNormalNamespace = (namespace: Namespace) => Promise; + +const requestDeleteNormalNamespaceInjectable = getInjectable({ + id: "request-delete-normal-namespace", + instantiate: (di): RequestDeleteNormalNamespace => { + const namespaceStore = di.inject(namespaceStoreInjectable); + + return (namespace) => namespaceStore.remove(namespace); + }, +}); + +export default requestDeleteNormalNamespaceInjectable; diff --git a/packages/core/src/renderer/components/+namespaces/request-delete-sub-namespace.injectable.ts b/packages/core/src/renderer/components/+namespaces/request-delete-sub-namespace.injectable.ts new file mode 100644 index 0000000000..27b6504b4e --- /dev/null +++ b/packages/core/src/renderer/components/+namespaces/request-delete-sub-namespace.injectable.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { waitUntilDefined } from "@k8slens/utilities"; +import { getInjectable } from "@ogre-tools/injectable"; +import customResourceDefinitionStoreInjectable from "../+custom-resources/definition.store.injectable"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import type { Namespace } from "../../../common/k8s-api/endpoints"; + +export type RequestDeleteSubNamespaceAnchor = (namespace: Namespace) => Promise; + +const requestDeleteSubNamespaceAnchorInjectable = getInjectable({ + id: "request-delete-sub-namespace-anchor", + instantiate: (di): RequestDeleteSubNamespaceAnchor => { + const crdStore = di.inject(customResourceDefinitionStoreInjectable); + const apiManager = di.inject(apiManagerInjectable); + + return async (namespace) => { + const anchorCrd = await waitUntilDefined(() => crdStore.getByGroup("hnc.x-k8s.io", "subnamespaceanchors")); + const anchorApi = apiManager.getApi(anchorCrd.getResourceApiBase()); + + await anchorApi?.delete({ name: namespace.getName() }); + }; + }, +}); + +export default requestDeleteSubNamespaceAnchorInjectable;