diff --git a/extensions/metrics-cluster-feature/src/metrics-feature.ts b/extensions/metrics-cluster-feature/src/metrics-feature.ts index c4aba6ed4b..b42b726c0b 100644 --- a/extensions/metrics-cluster-feature/src/metrics-feature.ts +++ b/extensions/metrics-cluster-feature/src/metrics-feature.ts @@ -58,37 +58,31 @@ export class MetricsFeature extends ClusterFeature.Feature { sc.metadata?.annotations?.['storageclass.beta.kubernetes.io/is-default-class'] === 'true' )); - const template = super.renderTemplates(path.join(__dirname, "../resources/")) - console.log(template) - super.applyResources(cluster, template) + super.applyResources(cluster, super.renderTemplates(path.join(__dirname, "../resources/"))) } async upgrade(cluster: Store.Cluster): Promise { return this.install(cluster) } - async featureStatus(cluster: Store.Cluster): Promise { - const status: ClusterFeature.FeatureStatus = { - currentVersion: null, - installed: false, - latestVersion: this.latestVersion, - canUpgrade: false, // Dunno yet - }; - + async updateStatus(cluster: Store.Cluster): Promise { try { const statefulSet = K8sApi.forCluster(cluster, K8sApi.StatefulSet) const prometheus = await statefulSet.get({name: "prometheus", namespace: "lens-metrics"}) - console.log("prom", cluster) if (prometheus?.kind) { - status.installed = true; - status.currentVersion = prometheus.spec.template.spec.containers[0].image.split(":")[1]; - status.canUpgrade = semver.lt(status.currentVersion, this.latestVersion, true); + this.status.installed = true; + this.status.currentVersion = prometheus.spec.template.spec.containers[0].image.split(":")[1]; + this.status.canUpgrade = semver.lt(this.status.currentVersion, this.latestVersion, true); + } else { + this.status.installed = false + } + } catch(e) { + if (e?.error?.code === 404) { + this.status.installed = false } - } catch { - // ignore error } - return status; + return this.status } async uninstall(cluster: Store.Cluster): Promise { diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 817d847ef6..c40bedab51 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -1,7 +1,6 @@ import type { ClusterId, ClusterModel, ClusterPreferences } from "../common/cluster-store" import type { IMetricsReqParams } from "../renderer/api/endpoints/metrics.api"; import type { WorkspaceId } from "../common/workspace-store"; -import type { FeatureStatusMap } from "./feature" import { action, computed, observable, reaction, toJS, when } from "mobx"; import { apiKubePrefix } from "../common/vars"; import { broadcastIpc } from "../common/ipc"; diff --git a/src/main/feature.ts b/src/main/feature.ts index d70f5e49aa..59400da15a 100644 --- a/src/main/feature.ts +++ b/src/main/feature.ts @@ -1,21 +1,13 @@ import fs from "fs"; import path from "path" import hb from "handlebars" +import { observable } from "mobx" import { ResourceApplier } from "./resource-applier" import { Cluster } from "./cluster"; import logger from "./logger"; -import { app, remote } from "electron" +import { app } from "electron" import { clusterIpc } from "../common/cluster-ipc" -export type FeatureStatusMap = Record -export type FeatureMap = Record - -export interface FeatureInstallRequest { - clusterId: string; - name: string; - config?: any; -} - export interface FeatureStatus { currentVersion: string; installed: boolean; @@ -24,9 +16,16 @@ export interface FeatureStatus { } export abstract class Feature { - public name: string; - public latestVersion: string; - public config: any; + name: string; + latestVersion: string; + config: any; + + @observable status: FeatureStatus = { + currentVersion: null, + installed: false, + latestVersion: null, + canUpgrade: false + } abstract async install(cluster: Cluster): Promise; @@ -34,7 +33,7 @@ export abstract class Feature { abstract async uninstall(cluster: Cluster): Promise; - abstract async featureStatus(cluster: Cluster): Promise; + abstract async updateStatus(cluster: Cluster): Promise; protected async applyResources(cluster: Cluster, resources: string[]) { if (app) { diff --git a/src/renderer/components/+cluster-settings/components/install-feature.tsx b/src/renderer/components/+cluster-settings/components/install-feature.tsx index 670933af3e..98201ea9b3 100644 --- a/src/renderer/components/+cluster-settings/components/install-feature.tsx +++ b/src/renderer/components/+cluster-settings/components/install-feature.tsx @@ -5,7 +5,8 @@ import { Cluster } from "../../../../main/cluster"; import { Button } from "../../button"; import { Notifications } from "../../notifications"; import { Spinner } from "../../spinner"; -import { Feature, FeatureStatus } from "../../../../main/feature"; +import { Feature } from "../../../../main/feature"; +import { interval } from "../../../utils"; interface Props { cluster: Cluster @@ -15,14 +16,21 @@ interface Props { @observer export class InstallFeature extends React.Component { @observable loading = false; - @observable status: FeatureStatus componentDidMount() { - this.props.feature.featureStatus(this.props.cluster).then((status) => { - this.status = status + const feature = this.props.feature + const cluster = this.props.cluster + const statusUpdate = interval(20, () => { + feature.updateStatus(cluster) }) + statusUpdate.start(true) + + disposeOnUnmount(this, () => { + statusUpdate.stop() + }) + disposeOnUnmount(this, - reaction(() => this.status, () => { + reaction(() => feature.status.installed, () => { this.loading = false; }, { equals: comparer.structural }) ); @@ -32,11 +40,9 @@ export class InstallFeature extends React.Component { const { cluster, feature } = this.props; const disabled = !cluster.isAdmin || this.loading; const loadingIcon = this.loading ? : null; - const features = this.status - if (!features) return null return (
- {features.canUpgrade && + {feature.status.canUpgrade && } - {features.installed && + {feature.status.installed && } - {!features.installed && !features.canUpgrade && + {!feature.status.installed && !feature.status.canUpgrade &&