From 643b0d861f64bbc250d8160f199b32933aea25e2 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 28 May 2021 14:06:18 +0300 Subject: [PATCH] Fix: cluster commands disappeared from Command Palette (#2886) * Cluster commands disappeared from Command Palette, close #2760 Signed-off-by: Roman * refactoring: get rid of ClusterStore.active && ClusterStore.activeCluster (managed via catalog's entity) Signed-off-by: Roman --- src/common/__tests__/cluster-store.test.ts | 5 -- .../catalog-entities/kubernetes-cluster.ts | 1 - src/common/cluster-store.ts | 46 ++----------------- src/extensions/registries/command-registry.ts | 9 ---- src/main/cluster.ts | 17 +++++++ src/renderer/api/catalog-entity-registry.ts | 22 ++++----- src/renderer/api/catalog-entity.ts | 6 +-- .../components/+cluster/cluster-overview.tsx | 9 ++-- .../+network-ingresses/ingress-details.tsx | 17 +++---- .../components/+nodes/node-details.tsx | 6 +-- .../volume-claim-details.tsx | 6 +-- .../daemonset-details.tsx | 6 +-- .../deployment-details.tsx | 6 +-- .../+workloads-pods/pod-details-container.tsx | 8 ++-- .../+workloads-pods/pod-details.tsx | 6 +-- .../replicaset-details.tsx | 6 +-- .../statefulset-details.tsx | 7 ++- .../cluster-manager/cluster-view.tsx | 4 +- .../cluster-settings.command.ts | 4 +- .../components/cluster-metrics-setting.tsx | 23 ++-------- .../command-palette/command-container.tsx | 3 +- .../command-palette/command-dialog.tsx | 21 +++++---- src/renderer/lens-app.tsx | 16 +------ 23 files changed, 99 insertions(+), 155 deletions(-) diff --git a/src/common/__tests__/cluster-store.test.ts b/src/common/__tests__/cluster-store.test.ts index 7a82547e61..5117e8d603 100644 --- a/src/common/__tests__/cluster-store.test.ts +++ b/src/common/__tests__/cluster-store.test.ts @@ -119,11 +119,6 @@ describe("empty config", () => { await ClusterStore.getInstance().removeById("foo"); expect(ClusterStore.getInstance().getById("foo")).toBeNull(); }); - - it("sets active cluster", () => { - ClusterStore.getInstance().setActive("foo"); - expect(ClusterStore.getInstance().active.id).toBe("foo"); - }); }); describe("with prod and dev clusters added", () => { diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index 43fee50eaf..9375bb06e4 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -124,7 +124,6 @@ export class KubernetesCluster extends CatalogEntity { - ClusterStore.getInstance().deactivate(this.metadata.uid); requestMain(clusterDisconnectHandler, this.metadata.uid); } }); diff --git a/src/common/cluster-store.ts b/src/common/cluster-store.ts index 31ecd18031..9d8bc864cb 100644 --- a/src/common/cluster-store.ts +++ b/src/common/cluster-store.ts @@ -22,7 +22,7 @@ import path from "path"; import { app, ipcMain, ipcRenderer, remote, webFrame } from "electron"; import { unlink } from "fs-extra"; -import { action, comparer, computed, observable, reaction, makeObservable } from "mobx"; +import { action, comparer, computed, makeObservable, observable, reaction } from "mobx"; import { BaseStore } from "./base-store"; import { Cluster, ClusterState } from "../main/cluster"; import migrations from "../migrations/cluster-store"; @@ -32,7 +32,6 @@ import { dumpConfigYaml } from "./kube-helpers"; import { saveToAppFiles } from "./utils/saveToAppFiles"; import type { KubeConfig } from "@kubernetes/client-node"; import { handleRequest, requestMain, subscribeToBroadcast, unsubscribeAllFromBroadcast } from "./ipc"; -import type { ResourceType } from "../renderer/components/cluster-settings/components/cluster-metrics-setting"; import { disposer, noop, toJS } from "./utils"; export interface ClusterIconUpload { @@ -52,7 +51,6 @@ export type ClusterPrometheusMetadata = { }; export interface ClusterStoreModel { - activeCluster?: ClusterId; // last opened cluster clusters?: ClusterModel[]; } @@ -73,7 +71,7 @@ export interface ClusterModel { * Workspace id * * @deprecated - */ + */ workspace?: string; /** User context in kubeconfig */ @@ -131,9 +129,8 @@ export class ClusterStore extends BaseStore { return filePath; } - @observable activeCluster: ClusterId; - @observable removedClusters = observable.map(); @observable clusters = observable.map(); + @observable removedClusters = observable.map(); private static stateRequestChannel = "cluster:states"; protected disposer = disposer(); @@ -217,43 +214,14 @@ export class ClusterStore extends BaseStore { }); } - get activeClusterId() { - return this.activeCluster; - } - @computed get clustersList(): Cluster[] { return Array.from(this.clusters.values()); } - @computed get active(): Cluster | null { - return this.getById(this.activeCluster); - } - @computed get connectedClustersList(): Cluster[] { return this.clustersList.filter((c) => !c.disconnected); } - isActive(id: ClusterId) { - return this.activeCluster === id; - } - - isMetricHidden(resource: ResourceType) { - return Boolean(this.active?.preferences.hiddenMetrics?.includes(resource)); - } - - @action - setActive(clusterId: ClusterId) { - this.activeCluster = this.clusters.has(clusterId) - ? clusterId - : null; - } - - deactivate(id: ClusterId) { - if (this.isActive(id)) { - this.setActive(null); - } - } - hasClusters() { return this.clusters.size > 0; } @@ -298,10 +266,6 @@ export class ClusterStore extends BaseStore { if (cluster) { this.clusters.delete(clusterId); - if (this.activeCluster === clusterId) { - this.setActive(null); - } - // remove only custom kubeconfigs (pasted as text) if (cluster.kubeConfigPath == ClusterStore.getCustomKubeConfigPath(clusterId)) { await unlink(cluster.kubeConfigPath).catch(noop); @@ -310,7 +274,7 @@ export class ClusterStore extends BaseStore { } @action - protected fromStore({ activeCluster, clusters = [] }: ClusterStoreModel = {}) { + protected fromStore({ clusters = [] }: ClusterStoreModel = {}) { const currentClusters = new Map(this.clusters); const newClusters = new Map(); const removedClusters = new Map(); @@ -338,14 +302,12 @@ export class ClusterStore extends BaseStore { } }); - this.setActive(activeCluster); this.clusters.replace(newClusters); this.removedClusters.replace(removedClusters); } toJSON(): ClusterStoreModel { return toJS({ - activeCluster: this.activeCluster, clusters: this.clustersList.map(cluster => cluster.toJSON()), }); } diff --git a/src/extensions/registries/command-registry.ts b/src/extensions/registries/command-registry.ts index b7b822d473..8f91dace10 100644 --- a/src/extensions/registries/command-registry.ts +++ b/src/extensions/registries/command-registry.ts @@ -22,7 +22,6 @@ // Extensions API -> Commands import { BaseRegistry } from "./base-registry"; -import { makeObservable, observable } from "mobx"; import type { LensExtension } from "../lens-extension"; import type { CatalogEntity } from "../../common/catalog"; @@ -39,14 +38,6 @@ export interface CommandRegistration { } export class CommandRegistry extends BaseRegistry { - @observable.ref activeEntity: CatalogEntity; - - constructor() { - super(); - - makeObservable(this); - } - add(items: CommandRegistration | CommandRegistration[], extension?: LensExtension) { const itemArray = [items].flat(); diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 09d53ad5cf..e5db4adbb3 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -50,6 +50,19 @@ export enum ClusterMetadataKey { PROMETHEUS = "prometheus" } +export enum ClusterMetricsResourceType { + Cluster = "Cluster", + Node = "Node", + Pod = "Pod", + Deployment = "Deployment", + StatefulSet = "StatefulSet", + Container = "Container", + Ingress = "Ingress", + VolumeClaim = "VolumeClaim", + ReplicaSet = "ReplicaSet", + DaemonSet = "DaemonSet", +} + export type ClusterRefreshOptions = { refreshMetadata?: boolean }; @@ -709,4 +722,8 @@ export class Cluster implements ClusterModel, ClusterState { return true; // allowed by default for other resources } + + isMetricHidden(resource: ClusterMetricsResourceType): boolean { + return Boolean(this.preferences.hiddenMetrics?.includes(resource)); + } } diff --git a/src/renderer/api/catalog-entity-registry.ts b/src/renderer/api/catalog-entity-registry.ts index 63681106bd..e2f83058b8 100644 --- a/src/renderer/api/catalog-entity-registry.ts +++ b/src/renderer/api/catalog-entity-registry.ts @@ -19,15 +19,17 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { computed, observable, makeObservable } from "mobx"; +import { computed, makeObservable, observable } from "mobx"; import { subscribeToBroadcast } from "../../common/ipc"; -import { CatalogCategory, CatalogEntity, CatalogEntityData, catalogCategoryRegistry, CatalogCategoryRegistry, CatalogEntityKindData } from "../../common/catalog"; +import { CatalogCategory, catalogCategoryRegistry, CatalogCategoryRegistry, CatalogEntity, CatalogEntityData, CatalogEntityKindData } from "../../common/catalog"; import "../../common/catalog-entities"; import { iter } from "../utils"; +import type { Cluster } from "../../main/cluster"; +import { ClusterStore } from "../../common/cluster-store"; export class CatalogEntityRegistry { - protected rawItems = observable.array([], { deep: true }); - @observable protected _activeEntity: CatalogEntity; + protected rawItems = observable.array(); + @observable.ref activeEntity?: CatalogEntity; constructor(private categoryRegistry: CatalogCategoryRegistry) { makeObservable(this); @@ -39,14 +41,6 @@ export class CatalogEntityRegistry { }); } - set activeEntity(entity: CatalogEntity) { - this._activeEntity = entity; - } - - get activeEntity() { - return this._activeEntity; - } - @computed get items() { return Array.from(iter.filterMap(this.rawItems, rawItem => this.categoryRegistry.getEntityForData(rawItem))); } @@ -74,3 +68,7 @@ export class CatalogEntityRegistry { } export const catalogEntityRegistry = new CatalogEntityRegistry(catalogCategoryRegistry); + +export function getActiveClusterEntity(): Cluster | undefined { + return ClusterStore.getInstance().getById(catalogEntityRegistry.activeEntity?.getId()); +} diff --git a/src/renderer/api/catalog-entity.ts b/src/renderer/api/catalog-entity.ts index 63a5ce62eb..212c64464b 100644 --- a/src/renderer/api/catalog-entity.ts +++ b/src/renderer/api/catalog-entity.ts @@ -20,8 +20,8 @@ */ import { navigate } from "../navigation"; -import { commandRegistry } from "../../extensions/registries"; -import type { CatalogEntity } from "../../common/catalog"; +import type { CatalogEntity } from "../../common/catalog"; +import { catalogEntityRegistry } from "./catalog-entity-registry"; export { CatalogCategory, CatalogEntity } from "../../common/catalog"; export type { @@ -37,6 +37,6 @@ export type { export const catalogEntityRunContext = { navigate: (url: string) => navigate(url), setCommandPaletteContext: (entity?: CatalogEntity) => { - commandRegistry.activeEntity = entity; + catalogEntityRegistry.activeEntity = entity; } }; diff --git a/src/renderer/components/+cluster/cluster-overview.tsx b/src/renderer/components/+cluster/cluster-overview.tsx index cc72c7cc63..8149f614ff 100644 --- a/src/renderer/components/+cluster/cluster-overview.tsx +++ b/src/renderer/components/+cluster/cluster-overview.tsx @@ -26,7 +26,7 @@ import { reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { nodesStore } from "../+nodes/nodes.store"; import { podsStore } from "../+workloads-pods/pods.store"; -import { ClusterStore, getHostedCluster } from "../../../common/cluster-store"; +import { getHostedCluster } from "../../../common/cluster-store"; import { interval } from "../../utils"; import { TabLayout } from "../layout/tab-layout"; import { Spinner } from "../spinner"; @@ -34,7 +34,8 @@ import { ClusterIssues } from "./cluster-issues"; import { ClusterMetrics } from "./cluster-metrics"; import { clusterOverviewStore } from "./cluster-overview.store"; import { ClusterPieCharts } from "./cluster-pie-charts"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; @observer export class ClusterOverview extends React.Component { @@ -87,12 +88,12 @@ export class ClusterOverview extends React.Component { render() { const isLoaded = nodesStore.isLoaded && podsStore.isLoaded; - const isMetricsHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.Cluster); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Cluster); return (
- {this.renderClusterOverview(isLoaded, isMetricsHidden)} + {this.renderClusterOverview(isLoaded, isMetricHidden)}
); diff --git a/src/renderer/components/+network-ingresses/ingress-details.tsx b/src/renderer/components/+network-ingresses/ingress-details.tsx index 8e9ddf7bb4..a615da27e3 100644 --- a/src/renderer/components/+network-ingresses/ingress-details.tsx +++ b/src/renderer/components/+network-ingresses/ingress-details.tsx @@ -35,8 +35,8 @@ import { IngressCharts } from "./ingress-charts"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; import { getBackendServiceNamePort } from "../../api/endpoints/ingress.api"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -74,7 +74,7 @@ export class IngressDetails extends React.Component { { rule.http.paths.map((path, index) => { const { serviceName, servicePort } = getBackendServiceNamePort(path.backend); - const backend =`${serviceName}:${servicePort}`; + const backend = `${serviceName}:${servicePort}`; return ( @@ -94,22 +94,23 @@ export class IngressDetails extends React.Component { } renderIngressPoints(ingressPoints: ILoadBalancerIngress[]) { - if (!ingressPoints || ingressPoints.length === 0) return null; + if (!ingressPoints || ingressPoints.length === 0) return null; return (
- Hostname + Hostname IP - {ingressPoints.map(({hostname, ip}, index) => { + {ingressPoints.map(({ hostname, ip }, index) => { return ( {hostname ? hostname : "-"} {ip ? ip : "-"} - );}) + ); + }) })
@@ -130,7 +131,7 @@ export class IngressDetails extends React.Component { "Network", "Duration", ]; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.Ingress); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Ingress); const { serviceName, servicePort } = ingress.getServiceNamePort(); return ( diff --git a/src/renderer/components/+nodes/node-details.tsx b/src/renderer/components/+nodes/node-details.tsx index 6d32eb585b..67cb76de2e 100644 --- a/src/renderer/components/+nodes/node-details.tsx +++ b/src/renderer/components/+nodes/node-details.tsx @@ -38,8 +38,8 @@ import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { KubeEventDetails } from "../+events/kube-event-details"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; import { NodeDetailsResources } from "./node-details-resources"; import { DrawerTitle } from "../drawer/drawer-title"; @@ -77,7 +77,7 @@ export class NodeDetails extends React.Component { "Disk", "Pods", ]; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.Node); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Node); return (
diff --git a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx index c2ae2f672f..d7d474365d 100644 --- a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx +++ b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx @@ -35,8 +35,8 @@ import { VolumeClaimDiskChart } from "./volume-claim-disk-chart"; import { getDetailsUrl, KubeObjectDetailsProps, KubeObjectMeta } from "../kube-object"; import type { PersistentVolumeClaim } from "../../api/endpoints"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -64,7 +64,7 @@ export class PersistentVolumeClaimDetails extends React.Component { const metricTabs = [ "Disk" ]; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.VolumeClaim); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.VolumeClaim); return (
diff --git a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx index 96bf692e72..8df3af9bd6 100644 --- a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx +++ b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx @@ -39,8 +39,8 @@ import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -70,7 +70,7 @@ export class DaemonSetDetails extends React.Component { const nodeSelector = daemonSet.getNodeSelectors(); const childPods = daemonSetStore.getChildPods(daemonSet); const metrics = daemonSetStore.metrics; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.DaemonSet); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.DaemonSet); return (
diff --git a/src/renderer/components/+workloads-deployments/deployment-details.tsx b/src/renderer/components/+workloads-deployments/deployment-details.tsx index 21bf03bdf5..b1b98939b7 100644 --- a/src/renderer/components/+workloads-deployments/deployment-details.tsx +++ b/src/renderer/components/+workloads-deployments/deployment-details.tsx @@ -40,10 +40,10 @@ import { reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; import { replicaSetStore } from "../+workloads-replicasets/replicasets.store"; import { DeploymentReplicaSets } from "./deployment-replicasets"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -74,7 +74,7 @@ export class DeploymentDetails extends React.Component { const childPods = deploymentStore.getChildPods(deployment); const replicaSets = replicaSetStore.getReplicaSetsByOwner(deployment); const metrics = deploymentStore.metrics; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.Deployment); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Deployment); return (
diff --git a/src/renderer/components/+workloads-pods/pod-details-container.tsx b/src/renderer/components/+workloads-pods/pod-details-container.tsx index 1596a6cad7..a6aeae0593 100644 --- a/src/renderer/components/+workloads-pods/pod-details-container.tsx +++ b/src/renderer/components/+workloads-pods/pod-details-container.tsx @@ -32,9 +32,9 @@ import { PodContainerPort } from "./pod-container-port"; import { ResourceMetrics } from "../resource-metrics"; import type { IMetrics } from "../../api/endpoints/metrics.api"; import { ContainerCharts } from "./container-charts"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; import { LocaleDate } from "../locale-date"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props { pod: Pod; @@ -89,7 +89,7 @@ export class PodDetailsContainer extends React.Component { "Memory", "Filesystem", ]; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.Container); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Container); return (
@@ -125,7 +125,7 @@ export class PodDetailsContainer extends React.Component { ports.map((port) => { const key = `${container.name}-port-${port.containerPort}-${port.protocol}`; - return( + return ( ); }) diff --git a/src/renderer/components/+workloads-pods/pod-details.tsx b/src/renderer/components/+workloads-pods/pod-details.tsx index 74acfff2cc..076928fe56 100644 --- a/src/renderer/components/+workloads-pods/pod-details.tsx +++ b/src/renderer/components/+workloads-pods/pod-details.tsx @@ -43,8 +43,8 @@ import { getItemMetrics } from "../../api/endpoints/metrics.api"; import { PodCharts, podMetricTabs } from "./pod-charts"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -94,7 +94,7 @@ export class PodDetails extends React.Component { const nodeSelector = pod.getNodeSelectors(); const volumes = pod.getVolumes(); const metrics = podsStore.metrics; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.Pod); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Pod); return (
diff --git a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx index e02d23a3d5..9af8511984 100644 --- a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx +++ b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx @@ -38,8 +38,8 @@ import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -70,7 +70,7 @@ export class ReplicaSetDetails extends React.Component { const nodeSelector = replicaSet.getNodeSelectors(); const images = replicaSet.getImages(); const childPods = replicaSetStore.getChildPods(replicaSet); - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.ReplicaSet); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.ReplicaSet); return (
diff --git a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx index 0342d424e9..1d4d7727d1 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx @@ -39,8 +39,8 @@ import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; import { KubeObjectMeta } from "../kube-object/kube-object-meta"; import { kubeObjectDetailRegistry } from "../../api/kube-object-detail-registry"; -import { ResourceType } from "../cluster-settings/components/cluster-metrics-setting"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; +import { ClusterMetricsResourceType } from "../../../main/cluster"; interface Props extends KubeObjectDetailsProps { } @@ -69,7 +69,7 @@ export class StatefulSetDetails extends React.Component { const nodeSelector = statefulSet.getNodeSelectors(); const childPods = statefulSetStore.getChildPods(statefulSet); const metrics = statefulSetStore.metrics; - const isMetricHidden = ClusterStore.getInstance().isMetricHidden(ResourceType.StatefulSet); + const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.StatefulSet); return (
@@ -117,7 +117,6 @@ export class StatefulSetDetails extends React.Component { } } - kubeObjectDetailRegistry.add({ kind: "StatefulSet", apiVersions: ["apps/v1"], diff --git a/src/renderer/components/cluster-manager/cluster-view.tsx b/src/renderer/components/cluster-manager/cluster-view.tsx index ed4cbe2718..af719107e0 100644 --- a/src/renderer/components/cluster-manager/cluster-view.tsx +++ b/src/renderer/components/cluster-manager/cluster-view.tsx @@ -35,6 +35,8 @@ import { catalogURL } from "../+catalog/catalog.route"; @observer export class ClusterView extends React.Component { + private store = ClusterStore.getInstance(); + constructor(props: {}) { super(props); makeObservable(this); @@ -45,7 +47,7 @@ export class ClusterView extends React.Component { } @computed get cluster(): Cluster | undefined { - return ClusterStore.getInstance().getById(this.clusterId); + return this.store.getById(this.clusterId); } @computed get isReady(): boolean { diff --git a/src/renderer/components/cluster-settings/cluster-settings.command.ts b/src/renderer/components/cluster-settings/cluster-settings.command.ts index 80d49ae39f..a7265bcf3c 100644 --- a/src/renderer/components/cluster-settings/cluster-settings.command.ts +++ b/src/renderer/components/cluster-settings/cluster-settings.command.ts @@ -22,7 +22,7 @@ import { navigate } from "../../navigation"; import { commandRegistry } from "../../../extensions/registries/command-registry"; import { entitySettingsURL } from "../+entity-settings"; -import { ClusterStore } from "../../../common/cluster-store"; +import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; commandRegistry.add({ id: "cluster.viewCurrentClusterSettings", @@ -30,7 +30,7 @@ commandRegistry.add({ scope: "global", action: () => navigate(entitySettingsURL({ params: { - entityId: ClusterStore.getInstance().active.id + entityId: getActiveClusterEntity()?.id, } })), isActive: (context) => !!context.entity diff --git a/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx index 798ae7daa5..21a6b3242d 100644 --- a/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-metrics-setting.tsx @@ -25,26 +25,13 @@ import { Select, SelectOption } from "../../select/select"; import { Icon } from "../../icon/icon"; import { Button } from "../../button/button"; import { SubTitle } from "../../layout/sub-title"; -import type { Cluster } from "../../../../main/cluster"; +import { Cluster, ClusterMetricsResourceType } from "../../../../main/cluster"; import { observable, reaction, makeObservable } from "mobx"; interface Props { cluster: Cluster; } -export enum ResourceType { - Cluster = "Cluster", - Node = "Node", - Pod = "Pod", - Deployment = "Deployment", - StatefulSet = "StatefulSet", - Container = "Container", - Ingress = "Ingress", - VolumeClaim = "VolumeClaim", - ReplicaSet = "ReplicaSet", - DaemonSet = "DaemonSet", -} - @observer export class ClusterMetricsSetting extends React.Component { @observable hiddenMetrics = observable.set(); @@ -68,7 +55,7 @@ export class ClusterMetricsSetting extends React.Component { this.props.cluster.preferences.hiddenMetrics = Array.from(this.hiddenMetrics); }; - onChangeSelect = (values: SelectOption[]) => { + onChangeSelect = (values: SelectOption[]) => { for (const { value } of values) { if (this.hiddenMetrics.has(value)) { this.hiddenMetrics.delete(value); @@ -80,7 +67,7 @@ export class ClusterMetricsSetting extends React.Component { }; onChangeButton = () => { - Object.keys(ResourceType).map(value => + Object.keys(ClusterMetricsResourceType).map(value => this.hiddenMetrics.add(value) ); this.save(); @@ -91,7 +78,7 @@ export class ClusterMetricsSetting extends React.Component { this.save(); }; - formatOptionLabel = ({ value: resource }: SelectOption) => ( + formatOptionLabel = ({ value: resource }: SelectOption) => (
{resource} {this.hiddenMetrics.has(resource) && } @@ -110,7 +97,7 @@ export class ClusterMetricsSetting extends React.Component { onMenuClose={this.save} closeMenuOnSelect={false} controlShouldRenderValue={false} - options={Object.values(ResourceType)} + options={Object.values(ClusterMetricsResourceType)} onChange={this.onChangeSelect} formatOptionLabel={this.formatOptionLabel} /> diff --git a/src/renderer/components/command-palette/command-container.tsx b/src/renderer/components/command-palette/command-container.tsx index 50e79bde12..120c570c77 100644 --- a/src/renderer/components/command-palette/command-container.tsx +++ b/src/renderer/components/command-palette/command-container.tsx @@ -30,6 +30,7 @@ import { subscribeToBroadcast } from "../../../common/ipc"; import { CommandDialog } from "./command-dialog"; import { CommandRegistration, commandRegistry } from "../../../extensions/registries/command-registry"; import type { ClusterId } from "../../../common/cluster-store"; +import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; export type CommandDialogEvent = { component: React.ReactElement @@ -78,7 +79,7 @@ export class CommandContainer extends React.Component { private runCommand(command: CommandRegistration) { command.action({ - entity: commandRegistry.activeEntity + entity: catalogEntityRegistry.activeEntity }); } diff --git a/src/renderer/components/command-palette/command-dialog.tsx b/src/renderer/components/command-palette/command-dialog.tsx index 16c375d666..6049c23de9 100644 --- a/src/renderer/components/command-palette/command-dialog.tsx +++ b/src/renderer/components/command-palette/command-dialog.tsx @@ -25,11 +25,12 @@ import { computed, makeObservable, observable } from "mobx"; import { observer } from "mobx-react"; import React from "react"; import { commandRegistry } from "../../../extensions/registries/command-registry"; -import { ClusterStore } from "../../../common/cluster-store"; import { CommandOverlay } from "./command-container"; import { broadcastMessage } from "../../../common/ipc"; import { navigate } from "../../navigation"; import { clusterViewURL } from "../cluster-manager/cluster-view.route"; +import { catalogEntityRegistry } from "../../api/catalog-entity-registry"; +import type { CatalogEntity } from "../../../common/catalog"; @observer export class CommandDialog extends React.Component { @@ -39,14 +40,18 @@ export class CommandDialog extends React.Component { super(props); makeObservable(this); } - + + @computed get activeEntity(): CatalogEntity | undefined { + return catalogEntityRegistry.activeEntity; + } + @computed get options() { const context = { - entity: commandRegistry.activeEntity + entity: this.activeEntity }; return commandRegistry.getItems().filter((command) => { - if (command.scope === "entity" && !ClusterStore.getInstance().active) { + if (command.scope === "entity" && !this.activeEntity) { return false; } @@ -78,15 +83,15 @@ export class CommandDialog extends React.Component { if (command.scope === "global") { command.action({ - entity: commandRegistry.activeEntity + entity: this.activeEntity }); - } else if(commandRegistry.activeEntity) { + } else if(this.activeEntity) { navigate(clusterViewURL({ params: { - clusterId: commandRegistry.activeEntity.metadata.uid + clusterId: this.activeEntity.metadata.uid } })); - broadcastMessage(`command-palette:run-action:${commandRegistry.activeEntity.metadata.uid}`, command.id); + broadcastMessage(`command-palette:run-action:${this.activeEntity.metadata.uid}`, command.id); } } catch(error) { console.error("[COMMAND-DIALOG] failed to execute command", command.id, error); diff --git a/src/renderer/lens-app.tsx b/src/renderer/lens-app.tsx index 9043819761..c58845fe23 100644 --- a/src/renderer/lens-app.tsx +++ b/src/renderer/lens-app.tsx @@ -31,13 +31,11 @@ import { ConfirmDialog } from "./components/confirm-dialog"; import { ExtensionLoader } from "../extensions/extension-loader"; import { broadcastMessage } from "../common/ipc"; import { CommandContainer } from "./components/command-palette/command-container"; -import { LensProtocolRouterRenderer, bindProtocolAddRouteHandlers } from "./protocol-handler"; +import { bindProtocolAddRouteHandlers, LensProtocolRouterRenderer } from "./protocol-handler"; import { registerIpcHandlers } from "./ipc"; import { ipcRenderer } from "electron"; import { IpcRendererNavigationEvents } from "./navigation/events"; import { catalogEntityRegistry } from "./api/catalog-entity-registry"; -import { commandRegistry } from "../extensions/registries"; -import { reaction } from "mobx"; @observer export class LensApp extends React.Component { @@ -54,18 +52,6 @@ export class LensApp extends React.Component { ipcRenderer.send(IpcRendererNavigationEvents.LOADED); } - componentDidMount() { - reaction(() => catalogEntityRegistry.items, (items) => { - if (!commandRegistry.activeEntity) { - return; - } - - if (!items.includes(commandRegistry.activeEntity)) { - commandRegistry.activeEntity = null; - } - }); - } - render() { return (