From 930af6c6fd1029108bf77a150a55b790c9c9f275 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 13 Apr 2022 11:59:38 -0400 Subject: [PATCH] convert all KubeObjectStores to injectable with legacy global backups Signed-off-by: Sebastian Malton --- src/common/utils/cluster-id-url-parsing.ts | 10 ---- src/extensions/renderer-api/k8s-api.ts | 30 ++++++------ .../components/+cluster/cluster-issues.tsx | 6 +-- .../+cluster/cluster-metric-switchers.tsx | 26 ++++++----- .../cluster-overview-store.ts | 13 +++--- .../components/+cluster/cluster-overview.tsx | 17 +++++-- .../+cluster/cluster-pie-charts.tsx | 26 ++++++----- .../components/+config-autoscalers/hpa.tsx | 4 +- .../+config-autoscalers/legacy-store.ts | 12 +++++ .../+config-autoscalers/store.injectable.ts | 27 +++++++++++ .../{hpa.store.ts => store.ts} | 11 ----- .../+config-limit-ranges/legacy-store.ts | 12 +++++ .../+config-limit-ranges/limit-ranges.tsx | 2 +- .../+config-limit-ranges/store.injectable.ts | 27 +++++++++++ .../{limit-ranges.store.ts => store.ts} | 11 ----- .../+config-maps/config-map-details.tsx | 2 +- .../components/+config-maps/config-maps.tsx | 2 +- .../components/+config-maps/legacy-store.ts | 12 +++++ .../+config-maps/store.injectable.ts | 27 +++++++++++ .../{config-maps.store.ts => store.ts} | 11 ----- .../legacy-store.ts | 12 +++++ .../pod-disruption-budgets.tsx | 4 +- .../store.injectable.ts | 27 +++++++++++ ...d-disruption-budgets.store.ts => store.ts} | 11 ----- .../+config-resource-quotas/legacy-store.ts | 12 +++++ .../resource-quotas.tsx | 2 +- .../store.injectable.ts | 27 +++++++++++ .../{resource-quotas.store.ts => store.ts} | 11 ----- .../+config-secrets/legacy-store.ts | 12 +++++ .../+config-secrets/secret-details.tsx | 2 +- .../components/+config-secrets/secrets.tsx | 2 +- .../+config-secrets/store.injectable.ts | 27 +++++++++++ .../{secrets.store.ts => store.ts} | 11 ----- .../components/+custom-resources/crd-list.tsx | 12 ++--- .../+custom-resources/crd-resources.tsx | 35 +++++++------- ...om-resources-route-component.injectable.ts | 4 +- .../custom-resources.injectable.ts | 7 +-- .../definition.store.injectable.ts | 30 ++++++++++++ .../{crd.store.ts => definition.store.ts} | 46 ++++++------------- .../init-resource-store.injectable.ts | 36 +++++++++++++++ .../+custom-resources/legacy-store.ts | 12 +++++ ...rd-resource.store.ts => resource.store.ts} | 2 +- src/renderer/components/+events/events.tsx | 44 ++++++++---------- .../components/+events/kube-event-details.tsx | 9 ++-- .../components/+events/kube-event-icon.tsx | 2 +- .../components/+events/legacy-store.ts | 12 +++++ .../components/+events/store.injectable.ts | 30 ++++++++++++ .../+events/{event.store.ts => store.ts} | 33 ++++++------- .../+namespaces/namespace-details.tsx | 4 +- .../+network-endpoints/endpoints.store.ts | 21 --------- .../+network-endpoints/endpoints.tsx | 4 +- .../+network-endpoints/legacy-store.ts | 12 +++++ .../+network-endpoints/store.injectable.ts | 27 +++++++++++ .../components/+network-endpoints/store.ts | 10 ++++ .../+network-ingresses/ingresses.tsx | 2 +- .../+network-ingresses/legacy-store.ts | 12 +++++ .../+network-ingresses/store.injectable.ts | 27 +++++++++++ .../{ingress.store.ts => store.ts} | 11 ----- .../+network-policies/legacy-store.ts | 12 +++++ .../+network-policies/network-policies.tsx | 2 +- .../+network-policies/store.injectable.ts | 27 +++++++++++ .../{network-policy.store.ts => store.ts} | 5 -- .../+network-services/legacy-store.ts | 12 +++++ .../service-details-endpoint.tsx | 4 +- .../+network-services/service-details.tsx | 22 ++++++--- .../components/+network-services/services.tsx | 2 +- .../+network-services/store.injectable.ts | 27 +++++++++++ .../{services.store.ts => store.ts} | 5 -- .../components/+nodes/legacy-store.ts | 12 +++++ src/renderer/components/+nodes/route.tsx | 8 ++-- .../components/+nodes/store.injectable.ts | 27 +++++++++++ .../+nodes/{nodes.store.ts => store.ts} | 21 +++------ .../+pod-security-policies/legacy-store.ts | 12 +++++ .../pod-security-policies.tsx | 2 +- .../store.injectable.ts | 27 +++++++++++ ...od-security-policies.store.ts => store.ts} | 5 -- .../+storage-classes/legacy-store.ts | 12 +++++ .../storage-class-details.tsx | 14 ++++-- .../+storage-classes/storage-class.store.ts | 19 -------- .../+storage-classes/storage-classes.tsx | 2 +- .../+storage-classes/store.injectable.ts | 30 ++++++++++++ .../components/+storage-classes/store.ts | 27 +++++++++++ .../+storage-volume-claims/legacy-store.ts | 12 +++++ .../store.injectable.ts | 27 +++++++++++ .../{volume-claim.store.ts => store.ts} | 5 -- .../+storage-volume-claims/volume-claims.tsx | 2 +- ...ten-volumes-by-storage-class.injectable.ts | 20 ++++++++ .../+storage-volumes/legacy-store.ts | 12 +++++ .../+storage-volumes/store.injectable.ts | 27 +++++++++++ .../{volumes.store.ts => store.ts} | 14 ++---- .../+storage-volumes/volume-details-list.tsx | 4 +- .../components/+storage-volumes/volumes.tsx | 4 +- .../+role-bindings/details.tsx | 2 +- .../+role-bindings/dialog.tsx | 2 +- .../+role-bindings/legacy-store.ts | 12 +++++ .../+role-bindings/store.injectable.ts | 27 +++++++++++ .../+user-management/+role-bindings/store.ts | 12 +---- .../+user-management/+role-bindings/view.tsx | 2 +- .../+service-accounts/details.tsx | 2 +- .../+workloads-cronjobs/cronjobs.tsx | 2 +- .../+workloads-daemonsets/daemonsets.tsx | 2 +- .../+workloads-deployments/deployments.tsx | 2 +- .../components/+workloads-jobs/jobs.tsx | 2 +- .../+workloads-overview/overview.tsx | 7 ++- .../+workloads-pods/pod-container-env.tsx | 4 +- .../components/+workloads-pods/pods.tsx | 2 +- .../+workloads-replicasets/replicasets.tsx | 2 +- .../+workloads-statefulsets/statefulsets.tsx | 2 +- .../kube-object-details.tsx | 6 +-- src/renderer/create-stores-apis.injectable.ts | 4 +- 110 files changed, 1046 insertions(+), 403 deletions(-) create mode 100644 src/renderer/components/+config-autoscalers/legacy-store.ts create mode 100644 src/renderer/components/+config-autoscalers/store.injectable.ts rename src/renderer/components/+config-autoscalers/{hpa.store.ts => store.ts} (52%) create mode 100644 src/renderer/components/+config-limit-ranges/legacy-store.ts create mode 100644 src/renderer/components/+config-limit-ranges/store.injectable.ts rename src/renderer/components/+config-limit-ranges/{limit-ranges.store.ts => store.ts} (50%) create mode 100644 src/renderer/components/+config-maps/legacy-store.ts create mode 100644 src/renderer/components/+config-maps/store.injectable.ts rename src/renderer/components/+config-maps/{config-maps.store.ts => store.ts} (52%) create mode 100644 src/renderer/components/+config-pod-disruption-budgets/legacy-store.ts create mode 100644 src/renderer/components/+config-pod-disruption-budgets/store.injectable.ts rename src/renderer/components/+config-pod-disruption-budgets/{pod-disruption-budgets.store.ts => store.ts} (50%) create mode 100644 src/renderer/components/+config-resource-quotas/legacy-store.ts create mode 100644 src/renderer/components/+config-resource-quotas/store.injectable.ts rename src/renderer/components/+config-resource-quotas/{resource-quotas.store.ts => store.ts} (50%) create mode 100644 src/renderer/components/+config-secrets/legacy-store.ts create mode 100644 src/renderer/components/+config-secrets/store.injectable.ts rename src/renderer/components/+config-secrets/{secrets.store.ts => store.ts} (52%) create mode 100644 src/renderer/components/+custom-resources/definition.store.injectable.ts rename src/renderer/components/+custom-resources/{crd.store.ts => definition.store.ts} (50%) create mode 100644 src/renderer/components/+custom-resources/init-resource-store.injectable.ts create mode 100644 src/renderer/components/+custom-resources/legacy-store.ts rename src/renderer/components/+custom-resources/{crd-resource.store.ts => resource.store.ts} (81%) create mode 100644 src/renderer/components/+events/legacy-store.ts create mode 100644 src/renderer/components/+events/store.injectable.ts rename src/renderer/components/+events/{event.store.ts => store.ts} (76%) delete mode 100644 src/renderer/components/+network-endpoints/endpoints.store.ts create mode 100644 src/renderer/components/+network-endpoints/legacy-store.ts create mode 100644 src/renderer/components/+network-endpoints/store.injectable.ts create mode 100644 src/renderer/components/+network-endpoints/store.ts create mode 100644 src/renderer/components/+network-ingresses/legacy-store.ts create mode 100644 src/renderer/components/+network-ingresses/store.injectable.ts rename src/renderer/components/+network-ingresses/{ingress.store.ts => store.ts} (50%) create mode 100644 src/renderer/components/+network-policies/legacy-store.ts create mode 100644 src/renderer/components/+network-policies/store.injectable.ts rename src/renderer/components/+network-policies/{network-policy.store.ts => store.ts} (60%) create mode 100644 src/renderer/components/+network-services/legacy-store.ts create mode 100644 src/renderer/components/+network-services/store.injectable.ts rename src/renderer/components/+network-services/{services.store.ts => store.ts} (61%) create mode 100644 src/renderer/components/+nodes/legacy-store.ts create mode 100644 src/renderer/components/+nodes/store.injectable.ts rename src/renderer/components/+nodes/{nodes.store.ts => store.ts} (56%) create mode 100644 src/renderer/components/+pod-security-policies/legacy-store.ts create mode 100644 src/renderer/components/+pod-security-policies/store.injectable.ts rename src/renderer/components/+pod-security-policies/{pod-security-policies.store.ts => store.ts} (60%) create mode 100644 src/renderer/components/+storage-classes/legacy-store.ts delete mode 100644 src/renderer/components/+storage-classes/storage-class.store.ts create mode 100644 src/renderer/components/+storage-classes/store.injectable.ts create mode 100644 src/renderer/components/+storage-classes/store.ts create mode 100644 src/renderer/components/+storage-volume-claims/legacy-store.ts create mode 100644 src/renderer/components/+storage-volume-claims/store.injectable.ts rename src/renderer/components/+storage-volume-claims/{volume-claim.store.ts => store.ts} (59%) create mode 100644 src/renderer/components/+storage-volumes/get-persisten-volumes-by-storage-class.injectable.ts create mode 100644 src/renderer/components/+storage-volumes/legacy-store.ts create mode 100644 src/renderer/components/+storage-volumes/store.injectable.ts rename src/renderer/components/+storage-volumes/{volumes.store.ts => store.ts} (51%) create mode 100644 src/renderer/components/+user-management/+role-bindings/legacy-store.ts create mode 100644 src/renderer/components/+user-management/+role-bindings/store.injectable.ts diff --git a/src/common/utils/cluster-id-url-parsing.ts b/src/common/utils/cluster-id-url-parsing.ts index 5ba85eb382..cb02f36484 100644 --- a/src/common/utils/cluster-id-url-parsing.ts +++ b/src/common/utils/cluster-id-url-parsing.ts @@ -3,7 +3,6 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { once } from "lodash/fp"; import type { ClusterId } from "../cluster-types"; /** @@ -26,12 +25,3 @@ export function getClusterIdFromHost(host: string): ClusterId | undefined { export function getClusterFrameUrl(clusterId: ClusterId) { return `//${clusterId}.${location.host}`; } - -/** - * Returns true only if code is running within a cluster iframe context - */ -export const isClusterPageContext = once(() => { - if (typeof window === "undefined") return false; - - return !!getClusterIdFromHost(window.location.host); -}); diff --git a/src/extensions/renderer-api/k8s-api.ts b/src/extensions/renderer-api/k8s-api.ts index 34880d2dd2..291869936c 100644 --- a/src/extensions/renderer-api/k8s-api.ts +++ b/src/extensions/renderer-api/k8s-api.ts @@ -87,31 +87,31 @@ export { } from "./kube-object-status"; // stores -export type { EventStore } from "../../renderer/components/+events/event.store"; +export type { EventStore } from "../../renderer/components/+events/store"; export type { PodStore as PodsStore } from "../../renderer/components/+workloads-pods/store"; -export type { NodesStore } from "../../renderer/components/+nodes/nodes.store"; +export type { NodeStore as NodesStore } from "../../renderer/components/+nodes/store"; export type { DeploymentStore } from "../../renderer/components/+workloads-deployments/store"; export type { DaemonSetStore } from "../../renderer/components/+workloads-daemonsets/store"; export type { StatefulSetStore } from "../../renderer/components/+workloads-statefulsets/store"; export type { JobStore } from "../../renderer/components/+workloads-jobs/store"; export type { CronJobStore } from "../../renderer/components/+workloads-cronjobs/store"; -export type { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/+config-maps/config-maps.store"; -export type { SecretStore as SecretsStore } from "../../renderer/components/+config-secrets/secrets.store"; +export type { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/+config-maps/store"; +export type { SecretStore as SecretsStore } from "../../renderer/components/+config-secrets/store"; export type { ReplicaSetStore } from "../../renderer/components/+workloads-replicasets/store"; -export type { ResourceQuotaStore as ResourceQuotasStore } from "../../renderer/components/+config-resource-quotas/resource-quotas.store"; +export type { ResourceQuotaStore as ResourceQuotasStore } from "../../renderer/components/+config-resource-quotas/store"; export type { LimitRangeStore as LimitRangesStore } from "../../renderer/components/+config-limit-ranges/store"; export type { HorizontalPodAutoscalerStore as HPAStore } from "../../renderer/components/+config-autoscalers/store"; -export type { PodDisruptionBudgetStore as PodDisruptionBudgetsStore } from "../../renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store"; -export type { ServiceStore } from "../../renderer/components/+network-services/services.store"; -export type { EndpointStore } from "../../renderer/components/+network-endpoints/endpoints.store"; -export type { IngressStore } from "../../renderer/components/+network-ingresses/ingress.store"; -export type { NetworkPolicyStore } from "../../renderer/components/+network-policies/network-policy.store"; -export type { PersistentVolumesStore } from "../../renderer/components/+storage-volumes/volumes.store"; -export type { PersistentVolumeClaimStore as VolumeClaimStore } from "../../renderer/components/+storage-volume-claims/volume-claim.store"; -export type { StorageClassStore } from "../../renderer/components/+storage-classes/storage-class.store"; +export type { PodDisruptionBudgetStore as PodDisruptionBudgetsStore } from "../../renderer/components/+config-pod-disruption-budgets/store"; +export type { ServiceStore } from "../../renderer/components/+network-services/store"; +export type { EndpointsStore as EndpointStore } from "../../renderer/components/+network-endpoints/store"; +export type { IngressStore } from "../../renderer/components/+network-ingresses/store"; +export type { NetworkPolicyStore } from "../../renderer/components/+network-policies/store"; +export type { PersistentVolumeStore as PersistentVolumesStore } from "../../renderer/components/+storage-volumes/store"; +export type { PersistentVolumeClaimStore as VolumeClaimStore } from "../../renderer/components/+storage-volume-claims/store"; +export type { StorageClassStore } from "../../renderer/components/+storage-classes/store"; export type { NamespaceStore } from "../../renderer/components/+namespaces/namespace-store/namespace.store"; export type { ServiceAccountStore as ServiceAccountsStore } from "../../renderer/components/+user-management/+service-accounts/store"; export type { RoleStore as RolesStore } from "../../renderer/components/+user-management/+roles/store"; export type { RoleBindingStore as RoleBindingsStore } from "../../renderer/components/+user-management/+role-bindings/store"; -export type { CRDStore } from "../../renderer/components/+custom-resources/crd.store"; -export type { CRDResourceStore } from "../../renderer/components/+custom-resources/crd-resource.store"; +export type { CustomResourceDefinitionStore as CRDStore } from "../../renderer/components/+custom-resources/definition.store"; +export type { CustomResourceStore as CRDResourceStore } from "../../renderer/components/+custom-resources/resource.store"; diff --git a/src/renderer/components/+cluster/cluster-issues.tsx b/src/renderer/components/+cluster/cluster-issues.tsx index 39fc1af076..881660abfa 100644 --- a/src/renderer/components/+cluster/cluster-issues.tsx +++ b/src/renderer/components/+cluster/cluster-issues.tsx @@ -11,8 +11,8 @@ import { computed, makeObservable } from "mobx"; import { Icon } from "../icon"; import { SubHeader } from "../layout/sub-header"; import { Table, TableCell, TableHead, TableRow } from "../table"; -import { nodesStore } from "../+nodes/nodes.store"; -import { eventStore } from "../+events/event.store"; +import { nodeStore } from "../+nodes/legacy-store"; +import { eventStore } from "../+events/legacy-store"; import { cssNames, prevDefault } from "../../utils"; import type { ItemObject } from "../../../common/item.store"; import { Spinner } from "../spinner"; @@ -48,7 +48,7 @@ export class ClusterIssues extends React.Component { @computed get warnings(): Warning[] { return [ - ...nodesStore.items.flatMap(node => ( + ...nodeStore.items.flatMap(node => ( node.getWarningConditions() .map(({ message }) => ({ selfLink: node.selfLink, diff --git a/src/renderer/components/+cluster/cluster-metric-switchers.tsx b/src/renderer/components/+cluster/cluster-metric-switchers.tsx index 18fd1635e7..32c3dce572 100644 --- a/src/renderer/components/+cluster/cluster-metric-switchers.tsx +++ b/src/renderer/components/+cluster/cluster-metric-switchers.tsx @@ -5,20 +5,25 @@ import React from "react"; import { observer } from "mobx-react"; -import { nodesStore } from "../+nodes/nodes.store"; +import type { NodeStore } from "../+nodes/store"; import { cssNames } from "../../utils"; import { Radio, RadioGroup } from "../radio"; import type { ClusterOverviewStore } from "./cluster-overview-store/cluster-overview-store"; import { MetricNodeRole, MetricType } from "./cluster-overview-store/cluster-overview-store"; import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable"; import { withInjectables } from "@ogre-tools/injectable-react"; +import nodeStoreInjectable from "../+nodes/store.injectable"; interface Dependencies { clusterOverviewStore: ClusterOverviewStore; + nodeStore: NodeStore; } -const NonInjectedClusterMetricSwitchers = observer(({ clusterOverviewStore }: Dependencies) => { - const { masterNodes, workerNodes } = nodesStore; +const NonInjectedClusterMetricSwitchers = observer(({ + clusterOverviewStore, + nodeStore, +}: Dependencies) => { + const { masterNodes, workerNodes } = nodeStore; const metricsValues = clusterOverviewStore.getMetricsValues(clusterOverviewStore.metrics); const disableRoles = !masterNodes.length || !workerNodes.length; const disableMetrics = !metricsValues.length; @@ -51,13 +56,10 @@ const NonInjectedClusterMetricSwitchers = observer(({ clusterOverviewStore }: De ); }); -export const ClusterMetricSwitchers = withInjectables( - NonInjectedClusterMetricSwitchers, - - { - getProps: (di) => ({ - clusterOverviewStore: di.inject(clusterOverviewStoreInjectable), - }), - }, -); +export const ClusterMetricSwitchers = withInjectables(NonInjectedClusterMetricSwitchers, { + getProps: (di) => ({ + clusterOverviewStore: di.inject(clusterOverviewStoreInjectable), + nodeStore: di.inject(nodeStoreInjectable), + }), +}); diff --git a/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts b/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts index ab33c36b3f..e6c912adc6 100644 --- a/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts +++ b/src/renderer/components/+cluster/cluster-overview-store/cluster-overview-store.ts @@ -10,7 +10,7 @@ import { getMetricsByNodeNames, type ClusterMetricData } from "../../../../commo import type { StorageLayer } from "../../../utils"; import { autoBind } from "../../../utils"; import { type IMetricsReqParams, normalizeMetrics } from "../../../../common/k8s-api/endpoints/metrics.api"; -import { nodesStore } from "../../+nodes/nodes.store"; +import type { NodeStore } from "../../+nodes/store"; export enum MetricType { MEMORY = "memory", @@ -28,7 +28,8 @@ export interface ClusterOverviewStorageState { } interface Dependencies { - storage: StorageLayer; + readonly storage: StorageLayer; + readonly nodeStore: NodeStore; } export class ClusterOverviewStore extends KubeObjectStore implements ClusterOverviewStorageState { @@ -69,8 +70,8 @@ export class ClusterOverviewStore extends KubeObjectStore i }); // check which node type to select - reaction(() => nodesStore.items.length, () => { - const { masterNodes, workerNodes } = nodesStore; + reaction(() => this.dependencies.nodeStore.items.length, () => { + const { masterNodes, workerNodes } = this.dependencies.nodeStore; if (!masterNodes.length) this.metricNodeRole = MetricNodeRole.WORKER; if (!workerNodes.length) this.metricNodeRole = MetricNodeRole.MASTER; @@ -79,8 +80,8 @@ export class ClusterOverviewStore extends KubeObjectStore i @action async loadMetrics(params?: IMetricsReqParams) { - await when(() => nodesStore.isLoaded); - const { masterNodes, workerNodes } = nodesStore; + await when(() => this.dependencies.nodeStore.isLoaded); + const { masterNodes, workerNodes } = this.dependencies.nodeStore; const nodes = this.metricNodeRole === MetricNodeRole.MASTER && masterNodes.length ? masterNodes : workerNodes; this.metrics = await getMetricsByNodeNames(nodes.map(node => node.getName()), params); diff --git a/src/renderer/components/+cluster/cluster-overview.tsx b/src/renderer/components/+cluster/cluster-overview.tsx index d0c195e178..20147fb910 100644 --- a/src/renderer/components/+cluster/cluster-overview.tsx +++ b/src/renderer/components/+cluster/cluster-overview.tsx @@ -8,7 +8,7 @@ import styles from "./cluster-overview.module.scss"; import React from "react"; import { reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; -import { nodesStore } from "../+nodes/nodes.store"; +import type { NodeStore } from "../+nodes/store"; import type { PodStore } from "../+workloads-pods/store"; import { interval } from "../../utils"; import { TabLayout } from "../layout/tab-layout"; @@ -19,7 +19,7 @@ import type { ClusterOverviewStore } from "./cluster-overview-store/cluster-over import { ClusterPieCharts } from "./cluster-pie-charts"; import { getActiveClusterEntity } from "../../api/catalog-entity-registry"; import { ClusterMetricsResourceType } from "../../../common/cluster-types"; -import { eventStore } from "../+events/event.store"; +import type { EventStore } from "../+events/store"; import { withInjectables } from "@ogre-tools/injectable-react"; import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable"; import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api"; @@ -28,12 +28,16 @@ import hostedClusterInjectable from "../../../common/cluster-store/hosted-cluste import assert from "assert"; import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable"; import podStoreInjectable from "../+workloads-pods/store.injectable"; +import eventStoreInjectable from "../+events/store.injectable"; +import nodeStoreInjectable from "../+nodes/store.injectable"; interface Dependencies { subscribeStores: SubscribeStores; clusterOverviewStore: ClusterOverviewStore; hostedCluster: Cluster; podStore: PodStore; + eventStore: EventStore; + nodeStore: NodeStore; } @observer @@ -52,8 +56,8 @@ class NonInjectedClusterOverview extends React.Component { disposeOnUnmount(this, [ this.props.subscribeStores([ this.props.podStore, - eventStore, - nodesStore, + this.props.eventStore, + this.props.nodeStore, ]), reaction( @@ -94,7 +98,8 @@ class NonInjectedClusterOverview extends React.Component { } render() { - const isLoaded = nodesStore.isLoaded && eventStore.isLoaded; + const { eventStore, nodeStore } = this.props; + const isLoaded = nodeStore.isLoaded && eventStore.isLoaded; const isMetricHidden = getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Cluster); return ( @@ -118,6 +123,8 @@ export const ClusterOverview = withInjectables(NonInjectedClusterO clusterOverviewStore: di.inject(clusterOverviewStoreInjectable), hostedCluster, podStore: di.inject(podStoreInjectable), + eventStore: di.inject(eventStoreInjectable), + nodeStore: di.inject(nodeStoreInjectable), }; }, }); diff --git a/src/renderer/components/+cluster/cluster-pie-charts.tsx b/src/renderer/components/+cluster/cluster-pie-charts.tsx index 3121904e08..17d43d4098 100644 --- a/src/renderer/components/+cluster/cluster-pie-charts.tsx +++ b/src/renderer/components/+cluster/cluster-pie-charts.tsx @@ -11,7 +11,7 @@ import type { ClusterOverviewStore } from "./cluster-overview-store/cluster-over import { MetricNodeRole } from "./cluster-overview-store/cluster-overview-store"; import { Spinner } from "../spinner"; import { Icon } from "../icon"; -import { nodesStore } from "../+nodes/nodes.store"; +import type { NodeStore } from "../+nodes/store"; import type { PieChartData } from "../chart"; import { PieChart } from "../chart"; import { ClusterNoMetrics } from "./cluster-no-metrics"; @@ -20,6 +20,7 @@ import { ThemeStore } from "../../theme.store"; import { getMetricLastPoints } from "../../../common/k8s-api/endpoints/metrics.api"; import { withInjectables } from "@ogre-tools/injectable-react"; import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable"; +import nodeStoreInjectable from "../+nodes/store.injectable"; function createLabels(rawLabelData: [string, number | undefined][]): string[] { return rawLabelData.map(([key, value]) => `${key}: ${value?.toFixed(2) || "N/A"}`); @@ -27,9 +28,13 @@ function createLabels(rawLabelData: [string, number | undefined][]): string[] { interface Dependencies { clusterOverviewStore: ClusterOverviewStore; + nodeStore: NodeStore; } -const NonInjectedClusterPieCharts = observer(({ clusterOverviewStore }: Dependencies) => { +const NonInjectedClusterPieCharts = observer(({ + clusterOverviewStore, + nodeStore, +}: Dependencies) => { const renderLimitWarning = () => { return (
@@ -210,7 +215,7 @@ const NonInjectedClusterPieCharts = observer(({ clusterOverviewStore }: Dependen }; const renderContent = ({ metricNodeRole, metricsLoaded }: ClusterOverviewStore) => { - const { masterNodes, workerNodes } = nodesStore; + const { masterNodes, workerNodes } = nodeStore; const nodes = metricNodeRole === MetricNodeRole.MASTER ? masterNodes : workerNodes; if (!nodes.length) { @@ -249,12 +254,9 @@ const NonInjectedClusterPieCharts = observer(({ clusterOverviewStore }: Dependen ); }); -export const ClusterPieCharts = withInjectables( - NonInjectedClusterPieCharts, - - { - getProps: (di) => ({ - clusterOverviewStore: di.inject(clusterOverviewStoreInjectable), - }), - }, -); +export const ClusterPieCharts = withInjectables(NonInjectedClusterPieCharts, { + getProps: (di) => ({ + clusterOverviewStore: di.inject(clusterOverviewStoreInjectable), + nodeStore: di.inject(nodeStoreInjectable), + }), +}); diff --git a/src/renderer/components/+config-autoscalers/hpa.tsx b/src/renderer/components/+config-autoscalers/hpa.tsx index 77c0b8ed2e..b8c70541d6 100644 --- a/src/renderer/components/+config-autoscalers/hpa.tsx +++ b/src/renderer/components/+config-autoscalers/hpa.tsx @@ -9,7 +9,7 @@ import React from "react"; import { observer } from "mobx-react"; import { KubeObjectListLayout } from "../kube-object-list-layout"; import type { HorizontalPodAutoscaler } from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api"; -import { hpaStore } from "./hpa.store"; +import { horizontalPodAutoscalerStore } from "./legacy-store"; import { Badge } from "../badge"; import { cssNames } from "../../utils"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; @@ -54,7 +54,7 @@ export class HorizontalPodAutoscalers extends React.Component { isConfigurable tableId="configuration_hpa" className="HorizontalPodAutoscalers" - store={hpaStore} + store={horizontalPodAutoscalerStore} sortingCallbacks={{ [columnId.name]: hpa => hpa.getName(), [columnId.namespace]: hpa => hpa.getNs(), diff --git a/src/renderer/components/+config-autoscalers/legacy-store.ts b/src/renderer/components/+config-autoscalers/legacy-store.ts new file mode 100644 index 0000000000..87ff91360e --- /dev/null +++ b/src/renderer/components/+config-autoscalers/legacy-store.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; +import horizontalPodAutoscalerStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(horizontalPodAutoscalerStoreInjectable)` instead + */ +export const horizontalPodAutoscalerStore = asLegacyGlobalForExtensionApi(horizontalPodAutoscalerStoreInjectable); diff --git a/src/renderer/components/+config-autoscalers/store.injectable.ts b/src/renderer/components/+config-autoscalers/store.injectable.ts new file mode 100644 index 0000000000..85311256d4 --- /dev/null +++ b/src/renderer/components/+config-autoscalers/store.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 assert from "assert"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import horizontalPodAutoscalerApiInjectable from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { HorizontalPodAutoscalerStore } from "./store"; + +const horizontalPodAutoscalerStoreInjectable = getInjectable({ + id: "horizontal-pod-autoscaler-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "horizontalPodAutoscalerStore is only available in certain environments"); + + const api = di.inject(horizontalPodAutoscalerApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new HorizontalPodAutoscalerStore(api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default horizontalPodAutoscalerStoreInjectable; diff --git a/src/renderer/components/+config-autoscalers/hpa.store.ts b/src/renderer/components/+config-autoscalers/store.ts similarity index 52% rename from src/renderer/components/+config-autoscalers/hpa.store.ts rename to src/renderer/components/+config-autoscalers/store.ts index cd0b950020..ccee4ab943 100644 --- a/src/renderer/components/+config-autoscalers/hpa.store.ts +++ b/src/renderer/components/+config-autoscalers/store.ts @@ -5,17 +5,6 @@ import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import type { HorizontalPodAutoscaler, HorizontalPodAutoscalerApi } from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api"; -import { horizontalPodAutoscalerApi } from "../../../common/k8s-api/endpoints/horizontal-pod-autoscaler.api"; -import { apiManager } from "../../../common/k8s-api/api-manager"; -import { isClusterPageContext } from "../../utils"; export class HorizontalPodAutoscalerStore extends KubeObjectStore { } - -export const hpaStore = isClusterPageContext() - ? new HorizontalPodAutoscalerStore(horizontalPodAutoscalerApi) - : undefined as never; - -if (isClusterPageContext()) { - apiManager.registerStore(hpaStore); -} diff --git a/src/renderer/components/+config-limit-ranges/legacy-store.ts b/src/renderer/components/+config-limit-ranges/legacy-store.ts new file mode 100644 index 0000000000..d3227c26c2 --- /dev/null +++ b/src/renderer/components/+config-limit-ranges/legacy-store.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; +import limitRangeStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(limitRangeStoreInjectable)` instead + */ +export const limitRangeStore = asLegacyGlobalForExtensionApi(limitRangeStoreInjectable); diff --git a/src/renderer/components/+config-limit-ranges/limit-ranges.tsx b/src/renderer/components/+config-limit-ranges/limit-ranges.tsx index 8bf77cadc1..3d233fe67a 100644 --- a/src/renderer/components/+config-limit-ranges/limit-ranges.tsx +++ b/src/renderer/components/+config-limit-ranges/limit-ranges.tsx @@ -7,7 +7,7 @@ import "./limit-ranges.scss"; import { observer } from "mobx-react"; import { KubeObjectListLayout } from "../kube-object-list-layout"; -import { limitRangeStore } from "./limit-ranges.store"; +import { limitRangeStore } from "./legacy-store"; import React from "react"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout"; diff --git a/src/renderer/components/+config-limit-ranges/store.injectable.ts b/src/renderer/components/+config-limit-ranges/store.injectable.ts new file mode 100644 index 0000000000..6592dd6c5c --- /dev/null +++ b/src/renderer/components/+config-limit-ranges/store.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 assert from "assert"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import limitRangeApiInjectable from "../../../common/k8s-api/endpoints/limit-range.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { LimitRangeStore } from "./store"; + +const limitRangeStoreInjectable = getInjectable({ + id: "limit-range-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "limitRangeStore is only available in certain environments"); + + const api = di.inject(limitRangeApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new LimitRangeStore(api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default limitRangeStoreInjectable; diff --git a/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts b/src/renderer/components/+config-limit-ranges/store.ts similarity index 50% rename from src/renderer/components/+config-limit-ranges/limit-ranges.store.ts rename to src/renderer/components/+config-limit-ranges/store.ts index 65769f0b54..b38b0b30b5 100644 --- a/src/renderer/components/+config-limit-ranges/limit-ranges.store.ts +++ b/src/renderer/components/+config-limit-ranges/store.ts @@ -4,18 +4,7 @@ */ import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; -import { apiManager } from "../../../common/k8s-api/api-manager"; import type { LimitRange, LimitRangeApi } from "../../../common/k8s-api/endpoints/limit-range.api"; -import { limitRangeApi } from "../../../common/k8s-api/endpoints/limit-range.api"; -import { isClusterPageContext } from "../../utils"; export class LimitRangeStore extends KubeObjectStore { } - -export const limitRangeStore = isClusterPageContext() - ? new LimitRangeStore(limitRangeApi) - : undefined as never; - -if (isClusterPageContext()) { - apiManager.registerStore(limitRangeStore); -} diff --git a/src/renderer/components/+config-maps/config-map-details.tsx b/src/renderer/components/+config-maps/config-map-details.tsx index e299df86a6..1b7c88eed4 100644 --- a/src/renderer/components/+config-maps/config-map-details.tsx +++ b/src/renderer/components/+config-maps/config-map-details.tsx @@ -12,7 +12,7 @@ import { DrawerTitle } from "../drawer"; import { Notifications } from "../notifications"; import { Input } from "../input"; import { Button } from "../button"; -import { configMapStore } from "./config-maps.store"; +import { configMapStore } from "./legacy-store"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import { ConfigMap } from "../../../common/k8s-api/endpoints"; import { KubeObjectMeta } from "../kube-object-meta"; diff --git a/src/renderer/components/+config-maps/config-maps.tsx b/src/renderer/components/+config-maps/config-maps.tsx index aac20e7e87..ccfcc48962 100644 --- a/src/renderer/components/+config-maps/config-maps.tsx +++ b/src/renderer/components/+config-maps/config-maps.tsx @@ -7,7 +7,7 @@ import "./config-maps.scss"; import React from "react"; import { observer } from "mobx-react"; -import { configMapStore } from "./config-maps.store"; +import { configMapStore } from "./legacy-store"; import { KubeObjectListLayout } from "../kube-object-list-layout"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout"; diff --git a/src/renderer/components/+config-maps/legacy-store.ts b/src/renderer/components/+config-maps/legacy-store.ts new file mode 100644 index 0000000000..d655de6d1c --- /dev/null +++ b/src/renderer/components/+config-maps/legacy-store.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; +import configMapStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(configMapStoreInjectable)` instead + */ +export const configMapStore = asLegacyGlobalForExtensionApi(configMapStoreInjectable); diff --git a/src/renderer/components/+config-maps/store.injectable.ts b/src/renderer/components/+config-maps/store.injectable.ts new file mode 100644 index 0000000000..080638f682 --- /dev/null +++ b/src/renderer/components/+config-maps/store.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 assert from "assert"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import configMapApiInjectable from "../../../common/k8s-api/endpoints/config-map.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { ConfigMapStore } from "./store"; + +const configMapStoreInjectable = getInjectable({ + id: "config-map-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "configMapStore is only available in certain environments"); + + const api = di.inject(configMapApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new ConfigMapStore(api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default configMapStoreInjectable; diff --git a/src/renderer/components/+config-maps/config-maps.store.ts b/src/renderer/components/+config-maps/store.ts similarity index 52% rename from src/renderer/components/+config-maps/config-maps.store.ts rename to src/renderer/components/+config-maps/store.ts index f8c623ea6e..3688f9fda7 100644 --- a/src/renderer/components/+config-maps/config-maps.store.ts +++ b/src/renderer/components/+config-maps/store.ts @@ -5,17 +5,6 @@ import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import type { ConfigMap, ConfigMapApi, ConfigMapData } from "../../../common/k8s-api/endpoints/config-map.api"; -import { configMapApi } from "../../../common/k8s-api/endpoints/config-map.api"; -import { apiManager } from "../../../common/k8s-api/api-manager"; -import { isClusterPageContext } from "../../utils"; export class ConfigMapStore extends KubeObjectStore { } - -export const configMapStore = isClusterPageContext() - ? new ConfigMapStore(configMapApi) - : undefined as never; - -if (isClusterPageContext()) { - apiManager.registerStore(configMapStore); -} diff --git a/src/renderer/components/+config-pod-disruption-budgets/legacy-store.ts b/src/renderer/components/+config-pod-disruption-budgets/legacy-store.ts new file mode 100644 index 0000000000..4e0f2ec7d1 --- /dev/null +++ b/src/renderer/components/+config-pod-disruption-budgets/legacy-store.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; +import podDisruptionBudgetStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(podDisruptionBudgetStoreInjectable)` instead + */ +export const podDisruptionBudgetStore = asLegacyGlobalForExtensionApi(podDisruptionBudgetStoreInjectable); diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx index 3c018f9b31..ff9fe884a1 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx +++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.tsx @@ -7,7 +7,7 @@ import "./pod-disruption-budgets.scss"; import * as React from "react"; import { observer } from "mobx-react"; -import { podDisruptionBudgetsStore } from "./pod-disruption-budgets.store"; +import { podDisruptionBudgetStore } from "./legacy-store"; import type { PodDisruptionBudget } from "../../../common/k8s-api/endpoints/pod-disruption-budget.api"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import type { KubeObjectDetailsProps } from "../kube-object-details"; @@ -37,7 +37,7 @@ export class PodDisruptionBudgets extends React.Component pdb.getName(), [columnId.namespace]: pdb => pdb.getNs(), diff --git a/src/renderer/components/+config-pod-disruption-budgets/store.injectable.ts b/src/renderer/components/+config-pod-disruption-budgets/store.injectable.ts new file mode 100644 index 0000000000..ffbb43ad33 --- /dev/null +++ b/src/renderer/components/+config-pod-disruption-budgets/store.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 assert from "assert"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import podDisruptionBudgetApiInjectable from "../../../common/k8s-api/endpoints/pod-disruption-budget.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { PodDisruptionBudgetStore } from "./store"; + +const podDisruptionBudgetStoreInjectable = getInjectable({ + id: "pod-disruption-budget-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "podDisruptionBudgetStore is only available in certain environments"); + + const api = di.inject(podDisruptionBudgetApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new PodDisruptionBudgetStore(api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default podDisruptionBudgetStoreInjectable; diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts b/src/renderer/components/+config-pod-disruption-budgets/store.ts similarity index 50% rename from src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts rename to src/renderer/components/+config-pod-disruption-budgets/store.ts index d53faafd2c..c2907da95c 100644 --- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts +++ b/src/renderer/components/+config-pod-disruption-budgets/store.ts @@ -5,17 +5,6 @@ import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import type { PodDisruptionBudget, PodDisruptionBudgetApi } from "../../../common/k8s-api/endpoints/pod-disruption-budget.api"; -import { podDisruptionBudgetApi } from "../../../common/k8s-api/endpoints/pod-disruption-budget.api"; -import { apiManager } from "../../../common/k8s-api/api-manager"; -import { isClusterPageContext } from "../../utils"; export class PodDisruptionBudgetStore extends KubeObjectStore { } - -export const podDisruptionBudgetsStore = isClusterPageContext() - ? new PodDisruptionBudgetStore(podDisruptionBudgetApi) - : undefined as never; - -if (isClusterPageContext()) { - apiManager.registerStore(podDisruptionBudgetsStore); -} diff --git a/src/renderer/components/+config-resource-quotas/legacy-store.ts b/src/renderer/components/+config-resource-quotas/legacy-store.ts new file mode 100644 index 0000000000..2f13765856 --- /dev/null +++ b/src/renderer/components/+config-resource-quotas/legacy-store.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; +import resourceQuotaStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(resourceQuotaStoreInjectable)` instead + */ +export const resourceQuotaStore = asLegacyGlobalForExtensionApi(resourceQuotaStoreInjectable); diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.tsx b/src/renderer/components/+config-resource-quotas/resource-quotas.tsx index 5e602b6f1f..607274ee0f 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.tsx +++ b/src/renderer/components/+config-resource-quotas/resource-quotas.tsx @@ -9,7 +9,7 @@ import React from "react"; import { observer } from "mobx-react"; import { KubeObjectListLayout } from "../kube-object-list-layout"; import { AddQuotaDialog } from "./add-quota-dialog"; -import { resourceQuotaStore } from "./resource-quotas.store"; +import { resourceQuotaStore } from "./legacy-store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout"; import { KubeObjectAge } from "../kube-object/age"; diff --git a/src/renderer/components/+config-resource-quotas/store.injectable.ts b/src/renderer/components/+config-resource-quotas/store.injectable.ts new file mode 100644 index 0000000000..aaf12dd949 --- /dev/null +++ b/src/renderer/components/+config-resource-quotas/store.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 assert from "assert"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import resourceQuotaApiInjectable from "../../../common/k8s-api/endpoints/resource-quota.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { ResourceQuotaStore } from "./store"; + +const resourceQuotaStoreInjectable = getInjectable({ + id: "resource-quota-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "resourceQuotaStore is only available in certain environments"); + + const api = di.inject(resourceQuotaApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new ResourceQuotaStore(api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default resourceQuotaStoreInjectable; diff --git a/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts b/src/renderer/components/+config-resource-quotas/store.ts similarity index 50% rename from src/renderer/components/+config-resource-quotas/resource-quotas.store.ts rename to src/renderer/components/+config-resource-quotas/store.ts index 6de7858d92..14272c3def 100644 --- a/src/renderer/components/+config-resource-quotas/resource-quotas.store.ts +++ b/src/renderer/components/+config-resource-quotas/store.ts @@ -5,17 +5,6 @@ import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import type { ResourceQuota, ResourceQuotaApi } from "../../../common/k8s-api/endpoints/resource-quota.api"; -import { resourceQuotaApi } from "../../../common/k8s-api/endpoints/resource-quota.api"; -import { apiManager } from "../../../common/k8s-api/api-manager"; -import { isClusterPageContext } from "../../utils"; export class ResourceQuotaStore extends KubeObjectStore { } - -export const resourceQuotaStore = isClusterPageContext() - ? new ResourceQuotaStore(resourceQuotaApi) - : undefined as never; - -if (isClusterPageContext()) { - apiManager.registerStore(resourceQuotaStore); -} diff --git a/src/renderer/components/+config-secrets/legacy-store.ts b/src/renderer/components/+config-secrets/legacy-store.ts new file mode 100644 index 0000000000..f6ab0be80e --- /dev/null +++ b/src/renderer/components/+config-secrets/legacy-store.ts @@ -0,0 +1,12 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api"; +import secretStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(secretStoreInjectable)` instead + */ +export const secretStore = asLegacyGlobalForExtensionApi(secretStoreInjectable); diff --git a/src/renderer/components/+config-secrets/secret-details.tsx b/src/renderer/components/+config-secrets/secret-details.tsx index e497f07c6b..2176b7c1ce 100644 --- a/src/renderer/components/+config-secrets/secret-details.tsx +++ b/src/renderer/components/+config-secrets/secret-details.tsx @@ -14,7 +14,7 @@ import { Button } from "../button"; import { Notifications } from "../notifications"; import { base64, toggle } from "../../utils"; import { Icon } from "../icon"; -import { secretStore } from "./secrets.store"; +import { secretStore } from "./legacy-store"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import { Secret } from "../../../common/k8s-api/endpoints"; import { KubeObjectMeta } from "../kube-object-meta"; diff --git a/src/renderer/components/+config-secrets/secrets.tsx b/src/renderer/components/+config-secrets/secrets.tsx index f15cf9c397..6cac97afc3 100644 --- a/src/renderer/components/+config-secrets/secrets.tsx +++ b/src/renderer/components/+config-secrets/secrets.tsx @@ -10,7 +10,7 @@ import { observer } from "mobx-react"; import { AddSecretDialog } from "./add-secret-dialog"; import { KubeObjectListLayout } from "../kube-object-list-layout"; import { Badge } from "../badge"; -import { secretStore } from "./secrets.store"; +import { secretStore } from "./legacy-store"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout"; import { KubeObjectAge } from "../kube-object/age"; diff --git a/src/renderer/components/+config-secrets/store.injectable.ts b/src/renderer/components/+config-secrets/store.injectable.ts new file mode 100644 index 0000000000..fe08623a07 --- /dev/null +++ b/src/renderer/components/+config-secrets/store.injectable.ts @@ -0,0 +1,27 @@ +/** + * 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 assert from "assert"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import secretApiInjectable from "../../../common/k8s-api/endpoints/secret.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { SecretStore } from "./store"; + +const secretStoreInjectable = getInjectable({ + id: "secret-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "secretStore is only available in certain environments"); + + const api = di.inject(secretApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new SecretStore(api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default secretStoreInjectable; diff --git a/src/renderer/components/+config-secrets/secrets.store.ts b/src/renderer/components/+config-secrets/store.ts similarity index 52% rename from src/renderer/components/+config-secrets/secrets.store.ts rename to src/renderer/components/+config-secrets/store.ts index 8e64d3de39..f6dbaa167d 100644 --- a/src/renderer/components/+config-secrets/secrets.store.ts +++ b/src/renderer/components/+config-secrets/store.ts @@ -5,17 +5,6 @@ import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import type { Secret, SecretApi, SecretData } from "../../../common/k8s-api/endpoints"; -import { secretApi } from "../../../common/k8s-api/endpoints"; -import { apiManager } from "../../../common/k8s-api/api-manager"; -import { isClusterPageContext } from "../../utils"; export class SecretStore extends KubeObjectStore { } - -export const secretStore = isClusterPageContext() - ? new SecretStore(secretApi) - : undefined as never; - -if (isClusterPageContext()) { - apiManager.registerStore(secretStore); -} diff --git a/src/renderer/components/+custom-resources/crd-list.tsx b/src/renderer/components/+custom-resources/crd-list.tsx index c6c79b4cce..d14b554077 100644 --- a/src/renderer/components/+custom-resources/crd-list.tsx +++ b/src/renderer/components/+custom-resources/crd-list.tsx @@ -11,7 +11,7 @@ import { observer } from "mobx-react"; import { Link } from "react-router-dom"; import { iter, stopPropagation } from "../../utils"; import { KubeObjectListLayout } from "../kube-object-list-layout"; -import { crdStore } from "./crd.store"; +import { customResourceDefinitionStore } from "./legacy-store"; import { Select } from "../select"; import { createPageParam } from "../../navigation"; import { Icon } from "../icon"; @@ -42,10 +42,10 @@ export class CustomResourceDefinitions extends React.Component { @computed get items() { if (this.selectedGroups.size) { - return crdStore.items.filter(item => this.selectedGroups.has(item.getGroup())); + return customResourceDefinitionStore.items.filter(item => this.selectedGroups.has(item.getGroup())); } - return crdStore.items; // show all by default + return customResourceDefinitionStore.items; // show all by default } toggleSelection = (options: readonly ({ group: string })[]) => { @@ -76,8 +76,8 @@ export class CustomResourceDefinitions extends React.Component { isConfigurable tableId="crd" className="CrdList" - store={crdStore} - // Don't subscribe the `crdStore` because already has and is always mounted + store={customResourceDefinitionStore} + // Don't subscribe the `customResourceDefinitionStore` because already has and is always mounted subscribeStores={false} items={items} sortingCallbacks={{ @@ -103,7 +103,7 @@ export class CustomResourceDefinitions extends React.Component {