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==