1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

fix statefulset.store.test.ts

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2022-04-12 11:20:40 -04:00
parent d216b8915b
commit 1008d4e10b
17 changed files with 90 additions and 44 deletions

View File

@ -98,7 +98,7 @@ export type { PodStore as PodsStore } from "../../renderer/components/+workloads
export type { NodesStore } from "../../renderer/components/+nodes/nodes.store"; export type { NodesStore } from "../../renderer/components/+nodes/nodes.store";
export type { DeploymentStore } from "../../renderer/components/+workloads-deployments/store"; export type { DeploymentStore } from "../../renderer/components/+workloads-deployments/store";
export type { DaemonSetStore } from "../../renderer/components/+workloads-daemonsets/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 { JobStore } from "../../renderer/components/+workloads-jobs/store";
export type { CronJobStore } from "../../renderer/components/+workloads-cronjobs/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 { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/+config-maps/config-maps.store";

View File

@ -9,7 +9,7 @@ import React from "react";
import { disposeOnUnmount, observer } from "mobx-react"; import { disposeOnUnmount, observer } from "mobx-react";
import { eventStore } from "../+events/event.store"; import { eventStore } from "../+events/event.store";
import type { DeploymentStore } from "../+workloads-deployments/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 { JobStore } from "../+workloads-jobs/store";
import type { CronJobStore } from "../+workloads-cronjobs/store"; import type { CronJobStore } from "../+workloads-cronjobs/store";
import type { IComputedValue } from "mobx"; import type { IComputedValue } from "mobx";
@ -33,6 +33,7 @@ import replicaSetStoreInjectable from "../+workloads-replicasets/store.injectabl
import cronJobStoreInjectable from "../+workloads-cronjobs/store.injectable"; import cronJobStoreInjectable from "../+workloads-cronjobs/store.injectable";
import deploymentStoreInjectable from "../+workloads-deployments/store.injectable"; import deploymentStoreInjectable from "../+workloads-deployments/store.injectable";
import jobStoreInjectable from "../+workloads-jobs/store.injectable"; import jobStoreInjectable from "../+workloads-jobs/store.injectable";
import statefulSetStoreInjectable from "../+workloads-statefulsets/store.injectable";
interface Dependencies { interface Dependencies {
detailComponents: IComputedValue<React.ComponentType<{}>[]>; detailComponents: IComputedValue<React.ComponentType<{}>[]>;
@ -44,6 +45,7 @@ interface Dependencies {
deploymentStore: DeploymentStore; deploymentStore: DeploymentStore;
jobStore: JobStore; jobStore: JobStore;
cronJobStore: CronJobStore; cronJobStore: CronJobStore;
statefulSetStore: StatefulSetStore;
} }
@observer @observer
@ -65,7 +67,7 @@ class NonInjectedWorkloadsOverview extends React.Component<Dependencies> {
this.props.jobStore, this.props.jobStore,
this.props.podStore, this.props.podStore,
this.props.replicaSetStore, this.props.replicaSetStore,
statefulSetStore, this.props.statefulSetStore,
], { ], {
onLoadFailure: error => this.loadErrors.push(String(error)), onLoadFailure: error => this.loadErrors.push(String(error)),
}), }),
@ -127,5 +129,6 @@ export const WorkloadsOverview = withInjectables<Dependencies>(NonInjectedWorklo
cronJobStore: di.inject(cronJobStoreInjectable), cronJobStore: di.inject(cronJobStoreInjectable),
deploymentStore: di.inject(deploymentStoreInjectable), deploymentStore: di.inject(deploymentStoreInjectable),
jobStore: di.inject(jobStoreInjectable), jobStore: di.inject(jobStoreInjectable),
statefulSetStore: di.inject(statefulSetStoreInjectable),
}), }),
}); });

View File

