diff --git a/packages/core/src/renderer/components/+workloads-jobs/statuses.injectable.ts b/packages/core/src/renderer/components/+workloads-jobs/statuses.injectable.ts new file mode 100644 index 0000000000..40ec25a3ed --- /dev/null +++ b/packages/core/src/renderer/components/+workloads-jobs/statuses.injectable.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import computeStatusCountsForOwnersInjectable from "../../utils/compute-status-counts.injectable"; +import jobStoreInjectable from "./store.injectable"; + +const statusCountsForAllJobsInSelectedNamespacesInjectable = getInjectable({ + id: "status-counts-for-all-jobs-in-selected-namespaces", + instantiate: (di) => { + const jobStore = di.inject(jobStoreInjectable); + const computeStatusCountsForOwners = di.inject(computeStatusCountsForOwnersInjectable); + + return computed(() => computeStatusCountsForOwners(jobStore.contextItems)); + }, +}); + +export default statusCountsForAllJobsInSelectedNamespacesInjectable; + diff --git a/packages/core/src/renderer/components/+workloads-jobs/total-count.injectable.ts b/packages/core/src/renderer/components/+workloads-jobs/total-count.injectable.ts new file mode 100644 index 0000000000..3ced87931d --- /dev/null +++ b/packages/core/src/renderer/components/+workloads-jobs/total-count.injectable.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { computed } from "mobx"; +import jobStoreInjectable from "./store.injectable"; + +const totalCountOfJobsInSelectedNamespacesInjectable = getInjectable({ + id: "total-count-of-jobs-in-selected-namespaces", + instantiate: (di) => { + const jobStore = di.inject(jobStoreInjectable); + + return computed(() => jobStore.getTotalCount()); + }, +}); + +export default totalCountOfJobsInSelectedNamespacesInjectable; + diff --git a/packages/core/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts b/packages/core/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts index e68fd88c1c..f439d79672 100644 --- a/packages/core/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts +++ b/packages/core/src/renderer/components/+workloads-overview/workloads/implementations/jobs-workload.injectable.ts @@ -5,38 +5,24 @@ import { getInjectable } from "@ogre-tools/injectable"; import { workloadInjectionToken } from "../workload-injection-token"; import { ResourceNames } from "../../../../utils/rbac"; -import namespaceStoreInjectable from "../../../+namespaces/store.injectable"; -import jobStoreInjectable from "../../../+workloads-jobs/store.injectable"; import navigateToJobsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/jobs/navigate-to-jobs.injectable"; -import { computed } from "mobx"; +import totalCountOfJobsInSelectedNamespacesInjectable from "../../../+workloads-jobs/total-count.injectable"; +import statusCountsForAllJobsInSelectedNamespacesInjectable from "../../../+workloads-jobs/statuses.injectable"; const jobsWorkloadInjectable = getInjectable({ id: "jobs-workload", - instantiate: (di) => { - const navigate = di.inject(navigateToJobsInjectable); - const namespaceStore = di.inject(namespaceStoreInjectable); - const store = di.inject(jobStoreInjectable); - - return { - resource: { - apiName: "jobs", - group: "batch", - }, - open: navigate, - - amountOfItems: computed( - () => store.getAllByNs(namespaceStore.contextNamespaces).length, - ), - - status: computed(() => - store.getStatuses(store.getAllByNs(namespaceStore.contextNamespaces)), - ), - - title: ResourceNames.jobs, - orderNumber: 60, - }; - }, + instantiate: (di) => ({ + resource: { + apiName: "jobs", + group: "batch", + }, + open: di.inject(navigateToJobsInjectable), + amountOfItems: di.inject(totalCountOfJobsInSelectedNamespacesInjectable), + status: di.inject(statusCountsForAllJobsInSelectedNamespacesInjectable), + title: ResourceNames.jobs, + orderNumber: 60, + }), injectionToken: workloadInjectionToken, }); diff --git a/packages/core/src/renderer/components/+workloads-replicasets/statuses.injectable.ts b/packages/core/src/renderer/components/+workloads-replicasets/statuses.injectable.ts index 20c8800878..6bc0f7f995 100644 --- a/packages/core/src/renderer/components/+workloads-replicasets/statuses.injectable.ts +++ b/packages/core/src/renderer/components/+workloads-replicasets/statuses.injectable.ts @@ -5,44 +5,16 @@ import { getInjectable } from "@ogre-tools/injectable"; import { computed } from "mobx"; -import podStoreInjectable from "../+workloads-pods/store.injectable"; -import type { PodStatusPhase } from "../../../common/k8s-api/endpoints"; -import { getOrInsert } from "../../utils"; -import { foldPodStatusPhase } from "../../utils/fold-pod-status-phase"; +import computeStatusCountsForOwnersInjectable from "../../utils/compute-status-counts.injectable"; import replicaSetStoreInjectable from "./store.injectable"; -interface PodData { - status: PodStatusPhase; -} - const statusCountsForAllReplicaSetsInSelectedNamespacesInjectable = getInjectable({ id: "status-counts-for-all-replica-sets-in-selected-namespaces", instantiate: (di) => { - const podStore = di.inject(podStoreInjectable); const replicaSetStore = di.inject(replicaSetStoreInjectable); + const computeStatusCountsForOwners = di.inject(computeStatusCountsForOwnersInjectable); - return computed(() => { - const podsByOwnerId = new Map(); - const statuses = { running: 0, failed: 0, pending: 0 }; - - for (const pod of podStore.contextItems) { - for (const ownerRef of pod.getOwnerRefs()) { - getOrInsert(podsByOwnerId, ownerRef.uid, []).push({ - status: pod.getStatus(), - }); - } - } - - for (const replicaSet of replicaSetStore.contextItems) { - const status = (podsByOwnerId.get(replicaSet.getId()) ?? []) - .map(pod => pod.status) - .reduce(foldPodStatusPhase, "running"); - - statuses[status]++; - } - - return statuses; - }); + return computed(() => computeStatusCountsForOwners(replicaSetStore.contextItems)); }, }); diff --git a/packages/core/src/renderer/utils/compute-status-counts.injectable.ts b/packages/core/src/renderer/utils/compute-status-counts.injectable.ts new file mode 100644 index 0000000000..514a8d7703 --- /dev/null +++ b/packages/core/src/renderer/utils/compute-status-counts.injectable.ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { PodStatusPhase } from "../../common/k8s-api/endpoints"; +import { getOrInsert } from "../../common/utils"; +import { foldPodStatusPhase } from "./fold-pod-status-phase"; +import { getInjectable } from "@ogre-tools/injectable"; +import podStoreInjectable from "../components/+workloads-pods/store.injectable"; +import { computed } from "mobx"; +import type { KubeObject } from "../../common/k8s-api/kube-object"; + +export interface StatusCounts { + running: number; + failed: number; + pending: number; +} + +const computeStatusCountsForOwnersInjectable = getInjectable({ + id: "compute-status-counts-for-owners", + instantiate: (di) => { + const podStore = di.inject(podStoreInjectable); + + const podsByOwnerId = computed(() => { + const podsByOwnerId = new Map(); + + for (const pod of podStore.contextItems) { + for (const ownerRef of pod.getOwnerRefs()) { + getOrInsert(podsByOwnerId, ownerRef.uid, []).push({ + status: pod.getStatus(), + }); + } + } + + return podsByOwnerId; + }); + + return (possibleOwners: KubeObject[]): StatusCounts => { + const statuses = { running: 0, failed: 0, pending: 0 }; + + for (const possibleOwner of possibleOwners) { + const status = (podsByOwnerId.get().get(possibleOwner.getId()) ?? []) + .map(pod => pod.status) + .reduce(foldPodStatusPhase, "running"); + + statuses[status]++; + } + + return statuses; + }; + }, +}); + +export default computeStatusCountsForOwnersInjectable; +