From 351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 5 Apr 2023 10:17:35 -0400 Subject: [PATCH] fix: Referencing apiManager should not throw (#7468) Signed-off-by: Sebastian Malton --- .../k8s-api/__tests__/api-manager.test.ts | 14 +++++++++ .../common/k8s-api/api-manager/api-manager.ts | 4 +-- .../k8s-api/api-manager/manager.injectable.ts | 29 +++++++++++-------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts b/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts index ce117d9475..0490f446fe 100644 --- a/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts +++ b/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts @@ -206,3 +206,17 @@ describe("ApiManager", () => { }); }); }); + +describe("ApiManger without storesAndApisCanBeCreated", () => { + let di: DiContainer; + + beforeEach(() => { + di = getDiForUnitTesting(); + + di.override(storesAndApisCanBeCreatedInjectable, () => false); + }); + + it("should not throw when creating apiManager", () => { + di.inject(apiManagerInjectable); + }); +}); diff --git a/packages/core/src/common/k8s-api/api-manager/api-manager.ts b/packages/core/src/common/k8s-api/api-manager/api-manager.ts index 6b60ba8e7a..23574822ed 100644 --- a/packages/core/src/common/k8s-api/api-manager/api-manager.ts +++ b/packages/core/src/common/k8s-api/api-manager/api-manager.ts @@ -25,7 +25,7 @@ export type KubeObjectStoreFrom = Api extends KubeApi) => boolean; -interface Dependencies { +export interface ApiManagerDependencies { readonly apis: IComputedValue; readonly crdApis: IComputedValue; readonly stores: IComputedValue; @@ -38,7 +38,7 @@ export class ApiManager { private readonly defaultCrdStores = observable.map(); private readonly apis = observable.map(); - constructor(private readonly dependencies: Dependencies) { + constructor(private readonly dependencies: ApiManagerDependencies) { // NOTE: this is done to preserve the old behaviour of an API being discoverable using all previous apiBases autorun(() => { const apis = iter.chain(this.dependencies.apis.get().values()) diff --git a/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts b/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts index 2ffd41a296..6caca127f5 100644 --- a/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts +++ b/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts @@ -18,18 +18,23 @@ const apiManagerInjectable = getInjectable({ const computedInjectMany = di.inject(computedInjectManyInjectable); const storesAndApisCanBeCreated = di.inject(storesAndApisCanBeCreatedInjectionToken); - return new ApiManager({ - apis: storesAndApisCanBeCreated - ? computedInjectMany(kubeApiInjectionToken) - : computed(() => []), - stores: storesAndApisCanBeCreated - ? computedInjectMany(kubeObjectStoreInjectionToken) - : computed(() => []), - crdApis: storesAndApisCanBeCreated - ? computedInjectMany(customResourceDefinitionApiInjectionToken) - : computed(() => []), - createCustomResourceStore: di.inject(createCustomResourceStoreInjectable), - }); + return new ApiManager(( + storesAndApisCanBeCreated + ? { + apis: computedInjectMany(kubeApiInjectionToken), + stores: computedInjectMany(kubeObjectStoreInjectionToken), + crdApis: computedInjectMany(customResourceDefinitionApiInjectionToken), + createCustomResourceStore: di.inject(createCustomResourceStoreInjectable), + } + : { + apis: computed(() => []), + stores: computed(() => []), + crdApis: computed(() => []), + createCustomResourceStore: () => { + throw new Error("Tried to create a KubeObjectStore for a CustomResource in a disallowed environment"); + }, + } + )); }, });