From c629d603fe16ba416703d054c7cc066ab4526131 Mon Sep 17 00:00:00 2001
From: Sebastian Malton
Date: Mon, 11 Apr 2022 14:29:47 -0400
Subject: [PATCH] fix daemonset.store.test.ts
Signed-off-by: Sebastian Malton
---
.eslintrc.js | 27 +++++++-
package.json | 2 +-
.../endpoints/daemon-set.api.injectable.ts | 19 +++++
.../k8s-api/endpoints/daemon-set.api.ts | 7 +-
.../k8s-api/endpoints/deployment.api.ts | 2 +-
src/common/k8s-api/endpoints/index.ts | 8 +--
src/common/k8s-api/endpoints/job.api.ts | 2 +-
.../k8s-api/endpoints/legacy-globals.ts | 12 ++++
.../k8s-api/endpoints/namespaces.api.ts | 2 +-
.../endpoints/persistent-volume-claims.api.ts | 2 +-
...et.api.ts => pod-disruption-budget.api.ts} | 0
...licy.api.ts => pod-security-policy.api.ts} | 0
.../k8s-api/endpoints/pod.api.injectable.ts | 19 +++++
.../endpoints/{pods.api.ts => pod.api.ts} | 5 --
.../k8s-api/endpoints/replica-set.api.ts | 2 +-
...i.ts => self-subject-rules-reviews.api.ts} | 0
.../k8s-api/endpoints/stateful-set.api.ts | 2 +-
.../endpoints/types/pod-template-spec.ts | 2 +-
src/extensions/main-api/k8s-api.ts | 12 ++--
src/extensions/renderer-api/components.ts | 4 +-
src/extensions/renderer-api/k8s-api.ts | 69 ++++++++++---------
.../components/+cluster/cluster-overview.tsx | 11 +--
.../pod-disruption-budgets.store.ts | 4 +-
.../pod-disruption-budgets.tsx | 2 +-
.../components/+events/event.store.ts | 6 +-
.../components/+events/kube-event-details.tsx | 20 +++---
.../+namespaces/namespace-details.tsx | 20 +++---
.../+network-services/service-details.tsx | 20 +++---
src/renderer/components/+nodes/details.tsx | 31 ++++-----
.../storage-class-details.tsx | 18 ++---
.../volume-claim-details.tsx | 4 +-
.../+storage-volume-claims/volume-claims.tsx | 10 +--
.../+workloads-cronjobs/cronjob-details.tsx | 18 ++---
.../daemonset-details.tsx | 34 ++++-----
.../daemonsets-store.injectable.ts | 15 ----
.../+workloads-daemonsets/daemonsets.tsx | 8 +--
.../+workloads-daemonsets/legacy-store.ts | 12 ++++
.../+workloads-daemonsets/store.injectable.ts | 30 ++++++++
.../{daemonsets.store.ts => store.ts} | 25 ++++---
.../deployment-details.tsx | 29 ++++----
.../deployments.store.ts | 4 +-
.../+workloads-jobs/job-details.tsx | 27 ++++----
.../components/+workloads-jobs/job.store.ts | 4 +-
.../+workloads-overview/overview.tsx | 34 ++++-----
.../daemonsets-workload.injectable.ts | 2 +-
.../pods-workload.injectable.ts | 4 +-
.../get-pod-by-id.injectable.ts | 20 ++++++
.../get-pods-by-owner-id.injectable.ts | 20 ++++++
.../+workloads-pods/legacy-store.ts | 12 ++++
.../+workloads-pods/pod-details-list.tsx | 12 ++--
...e.tsx => pods-sidebar-items.injectable.ts} | 0
.../+workloads-pods/pods-store.injectable.ts | 14 ----
.../components/+workloads-pods/pods.tsx | 8 +--
.../+workloads-pods/store.injectable.ts | 27 ++++++++
.../{pods.store.ts => store.ts} | 15 +---
.../replicaset-details.tsx | 29 ++++----
.../replicasets.store.ts | 6 +-
.../statefulset-details.tsx | 29 ++++----
.../statefulset.store.ts | 4 +-
.../+workloads-statefulsets/statefulsets.tsx | 4 +-
.../__tests__/daemonset.store.test.ts | 18 ++++-
.../__tests__/deployments.store.test.ts | 4 +-
.../components/__tests__/job.store.test.ts | 4 +-
.../components/__tests__/pods.store.test.ts | 6 +-
.../__tests__/replicaset.store.test.ts | 4 +-
.../__tests__/statefulset.store.test.ts | 4 +-
.../create-workload-logs-tab.injectable.ts | 12 +++-
.../dock/logs/load-logs.injectable.ts | 16 +++--
.../dock/logs/logs-view-model.injectable.ts | 7 +-
.../components/dock/logs/logs-view-model.ts | 9 ++-
src/renderer/components/dock/logs/view.tsx | 17 +++--
.../drawer/drawer-param-toggler.tsx | 5 +-
.../kube-object-list-layout.tsx | 6 +-
yarn.lock | 12 ++--
74 files changed, 544 insertions(+), 370 deletions(-)
create mode 100644 src/common/k8s-api/endpoints/daemon-set.api.injectable.ts
rename src/common/k8s-api/endpoints/{poddisruptionbudget.api.ts => pod-disruption-budget.api.ts} (100%)
rename src/common/k8s-api/endpoints/{podsecuritypolicy.api.ts => pod-security-policy.api.ts} (100%)
create mode 100644 src/common/k8s-api/endpoints/pod.api.injectable.ts
rename src/common/k8s-api/endpoints/{pods.api.ts => pod.api.ts} (99%)
rename src/common/k8s-api/endpoints/{selfsubjectrulesreviews.api.ts => self-subject-rules-reviews.api.ts} (100%)
delete mode 100644 src/renderer/components/+workloads-daemonsets/daemonsets-store.injectable.ts
create mode 100644 src/renderer/components/+workloads-daemonsets/legacy-store.ts
create mode 100644 src/renderer/components/+workloads-daemonsets/store.injectable.ts
rename src/renderer/components/+workloads-daemonsets/{daemonsets.store.ts => store.ts} (62%)
create mode 100644 src/renderer/components/+workloads-pods/get-pod-by-id.injectable.ts
create mode 100644 src/renderer/components/+workloads-pods/get-pods-by-owner-id.injectable.ts
create mode 100644 src/renderer/components/+workloads-pods/legacy-store.ts
rename src/renderer/components/+workloads-pods/{pods-sidebar-items.injectable.tsx => pods-sidebar-items.injectable.ts} (100%)
delete mode 100644 src/renderer/components/+workloads-pods/pods-store.injectable.ts
create mode 100644 src/renderer/components/+workloads-pods/store.injectable.ts
rename src/renderer/components/+workloads-pods/{pods.store.ts => store.ts} (82%)
diff --git a/.eslintrc.js b/.eslintrc.js
index 36f647ff38..c246ccce01 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -130,7 +130,12 @@ module.exports = {
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-unused-vars": "off",
"no-restricted-imports": ["error", {
- "paths": ["."],
+ "paths": [
+ {
+ "name": ".",
+ "message": "No importing from local index.ts(x?) file. A common way to make circular dependencies.",
+ },
+ ],
}],
"@typescript-eslint/member-delimiter-style": ["error", {
"multiline": {
@@ -242,5 +247,25 @@ module.exports = {
"@typescript-eslint/consistent-type-imports": "error",
},
},
+ {
+ files: [
+ "src/{common,main,renderer}/**/*.ts",
+ "src/{common,main,renderer}/**/*.tsx",
+ ],
+ rules: {
+ "no-restricted-imports": ["error", {
+ "patterns": [
+ {
+ "group": [
+ "**/extensions/renderer-api/**/*",
+ "**/extensions/main-api/**/*",
+ "**/extensions/common-api/**/*",
+ ],
+ message: "No importing from the extension api definitions in application code",
+ },
+ ],
+ }],
+ },
+ },
],
};
diff --git a/package.json b/package.json
index 5ef254dbc3..465b810e7a 100644
--- a/package.json
+++ b/package.json
@@ -286,7 +286,7 @@
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.5",
"@sentry/types": "^6.19.3",
"@testing-library/jest-dom": "^5.16.4",
- "@testing-library/react": "^13.0.0",
+ "@testing-library/react": "^13.0.1",
"@testing-library/user-event": "^13.5.0",
"@types/byline": "^4.2.33",
"@types/chart.js": "^2.9.36",
diff --git a/src/common/k8s-api/endpoints/daemon-set.api.injectable.ts b/src/common/k8s-api/endpoints/daemon-set.api.injectable.ts
new file mode 100644
index 0000000000..6e89c1a129
--- /dev/null
+++ b/src/common/k8s-api/endpoints/daemon-set.api.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 assert from "assert";
+import { createStoresAndApisInjectionToken } from "../create-stores-apis.token";
+import { DaemonSetApi } from "./daemon-set.api";
+
+const daemonSetApiInjectable = getInjectable({
+ id: "daemon-set-api",
+ instantiate: (di) => {
+ assert(di.inject(createStoresAndApisInjectionToken), "daemonSetApi is only available in certain environements");
+
+ return new DaemonSetApi();
+ },
+});
+
+export default daemonSetApiInjectable;
diff --git a/src/common/k8s-api/endpoints/daemon-set.api.ts b/src/common/k8s-api/endpoints/daemon-set.api.ts
index 54e9b78773..449e021495 100644
--- a/src/common/k8s-api/endpoints/daemon-set.api.ts
+++ b/src/common/k8s-api/endpoints/daemon-set.api.ts
@@ -6,8 +6,7 @@
import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
import { metricsApi } from "./metrics.api";
-import type { PodMetricData } from "./pods.api";
-import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
+import type { PodMetricData } from "./pod.api";
import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object";
import { KubeObject } from "../kube-object";
import type { PodTemplateSpec } from "./types/pod-template-spec";
@@ -104,7 +103,3 @@ export function getMetricsForDaemonSets(daemonsets: DaemonSet[], namespace: stri
namespace,
});
}
-
-export const daemonSetApi = isClusterPageContext()
- ? new DaemonSetApi()
- : undefined as never;
diff --git a/src/common/k8s-api/endpoints/deployment.api.ts b/src/common/k8s-api/endpoints/deployment.api.ts
index b1367e36d3..96b901172c 100644
--- a/src/common/k8s-api/endpoints/deployment.api.ts
+++ b/src/common/k8s-api/endpoints/deployment.api.ts
@@ -8,7 +8,7 @@ import moment from "moment";
import type { DerivedKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
import { metricsApi } from "./metrics.api";
-import type { PodMetricData, PodSpec } from "./pods.api";
+import type { PodMetricData, PodSpec } from "./pod.api";
import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object";
import { KubeObject } from "../kube-object";
diff --git a/src/common/k8s-api/endpoints/index.ts b/src/common/k8s-api/endpoints/index.ts
index bd561396cc..de848e4eae 100644
--- a/src/common/k8s-api/endpoints/index.ts
+++ b/src/common/k8s-api/endpoints/index.ts
@@ -25,16 +25,16 @@ export * from "./network-policy.api";
export * from "./nodes.api";
export * from "./persistent-volume.api";
export * from "./persistent-volume-claims.api";
-export * from "./pods.api";
-export * from "./poddisruptionbudget.api";
+export * from "./pod.api";
+export * from "./pod-disruption-budget.api";
export * from "./pod-metrics.api";
-export * from "./podsecuritypolicy.api";
+export * from "./pod-security-policy.api";
export * from "./replica-set.api";
export * from "./resource-quota.api";
export * from "./role.api";
export * from "./role-binding.api";
export * from "./secret.api";
-export * from "./selfsubjectrulesreviews.api";
+export * from "./self-subject-rules-reviews.api";
export * from "./service.api";
export * from "./service-account.api";
export * from "./stateful-set.api";
diff --git a/src/common/k8s-api/endpoints/job.api.ts b/src/common/k8s-api/endpoints/job.api.ts
index d84ffd8b50..33b62790ea 100644
--- a/src/common/k8s-api/endpoints/job.api.ts
+++ b/src/common/k8s-api/endpoints/job.api.ts
@@ -6,7 +6,7 @@
import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
import { metricsApi } from "./metrics.api";
-import type { PodContainer, PodMetricData, PodSpec } from "./pods.api";
+import type { PodContainer, PodMetricData, PodSpec } from "./pod.api";
import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object";
import { KubeObject } from "../kube-object";
diff --git a/src/common/k8s-api/endpoints/legacy-globals.ts b/src/common/k8s-api/endpoints/legacy-globals.ts
index 2a30383932..72784b5a46 100644
--- a/src/common/k8s-api/endpoints/legacy-globals.ts
+++ b/src/common/k8s-api/endpoints/legacy-globals.ts
@@ -6,6 +6,8 @@
import { asLegacyGlobalForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import clusterRoleBindingApiInjectable from "./cluster-role-binding.api.injectable";
import clusterRoleApiInjectable from "./cluster-role.api.injectable";
+import daemonSetApiInjectable from "./daemon-set.api.injectable";
+import podApiInjectable from "./pod.api.injectable";
import roleApiInjectable from "./role.api.injectable";
import serviceAccountApiInjectable from "./service-account.api.injectable";
@@ -28,3 +30,13 @@ export const serviceAccountApi = asLegacyGlobalForExtensionApi(serviceAccountApi
* @deprecated use `di.inject(roleApiInjectable)` instead
*/
export const roleApi = asLegacyGlobalForExtensionApi(roleApiInjectable);
+
+/**
+ * @deprecated use `di.inject(podApiInjectable)` instead
+ */
+export const podApi = asLegacyGlobalForExtensionApi(podApiInjectable);
+
+/**
+ * @deprecated use `di.inject(daemonSetApiInjectable)` instead
+ */
+export const daemonSetApi = asLegacyGlobalForExtensionApi(daemonSetApiInjectable);
diff --git a/src/common/k8s-api/endpoints/namespaces.api.ts b/src/common/k8s-api/endpoints/namespaces.api.ts
index cbfe366d05..802f6e5d42 100644
--- a/src/common/k8s-api/endpoints/namespaces.api.ts
+++ b/src/common/k8s-api/endpoints/namespaces.api.ts
@@ -8,7 +8,7 @@ import { KubeApi } from "../kube-api";
import type { KubeObjectScope, KubeObjectStatus } from "../kube-object";
import { KubeObject } from "../kube-object";
import { metricsApi } from "./metrics.api";
-import type { PodMetricData } from "./pods.api";
+import type { PodMetricData } from "./pod.api";
import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
export enum NamespaceStatusKind {
diff --git a/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts b/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts
index fbdc56bfd8..907af36b50 100644
--- a/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts
+++ b/src/common/k8s-api/endpoints/persistent-volume-claims.api.ts
@@ -7,7 +7,7 @@ import type { KubeObjectScope, LabelSelector, TypedLocalObjectReference } from "
import { KubeObject } from "../kube-object";
import type { MetricData } from "./metrics.api";
import { metricsApi } from "./metrics.api";
-import type { Pod } from "./pods.api";
+import type { Pod } from "./pod.api";
import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
diff --git a/src/common/k8s-api/endpoints/poddisruptionbudget.api.ts b/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts
similarity index 100%
rename from src/common/k8s-api/endpoints/poddisruptionbudget.api.ts
rename to src/common/k8s-api/endpoints/pod-disruption-budget.api.ts
diff --git a/src/common/k8s-api/endpoints/podsecuritypolicy.api.ts b/src/common/k8s-api/endpoints/pod-security-policy.api.ts
similarity index 100%
rename from src/common/k8s-api/endpoints/podsecuritypolicy.api.ts
rename to src/common/k8s-api/endpoints/pod-security-policy.api.ts
diff --git a/src/common/k8s-api/endpoints/pod.api.injectable.ts b/src/common/k8s-api/endpoints/pod.api.injectable.ts
new file mode 100644
index 0000000000..9f12ea8acd
--- /dev/null
+++ b/src/common/k8s-api/endpoints/pod.api.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 assert from "assert";
+import { createStoresAndApisInjectionToken } from "../create-stores-apis.token";
+import { PodApi } from "./pod.api";
+
+const podApiInjectable = getInjectable({
+ id: "pod-api",
+ instantiate: (di) => {
+ assert(di.inject(createStoresAndApisInjectionToken), "podApi is only available in certain environments");
+
+ return new PodApi();
+ },
+});
+
+export default podApiInjectable;
diff --git a/src/common/k8s-api/endpoints/pods.api.ts b/src/common/k8s-api/endpoints/pod.api.ts
similarity index 99%
rename from src/common/k8s-api/endpoints/pods.api.ts
rename to src/common/k8s-api/endpoints/pod.api.ts
index e103ccdcb4..5803edece4 100644
--- a/src/common/k8s-api/endpoints/pods.api.ts
+++ b/src/common/k8s-api/endpoints/pod.api.ts
@@ -7,7 +7,6 @@ import type { MetricData } from "./metrics.api";
import { metricsApi } from "./metrics.api";
import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
-import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
import type { RequireExactlyOne } from "type-fest";
import type { KubeObjectMetadata, LocalObjectReference, Affinity, Toleration, LabelSelector, KubeObjectScope } from "../kube-object";
import type { SecretReference } from "./secret.api";
@@ -984,7 +983,3 @@ export class Pod extends KubeObject value.ip);
}
}
-
-export const podApi = isClusterPageContext()
- ? new PodApi()
- : undefined as never;
diff --git a/src/common/k8s-api/endpoints/replica-set.api.ts b/src/common/k8s-api/endpoints/replica-set.api.ts
index 70669f765b..cf4be35f98 100644
--- a/src/common/k8s-api/endpoints/replica-set.api.ts
+++ b/src/common/k8s-api/endpoints/replica-set.api.ts
@@ -6,7 +6,7 @@
import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
import { metricsApi } from "./metrics.api";
-import type { PodMetricData } from "./pods.api";
+import type { PodMetricData } from "./pod.api";
import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object";
import { KubeObject } from "../kube-object";
diff --git a/src/common/k8s-api/endpoints/selfsubjectrulesreviews.api.ts b/src/common/k8s-api/endpoints/self-subject-rules-reviews.api.ts
similarity index 100%
rename from src/common/k8s-api/endpoints/selfsubjectrulesreviews.api.ts
rename to src/common/k8s-api/endpoints/self-subject-rules-reviews.api.ts
diff --git a/src/common/k8s-api/endpoints/stateful-set.api.ts b/src/common/k8s-api/endpoints/stateful-set.api.ts
index 73dd8b77fb..3d2885f4fc 100644
--- a/src/common/k8s-api/endpoints/stateful-set.api.ts
+++ b/src/common/k8s-api/endpoints/stateful-set.api.ts
@@ -6,7 +6,7 @@
import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api";
import { KubeApi } from "../kube-api";
import { metricsApi } from "./metrics.api";
-import type { PodMetricData } from "./pods.api";
+import type { PodMetricData } from "./pod.api";
import { isClusterPageContext } from "../../utils/cluster-id-url-parsing";
import type { KubeObjectScope, LabelSelector } from "../kube-object";
import { KubeObject } from "../kube-object";
diff --git a/src/common/k8s-api/endpoints/types/pod-template-spec.ts b/src/common/k8s-api/endpoints/types/pod-template-spec.ts
index 4c960d6a95..ba0df4aec7 100644
--- a/src/common/k8s-api/endpoints/types/pod-template-spec.ts
+++ b/src/common/k8s-api/endpoints/types/pod-template-spec.ts
@@ -4,7 +4,7 @@
*/
import type { KubeObjectScope, KubeTemplateObjectMetadata } from "../../kube-object";
-import type { PodSpec } from "../pods.api";
+import type { PodSpec } from "../pod.api";
export interface PodTemplateSpec {
metadata?: KubeTemplateObjectMetadata;
diff --git a/src/extensions/main-api/k8s-api.ts b/src/extensions/main-api/k8s-api.ts
index 7096670ffd..bee8371363 100644
--- a/src/extensions/main-api/k8s-api.ts
+++ b/src/extensions/main-api/k8s-api.ts
@@ -5,6 +5,8 @@
import clusterRoleBindingApiInjectable from "../../common/k8s-api/endpoints/cluster-role-binding.api.injectable";
import clusterRoleApiInjectable from "../../common/k8s-api/endpoints/cluster-role.api.injectable";
+import daemonSetApiInjectable from "../../common/k8s-api/endpoints/daemon-set.api.injectable";
+import podApiInjectable from "../../common/k8s-api/endpoints/pod.api.injectable";
import roleApiInjectable from "../../common/k8s-api/endpoints/role.api.injectable";
import serviceAccountApiInjectable from "../../common/k8s-api/endpoints/service-account.api.injectable";
import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
@@ -21,16 +23,18 @@ export const serviceAccountsApi = asLegacyGlobalForExtensionApi(serviceAccountAp
export const clusterRoleApi = asLegacyGlobalForExtensionApi(clusterRoleApiInjectable);
export const clusterRoleBindingApi = asLegacyGlobalForExtensionApi(clusterRoleBindingApiInjectable);
export const roleApi = asLegacyGlobalForExtensionApi(roleApiInjectable);
+export const podsApi = asLegacyGlobalForExtensionApi(podApiInjectable);
+export const daemonSetApi = asLegacyGlobalForExtensionApi(daemonSetApiInjectable);
export { ResourceStack } from "../../common/k8s/resource-stack";
export { apiManager } from "../../common/k8s-api/api-manager";
export { KubeApi, forCluster, forRemoteCluster } from "../../common/k8s-api/kube-api";
export { KubeObject, KubeStatus } from "../../common/k8s-api/kube-object";
export { KubeObjectStore } from "../../common/k8s-api/kube-object.store";
-export { Pod, podApi as podsApi, PodApi as PodsApi } from "../../common/k8s-api/endpoints/pods.api";
+export { Pod, PodApi as PodsApi } from "../../common/k8s-api/endpoints/pod.api";
export { Node, nodeApi as nodesApi, NodeApi as NodesApi } from "../../common/k8s-api/endpoints/nodes.api";
export { Deployment, deploymentApi, DeploymentApi } from "../../common/k8s-api/endpoints/deployment.api";
-export { DaemonSet, daemonSetApi } from "../../common/k8s-api/endpoints/daemon-set.api";
+export { DaemonSet } from "../../common/k8s-api/endpoints/daemon-set.api";
export { StatefulSet, statefulSetApi } from "../../common/k8s-api/endpoints/stateful-set.api";
export { Job, jobApi } from "../../common/k8s-api/endpoints/job.api";
export { CronJob, cronJobApi } from "../../common/k8s-api/endpoints/cron-job.api";
@@ -40,7 +44,7 @@ export { ReplicaSet, replicaSetApi } from "../../common/k8s-api/endpoints/replic
export { ResourceQuota, resourceQuotaApi } from "../../common/k8s-api/endpoints/resource-quota.api";
export { LimitRange, limitRangeApi } from "../../common/k8s-api/endpoints/limit-range.api";
export { HorizontalPodAutoscaler, horizontalPodAutoscalerApi as hpaApi } from "../../common/k8s-api/endpoints/hpa.api";
-export { PodDisruptionBudget, podDisruptionBudgetApi as pdbApi } from "../../common/k8s-api/endpoints/poddisruptionbudget.api";
+export { PodDisruptionBudget, podDisruptionBudgetApi as pdbApi } from "../../common/k8s-api/endpoints/pod-disruption-budget.api";
export { Service, serviceApi } from "../../common/k8s-api/endpoints/service.api";
export { Endpoints as Endpoint, endpointsApi as endpointApi } from "../../common/k8s-api/endpoints/endpoint.api";
export { Ingress, ingressApi, IngressApi } from "../../common/k8s-api/endpoints/ingress.api";
@@ -59,7 +63,7 @@ export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints
// types
export type { ILocalKubeApiConfig, IRemoteKubeApiConfig, IKubeApiCluster } from "../../common/k8s-api/kube-api";
-export type { PodContainer as IPodContainer, PodContainerStatus as IPodContainerStatus } from "../../common/k8s-api/endpoints/pods.api";
+export type { PodContainer as IPodContainer, PodContainerStatus as IPodContainerStatus } from "../../common/k8s-api/endpoints/pod.api";
export type { SecretReference as ISecretRef } from "../../common/k8s-api/endpoints/secret.api";
export type { KubeObjectMetadata, KubeJsonApiObjectMetadata, KubeStatusData } from "../../common/k8s-api/kube-object";
export type { KubeObjectStoreLoadAllParams, KubeObjectStoreLoadingParams, KubeObjectStoreSubscribeParams } from "../../common/k8s-api/kube-object.store";
diff --git a/src/extensions/renderer-api/components.ts b/src/extensions/renderer-api/components.ts
index eec93653f8..2a91070e5e 100644
--- a/src/extensions/renderer-api/components.ts
+++ b/src/extensions/renderer-api/components.ts
@@ -12,9 +12,9 @@ import commandOverlayInjectable from "../../renderer/components/command-palette/
import createPodLogsTabInjectable from "../../renderer/components/dock/logs/create-pod-logs-tab.injectable";
import createWorkloadLogsTabInjectable from "../../renderer/components/dock/logs/create-workload-logs-tab.injectable";
import sendCommandInjectable from "../../renderer/components/dock/terminal/send-command.injectable";
-import { podsStore } from "../../renderer/components/+workloads-pods/pods.store";
import renameTabInjectable from "../../renderer/components/dock/dock/rename-tab.injectable";
import { asLegacyGlobalObjectForExtensionApiWithModifications } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api-with-modifications";
+import { podStore } from "../../renderer/components/+workloads-pods/legacy-store";
// layouts
export * from "../../renderer/components/layout/main-layout";
@@ -97,7 +97,7 @@ export const logTabStore = asLegacyGlobalObjectForExtensionApiWithModifications(
createWorkloadTab: asLegacyGlobalFunctionForExtensionApi(createWorkloadLogsTabInjectable),
renameTab: (tabId: string): void => {
const tabData = logTabStore.getData(tabId);
- const pod = podsStore.getById(tabData?.selectedPodId);
+ const pod = podStore.getById(tabData?.selectedPodId);
if (pod) {
renameTab(tabId, `Pod ${pod.getName()}`);
diff --git a/src/extensions/renderer-api/k8s-api.ts b/src/extensions/renderer-api/k8s-api.ts
index 303e32a003..683703286d 100644
--- a/src/extensions/renderer-api/k8s-api.ts
+++ b/src/extensions/renderer-api/k8s-api.ts
@@ -12,6 +12,8 @@ import clusterRoleApiInjectable from "../../common/k8s-api/endpoints/cluster-rol
import serviceAccountApiInjectable from "../../common/k8s-api/endpoints/service-account.api.injectable";
import { asLegacyGlobalForExtensionApi } from "../as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api";
import roleApiInjectable from "../../common/k8s-api/endpoints/role.api.injectable";
+import podApiInjectable from "../../common/k8s-api/endpoints/pod.api.injectable";
+import daemonSetApiInjectable from "../../common/k8s-api/endpoints/daemon-set.api.injectable";
export function isAllowedResource(resource: KubeResource | KubeResource[]) {
const resources = castArray(resource);
@@ -30,46 +32,47 @@ export const serviceAccountsApi = asLegacyGlobalForExtensionApi(serviceAccountAp
export const clusterRoleApi = asLegacyGlobalForExtensionApi(clusterRoleApiInjectable);
export const clusterRoleBindingApi = asLegacyGlobalForExtensionApi(clusterRoleBindingApiInjectable);
export const roleApi = asLegacyGlobalForExtensionApi(roleApiInjectable);
+export const podsApi = asLegacyGlobalForExtensionApi(podApiInjectable);
+export const daemonSetApi = asLegacyGlobalForExtensionApi(daemonSetApiInjectable);
export {
BaseKubeJsonApiObjectMetadata,
};
export { ResourceStack } from "../../common/k8s/resource-stack";
export { apiManager } from "../../common/k8s-api/api-manager";
-export { KubeObjectStore } from "../../common/k8s-api/kube-object.store";
export { KubeApi, forCluster, forRemoteCluster } from "../../common/k8s-api/kube-api";
export { KubeObject, KubeStatus } from "../../common/k8s-api/kube-object";
-export { Pod, podApi as podsApi, PodApi as PodsApi } from "../../common/k8s-api/endpoints";
-export { Node, nodeApi as nodesApi, NodeApi as NodesApi } from "../../common/k8s-api/endpoints";
-export { Deployment, deploymentApi, DeploymentApi } from "../../common/k8s-api/endpoints";
-export { DaemonSet, daemonSetApi } from "../../common/k8s-api/endpoints";
-export { StatefulSet, statefulSetApi } from "../../common/k8s-api/endpoints";
-export { Job, jobApi } from "../../common/k8s-api/endpoints";
-export { CronJob, cronJobApi } from "../../common/k8s-api/endpoints";
-export { ConfigMap, configMapApi } from "../../common/k8s-api/endpoints";
-export { Secret, secretApi as secretsApi } from "../../common/k8s-api/endpoints";
-export { ReplicaSet, replicaSetApi } from "../../common/k8s-api/endpoints";
-export { ResourceQuota, resourceQuotaApi } from "../../common/k8s-api/endpoints";
-export { LimitRange, limitRangeApi } from "../../common/k8s-api/endpoints";
-export { HorizontalPodAutoscaler, horizontalPodAutoscalerApi as hpaApi } from "../../common/k8s-api/endpoints";
-export { PodDisruptionBudget, podDisruptionBudgetApi as pdbApi } from "../../common/k8s-api/endpoints";
-export { Service, serviceApi } from "../../common/k8s-api/endpoints";
-export { Endpoints as Endpoint, endpointsApi as endpointApi } from "../../common/k8s-api/endpoints";
-export { Ingress, ingressApi, IngressApi } from "../../common/k8s-api/endpoints";
-export { NetworkPolicy, networkPolicyApi } from "../../common/k8s-api/endpoints";
-export { PersistentVolume, persistentVolumeApi } from "../../common/k8s-api/endpoints";
-export { PersistentVolumeClaim, persistentVolumeClaimApi as pvcApi, PersistentVolumeClaimApi as PersistentVolumeClaimsApi } from "../../common/k8s-api/endpoints";
-export { StorageClass, storageClassApi } from "../../common/k8s-api/endpoints";
-export { Namespace, namespaceApi as namespacesApi } from "../../common/k8s-api/endpoints";
-export { KubeEvent, eventApi } from "../../common/k8s-api/endpoints";
-export { ServiceAccount } from "../../common/k8s-api/endpoints";
-export { Role } from "../../common/k8s-api/endpoints";
-export { RoleBinding, roleBindingApi } from "../../common/k8s-api/endpoints";
-export { ClusterRole } from "../../common/k8s-api/endpoints";
-export { ClusterRoleBinding } from "../../common/k8s-api/endpoints";
-export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints";
+export { KubeObjectStore } from "../../common/k8s-api/kube-object.store";
+export { Pod, PodApi as PodsApi } from "../../common/k8s-api/endpoints/pod.api";
+export { Node, nodeApi as nodesApi, NodeApi as NodesApi } from "../../common/k8s-api/endpoints/nodes.api";
+export { Deployment, deploymentApi, DeploymentApi } from "../../common/k8s-api/endpoints/deployment.api";
+export { DaemonSet } from "../../common/k8s-api/endpoints/daemon-set.api";
+export { StatefulSet, statefulSetApi } from "../../common/k8s-api/endpoints/stateful-set.api";
+export { Job, jobApi } from "../../common/k8s-api/endpoints/job.api";
+export { CronJob, cronJobApi } from "../../common/k8s-api/endpoints/cron-job.api";
+export { ConfigMap, configMapApi } from "../../common/k8s-api/endpoints/configmap.api";
+export { Secret, secretApi as secretsApi } from "../../common/k8s-api/endpoints/secret.api";
+export { ReplicaSet, replicaSetApi } from "../../common/k8s-api/endpoints/replica-set.api";
+export { ResourceQuota, resourceQuotaApi } from "../../common/k8s-api/endpoints/resource-quota.api";
+export { LimitRange, limitRangeApi } from "../../common/k8s-api/endpoints/limit-range.api";
+export { HorizontalPodAutoscaler, horizontalPodAutoscalerApi as hpaApi } from "../../common/k8s-api/endpoints/hpa.api";
+export { PodDisruptionBudget, podDisruptionBudgetApi as pdbApi } from "../../common/k8s-api/endpoints/pod-disruption-budget.api";
+export { Service, serviceApi } from "../../common/k8s-api/endpoints/service.api";
+export { Endpoints as Endpoint, endpointsApi as endpointApi } from "../../common/k8s-api/endpoints/endpoint.api";
+export { Ingress, ingressApi, IngressApi } from "../../common/k8s-api/endpoints/ingress.api";
+export { NetworkPolicy, networkPolicyApi } from "../../common/k8s-api/endpoints/network-policy.api";
+export { PersistentVolume, persistentVolumeApi } from "../../common/k8s-api/endpoints/persistent-volume.api";
+export { PersistentVolumeClaim, persistentVolumeClaimApi as pvcApi, PersistentVolumeClaimApi as PersistentVolumeClaimsApi } from "../../common/k8s-api/endpoints/persistent-volume-claims.api";
+export { StorageClass, storageClassApi } from "../../common/k8s-api/endpoints/storage-class.api";
+export { Namespace, namespaceApi as namespacesApi } from "../../common/k8s-api/endpoints/namespaces.api";
+export { KubeEvent, eventApi } from "../../common/k8s-api/endpoints/events.api";
+export { ServiceAccount } from "../../common/k8s-api/endpoints/service-account.api";
+export { Role } from "../../common/k8s-api/endpoints/role.api";
+export { RoleBinding, roleBindingApi } from "../../common/k8s-api/endpoints/role-binding.api";
+export { ClusterRole } from "../../common/k8s-api/endpoints/cluster-role.api";
+export { ClusterRoleBinding } from "../../common/k8s-api/endpoints/cluster-role-binding.api";
+export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints/crd.api";
export { KubeObjectStatusLevel } from "./kube-object-status";
-export { KubeJsonApi } from "../../common/k8s-api/kube-json-api";
// types
export type { ILocalKubeApiConfig, IRemoteKubeApiConfig, IKubeApiCluster } from "../../common/k8s-api/kube-api";
@@ -81,10 +84,10 @@ export type { KubeObjectStoreLoadAllParams, KubeObjectStoreLoadingParams, KubeOb
// stores
export type { EventStore } from "../../renderer/components/+events/event.store";
-export type { PodsStore } from "../../renderer/components/+workloads-pods/pods.store";
+export type { PodStore as PodsStore } from "../../renderer/components/+workloads-pods/store";
export type { NodesStore } from "../../renderer/components/+nodes/nodes.store";
export type { DeploymentStore } from "../../renderer/components/+workloads-deployments/deployments.store";
-export type { DaemonSetStore } from "../../renderer/components/+workloads-daemonsets/daemonsets.store";
+export type { DaemonSetStore } from "../../renderer/components/+workloads-daemonsets/store";
export type { StatefulSetStore } from "../../renderer/components/+workloads-statefulsets/statefulset.store";
export type { JobStore } from "../../renderer/components/+workloads-jobs/job.store";
export type { CronJobStore } from "../../renderer/components/+workloads-cronjobs/cronjob.store";
diff --git a/src/renderer/components/+cluster/cluster-overview.tsx b/src/renderer/components/+cluster/cluster-overview.tsx
index a618f2cc0d..d0c195e178 100644
--- a/src/renderer/components/+cluster/cluster-overview.tsx
+++ b/src/renderer/components/+cluster/cluster-overview.tsx
@@ -9,7 +9,7 @@ import React from "react";
import { reaction } from "mobx";
import { disposeOnUnmount, observer } from "mobx-react";
import { nodesStore } from "../+nodes/nodes.store";
-import { podsStore } from "../+workloads-pods/pods.store";
+import type { PodStore } from "../+workloads-pods/store";
import { interval } from "../../utils";
import { TabLayout } from "../layout/tab-layout";
import { Spinner } from "../spinner";
@@ -21,17 +21,19 @@ import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import { eventStore } from "../+events/event.store";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import clusterOverviewStoreInjectable from "./cluster-overview-store/cluster-overview-store.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import type { Cluster } from "../../../common/cluster/cluster";
import hostedClusterInjectable from "../../../common/cluster-store/hosted-cluster.injectable";
import assert from "assert";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
+import podStoreInjectable from "../+workloads-pods/store.injectable";
interface Dependencies {
subscribeStores: SubscribeStores;
clusterOverviewStore: ClusterOverviewStore;
hostedCluster: Cluster;
+ podStore: PodStore;
}
@observer
@@ -49,7 +51,7 @@ class NonInjectedClusterOverview extends React.Component {
disposeOnUnmount(this, [
this.props.subscribeStores([
- podsStore,
+ this.props.podStore,
eventStore,
nodesStore,
]),
@@ -112,9 +114,10 @@ export const ClusterOverview = withInjectables(NonInjectedClusterO
assert(hostedCluster, "Only allowed to renderer ClusterOverview within cluster frame");
return {
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
+ subscribeStores: di.inject(subscribeStoresInjectable),
clusterOverviewStore: di.inject(clusterOverviewStoreInjectable),
hostedCluster,
+ podStore: di.inject(podStoreInjectable),
};
},
});
diff --git a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts
index 4c8c9e7878..d53faafd2c 100644
--- a/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts
+++ b/src/renderer/components/+config-pod-disruption-budgets/pod-disruption-budgets.store.ts
@@ -4,8 +4,8 @@
*/
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
-import type { PodDisruptionBudget, PodDisruptionBudgetApi } from "../../../common/k8s-api/endpoints/poddisruptionbudget.api";
-import { podDisruptionBudgetApi } from "../../../common/k8s-api/endpoints/poddisruptionbudget.api";
+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";
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 f9871f646a..3c018f9b31 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
@@ -8,7 +8,7 @@ import "./pod-disruption-budgets.scss";
import * as React from "react";
import { observer } from "mobx-react";
import { podDisruptionBudgetsStore } from "./pod-disruption-budgets.store";
-import type { PodDisruptionBudget } from "../../../common/k8s-api/endpoints/poddisruptionbudget.api";
+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";
import { KubeObjectListLayout } from "../kube-object-list-layout";
diff --git a/src/renderer/components/+events/event.store.ts b/src/renderer/components/+events/event.store.ts
index 4a66b6d69d..9a28631a86 100644
--- a/src/renderer/components/+events/event.store.ts
+++ b/src/renderer/components/+events/event.store.ts
@@ -10,8 +10,8 @@ import { autoBind, isClusterPageContext } from "../../utils";
import type { KubeEvent, KubeEventApi } from "../../../common/k8s-api/endpoints/events.api";
import { eventApi } from "../../../common/k8s-api/endpoints/events.api";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
-import { Pod } from "../../../common/k8s-api/endpoints/pods.api";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { Pod } from "../../../common/k8s-api/endpoints/pod.api";
+import { podStore } from "../+workloads-pods/legacy-store";
import { apiManager } from "../../../common/k8s-api/api-manager";
export class EventStore extends KubeObjectStore {
@@ -48,7 +48,7 @@ export class EventStore extends KubeObjectStore {
const { kind, uid } = recent.involvedObject;
if (kind == Pod.kind) { // Wipe out running pods
- const pod = podsStore.items.find(pod => pod.getId() == uid);
+ const pod = podStore.getById(uid);
if (!pod || (!pod.hasIssues() && (pod.spec?.priority ?? 0) < 500000)) return undefined;
}
diff --git a/src/renderer/components/+events/kube-event-details.tsx b/src/renderer/components/+events/kube-event-details.tsx
index 0c120c6dd4..3e00dd0841 100644
--- a/src/renderer/components/+events/kube-event-details.tsx
+++ b/src/renderer/components/+events/kube-event-details.tsx
@@ -14,9 +14,9 @@ import { LocaleDate } from "../locale-date";
import { eventStore } from "./event.store";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable
- from "../../kube-watch-api/kube-watch-api.injectable";
+
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
export interface KubeEventDetailsProps {
object: KubeObject;
@@ -86,16 +86,12 @@ class NonInjectedKubeEventDetails extends React.Component(
- NonInjectedKubeEventDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const KubeEventDetails = withInjectables(NonInjectedKubeEventDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ }),
+});
diff --git a/src/renderer/components/+namespaces/namespace-details.tsx b/src/renderer/components/+namespaces/namespace-details.tsx
index 6114fc23e1..fa08c7b2f5 100644
--- a/src/renderer/components/+namespaces/namespace-details.tsx
+++ b/src/renderer/components/+namespaces/namespace-details.tsx
@@ -24,9 +24,9 @@ import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { getDetailsUrl } from "../kube-detail-params";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable
- from "../../kube-watch-api/kube-watch-api.injectable";
+
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
export interface NamespaceDetailsProps extends KubeObjectDetailsProps {
}
@@ -132,14 +132,10 @@ class NonInjectedNamespaceDetails extends React.Component(
- NonInjectedNamespaceDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const NamespaceDetails = withInjectables(NonInjectedNamespaceDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ }),
+});
diff --git a/src/renderer/components/+network-services/service-details.tsx b/src/renderer/components/+network-services/service-details.tsx
index 138a0a98fc..5ce6d10ffa 100644
--- a/src/renderer/components/+network-services/service-details.tsx
+++ b/src/renderer/components/+network-services/service-details.tsx
@@ -18,9 +18,9 @@ import { ServiceDetailsEndpoint } from "./service-details-endpoint";
import type { PortForwardStore } from "../../port-forward";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import portForwardStoreInjectable from "../../port-forward/port-forward-store/port-forward-store.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
export interface ServiceDetailsProps extends KubeObjectDetailsProps {
}
@@ -145,14 +145,10 @@ class NonInjectedServiceDetails extends React.Component(
- NonInjectedServiceDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- portForwardStore: di.inject(portForwardStoreInjectable),
- ...props,
- }),
- },
-);
+export const ServiceDetails = withInjectables(NonInjectedServiceDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ portForwardStore: di.inject(portForwardStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+nodes/details.tsx b/src/renderer/components/+nodes/details.tsx
index 5874d4e946..38d89acf86 100644
--- a/src/renderer/components/+nodes/details.tsx
+++ b/src/renderer/components/+nodes/details.tsx
@@ -12,7 +12,6 @@ import { disposeOnUnmount, observer } from "mobx-react";
import { DrawerItem, DrawerItemLabels } from "../drawer";
import { Badge } from "../badge";
import { ResourceMetrics } from "../resource-metrics";
-import { podsStore } from "../+workloads-pods/pods.store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import type { ClusterMetricData } from "../../../common/k8s-api/endpoints";
import { formatNodeTaint, getMetricsByNodeNames, Node } from "../../../common/k8s-api/endpoints";
@@ -26,14 +25,17 @@ import { NodeDetailsResources } from "./details-resources";
import { DrawerTitle } from "../drawer/drawer-title";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
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";
export interface NodeDetailsProps extends KubeObjectDetailsProps {
}
interface Dependencies {
subscribeStores: SubscribeStores;
+ podStore: PodStore;
}
@observer
@@ -52,7 +54,7 @@ class NonInjectedNodeDetails extends React.Component
- {!isMetricHidden && podsStore.isLoaded && (
+ {!isMetricHidden && podStore.isLoaded && (
(
- NonInjectedNodeDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const NodeDetails = withInjectables(NonInjectedNodeDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+storage-classes/storage-class-details.tsx b/src/renderer/components/+storage-classes/storage-class-details.tsx
index 21424a99b6..2b81cebeba 100644
--- a/src/renderer/components/+storage-classes/storage-class-details.tsx
+++ b/src/renderer/components/+storage-classes/storage-class-details.tsx
@@ -18,8 +18,8 @@ import { VolumeDetailsList } from "../+storage-volumes/volume-details-list";
import { volumesStore } from "../+storage-volumes/volumes.store";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
export interface StorageClassDetailsProps extends KubeObjectDetailsProps {
}
@@ -93,14 +93,10 @@ class NonInjectedStorageClassDetails extends React.Component(
- NonInjectedStorageClassDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const StorageClassDetails = withInjectables(NonInjectedStorageClassDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ }),
+});
diff --git a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx
index 3401525ee0..acc310d959 100644
--- a/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx
+++ b/src/renderer/components/+storage-volume-claims/volume-claim-details.tsx
@@ -10,7 +10,7 @@ import { makeObservable, observable, reaction } from "mobx";
import { disposeOnUnmount, observer } from "mobx-react";
import { DrawerItem, DrawerTitle } from "../drawer";
import { Badge } from "../badge";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { Link } from "react-router-dom";
import { ResourceMetrics } from "../resource-metrics";
import { VolumeClaimDiskChart } from "./volume-claim-disk-chart";
@@ -62,7 +62,7 @@ export class PersistentVolumeClaimDetails extends React.Component pvc.getName(),
[columnId.namespace]: pvc => pvc.getNs(),
- [columnId.pods]: pvc => pvc.getPods(podsStore.items).map(pod => pod.getName()),
+ [columnId.pods]: pvc => pvc.getPods(podStore.items).map(pod => pod.getName()),
[columnId.status]: pvc => pvc.getStatus(),
[columnId.size]: pvc => unitsToBytes(pvc.getStorage()),
[columnId.storageClass]: pvc => pvc.spec.storageClassName,
@@ -51,7 +51,7 @@ export class PersistentVolumeClaims extends React.Component {
}}
searchFilters={[
pvc => pvc.getSearchFields(),
- pvc => pvc.getPods(podsStore.items).map(pod => pod.getName()),
+ pvc => pvc.getPods(podStore.items).map(pod => pod.getName()),
]}
renderHeaderTitle="Persistent Volume Claims"
renderTableHeader={[
@@ -65,7 +65,7 @@ export class PersistentVolumeClaims extends React.Component {
{ title: "Status", className: "status", sortBy: columnId.status, id: columnId.status },
]}
renderTableContents={pvc => {
- const pods = pvc.getPods(podsStore.items);
+ const pods = pvc.getPods(podStore.items);
const { storageClassName } = pvc.spec;
const storageClassDetailsUrl = getDetailsUrl(storageClassApi.getUrl({
name: storageClassName,
diff --git a/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx b/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx
index 2786cd2593..550f235962 100644
--- a/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx
+++ b/src/renderer/components/+workloads-cronjobs/cronjob-details.tsx
@@ -20,8 +20,8 @@ import { CronJob } from "../../../common/k8s-api/endpoints";
import { KubeObjectMeta } from "../kube-object-meta";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
export interface CronJobDetailsProps extends KubeObjectDetailsProps {
}
@@ -115,13 +115,9 @@ class NonInjectedCronJobDetails extends React.Component(
- NonInjectedCronJobDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const CronJobDetails = withInjectables(NonInjectedCronJobDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx
index 2ec6cc1757..e4e20a6401 100644
--- a/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx
+++ b/src/renderer/components/+workloads-daemonsets/daemonset-details.tsx
@@ -12,8 +12,8 @@ import { Badge } from "../badge";
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 { daemonSetStore } from "./daemonsets.store";
-import { podsStore } from "../+workloads-pods/pods.store";
+import type { DaemonSetStore } from "./store";
+import type { PodStore } from "../+workloads-pods/store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { DaemonSet, getMetricsForDaemonSets, type PodMetricData } from "../../../common/k8s-api/endpoints";
import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics";
@@ -25,14 +25,18 @@ import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
+import daemonSetStoreInjectable from "./store.injectable";
+import podStoreInjectable from "../+workloads-pods/store.injectable";
export interface DaemonSetDetailsProps extends KubeObjectDetailsProps {
}
interface Dependencies {
subscribeStores: SubscribeStores;
+ daemonSetStore: DaemonSetStore;
+ podStore: PodStore;
}
@observer
@@ -50,7 +54,7 @@ class NonInjectedDaemonSetDetails extends React.Component
- {!isMetricHidden && podsStore.isLoaded && (
+ {!isMetricHidden && podStore.isLoaded && (
(
- NonInjectedDaemonSetDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const DaemonSetDetails = withInjectables(NonInjectedDaemonSetDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ daemonSetStore: di.inject(daemonSetStoreInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets-store.injectable.ts b/src/renderer/components/+workloads-daemonsets/daemonsets-store.injectable.ts
deleted file mode 100644
index 044750d493..0000000000
--- a/src/renderer/components/+workloads-daemonsets/daemonsets-store.injectable.ts
+++ /dev/null
@@ -1,15 +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 { daemonSetStore } from "./daemonsets.store";
-
-const daemonsetsStoreInjectable = getInjectable({
- id: "daemonsets-store",
- instantiate: () => daemonSetStore,
- causesSideEffects: true,
-});
-
-export default daemonsetsStoreInjectable;
-
diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.tsx b/src/renderer/components/+workloads-daemonsets/daemonsets.tsx
index 6ee585a49d..633e7928b1 100644
--- a/src/renderer/components/+workloads-daemonsets/daemonsets.tsx
+++ b/src/renderer/components/+workloads-daemonsets/daemonsets.tsx
@@ -9,8 +9,8 @@ import React from "react";
import { observer } from "mobx-react";
import type { DaemonSet } from "../../../common/k8s-api/endpoints";
import { eventStore } from "../+events/event.store";
-import { daemonSetStore } from "./daemonsets.store";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { daemonSetStore } from "./legacy-store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import { Badge } from "../badge";
import { KubeObjectStatusIcon } from "../kube-object-status-icon";
@@ -39,7 +39,7 @@ export class DaemonSets extends React.Component {
tableId="workload_daemonsets"
className="DaemonSets"
store={daemonSetStore}
- dependentStores={[podsStore, eventStore]} // status icon component uses event store
+ dependentStores={[podStore, eventStore]} // status icon component uses event store
sortingCallbacks={{
[columnId.name]: daemonSet => daemonSet.getName(),
[columnId.namespace]: daemonSet => daemonSet.getNs(),
@@ -68,7 +68,7 @@ export class DaemonSets extends React.Component {
)),
,
diff --git a/src/renderer/components/+workloads-daemonsets/legacy-store.ts b/src/renderer/components/+workloads-daemonsets/legacy-store.ts
new file mode 100644
index 0000000000..afd40e7df2
--- /dev/null
+++ b/src/renderer/components/+workloads-daemonsets/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 daemonSetStoreInjectable from "./store.injectable";
+
+/**
+ * @deprecated use `di.inject(daemonSetStoreInjectable)` instead
+ */
+export const daemonSetStore = asLegacyGlobalForExtensionApi(daemonSetStoreInjectable);
diff --git a/src/renderer/components/+workloads-daemonsets/store.injectable.ts b/src/renderer/components/+workloads-daemonsets/store.injectable.ts
new file mode 100644
index 0000000000..d9dcf4459d
--- /dev/null
+++ b/src/renderer/components/+workloads-daemonsets/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 daemonSetApiInjectable from "../../../common/k8s-api/endpoints/daemon-set.api.injectable";
+import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
+import apiManagerInjectable from "../kube-object-menu/dependencies/api-manager.injectable";
+import { DaemonSetStore } from "./store";
+
+const daemonSetStoreInjectable = getInjectable({
+ id: "daemon-set-store",
+ instantiate: (di) => {
+ assert(di.inject(createStoresAndApisInjectable), "daemonSetStore is only available in certain environments");
+
+ const api = di.inject(daemonSetApiInjectable);
+ const apiManager = di.inject(apiManagerInjectable);
+ const store = new DaemonSetStore({
+ getPodsByOwnerId: di.inject(getPodsByOwnerIdInjectable),
+ }, api);
+
+ apiManager.registerStore(store);
+
+ return store;
+ },
+});
+
+export default daemonSetStoreInjectable;
diff --git a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts b/src/renderer/components/+workloads-daemonsets/store.ts
similarity index 62%
rename from src/renderer/components/+workloads-daemonsets/daemonsets.store.ts
rename to src/renderer/components/+workloads-daemonsets/store.ts
index bd6ac4da62..66216e3f76 100644
--- a/src/renderer/components/+workloads-daemonsets/daemonsets.store.ts
+++ b/src/renderer/components/+workloads-daemonsets/store.ts
@@ -3,16 +3,23 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-import { podsStore } from "../+workloads-pods/pods.store";
-import { apiManager } from "../../../common/k8s-api/api-manager";
+import type { GetPodsByOwnerId } from "../+workloads-pods/get-pods-by-owner-id.injectable";
import type { DaemonSet, DaemonSetApi, Pod } from "../../../common/k8s-api/endpoints";
-import { daemonSetApi, PodStatusPhase } 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";
+
+export interface DaemonSetStoreDependencies {
+ readonly getPodsByOwnerId: GetPodsByOwnerId;
+}
export class DaemonSetStore extends KubeObjectStore {
+ constructor(protected readonly dependencies: DaemonSetStoreDependencies, api: DaemonSetApi, opts?: KubeObjectStoreOptions) {
+ super(api, opts);
+ }
+
getChildPods(daemonSet: DaemonSet): Pod[] {
- return podsStore.getPodsByOwnerId(daemonSet.getId());
+ return this.dependencies.getPodsByOwnerId(daemonSet.getId());
}
getStatuses(daemonSets?: DaemonSet[]) {
@@ -33,11 +40,3 @@ export class DaemonSetStore extends KubeObjectStore {
return status;
}
}
-
-export const daemonSetStore = isClusterPageContext()
- ? new DaemonSetStore(daemonSetApi)
- : undefined as never;
-
-if (isClusterPageContext()) {
- apiManager.registerStore(daemonSetStore);
-}
diff --git a/src/renderer/components/+workloads-deployments/deployment-details.tsx b/src/renderer/components/+workloads-deployments/deployment-details.tsx
index 43c9995dec..4cbcd4880c 100644
--- a/src/renderer/components/+workloads-deployments/deployment-details.tsx
+++ b/src/renderer/components/+workloads-deployments/deployment-details.tsx
@@ -14,7 +14,6 @@ import type { PodMetricData } from "../../../common/k8s-api/endpoints";
import { Deployment, getMetricsForDeployments } from "../../../common/k8s-api/endpoints";
import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations";
import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities";
-import { podsStore } from "../+workloads-pods/pods.store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics";
import { deploymentStore } from "./deployments.store";
@@ -28,14 +27,17 @@ import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
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";
export interface DeploymentDetailsProps extends KubeObjectDetailsProps {
}
interface Dependencies {
subscribeStores: SubscribeStores;
+ podStore: PodStore;
}
@observer
@@ -54,7 +56,7 @@ class NonInjectedDeploymentDetails extends React.Component
- {!isMetricHidden && podsStore.isLoaded && (
+ {!isMetricHidden && podStore.isLoaded && (
(
- NonInjectedDeploymentDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const DeploymentDetails = withInjectables(NonInjectedDeploymentDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-deployments/deployments.store.ts b/src/renderer/components/+workloads-deployments/deployments.store.ts
index 1479b669eb..2351e68225 100644
--- a/src/renderer/components/+workloads-deployments/deployments.store.ts
+++ b/src/renderer/components/+workloads-deployments/deployments.store.ts
@@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { Deployment, DeploymentApi } from "../../../common/k8s-api/endpoints";
import { deploymentApi, PodStatusPhase } from "../../../common/k8s-api/endpoints";
@@ -38,7 +38,7 @@ export class DeploymentStore extends KubeObjectStore
}
getChildPods(deployment: Deployment) {
- return podsStore
+ return podStore
.getByLabel(deployment.getTemplateLabels())
.filter(pod => pod.getNs() === deployment.getNs());
}
diff --git a/src/renderer/components/+workloads-jobs/job-details.tsx b/src/renderer/components/+workloads-jobs/job-details.tsx
index d74b3c823f..fd95c1a026 100644
--- a/src/renderer/components/+workloads-jobs/job-details.tsx
+++ b/src/renderer/components/+workloads-jobs/job-details.tsx
@@ -14,7 +14,6 @@ import { PodDetailsStatuses } from "../+workloads-pods/pod-details-statuses";
import { Link } from "react-router-dom";
import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations";
import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities";
-import { podsStore } from "../+workloads-pods/pods.store";
import { jobStore } from "./job.store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import { getMetricsForJobs, type PodMetricData, Job } from "../../../common/k8s-api/endpoints";
@@ -29,14 +28,17 @@ import { getDetailsUrl } from "../kube-detail-params";
import { apiManager } from "../../../common/k8s-api/api-manager";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
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";
export interface JobDetailsProps extends KubeObjectDetailsProps {
}
interface Dependencies {
subscribeStores: SubscribeStores;
+ podStore: PodStore;
}
@observer
@@ -54,7 +56,7 @@ class NonInjectedJobDetails extends React.Component
- {kind}
+ {kind}
{" "}
{name}
@@ -168,14 +170,11 @@ class NonInjectedJobDetails extends React.Component(
- NonInjectedJobDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const JobDetails = withInjectables(NonInjectedJobDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-jobs/job.store.ts b/src/renderer/components/+workloads-jobs/job.store.ts
index 1e250b04ce..e14018be03 100644
--- a/src/renderer/components/+workloads-jobs/job.store.ts
+++ b/src/renderer/components/+workloads-jobs/job.store.ts
@@ -8,13 +8,13 @@ import type { Job, JobApi } from "../../../common/k8s-api/endpoints/job.api";
import { jobApi } from "../../../common/k8s-api/endpoints/job.api";
import type { CronJob, Pod } from "../../../common/k8s-api/endpoints";
import { PodStatusPhase } from "../../../common/k8s-api/endpoints";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import { isClusterPageContext } from "../../utils";
export class JobStore extends KubeObjectStore {
getChildPods(job: Job): Pod[] {
- return podsStore.getPodsByOwnerId(job.getId());
+ return podStore.getPodsByOwnerId(job.getId());
}
getJobsByOwner(cronJob: CronJob) {
diff --git a/src/renderer/components/+workloads-overview/overview.tsx b/src/renderer/components/+workloads-overview/overview.tsx
index 5975c1e9cd..26515e8dac 100644
--- a/src/renderer/components/+workloads-overview/overview.tsx
+++ b/src/renderer/components/+workloads-overview/overview.tsx
@@ -8,9 +8,7 @@ import "./overview.scss";
import React from "react";
import { disposeOnUnmount, observer } from "mobx-react";
import { eventStore } from "../+events/event.store";
-import { podsStore } from "../+workloads-pods/pods.store";
import { deploymentStore } from "../+workloads-deployments/deployments.store";
-import { daemonSetStore } from "../+workloads-daemonsets/daemonsets.store";
import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store";
import { replicaSetStore } from "../+workloads-replicasets/replicasets.store";
import { jobStore } from "../+workloads-jobs/job.store";
@@ -23,15 +21,21 @@ import { TooltipPosition } from "../tooltip";
import { withInjectables } from "@ogre-tools/injectable-react";
import clusterFrameContextInjectable from "../../cluster-frame-context/cluster-frame-context.injectable";
import type { ClusterFrameContext } from "../../cluster-frame-context/cluster-frame-context";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import detailComponentsInjectable from "./detail-components.injectable";
import { SiblingsInTabLayout } from "../layout/siblings-in-tab-layout";
+import type { PodStore } from "../+workloads-pods/store";
+import type { DaemonSetStore } from "../+workloads-daemonsets/store";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
+import daemonSetStoreInjectable from "../+workloads-daemonsets/store.injectable";
+import podStoreInjectable from "../+workloads-pods/store.injectable";
interface Dependencies {
detailComponents: IComputedValue[]>;
clusterFrameContext: ClusterFrameContext;
subscribeStores: SubscribeStores;
+ podStore: PodStore;
+ daemonSetStore: DaemonSetStore;
}
@observer
@@ -47,11 +51,11 @@ class NonInjectedWorkloadsOverview extends React.Component {
disposeOnUnmount(this, [
this.props.subscribeStores([
cronJobStore,
- daemonSetStore,
+ this.props.daemonSetStore,
deploymentStore,
eventStore,
jobStore,
- podsStore,
+ this.props.podStore,
replicaSetStore,
statefulSetStore,
], {
@@ -104,14 +108,12 @@ class NonInjectedWorkloadsOverview extends React.Component {
}
}
-export const WorkloadsOverview = withInjectables(
- NonInjectedWorkloadsOverview,
-
- {
- getProps: (di) => ({
- detailComponents: di.inject(detailComponentsInjectable),
- clusterFrameContext: di.inject(clusterFrameContextInjectable),
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- }),
- },
-);
+export const WorkloadsOverview = withInjectables(NonInjectedWorkloadsOverview, {
+ getProps: (di) => ({
+ detailComponents: di.inject(detailComponentsInjectable),
+ clusterFrameContext: di.inject(clusterFrameContextInjectable),
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ daemonSetStore: di.inject(daemonSetStoreInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts
index 3d94bed421..3a011df7fd 100644
--- a/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts
+++ b/src/renderer/components/+workloads-overview/workloads/implementations/daemonsets-workload.injectable.ts
@@ -6,7 +6,7 @@ import { getInjectable } from "@ogre-tools/injectable";
import { workloadInjectionToken } from "../workload-injection-token";
import { ResourceNames } from "../../../../utils/rbac";
import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable";
-import daemonsetsStoreInjectable from "../../../+workloads-daemonsets/daemonsets-store.injectable";
+import daemonsetsStoreInjectable from "../../../+workloads-daemonsets/store.injectable";
import navigateToDaemonsetsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/daemonsets/navigate-to-daemonsets.injectable";
import { computed } from "mobx";
diff --git a/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts b/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts
index 334c20ba44..1a84f02885 100644
--- a/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts
+++ b/src/renderer/components/+workloads-overview/workloads/implementations/pods-workload.injectable.ts
@@ -6,9 +6,9 @@ import { getInjectable } from "@ogre-tools/injectable";
import { workloadInjectionToken } from "../workload-injection-token";
import { ResourceNames } from "../../../../utils/rbac";
import navigateToPodsInjectable from "../../../../../common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable";
-import podsStoreInjectable from "../../../+workloads-pods/pods-store.injectable";
import namespaceStoreInjectable from "../../../+namespaces/namespace-store/namespace-store.injectable";
import { computed } from "mobx";
+import podStoreInjectable from "../../../+workloads-pods/store.injectable";
const podsWorkloadInjectable = getInjectable({
id: "pods-workload",
@@ -16,7 +16,7 @@ const podsWorkloadInjectable = getInjectable({
instantiate: (di) => {
const navigate = di.inject(navigateToPodsInjectable);
const namespaceStore = di.inject(namespaceStoreInjectable);
- const store = di.inject(podsStoreInjectable);
+ const store = di.inject(podStoreInjectable);
return {
resourceName: "pods",
diff --git a/src/renderer/components/+workloads-pods/get-pod-by-id.injectable.ts b/src/renderer/components/+workloads-pods/get-pod-by-id.injectable.ts
new file mode 100644
index 0000000000..b0c0a5729a
--- /dev/null
+++ b/src/renderer/components/+workloads-pods/get-pod-by-id.injectable.ts
@@ -0,0 +1,20 @@
+/**
+ * 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 type { Pod } from "../../../common/k8s-api/endpoints";
+import podStoreInjectable from "./store.injectable";
+
+export type GetPodById = (id: string) => Pod | undefined;
+
+const getPodByIdInjectable = getInjectable({
+ id: "get-pod-by-id",
+ instantiate: (di): GetPodById => {
+ const store = di.inject(podStoreInjectable);
+
+ return id => store.getById(id);
+ },
+});
+
+export default getPodByIdInjectable;
diff --git a/src/renderer/components/+workloads-pods/get-pods-by-owner-id.injectable.ts b/src/renderer/components/+workloads-pods/get-pods-by-owner-id.injectable.ts
new file mode 100644
index 0000000000..01862831a2
--- /dev/null
+++ b/src/renderer/components/+workloads-pods/get-pods-by-owner-id.injectable.ts
@@ -0,0 +1,20 @@
+/**
+ * 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 type { Pod } from "../../../common/k8s-api/endpoints";
+import podStoreInjectable from "./store.injectable";
+
+export type GetPodsByOwnerId = (ownerId: string) => Pod[];
+
+const getPodsByOwnerIdInjectable = getInjectable({
+ id: "get-pods-by-owner-id",
+ instantiate: (di): GetPodsByOwnerId => {
+ const podStore = di.inject(podStoreInjectable);
+
+ return (ownerId) => podStore.getPodsByOwnerId(ownerId);
+ },
+});
+
+export default getPodsByOwnerIdInjectable;
diff --git a/src/renderer/components/+workloads-pods/legacy-store.ts b/src/renderer/components/+workloads-pods/legacy-store.ts
new file mode 100644
index 0000000000..e05d8fcffd
--- /dev/null
+++ b/src/renderer/components/+workloads-pods/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 podStoreInjectable from "./store.injectable";
+
+/**
+ * @deprecated use `di.inject(podStoreInjectable)` instead
+ */
+export const podStore = asLegacyGlobalForExtensionApi(podStoreInjectable);
diff --git a/src/renderer/components/+workloads-pods/pod-details-list.tsx b/src/renderer/components/+workloads-pods/pod-details-list.tsx
index 66b8deb84e..907d60b334 100644
--- a/src/renderer/components/+workloads-pods/pod-details-list.tsx
+++ b/src/renderer/components/+workloads-pods/pod-details-list.tsx
@@ -9,7 +9,7 @@ import React from "react";
import kebabCase from "lodash/kebabCase";
import { reaction } from "mobx";
import { disposeOnUnmount, observer } from "mobx-react";
-import { podsStore } from "./pods.store";
+import { podStore } from "./legacy-store";
import type { Pod } from "../../../common/k8s-api/endpoints";
import { autoBind, bytesToUnits, cssNames, interval, prevDefault } from "../../utils";
import { LineProgress } from "../line-progress";
@@ -42,7 +42,7 @@ export class PodDetailsList extends React.Component {
}
private metricsWatcher = interval(120, () => {
- podsStore.loadKubeMetrics(this.props.owner.getNs());
+ podStore.loadKubeMetrics(this.props.owner.getNs());
});
componentDidMount() {
@@ -113,7 +113,7 @@ export class PodDetailsList extends React.Component {
return;
}
- const metrics = podsStore.getPodKubeMetrics(pod);
+ const metrics = podStore.getPodKubeMetrics(pod);
return (
{
render() {
const { pods } = this.props;
- if (!podsStore.isLoaded) {
+ if (!podStore.isLoaded) {
return (
@@ -166,8 +166,8 @@ export class PodDetailsList extends React.Component
{
sortable={{
[sortBy.name]: pod => pod.getName(),
[sortBy.namespace]: pod => pod.getNs(),
- [sortBy.cpu]: pod => podsStore.getPodKubeMetrics(pod).cpu,
- [sortBy.memory]: pod => podsStore.getPodKubeMetrics(pod).memory,
+ [sortBy.cpu]: pod => podStore.getPodKubeMetrics(pod).cpu,
+ [sortBy.memory]: pod => podStore.getPodKubeMetrics(pod).memory,
}}
sortByDefault={{ sortBy: sortBy.cpu, orderBy: "desc" }}
sortSyncWithUrl={false}
diff --git a/src/renderer/components/+workloads-pods/pods-sidebar-items.injectable.tsx b/src/renderer/components/+workloads-pods/pods-sidebar-items.injectable.ts
similarity index 100%
rename from src/renderer/components/+workloads-pods/pods-sidebar-items.injectable.tsx
rename to src/renderer/components/+workloads-pods/pods-sidebar-items.injectable.ts
diff --git a/src/renderer/components/+workloads-pods/pods-store.injectable.ts b/src/renderer/components/+workloads-pods/pods-store.injectable.ts
deleted file mode 100644
index 7515931f80..0000000000
--- a/src/renderer/components/+workloads-pods/pods-store.injectable.ts
+++ /dev/null
@@ -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 { podsStore } from "./pods.store";
-
-const podsStoreInjectable = getInjectable({
- id: "pods-store",
- instantiate: () => podsStore,
- causesSideEffects: true,
-});
-
-export default podsStoreInjectable;
diff --git a/src/renderer/components/+workloads-pods/pods.tsx b/src/renderer/components/+workloads-pods/pods.tsx
index 0da23c6719..687fb318be 100644
--- a/src/renderer/components/+workloads-pods/pods.tsx
+++ b/src/renderer/components/+workloads-pods/pods.tsx
@@ -8,7 +8,7 @@ import "./pods.scss";
import React, { Fragment } from "react";
import { observer } from "mobx-react";
import { Link } from "react-router-dom";
-import { podsStore } from "./pods.store";
+import { podStore } from "./legacy-store";
import { eventStore } from "../+events/event.store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
import type { Pod } from "../../../common/k8s-api/endpoints";
@@ -80,7 +80,7 @@ export class Pods extends React.Component {
{this.renderState(name, ready, "terminated", state.terminated)}
>
),
- }}
+ }}
/>
));
@@ -91,7 +91,7 @@ export class Pods extends React.Component {
,
,
pod.getNs(),
diff --git a/src/renderer/components/+workloads-pods/store.injectable.ts b/src/renderer/components/+workloads-pods/store.injectable.ts
new file mode 100644
index 0000000000..bc9909e09a
--- /dev/null
+++ b/src/renderer/components/+workloads-pods/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 podApiInjectable from "../../../common/k8s-api/endpoints/pod.api.injectable";
+import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
+import apiManagerInjectable from "../kube-object-menu/dependencies/api-manager.injectable";
+import { PodStore } from "./store";
+
+const podStoreInjectable = getInjectable({
+ id: "pod-store",
+ instantiate: (di) => {
+ assert(di.inject(createStoresAndApisInjectable), "podStore is only available in certain environements");
+
+ const api = di.inject(podApiInjectable);
+ const apiManager = di.inject(apiManagerInjectable);
+ const store = new PodStore(api);
+
+ apiManager.registerStore(store);
+
+ return store;
+ },
+});
+
+export default podStoreInjectable;
diff --git a/src/renderer/components/+workloads-pods/pods.store.ts b/src/renderer/components/+workloads-pods/store.ts
similarity index 82%
rename from src/renderer/components/+workloads-pods/pods.store.ts
rename to src/renderer/components/+workloads-pods/store.ts
index 776c688940..6552e7ff5f 100644
--- a/src/renderer/components/+workloads-pods/pods.store.ts
+++ b/src/renderer/components/+workloads-pods/store.ts
@@ -6,13 +6,12 @@
import countBy from "lodash/countBy";
import { observable } from "mobx";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
-import { cpuUnitsToNumber, isClusterPageContext, unitsToBytes } from "../../utils";
+import { cpuUnitsToNumber, unitsToBytes } from "../../utils";
import type { Pod, PodMetrics, PodApi } from "../../../common/k8s-api/endpoints";
-import { podMetricsApi, podApi } from "../../../common/k8s-api/endpoints";
-import { apiManager } from "../../../common/k8s-api/api-manager";
+import { podMetricsApi } from "../../../common/k8s-api/endpoints";
import type { KubeObject, KubeObjectScope } from "../../../common/k8s-api/kube-object";
-export class PodsStore extends KubeObjectStore {
+export class PodStore extends KubeObjectStore {
readonly kubeMetrics = observable.array([]);
async loadKubeMetrics(namespace?: string) {
@@ -77,11 +76,3 @@ export class PodsStore extends KubeObjectStore {
}, empty);
}
}
-
-export const podsStore = isClusterPageContext()
- ? new PodsStore(podApi)
- : undefined as never;
-
-if (isClusterPageContext()) {
- apiManager.registerStore(podsStore);
-}
diff --git a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx
index 2c53b4dcbf..cc64682436 100644
--- a/src/renderer/components/+workloads-replicasets/replicaset-details.tsx
+++ b/src/renderer/components/+workloads-replicasets/replicaset-details.tsx
@@ -13,7 +13,6 @@ 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 { disposeOnUnmount, observer } from "mobx-react";
-import { podsStore } from "../+workloads-pods/pods.store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import type { PodMetricData } from "../../../common/k8s-api/endpoints";
import { getMetricsForReplicaSets, ReplicaSet } from "../../../common/k8s-api/endpoints";
@@ -25,14 +24,17 @@ import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
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";
export interface ReplicaSetDetailsProps extends KubeObjectDetailsProps {
}
interface Dependencies {
subscribeStores: SubscribeStores;
+ podStore: PodStore;
}
@observer
@@ -51,7 +53,7 @@ class NonInjectedReplicaSetDetails extends React.Component
- {!isMetricHidden && podsStore.isLoaded && (
+ {!isMetricHidden && podStore.isLoaded && (
(
- NonInjectedReplicaSetDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const ReplicaSetDetails = withInjectables(NonInjectedReplicaSetDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-replicasets/replicasets.store.ts b/src/renderer/components/+workloads-replicasets/replicasets.store.ts
index e498832127..cba5a2779a 100644
--- a/src/renderer/components/+workloads-replicasets/replicasets.store.ts
+++ b/src/renderer/components/+workloads-replicasets/replicasets.store.ts
@@ -3,17 +3,17 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { Deployment, ReplicaSet, ReplicaSetApi } from "../../../common/k8s-api/endpoints";
import { replicaSetApi } from "../../../common/k8s-api/endpoints";
-import { PodStatusPhase } from "../../../common/k8s-api/endpoints/pods.api";
+import { PodStatusPhase } from "../../../common/k8s-api/endpoints/pod.api";
import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store";
import { isClusterPageContext } from "../../utils";
export class ReplicaSetStore extends KubeObjectStore {
getChildPods(replicaSet: ReplicaSet) {
- return podsStore.getPodsByOwnerId(replicaSet.getId());
+ return podStore.getPodsByOwnerId(replicaSet.getId());
}
getStatuses(replicaSets: ReplicaSet[]) {
diff --git a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx
index 613a7097a3..3ed473a217 100644
--- a/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx
+++ b/src/renderer/components/+workloads-statefulsets/statefulset-details.tsx
@@ -13,7 +13,6 @@ 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 { podsStore } from "../+workloads-pods/pods.store";
import { statefulSetStore } from "./statefulset.store";
import type { KubeObjectDetailsProps } from "../kube-object-details";
import type { PodMetricData } from "../../../common/k8s-api/endpoints";
@@ -26,14 +25,17 @@ import { getActiveClusterEntity } from "../../api/catalog-entity-registry";
import { ClusterMetricsResourceType } from "../../../common/cluster-types";
import logger from "../../../common/logger";
import { withInjectables } from "@ogre-tools/injectable-react";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
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";
export interface StatefulSetDetailsProps extends KubeObjectDetailsProps {
}
interface Dependencies {
subscribeStores: SubscribeStores;
+ podStore: PodStore;
}
@observer
@@ -52,7 +54,7 @@ class NonInjectedStatefulSetDetails extends React.Component
- {!isMetricHidden && podsStore.isLoaded && (
+ {!isMetricHidden && podStore.isLoaded && (
(
- NonInjectedStatefulSetDetails,
-
- {
- getProps: (di, props) => ({
- subscribeStores: di.inject(kubeWatchApiInjectable).subscribeStores,
- ...props,
- }),
- },
-);
+export const StatefulSetDetails = withInjectables(NonInjectedStatefulSetDetails, {
+ getProps: (di, props) => ({
+ ...props,
+ subscribeStores: di.inject(subscribeStoresInjectable),
+ podStore: di.inject(podStoreInjectable),
+ }),
+});
diff --git a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts
index b6932f24c7..1a8e13feb6 100644
--- a/src/renderer/components/+workloads-statefulsets/statefulset.store.ts
+++ b/src/renderer/components/+workloads-statefulsets/statefulset.store.ts
@@ -3,7 +3,7 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { apiManager } from "../../../common/k8s-api/api-manager";
import type { StatefulSet, StatefulSetApi } from "../../../common/k8s-api/endpoints";
import { PodStatusPhase, statefulSetApi } from "../../../common/k8s-api/endpoints";
@@ -12,7 +12,7 @@ import { isClusterPageContext } from "../../utils";
export class StatefulSetStore extends KubeObjectStore {
getChildPods(statefulSet: StatefulSet) {
- return podsStore.getPodsByOwnerId(statefulSet.getId());
+ return podStore.getPodsByOwnerId(statefulSet.getId());
}
getStatuses(statefulSets: StatefulSet[]) {
diff --git a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx
index dd3bee87a3..8b1bbd46f9 100644
--- a/src/renderer/components/+workloads-statefulsets/statefulsets.tsx
+++ b/src/renderer/components/+workloads-statefulsets/statefulsets.tsx
@@ -8,7 +8,7 @@ import "./statefulsets.scss";
import React from "react";
import { observer } from "mobx-react";
import type { StatefulSet } from "../../../common/k8s-api/endpoints";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { statefulSetStore } from "./statefulset.store";
import { eventStore } from "../+events/event.store";
import { KubeObjectListLayout } from "../kube-object-list-layout";
@@ -40,7 +40,7 @@ export class StatefulSets extends React.Component {
tableId="workload_statefulsets"
className="StatefulSets"
store={statefulSetStore}
- dependentStores={[podsStore, eventStore]} // status icon component uses event store, details component uses podStore
+ dependentStores={[podStore, eventStore]} // status icon component uses event store, details component uses podStore
sortingCallbacks={{
[columnId.name]: statefulSet => statefulSet.getName(),
[columnId.namespace]: statefulSet => statefulSet.getNs(),
diff --git a/src/renderer/components/__tests__/daemonset.store.test.ts b/src/renderer/components/__tests__/daemonset.store.test.ts
index 5dc5ff775a..22c0b4e60e 100644
--- a/src/renderer/components/__tests__/daemonset.store.test.ts
+++ b/src/renderer/components/__tests__/daemonset.store.test.ts
@@ -4,9 +4,12 @@
*/
import { observable } from "mobx";
-import { daemonSetStore } from "../+workloads-daemonsets/daemonsets.store";
-import { podsStore } from "../+workloads-pods/pods.store";
+import type { DaemonSetStore } from "../+workloads-daemonsets/store";
+import daemonSetStoreInjectable from "../+workloads-daemonsets/store.injectable";
+import podStoreInjectable from "../+workloads-pods/store.injectable";
import { DaemonSet, Pod } from "../../../common/k8s-api/endpoints";
+import createStoresAndApisInjectable from "../../create-stores-apis.injectable";
+import { getDiForUnitTesting } from "../../getDiForUnitTesting";
const runningDaemonSet = new DaemonSet({
apiVersion: "foo",
@@ -128,8 +131,17 @@ const failedPod = new Pod({
});
describe("DaemonSet Store tests", () => {
+ let daemonSetStore: DaemonSetStore;
+
beforeAll(() => {
- podsStore.items = observable.array([
+ const di = getDiForUnitTesting({ doGeneralOverrides: true });
+
+ di.override(createStoresAndApisInjectable, () => true);
+
+ const podStore = di.inject(podStoreInjectable);
+
+ daemonSetStore = di.inject(daemonSetStoreInjectable);
+ podStore.items = observable.array([
runningPod,
failedPod,
pendingPod,
diff --git a/src/renderer/components/__tests__/deployments.store.test.ts b/src/renderer/components/__tests__/deployments.store.test.ts
index 12e3e2a1ee..2a0d364de7 100644
--- a/src/renderer/components/__tests__/deployments.store.test.ts
+++ b/src/renderer/components/__tests__/deployments.store.test.ts
@@ -5,7 +5,7 @@
import { observable } from "mobx";
import { deploymentStore } from "../+workloads-deployments/deployments.store";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import type { PodSpec } from "../../../common/k8s-api/endpoints";
import { Deployment, Pod } from "../../../common/k8s-api/endpoints";
@@ -202,7 +202,7 @@ const failedPod = new Pod({
describe("Deployment Store tests", () => {
beforeAll(() => {
// Add pods to pod store
- podsStore.items = observable.array([
+ podStore.items = observable.array([
runningPod,
failedPod,
pendingPod,
diff --git a/src/renderer/components/__tests__/job.store.test.ts b/src/renderer/components/__tests__/job.store.test.ts
index 90845ba710..4423863d91 100644
--- a/src/renderer/components/__tests__/job.store.test.ts
+++ b/src/renderer/components/__tests__/job.store.test.ts
@@ -5,7 +5,7 @@
import { observable } from "mobx";
import { jobStore } from "../+workloads-jobs/job.store";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { Job, Pod } from "../../../common/k8s-api/endpoints";
const runningJob = new Job({
@@ -166,7 +166,7 @@ const succeededPod = new Pod({
describe("Job Store tests", () => {
beforeAll(() => {
- podsStore.items = observable.array([
+ podStore.items = observable.array([
runningPod,
failedPod,
pendingPod,
diff --git a/src/renderer/components/__tests__/pods.store.test.ts b/src/renderer/components/__tests__/pods.store.test.ts
index cf2963762e..9dfbafb9e4 100644
--- a/src/renderer/components/__tests__/pods.store.test.ts
+++ b/src/renderer/components/__tests__/pods.store.test.ts
@@ -4,7 +4,7 @@
*/
import { Pod } from "../../../common/k8s-api/endpoints";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
const runningPod = new Pod({
apiVersion: "foo",
@@ -112,7 +112,7 @@ const succeededPod = new Pod({
describe("Pod Store tests", () => {
it("gets Pod statuses in proper sorting order", () => {
- const statuses = Object.entries(podsStore.getStatuses([
+ const statuses = Object.entries(podStore.getStatuses([
pendingPod,
runningPod,
succeededPod,
@@ -131,7 +131,7 @@ describe("Pod Store tests", () => {
});
it("counts statuses properly", () => {
- const statuses = Object.entries(podsStore.getStatuses([
+ const statuses = Object.entries(podStore.getStatuses([
pendingPod,
pendingPod,
pendingPod,
diff --git a/src/renderer/components/__tests__/replicaset.store.test.ts b/src/renderer/components/__tests__/replicaset.store.test.ts
index 549965d06c..9dc5c698ea 100644
--- a/src/renderer/components/__tests__/replicaset.store.test.ts
+++ b/src/renderer/components/__tests__/replicaset.store.test.ts
@@ -4,7 +4,7 @@
*/
import { observable } from "mobx";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { replicaSetStore } from "../+workloads-replicasets/replicasets.store";
import { ReplicaSet, Pod } from "../../../common/k8s-api/endpoints";
@@ -129,7 +129,7 @@ const failedPod = new Pod({
describe("ReplicaSet Store tests", () => {
beforeAll(() => {
- podsStore.items = observable.array([
+ podStore.items = observable.array([
runningPod,
failedPod,
pendingPod,
diff --git a/src/renderer/components/__tests__/statefulset.store.test.ts b/src/renderer/components/__tests__/statefulset.store.test.ts
index c0faeb9441..50b476285e 100644
--- a/src/renderer/components/__tests__/statefulset.store.test.ts
+++ b/src/renderer/components/__tests__/statefulset.store.test.ts
@@ -4,7 +4,7 @@
*/
import { observable } from "mobx";
-import { podsStore } from "../+workloads-pods/pods.store";
+import { podStore } from "../+workloads-pods/legacy-store";
import { statefulSetStore } from "../+workloads-statefulsets/statefulset.store";
import { StatefulSet, Pod } from "../../../common/k8s-api/endpoints";
@@ -130,7 +130,7 @@ const failedPod = new Pod({
describe("StatefulSet Store tests", () => {
beforeAll(() => {
// Add pods to pod store
- podsStore.items = observable.array([
+ podStore.items = observable.array([
runningPod,
failedPod,
pendingPod,
diff --git a/src/renderer/components/dock/logs/create-workload-logs-tab.injectable.ts b/src/renderer/components/dock/logs/create-workload-logs-tab.injectable.ts
index f4dfc997e9..748548ddbc 100644
--- a/src/renderer/components/dock/logs/create-workload-logs-tab.injectable.ts
+++ b/src/renderer/components/dock/logs/create-workload-logs-tab.injectable.ts
@@ -3,7 +3,8 @@
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
-import { podsStore } from "../../+workloads-pods/pods.store";
+import type { GetPodsByOwnerId } from "../../+workloads-pods/get-pods-by-owner-id.injectable";
+import getPodsByOwnerIdInjectable from "../../+workloads-pods/get-pods-by-owner-id.injectable";
import type { DaemonSet, Deployment, Job, ReplicaSet, StatefulSet } from "../../../../common/k8s-api/endpoints";
import type { TabId } from "../dock/store";
import type { CreateLogsTabData } from "./create-logs-tab.injectable";
@@ -15,10 +16,14 @@ export interface WorkloadLogsTabData {
interface Dependencies {
createLogsTab: (title: string, data: CreateLogsTabData) => TabId;
+ getPodsByOwnerId: GetPodsByOwnerId;
}
-const createWorkloadLogsTab = ({ createLogsTab }: Dependencies) => ({ workload }: WorkloadLogsTabData): TabId | undefined => {
- const pods = podsStore.getPodsByOwnerId(workload.getId());
+const createWorkloadLogsTab = ({
+ createLogsTab,
+ getPodsByOwnerId,
+}: Dependencies) => ({ workload }: WorkloadLogsTabData): TabId | undefined => {
+ const pods = getPodsByOwnerId(workload.getId());
if (pods.length === 0) {
return undefined;
@@ -43,6 +48,7 @@ const createWorkloadLogsTabInjectable = getInjectable({
instantiate: (di) => createWorkloadLogsTab({
createLogsTab: di.inject(createLogsTabInjectable),
+ getPodsByOwnerId: di.inject(getPodsByOwnerIdInjectable),
}),
});
diff --git a/src/renderer/components/dock/logs/load-logs.injectable.ts b/src/renderer/components/dock/logs/load-logs.injectable.ts
index 5f2055417c..0d1b72ed30 100644
--- a/src/renderer/components/dock/logs/load-logs.injectable.ts
+++ b/src/renderer/components/dock/logs/load-logs.injectable.ts
@@ -8,17 +8,21 @@ import type { Pod } from "../../../../common/k8s-api/endpoints";
import logStoreInjectable from "./store.injectable";
import type { LogTabData } from "./tab-store";
+export interface LoadLogs {
+ (
+ tabId: string,
+ pod: IComputedValue,
+ logTabData: IComputedValue,
+ ): Promise;
+}
+
const loadLogsInjectable = getInjectable({
id: "load-logs",
- instantiate: (di) => {
+ instantiate: (di): LoadLogs => {
const logStore = di.inject(logStoreInjectable);
- return (
- tabId: string,
- pod: IComputedValue,
- logTabData: IComputedValue,
- ): Promise => logStore.load(tabId, pod, logTabData);
+ return (tabId, pod, logTabData) => logStore.load(tabId, pod, logTabData);
},
});
diff --git a/src/renderer/components/dock/logs/logs-view-model.injectable.ts b/src/renderer/components/dock/logs/logs-view-model.injectable.ts
index 5943888a5b..a9c027acf9 100644
--- a/src/renderer/components/dock/logs/logs-view-model.injectable.ts
+++ b/src/renderer/components/dock/logs/logs-view-model.injectable.ts
@@ -13,10 +13,11 @@ import getLogTabDataInjectable from "./get-log-tab-data.injectable";
import loadLogsInjectable from "./load-logs.injectable";
import setLogTabDataInjectable from "./set-log-tab-data.injectable";
import stopLoadingLogsInjectable from "./stop-loading-logs.injectable";
-import { podsStore } from "../../+workloads-pods/pods.store";
import renameTabInjectable from "../dock/rename-tab.injectable";
import areLogsPresentInjectable from "./are-logs-present.injectable";
import searchStoreInjectable from "../../../search-store/search-store.injectable";
+import getPodsByOwnerIdInjectable from "../../+workloads-pods/get-pods-by-owner-id.injectable";
+import getPodByIdInjectable from "../../+workloads-pods/get-pod-by-id.injectable";
export interface InstantiateArgs {
tabId: TabId;
@@ -36,8 +37,8 @@ const logsViewModelInjectable = getInjectable({
renameTab: di.inject(renameTabInjectable),
stopLoadingLogs: di.inject(stopLoadingLogsInjectable),
areLogsPresent: di.inject(areLogsPresentInjectable),
- getPodById: id => podsStore.getById(id),
- getPodsByOwnerId: id => podsStore.getPodsByOwnerId(id),
+ getPodById: di.inject(getPodByIdInjectable),
+ getPodsByOwnerId: di.inject(getPodsByOwnerIdInjectable),
searchStore: di.inject(searchStoreInjectable),
}),
lifecycle: lifecycleEnum.transient,
diff --git a/src/renderer/components/dock/logs/logs-view-model.ts b/src/renderer/components/dock/logs/logs-view-model.ts
index 76e7704710..021eb43a7a 100644
--- a/src/renderer/components/dock/logs/logs-view-model.ts
+++ b/src/renderer/components/dock/logs/logs-view-model.ts
@@ -10,6 +10,9 @@ import type { SearchStore } from "../../../search-store/search-store";
import type { Pod } from "../../../../common/k8s-api/endpoints";
import { isDefined } from "../../../utils";
import assert from "assert";
+import type { GetPodById } from "../../+workloads-pods/get-pod-by-id.injectable";
+import type { GetPodsByOwnerId } from "../../+workloads-pods/get-pods-by-owner-id.injectable";
+import type { LoadLogs } from "./load-logs.injectable";
export interface LogTabViewModelDependencies {
getLogs: (tabId: TabId) => string[];
@@ -17,12 +20,12 @@ export interface LogTabViewModelDependencies {
getTimestampSplitLogs: (tabId: TabId) => [string, string][];
getLogTabData: (tabId: TabId) => LogTabData | undefined;
setLogTabData: (tabId: TabId, data: LogTabData) => void;
- loadLogs: (tabId: TabId, pod: IComputedValue, logTabData: IComputedValue) => Promise;
+ loadLogs: LoadLogs;
reloadLogs: (tabId: TabId, pod: IComputedValue, logTabData: IComputedValue) => Promise;
renameTab: (tabId: TabId, title: string) => void;
stopLoadingLogs: (tabId: TabId) => void;
- getPodById: (id: string) => Pod | undefined;
- getPodsByOwnerId: (id: string) => Pod[];
+ getPodById: GetPodById;
+ getPodsByOwnerId: GetPodsByOwnerId;
areLogsPresent: (tabId: TabId) => boolean;
searchStore: SearchStore;
}
diff --git a/src/renderer/components/dock/logs/view.tsx b/src/renderer/components/dock/logs/view.tsx
index 095fd73bb9..157ccfa778 100644
--- a/src/renderer/components/dock/logs/view.tsx
+++ b/src/renderer/components/dock/logs/view.tsx
@@ -18,7 +18,8 @@ import type { DockTab } from "../dock/store";
import { cssNames } from "../../../utils";
import type { SubscribeStores } from "../../../kube-watch-api/kube-watch-api";
import subscribeStoresInjectable from "../../../kube-watch-api/subscribe-stores.injectable";
-import { podsStore } from "../../+workloads-pods/pods.store";
+import type { PodStore } from "../../+workloads-pods/store";
+import podStoreInjectable from "../../+workloads-pods/store.injectable";
export interface LogsDockTabProps {
className?: string;
@@ -28,9 +29,16 @@ export interface LogsDockTabProps {
interface Dependencies {
model: LogTabViewModel;
subscribeStores: SubscribeStores;
+ podStore: PodStore;
}
-const NonInjectedLogsDockTab = observer(({ className, tab, model, subscribeStores }: Dependencies & LogsDockTabProps) => {
+const NonInjectedLogsDockTab = observer(({
+ className,
+ tab,
+ model,
+ subscribeStores,
+ podStore,
+}: Dependencies & LogsDockTabProps) => {
const logListElement = createRef();
const data = model.logTabData.get();
@@ -40,7 +48,7 @@ const NonInjectedLogsDockTab = observer(({ className, tab, model, subscribeStore
return model.stopLoadingLogs;
}, [tab.id]);
useEffect(() => subscribeStores([
- podsStore,
+ podStore,
], {
namespaces: data ? [data.namespace] : [],
}), [data?.namespace]);
@@ -92,10 +100,11 @@ const NonInjectedLogsDockTab = observer(({ className, tab, model, subscribeStore
export const LogsDockTab = withInjectables(NonInjectedLogsDockTab, {
getProps: (di, props) => ({
+ ...props,
model: di.inject(logsViewModelInjectable, {
tabId: props.tab.id,
}),
subscribeStores: di.inject(subscribeStoresInjectable),
- ...props,
+ podStore: di.inject(podStoreInjectable),
}),
});
diff --git a/src/renderer/components/drawer/drawer-param-toggler.tsx b/src/renderer/components/drawer/drawer-param-toggler.tsx
index be7d4984f0..44d813a25e 100644
--- a/src/renderer/components/drawer/drawer-param-toggler.tsx
+++ b/src/renderer/components/drawer/drawer-param-toggler.tsx
@@ -10,6 +10,7 @@ import { cssNames } from "../../utils";
export interface DrawerParamTogglerProps {
label: string | number;
+ children: React.ReactNode | React.ReactNode[];
}
interface State {
@@ -37,7 +38,9 @@ export class DrawerParamToggler extends React.Component
- {children}
+
+ {children}
+
);
}
diff --git a/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx b/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx
index 310d53ce5f..661624ff53 100644
--- a/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx
+++ b/src/renderer/components/kube-object-list-layout/kube-object-list-layout.tsx
@@ -23,9 +23,9 @@ import { TooltipPosition } from "../tooltip";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { ClusterFrameContext } from "../../cluster-frame-context/cluster-frame-context";
import clusterFrameContextInjectable from "../../cluster-frame-context/cluster-frame-context.injectable";
-import kubeWatchApiInjectable from "../../kube-watch-api/kube-watch-api.injectable";
import type { SubscribableStore, SubscribeStores } from "../../kube-watch-api/kube-watch-api";
import type { KubeApi } from "../../../common/k8s-api/kube-api";
+import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable";
export interface KubeObjectListLayoutProps<
K extends KubeObject,
@@ -148,9 +148,9 @@ const InjectedKubeObjectListLayout = withInjectables<
KubeObjectListLayoutProps>, KubeJsonApiDataFor>
>(NonInjectedKubeObjectListLayout, {
getProps: (di, props) => ({
- clusterFrameContext: di.inject(clusterFrameContextInjectable),
- subscribeToStores: di.inject(kubeWatchApiInjectable).subscribeStores,
...props,
+ clusterFrameContext: di.inject(clusterFrameContextInjectable),
+ subscribeToStores: di.inject(subscribeStoresInjectable),
}),
});
diff --git a/yarn.lock b/yarn.lock
index fa47f266e4..0ac2908221 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1197,14 +1197,14 @@
lodash "^4.17.15"
redent "^3.0.0"
-"@testing-library/react@^13.0.0":
- version "13.0.0"
- resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.0.0.tgz#8cdaf4667c6c2b082eb0513731551e9db784e8bc"
- integrity sha512-p0lYA1M7uoEmk2LnCbZLGmHJHyH59sAaZVXChTXlyhV/PRW9LoIh4mdf7tiXsO8BoNG+vN8UnFJff1hbZeXv+w==
+"@testing-library/react@^13.0.1":
+ version "13.0.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.0.1.tgz#00d223e182923d341a9610590561fb9dd1324110"
+ integrity sha512-zeHx3PohYYp+4bTJwrixQY8zSBZjWUGwYc7OhD1EpWTHS92RleApLoP72NdwaWxOrM1P1Uezt3XvGf6t2XSWPQ==
dependencies:
"@babel/runtime" "^7.12.5"
"@testing-library/dom" "^8.5.0"
- "@types/react-dom" "*"
+ "@types/react-dom" "^18.0.0"
"@testing-library/user-event@^13.5.0":
version "13.5.0"
@@ -1756,7 +1756,7 @@
dependencies:
"@types/react" "*"
-"@types/react-dom@*", "@types/react-dom@^18.0.0":
+"@types/react-dom@^18.0.0":
version "18.0.0"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141"
integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg==