diff --git a/src/renderer/components/+workloads-deployments/deployment-details.tsx b/src/renderer/components/+workloads-deployments/deployment-details.tsx index d21d7648d1..6137c7af48 100644 --- a/src/renderer/components/+workloads-deployments/deployment-details.tsx +++ b/src/renderer/components/+workloads-deployments/deployment-details.tsx @@ -14,70 +14,40 @@ import { Deployment } from "../../../common/k8s-api/endpoints"; import { PodDetailsTolerations } from "../+workloads-pods/pod-details-tolerations"; import { PodDetailsAffinities } from "../+workloads-pods/pod-details-affinities"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import { ResourceMetrics, ResourceMetricsText } from "../resource-metrics"; import type { DeploymentStore } from "./store"; -import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; -import { makeObservable, observable, reaction } from "mobx"; import { PodDetailsList } from "../+workloads-pods/pod-details-list"; -import { KubeObjectMeta } from "../kube-object-meta"; import type { ReplicaSetStore } from "../+workloads-replicasets/store"; import { DeploymentReplicaSets } from "./deployment-replicasets"; -import { ClusterMetricsResourceType } from "../../../common/cluster-types"; -import logger from "../../../common/logger"; +import type { Logger } from "../../../common/logger"; import { withInjectables } from "@ogre-tools/injectable-react"; import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api"; import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable"; -import type { PodStore } from "../+workloads-pods/store"; -import podStoreInjectable from "../+workloads-pods/store.injectable"; import replicaSetStoreInjectable from "../+workloads-replicasets/store.injectable"; import deploymentStoreInjectable from "./store.injectable"; -import type { GetActiveClusterEntity } from "../../api/catalog/entity/get-active-cluster-entity.injectable"; -import getActiveClusterEntityInjectable from "../../api/catalog/entity/get-active-cluster-entity.injectable"; -import type { DeploymentPodMetricData, RequestPodMetricsForDeployments } from "../../../common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-deployments.injectable"; -import requestPodMetricsForDeploymentsInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-deployments.injectable"; +import loggerInjectable from "../../../common/logger.injectable"; export interface DeploymentDetailsProps extends KubeObjectDetailsProps { } interface Dependencies { subscribeStores: SubscribeStores; - podStore: PodStore; replicaSetStore: ReplicaSetStore; deploymentStore: DeploymentStore; - getActiveClusterEntity: GetActiveClusterEntity; - requestPodMetricsForDeployments: RequestPodMetricsForDeployments; + logger: Logger; } @observer class NonInjectedDeploymentDetails extends React.Component { - @observable metrics: DeploymentPodMetricData | null = null; - - constructor(props: DeploymentDetailsProps & Dependencies) { - super(props); - makeObservable(this); - } - componentDidMount() { disposeOnUnmount(this, [ - reaction(() => this.props.object, () => { - this.metrics = null; - }), - this.props.subscribeStores([ - this.props.podStore, this.props.replicaSetStore, ]), ]); } - loadMetrics = async () => { - const { object: deployment, requestPodMetricsForDeployments } = this.props; - - this.metrics = await requestPodMetricsForDeployments([deployment], deployment.getNs()); - }; - render() { - const { object: deployment, podStore, replicaSetStore, deploymentStore, getActiveClusterEntity } = this.props; + const { object: deployment, replicaSetStore, deploymentStore, logger } = this.props; if (!deployment) { return null; @@ -94,21 +64,9 @@ class NonInjectedDeploymentDetails extends React.Component - {!isMetricHidden && podStore.isLoaded && ( - - - - )} - {`${spec.replicas} desired, ${status?.updatedReplicas ?? 0} updated, `} {`${status?.replicas ?? 0} total, ${status?.availableReplicas ?? 0} available, `} @@ -159,7 +117,6 @@ class NonInjectedDeploymentDetails extends React.Component - @@ -171,11 +128,9 @@ export const DeploymentDetails = withInjectables ({ ...props, subscribeStores: di.inject(subscribeStoresInjectable), - podStore: di.inject(podStoreInjectable), replicaSetStore: di.inject(replicaSetStoreInjectable), deploymentStore: di.inject(deploymentStoreInjectable), - getActiveClusterEntity: di.inject(getActiveClusterEntityInjectable), - requestPodMetricsForDeployments: di.inject(requestPodMetricsForDeploymentsInjectable), + logger: di.inject(loggerInjectable), }), }); diff --git a/src/renderer/components/+workloads-deployments/metrics-details-component.injectable.tsx b/src/renderer/components/+workloads-deployments/metrics-details-component.injectable.tsx new file mode 100644 index 0000000000..c3e695789d --- /dev/null +++ b/src/renderer/components/+workloads-deployments/metrics-details-component.injectable.tsx @@ -0,0 +1,34 @@ +/** + * 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 React from "react"; +import { PodCharts, podMetricTabs } from "../+workloads-pods/pod-charts"; +import { ClusterMetricsResourceType } from "../../../common/cluster-types"; +import type { Deployment } from "../../../common/k8s-api/endpoints"; +import enabledMetricsInjectable from "../../api/catalog/entity/metrics-enabled.injectable"; +import type { KubeObjectDetailsProps } from "../kube-object-details"; +import { kubeObjectDetailItemInjectionToken } from "../kube-object-details/kube-object-detail-items/kube-object-detail-item-injection-token"; +import { ResourceMetrics } from "../resource-metrics"; +import deploymentMetricsInjectable from "./metrics.injectable"; + +const deploymentMetricsDetailsComponentInjectable = getInjectable({ + id: "deployment-metrics-details-component", + instantiate: (di) => ({ + Component: ({ object }: KubeObjectDetailsProps) => ( + + + + ), + enabled: di.inject(enabledMetricsInjectable, ClusterMetricsResourceType.Deployment), + orderNumber: -1, + }), + injectionToken: kubeObjectDetailItemInjectionToken, +}); + +export default deploymentMetricsDetailsComponentInjectable; diff --git a/src/renderer/components/+workloads-deployments/metrics.injectable.ts b/src/renderer/components/+workloads-deployments/metrics.injectable.ts new file mode 100644 index 0000000000..ec25327d8f --- /dev/null +++ b/src/renderer/components/+workloads-deployments/metrics.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, lifecycleEnum } from "@ogre-tools/injectable"; +import { asyncComputed } from "@ogre-tools/injectable-react"; +import { now } from "mobx-utils"; +import type { Deployment } from "../../../common/k8s-api/endpoints"; +import requestPodMetricsForDeploymentsInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-deployments.injectable"; + +const deploymentMetricsInjectable = getInjectable({ + id: "deployment-metrics", + instantiate: (di, deployment) => { + const requestPodMetricsForDeployments = di.inject(requestPodMetricsForDeploymentsInjectable); + + return asyncComputed(() => { + now(60 * 1000); + + return requestPodMetricsForDeployments([deployment], deployment.getNs()); + }); + }, + lifecycle: lifecycleEnum.keyedSingleton({ + getInstanceKey: (di, deployment: Deployment) => deployment.getId(), + }), +}); + +export default deploymentMetricsInjectable;