diff --git a/src/extensions/renderer-api/k8s-api.ts b/src/extensions/renderer-api/k8s-api.ts index 5857d6dc0e..f115022c2e 100644 --- a/src/extensions/renderer-api/k8s-api.ts +++ b/src/extensions/renderer-api/k8s-api.ts @@ -98,7 +98,7 @@ export type { PodStore as PodsStore } from "../../renderer/components/+workloads export type { NodesStore } from "../../renderer/components/+nodes/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/statefulset.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"; diff --git a/src/renderer/components/+workloads-overview/overview.tsx b/src/renderer/components/+workloads-overview/overview.tsx index 1157285e27..c8e6a23978 100644 --- a/src/renderer/components/+workloads-overview/overview.tsx +++ b/src/renderer/components/+workloads-overview/overview.tsx @@ -9,7 +9,7 @@ import React from "react"; import { disposeOnUnmount, observer } from "mobx-react"; import { eventStore } from "../+events/event.store"; import type { DeploymentStore } from "../+workloads-deployments/store"; -import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store"; +import type { StatefulSetStore } from "../+workloads-statefulsets/store"; import type { JobStore } from "../+workloads-jobs/store"; import type { CronJobStore } from "../+workloads-cronjobs/store"; import type { IComputedValue } from "mobx"; @@ -33,6 +33,7 @@ import replicaSetStoreInjectable from "../+workloads-replicasets/store.injectabl import cronJobStoreInjectable from "../+workloads-cronjobs/store.injectable"; import deploymentStoreInjectable from "../+workloads-deployments/store.injectable"; import jobStoreInjectable from "../+workloads-jobs/store.injectable"; +import statefulSetStoreInjectable from "../+workloads-statefulsets/store.injectable"; interface Dependencies { detailComponents: IComputedValue[]>; @@ -44,6 +45,7 @@ interface Dependencies { deploymentStore: DeploymentStore; jobStore: JobStore; cronJobStore: CronJobStore; + statefulSetStore: StatefulSetStore; } @observer @@ -65,7 +67,7 @@ class NonInjectedWorkloadsOverview extends React.Component { this.props.jobStore, this.props.podStore, this.props.replicaSetStore, - statefulSetStore, + this.props.statefulSetStore, ], { onLoadFailure: error => this.loadErrors.push(String(error)), }), @@ -127,5 +129,6 @@ export const WorkloadsOverview = withInjectables(NonInjectedWorklo cronJobStore: di.inject(cronJobStoreInjectable), deploymentStore: di.inject(deploymentStoreInjectable), jobStore: di.inject(jobStoreInjectable), + statefulSetStore: di.inject(statefulSetStoreInjectable), }), }); diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts index d7908990bf..d32736efc3 100644 --- a/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts +++ b/src/renderer/components/+workloads-overview/workloads/implementations/statefulsets-workload.injectable.ts @@ -7,7 +7,7 @@ import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable"; import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable"; -import statefulsetsStoreInjectable from "../../../+workloads-statefulsets/statefulsets-store.injectable"; +import statefulsetsStoreInjectable from "../../../+workloads-statefulsets/store.injectable"; import { computed } from "mobx"; const statefulsetsWorkloadInjectable = getInjectable({ diff --git a/src/renderer/components/+workloads-statefulsets/legacy-store.ts b/src/renderer/components/+workloads-statefulsets/legacy-store.ts new file mode 100644 index 0000000000..b96347a78b --- /dev/null +++ b/src/renderer/components/+workloads-statefulsets/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 statefulSetStoreInjectable from "./store.injectable"; + +/** + * @deprecated use `di.inject(statefulSetStoreInjectable)` instead + */ +export const statefulSetStore = asLegacyGlobalForExtensionApi(statefulSetStoreInjectable); diff --git a/src/renderer/components/+workloads-statefulsets/dialog/state.injectable.ts b/src/renderer/components/+workloads-statefulsets/scale/dialog-state.injectable.ts similarity index 100% rename from src/renderer/components/+workloads-statefulsets/dialog/state.injectable.ts rename to src/renderer/components/+workloads-statefulsets/scale/dialog-state.injectable.ts diff --git a/src/renderer/components/+workloads-statefulsets/dialog/dialog.scss b/src/renderer/components/+workloads-statefulsets/scale/dialog.scss similarity index 100% rename from src/renderer/components/+workloads-statefulsets/dialog/dialog.scss rename to src/renderer/components/+workloads-statefulsets/scale/dialog.scss diff --git a/src/renderer/components/+workloads-statefulsets/dialog/dialog.test.tsx b/src/renderer/components/+workloads-statefulsets/scale/dialog.test.tsx similarity index 97% rename from src/renderer/components/+workloads-statefulsets/dialog/dialog.test.tsx rename to src/renderer/components/+workloads-statefulsets/scale/dialog.test.tsx index 32131e856b..6370c44307 100755 --- a/src/renderer/components/+workloads-statefulsets/dialog/dialog.test.tsx +++ b/src/renderer/components/+workloads-statefulsets/scale/dialog.test.tsx @@ -10,11 +10,11 @@ import { StatefulSet } from "../../../../common/k8s-api/endpoints"; import { StatefulSetScaleDialog } from "./dialog"; import { waitFor, fireEvent } from "@testing-library/react"; import React from "react"; -import type { OpenStatefulSetScaleDialog } from "./open.injectable"; +import type { OpenStatefulSetScaleDialog } from "./open-dialog.injectable"; import { getDiForUnitTesting } from "../../../getDiForUnitTesting"; import statefulSetApiInjectable from "../../../../common/k8s-api/endpoints/stateful-set.api.injectable"; import createStoresAndApisInjectable from "../../../create-stores-apis.injectable"; -import openStatefulSetScaleDialogInjectable from "./open.injectable"; +import openStatefulSetScaleDialogInjectable from "./open-dialog.injectable"; import { type DiRender, renderFor } from "../../test-utils/renderFor"; const dummyStatefulSet = new StatefulSet({ diff --git a/src/renderer/components/+workloads-statefulsets/dialog/dialog.tsx b/src/renderer/components/+workloads-statefulsets/scale/dialog.tsx similarity index 98% rename from src/renderer/components/+workloads-statefulsets/dialog/dialog.tsx rename to src/renderer/components/+workloads-statefulsets/scale/dialog.tsx index e8470b88e7..7a918cb85e 100644 --- a/src/renderer/components/+workloads-statefulsets/dialog/dialog.tsx +++ b/src/renderer/components/+workloads-statefulsets/scale/dialog.tsx @@ -19,7 +19,7 @@ import { Notifications } from "../../notifications"; import { cssNames } from "../../../utils"; import { withInjectables } from "@ogre-tools/injectable-react"; import statefulSetApiInjectable from "../../../../common/k8s-api/endpoints/stateful-set.api.injectable"; -import statefulSetDialogStateInjectable from "./state.injectable"; +import statefulSetDialogStateInjectable from "./dialog-state.injectable"; export interface StatefulSetScaleDialogProps extends Partial { } diff --git a/src/renderer/components/+workloads-statefulsets/dialog/open.injectable.ts b/src/renderer/components/+workloads-statefulsets/scale/open-dialog.injectable.ts similarity index 89% rename from src/renderer/components/+workloads-statefulsets/dialog/open.injectable.ts rename to src/renderer/components/+workloads-statefulsets/scale/open-dialog.injectable.ts index 8c42e19ca5..8f213a9a18 100644 --- a/src/renderer/components/+workloads-statefulsets/dialog/open.injectable.ts +++ b/src/renderer/components/+workloads-statefulsets/scale/open-dialog.injectable.ts @@ -5,7 +5,7 @@ import type { StatefulSet } from "../../../../common/k8s-api/endpoints"; import { getInjectable } from "@ogre-tools/injectable"; -import statefulSetDialogStateInjectable from "./state.injectable"; +import statefulSetDialogStateInjectable from "./dialog-state.injectable"; export type OpenStatefulSetScaleDialog = (obj: StatefulSet) => void; diff --git a/src/renderer/components/+workloads-statefulsets/stateful-set-menu.tsx b/src/renderer/components/+workloads-statefulsets/stateful-set-menu.tsx index 5ef5e9f289..4231d8b1f6 100644 --- a/src/renderer/components/+workloads-statefulsets/stateful-set-menu.tsx +++ b/src/renderer/components/+workloads-statefulsets/stateful-set-menu.tsx @@ -7,9 +7,9 @@ import type { KubeObjectMenuProps } from "../kube-object-menu"; import type { StatefulSet } from "../../../common/k8s-api/endpoints"; import { MenuItem } from "../menu"; import { Icon } from "../icon"; -import type { OpenStatefulSetScaleDialog } from "./dialog/open.injectable"; +import type { OpenStatefulSetScaleDialog } from "./scale/open-dialog.injectable"; import { withInjectables } from "@ogre-tools/injectable-react"; -import openStatefulSetScaleDialogInjectable from "./dialog/open.injectable"; +import openStatefulSetScaleDialogInjectable from "./scale/open-dialog.injectable"; export interface StatefulSetMenuProps extends KubeObjectMenuProps {} diff --git a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx index 3ed473a217..b23c4c02f0 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx @@ -13,7 +13,7 @@ import { DrawerItem } from "../drawer"; import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; -import { statefulSetStore } from "./statefulset.store"; +import type { StatefulSetStore } from "./store"; import type { KubeObjectDetailsProps } from "../kube-object-details"; import type { PodMetricData } from "../../../common/k8s-api/endpoints"; import { getMetricsForStatefulSets, StatefulSet } from "../../../common/k8s-api/endpoints"; @@ -29,6 +29,7 @@ import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api"; import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable"; import type { PodStore } from "../+workloads-pods/store"; import podStoreInjectable from "../+workloads-pods/store.injectable"; +import statefulSetStoreInjectable from "./store.injectable"; export interface StatefulSetDetailsProps extends KubeObjectDetailsProps { } @@ -36,6 +37,7 @@ export interface StatefulSetDetailsProps extends KubeObjectDetailsProps statefulSetStore, - causesSideEffects: true, -}); - -export default statefulsetsStoreInjectable; diff --git a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx index 8b1bbd46f9..c1ebd6286a 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx +++ b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx @@ -9,7 +9,7 @@ import React from "react"; import { observer } from "mobx-react"; import type { StatefulSet } from "../../../common/k8s-api/endpoints"; import { podStore } from "../+workloads-pods/legacy-store"; -import { statefulSetStore } from "./statefulset.store"; +import { statefulSetStore } from "./legacy-store"; import { eventStore } from "../+events/event.store"; import { KubeObjectListLayout } from "../kube-object-list-layout"; import { KubeObjectStatusIcon } from "../kube-object-status-icon"; diff --git a/src/renderer/components/+workloads-statefulsets/store.injectable.ts b/src/renderer/components/+workloads-statefulsets/store.injectable.ts new file mode 100644 index 0000000000..d07b527d8d --- /dev/null +++ b/src/renderer/components/+workloads-statefulsets/store.injectable.ts @@ -0,0 +1,30 @@ +/** + * 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 getPodsByOwnerIdInjectable from "../+workloads-pods/get-pods-by-owner-id.injectable"; +import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable"; +import statefulSetApiInjectable from "../../../common/k8s-api/endpoints/stateful-set.api.injectable"; +import createStoresAndApisInjectable from "../../create-stores-apis.injectable"; +import { StatefulSetStore } from "./store"; + +const statefulSetStoreInjectable = getInjectable({ + id: "stateful-set-store", + instantiate: (di) => { + assert(di.inject(createStoresAndApisInjectable), "statefulSetStore is only available in certain environment"); + + const api = di.inject(statefulSetApiInjectable); + const apiManager = di.inject(apiManagerInjectable); + const store = new StatefulSetStore({ + getPodsByOwnerId: di.inject(getPodsByOwnerIdInjectable), + }, api); + + apiManager.registerStore(store); + + return store; + }, +}); + +export default statefulSetStoreInjectable; diff --git a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts b/src/renderer/components/+workloads-statefulsets/store.ts similarity index 64% rename from src/renderer/components/+workloads-statefulsets/statefulset.store.ts rename to src/renderer/components/+workloads-statefulsets/store.ts index 1a8e13feb6..0732ae5680 100644 --- a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts +++ b/src/renderer/components/+workloads-statefulsets/store.ts @@ -3,16 +3,23 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { podStore } from "../+workloads-pods/legacy-store"; -import { apiManager } from "../../../common/k8s-api/api-manager"; +import type { GetPodsByOwnerId } from "../+workloads-pods/get-pods-by-owner-id.injectable"; import type { StatefulSet, StatefulSetApi } from "../../../common/k8s-api/endpoints"; -import { PodStatusPhase, statefulSetApi } from "../../../common/k8s-api/endpoints"; +import { PodStatusPhase } from "../../../common/k8s-api/endpoints"; +import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object.store"; import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; -import { isClusterPageContext } from "../../utils"; + +interface Dependencies { + getPodsByOwnerId: GetPodsByOwnerId; +} export class StatefulSetStore extends KubeObjectStore { + constructor(protected readonly dependencies: Dependencies, api: StatefulSetApi, opts?: KubeObjectStoreOptions) { + super(api, opts); + } + getChildPods(statefulSet: StatefulSet) { - return podStore.getPodsByOwnerId(statefulSet.getId()); + return this.dependencies.getPodsByOwnerId(statefulSet.getId()); } getStatuses(statefulSets: StatefulSet[]) { @@ -33,11 +40,3 @@ export class StatefulSetStore extends KubeObjectStore { - beforeAll(() => { + let statefulSetStore: StatefulSetStore; + + beforeEach(() => { + const di = getDiForUnitTesting({ doGeneralOverrides: true }); + + di.override(createStoresAndApisInjectable, () => true); + + statefulSetStore = di.inject(statefulSetStoreInjectable); + + const podStore = di.inject(podStoreInjectable); + // Add pods to pod store podStore.items = observable.array([ runningPod, diff --git a/src/renderer/frames/cluster-frame/cluster-frame.tsx b/src/renderer/frames/cluster-frame/cluster-frame.tsx index f4b59e1258..2a8862261a 100755 --- a/src/renderer/frames/cluster-frame/cluster-frame.tsx +++ b/src/renderer/frames/cluster-frame/cluster-frame.tsx @@ -9,7 +9,7 @@ import { Redirect } from "react-router"; import { ConfirmDialog } from "../../components/confirm-dialog"; import { DeploymentScaleDialog } from "../../components/+workloads-deployments/scale/dialog"; import { CronJobTriggerDialog } from "../../components/+workloads-cronjobs/cronjob-trigger-dialog"; -import { StatefulSetScaleDialog } from "../../components/+workloads-statefulsets/dialog/dialog"; +import { StatefulSetScaleDialog } from "../../components/+workloads-statefulsets/scale/dialog"; import { ReplicaSetScaleDialog } from "../../components/+workloads-replicasets/scale-dialog/dialog"; import { CommandContainer } from "../../components/command-palette/command-container"; import { ErrorBoundary } from "../../components/error-boundary";