@ -7,7 +7,7 @@ import { workloadInjectionToken } from "../workload-injection-token";
import { ResourceNames } from "../../../../utils/rbac"; import { ResourceNames } from "../../../../utils/rbac";
import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable"; 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 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"; import { computed } from "mobx";
const statefulsetsWorkloadInjectable = getInjectable({ const statefulsetsWorkloadInjectable = getInjectable({

View File

@ -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);

View File

@ -10,11 +10,11 @@ import { StatefulSet } from "../../../../common/k8s-api/endpoints";
import { StatefulSetScaleDialog } from "./dialog"; import { StatefulSetScaleDialog } from "./dialog";
import { waitFor, fireEvent } from "@testing-library/react"; import { waitFor, fireEvent } from "@testing-library/react";
import React from "react"; import React from "react";
import type { OpenStatefulSetScaleDialog } from "./open.injectable"; import type { OpenStatefulSetScaleDialog } from "./open-dialog.injectable";
import { getDiForUnitTesting } from "../../../getDiForUnitTesting"; import { getDiForUnitTesting } from "../../../getDiForUnitTesting";
import statefulSetApiInjectable from "../../../../common/k8s-api/endpoints/stateful-set.api.injectable"; import statefulSetApiInjectable from "../../../../common/k8s-api/endpoints/stateful-set.api.injectable";
import createStoresAndApisInjectable from "../../../create-stores-apis.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"; import { type DiRender, renderFor } from "../../test-utils/renderFor";
const dummyStatefulSet = new StatefulSet({ const dummyStatefulSet = new StatefulSet({

View File

@ -19,7 +19,7 @@ import { Notifications } from "../../notifications";
import { cssNames } from "../../../utils"; import { cssNames } from "../../../utils";
import { withInjectables } from "@ogre-tools/injectable-react"; import { withInjectables } from "@ogre-tools/injectable-react";
import statefulSetApiInjectable from "../../../../common/k8s-api/endpoints/stateful-set.api.injectable"; 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<DialogProps> { export interface StatefulSetScaleDialogProps extends Partial<DialogProps> {
} }

View File

@ -5,7 +5,7 @@
import type { StatefulSet } from "../../../../common/k8s-api/endpoints"; import type { StatefulSet } from "../../../../common/k8s-api/endpoints";
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import statefulSetDialogStateInjectable from "./state.injectable"; import statefulSetDialogStateInjectable from "./dialog-state.injectable";
export type OpenStatefulSetScaleDialog = (obj: StatefulSet) => void; export type OpenStatefulSetScaleDialog = (obj: StatefulSet) => void;

View File

@ -7,9 +7,9 @@ import type { KubeObjectMenuProps } from "../kube-object-menu";
import type { StatefulSet } from "../../../common/k8s-api/endpoints"; import type { StatefulSet } from "../../../common/k8s-api/endpoints";
import { MenuItem } from "../menu"; import { MenuItem } from "../menu";
import { Icon } from "../icon"; 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 { withInjectables } from "@ogre-tools/injectable-react";
import openStatefulSetScaleDialogInjectable from "./dialog/open.injectable"; import openStatefulSetScaleDialogInjectable from "./scale/open-dialog.injectable";
export interface StatefulSetMenuProps extends KubeObjectMenuProps<StatefulSet> {} export interface StatefulSetMenuProps extends KubeObjectMenuProps<StatefulSet> {}

View File

@ -13,7 +13,7 @@ import { DrawerItem } from "../drawer";
import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses"; import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses";
import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations";
import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; 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 { KubeObjectDetailsProps } from "../kube-object-details";
import type { PodMetricData } from "../../../common/k8s-api/endpoints"; import type { PodMetricData } from "../../../common/k8s-api/endpoints";
import { getMetricsForStatefulSets, StatefulSet } 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 subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
import type { PodStore } from "../+workloads-pods/store"; import type { PodStore } from "../+workloads-pods/store";
import podStoreInjectable from "../+workloads-pods/store.injectable"; import podStoreInjectable from "../+workloads-pods/store.injectable";
import statefulSetStoreInjectable from "./store.injectable";
export interface StatefulSetDetailsProps extends KubeObjectDetailsProps<StatefulSet> { export interface StatefulSetDetailsProps extends KubeObjectDetailsProps<StatefulSet> {
} }
@ -36,6 +37,7 @@ export interface StatefulSetDetailsProps extends KubeObjectDetailsProps<Stateful
interface Dependencies { interface Dependencies {
subscribeStores: SubscribeStores; subscribeStores: SubscribeStores;
podStore: PodStore; podStore: PodStore;
statefulSetStore: StatefulSetStore;
} }
@observer @observer
@ -66,7 +68,7 @@ class NonInjectedStatefulSetDetails extends React.Component<StatefulSetDetailsPr
}; };
render() { render() {
const { object: statefulSet, podStore } = this.props; const { object: statefulSet, podStore, statefulSetStore } = this.props;
if (!statefulSet) { if (!statefulSet) {
return null; return null;
@ -137,6 +139,7 @@ export const StatefulSetDetails = withInjectables<Dependencies, StatefulSetDetai
...props, ...props,
subscribeStores: di.inject(subscribeStoresInjectable), subscribeStores: di.inject(subscribeStoresInjectable),
podStore: di.inject(podStoreInjectable), podStore: di.inject(podStoreInjectable),
statefulSetStore: di.inject(statefulSetStoreInjectable),
}), }),
}); });

View File

@ -1,14 +0,0 @@
/**
* 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 { statefulSetStore } from "./statefulset.store";
const statefulsetsStoreInjectable = getInjectable({
id: "statefulset-store",
instantiate: () => statefulSetStore,
causesSideEffects: true,
});
export default statefulsetsStoreInjectable;

View File

@ -9,7 +9,7 @@ import React from "react";
import { observer } from "mobx-react"; import { observer } from "mobx-react";
import type { StatefulSet } from "../../../common/k8s-api/endpoints"; import type { StatefulSet } from "../../../common/k8s-api/endpoints";
import { podStore } from "../+workloads-pods/legacy-store"; import { podStore } from "../+workloads-pods/legacy-store";
import { statefulSetStore } from "./statefulset.store"; import { statefulSetStore } from "./legacy-store";
import { eventStore } from "../+events/event.store"; import { eventStore } from "../+events/event.store";
import { KubeObjectListLayout } from "../kube-object-list-layout"; import { KubeObjectListLayout } from "../kube-object-list-layout";
import { KubeObjectStatusIcon } from "../kube-object-status-icon"; import { KubeObjectStatusIcon } from "../kube-object-status-icon";

View File

@ -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;

View File

@ -3,16 +3,23 @@
* Licensed under MIT License. See LICENSE in root directory for more information. * Licensed under MIT License. See LICENSE in root directory for more information.
*/ */
import { podStore } from "../+workloads-pods/legacy-store"; import type { GetPodsByOwnerId } from "../+workloads-pods/get-pods-by-owner-id.injectable";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { StatefulSet, StatefulSetApi } from "../../../common/k8s-api/endpoints"; 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 { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { isClusterPageContext } from "../../utils";
interface Dependencies {
getPodsByOwnerId: GetPodsByOwnerId;
}
export class StatefulSetStore extends KubeObjectStore<StatefulSet, StatefulSetApi> { export class StatefulSetStore extends KubeObjectStore<StatefulSet, StatefulSetApi> {
constructor(protected readonly dependencies: Dependencies, api: StatefulSetApi, opts?: KubeObjectStoreOptions) {
super(api, opts);
}
getChildPods(statefulSet: StatefulSet) { getChildPods(statefulSet: StatefulSet) {
return podStore.getPodsByOwnerId(statefulSet.getId()); return this.dependencies.getPodsByOwnerId(statefulSet.getId());
} }
getStatuses(statefulSets: StatefulSet[]) { getStatuses(statefulSets: StatefulSet[]) {
@ -33,11 +40,3 @@ export class StatefulSetStore extends KubeObjectStore<StatefulSet, StatefulSetAp
return status; return status;
} }
} }
export const statefulSetStore = isClusterPageContext()
? new StatefulSetStore(statefulSetApi)
: undefined as never;
if (isClusterPageContext()) {
apiManager.registerStore(statefulSetStore);
}

View File

@ -4,9 +4,12 @@
*/ */
import { observable } from "mobx"; import { observable } from "mobx";
import { podStore } from "../+workloads-pods/legacy-store"; import podStoreInjectable from "../+workloads-pods/store.injectable";
import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store"; import type { StatefulSetStore } from "../+workloads-statefulsets/store";
import statefulSetStoreInjectable from "../+workloads-statefulsets/store.injectable";
import { StatefulSet, Pod } from "../../../common/k8s-api/endpoints"; import { StatefulSet, Pod } from "../../../common/k8s-api/endpoints";
import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
import { getDiForUnitTesting } from "../../getDiForUnitTesting";
const runningStatefulSet = new StatefulSet({ const runningStatefulSet = new StatefulSet({
apiVersion: "foo", apiVersion: "foo",
@ -128,7 +131,17 @@ const failedPod = new Pod({
}); });
describe("StatefulSet Store tests", () => { describe("StatefulSet Store tests", () => {
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 // Add pods to pod store
podStore.items = observable.array([ podStore.items = observable.array([
runningPod, runningPod,

View File

@ -9,7 +9,7 @@ import { Redirect } from "react-router";
import { ConfirmDialog } from "../../components/confirm-dialog"; import { ConfirmDialog } from "../../components/confirm-dialog";
import { DeploymentScaleDialog } from "../../components/+workloads-deployments/scale/dialog"; import { DeploymentScaleDialog } from "../../components/+workloads-deployments/scale/dialog";
import { CronJobTriggerDialog } from "../../components/+workloads-cronjobs/cronjob-trigger-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 { ReplicaSetScaleDialog } from "../../components/+workloads-replicasets/scale-dialog/dialog";
import { CommandContainer } from "../../components/command-palette/command-container"; import { CommandContainer } from "../../components/command-palette/command-container";
import { ErrorBoundary } from "../../components/error-boundary"; import { ErrorBoundary } from "../../components/error-boundary";