diff --git a/src/common/k8s-api/kube-object.store.ts b/src/common/k8s-api/kube-object.store.ts index a82590d758..5722fef643 100644 --- a/src/common/k8s-api/kube-object.store.ts +++ b/src/common/k8s-api/kube-object.store.ts @@ -208,7 +208,11 @@ export abstract class KubeObjectStore< } } - return await res ?? []; + const items = await res ?? []; + + console.trace("loadItems", this.api, [...items]); + + return items; } this.loadedNamespaces.set(namespaces); @@ -249,6 +253,8 @@ export abstract class KubeObjectStore< try { const items = await this.loadItems({ namespaces, reqInit, onLoadFailure }); + console.log("loadAll", this.api, [...items]); + this.mergeItems(items, { merge, namespaces }); this.isLoaded = true; @@ -281,6 +287,8 @@ export abstract class KubeObjectStore< protected mergeItems(partialItems: K[], { merge = true, updateStore = true, sort = true, filter = true, namespaces }: MergeItemsOptions): K[] { let items = partialItems; + console.log("mergeItems", this.api, [...partialItems]); + // update existing items if (merge && this.api.isNamespaced) { const ns = new Set(namespaces); diff --git a/src/renderer/cluster/accessible-namespaces.injectable.ts b/src/renderer/cluster/accessible-namespaces.injectable.ts new file mode 100644 index 0000000000..50743cfa83 --- /dev/null +++ b/src/renderer/cluster/accessible-namespaces.injectable.ts @@ -0,0 +1,18 @@ +/** + * 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 { computed } from "mobx"; +import hostedClusterInjectable from "../cluster-frame-context/hosted-cluster.injectable"; + +const clusterConfiguredAccessibleNamespacesInjectable = getInjectable({ + id: "cluster-configured-accessible-namespaces", + instantiate: (di) => { + const hostedCluster = di.inject(hostedClusterInjectable); + + return computed(() => [...hostedCluster?.accessibleNamespaces ?? []]); + }, +}); + +export default clusterConfiguredAccessibleNamespacesInjectable; diff --git a/src/renderer/create-cluster/create-cluster.injectable.ts b/src/renderer/cluster/create-cluster.injectable.ts similarity index 100% rename from src/renderer/create-cluster/create-cluster.injectable.ts rename to src/renderer/cluster/create-cluster.injectable.ts diff --git a/src/renderer/components/+namespaces/store.injectable.ts b/src/renderer/components/+namespaces/store.injectable.ts index 9c835e0139..eb2a7e4a35 100644 --- a/src/renderer/components/+namespaces/store.injectable.ts +++ b/src/renderer/components/+namespaces/store.injectable.ts @@ -10,6 +10,7 @@ import namespaceApiInjectable from "../../../common/k8s-api/endpoints/namespace. import assert from "assert"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable"; import clusterFrameContextForClusterScopedResourcesInjectable from "../../cluster-frame-context/for-cluster-scoped-resources.injectable"; +import clusterConfiguredAccessibleNamespacesInjectable from "../../cluster/accessible-namespaces.injectable"; const namespaceStoreInjectable = getInjectable({ id: "namespace-store", @@ -23,6 +24,7 @@ const namespaceStoreInjectable = getInjectable({ return new NamespaceStore({ context: di.inject(clusterFrameContextForClusterScopedResourcesInjectable), storage: createStorage("selected_namespaces", undefined), + clusterConfiguredAccessibleNamespaces: di.inject(clusterConfiguredAccessibleNamespacesInjectable), }, api); }, injectionToken: kubeObjectStoreInjectionToken, diff --git a/src/renderer/components/+namespaces/store.ts b/src/renderer/components/+namespaces/store.ts index 8c44390cf7..6a85db04a3 100644 --- a/src/renderer/components/+namespaces/store.ts +++ b/src/renderer/components/+namespaces/store.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { IReactionDisposer } from "mobx"; +import type { IComputedValue, IReactionDisposer } from "mobx"; import { action, comparer, computed, makeObservable, reaction } from "mobx"; import type { StorageLayer } from "../../utils"; import { autoBind, noop, toggle } from "../../utils"; @@ -14,6 +14,7 @@ import { Namespace } from "../../../common/k8s-api/endpoints/namespace.api"; interface Dependencies extends KubeObjectStoreDependencies { readonly storage: StorageLayer; + readonly clusterConfiguredAccessibleNamespaces: IComputedValue; } export class NamespaceStore extends KubeObjectStore { @@ -118,17 +119,13 @@ export class NamespaceStore extends KubeObjectStore { } protected async loadItems(params: KubeObjectStoreLoadingParams): Promise { - const { allowedNamespaces } = this; + const clusterConfiguredAccessibleNamespaces = this.dependencies.clusterConfiguredAccessibleNamespaces.get(); - let namespaces = await super.loadItems(params).catch(() => []); - - namespaces = namespaces.filter(namespace => allowedNamespaces.includes(namespace.getName())); - - if (!namespaces.length && allowedNamespaces.length > 0) { - return allowedNamespaces.map(getDummyNamespace); + if (clusterConfiguredAccessibleNamespaces.length > 0) { + return clusterConfiguredAccessibleNamespaces.map(getDummyNamespace); } - return namespaces; + return super.loadItems(params); } @action selectNamespaces = (namespace: string | string[]) => { diff --git a/src/renderer/components/input/search-input.tsx b/src/renderer/components/input/search-input.tsx index 1d13794d8a..4aff4a6ffa 100644 --- a/src/renderer/components/input/search-input.tsx +++ b/src/renderer/components/input/search-input.tsx @@ -76,7 +76,7 @@ class NonInjectedSearchInput extends React.Component; if (showClearIcon && value) { diff --git a/src/renderer/frames/cluster-frame/cluster-frame.test.tsx b/src/renderer/frames/cluster-frame/cluster-frame.test.tsx index cf5dd8434d..aac19b3feb 100644 --- a/src/renderer/frames/cluster-frame/cluster-frame.test.tsx +++ b/src/renderer/frames/cluster-frame/cluster-frame.test.tsx @@ -15,7 +15,7 @@ import { ClusterFrame } from "./cluster-frame"; import historyInjectable from "../../navigation/history.injectable"; import { computed } from "mobx"; import type { Cluster } from "../../../common/cluster/cluster"; -import createClusterInjectable from "../../create-cluster/create-cluster.injectable"; +import createClusterInjectable from "../../cluster/create-cluster.injectable"; import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable"; import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; import storesAndApisCanBeCreatedInjectable from "../../stores-apis-can-be-created.injectable";