mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Signed-off-by: Roman <ixrock@gmail.com> Co-authored-by: Sebastian Malton <sebastian@malton.name> Co-authored-by: Sebastian Malton <smalton@mirantis.com> Co-authored-by: Lauri Nevala <lauri.nevala@gmail.com> Co-authored-by: Alex Andreev <alex.andreev.email@gmail.com>
101 lines
2.8 KiB
TypeScript
101 lines
2.8 KiB
TypeScript
import { Feature, FeatureStatus } from "../main/feature"
|
||
import {KubeConfig, AppsV1Api, RbacAuthorizationV1Api} from "@kubernetes/client-node"
|
||
import semver from "semver"
|
||
import { Cluster } from "../main/cluster";
|
||
import * as k8s from "@kubernetes/client-node"
|
||
|
||
export interface MetricsConfiguration {
|
||
// Placeholder for Metrics config structure
|
||
persistence: {
|
||
enabled: boolean;
|
||
storageClass: string;
|
||
size: string;
|
||
};
|
||
nodeExporter: {
|
||
enabled: boolean;
|
||
};
|
||
kubeStateMetrics: {
|
||
enabled: boolean;
|
||
};
|
||
retention: {
|
||
time: string;
|
||
size: string;
|
||
};
|
||
alertManagers: string[];
|
||
replicas: number;
|
||
storageClass: string;
|
||
}
|
||
|
||
export class MetricsFeature extends Feature {
|
||
static id = 'metrics'
|
||
name = MetricsFeature.id;
|
||
latestVersion = "v2.17.2-lens1"
|
||
|
||
config: MetricsConfiguration = {
|
||
persistence: {
|
||
enabled: false,
|
||
storageClass: null,
|
||
size: "20G",
|
||
},
|
||
nodeExporter: {
|
||
enabled: true,
|
||
},
|
||
retention: {
|
||
time: "2d",
|
||
size: "5GB",
|
||
},
|
||
kubeStateMetrics: {
|
||
enabled: true,
|
||
},
|
||
alertManagers: null,
|
||
replicas: 1,
|
||
storageClass: null,
|
||
};
|
||
|
||
async install(cluster: Cluster): Promise<void> {
|
||
// Check if there are storageclasses
|
||
const storageClient = cluster.getProxyKubeconfig().makeApiClient(k8s.StorageV1Api)
|
||
const scs = await storageClient.listStorageClass();
|
||
|
||
this.config.persistence.enabled = scs.body.items.some(sc => (
|
||
sc.metadata?.annotations?.['storageclass.kubernetes.io/is-default-class'] === 'true' ||
|
||
sc.metadata?.annotations?.['storageclass.beta.kubernetes.io/is-default-class'] === 'true'
|
||
));
|
||
|
||
return super.install(cluster)
|
||
}
|
||
|
||
async upgrade(cluster: Cluster): Promise<void> {
|
||
return this.install(cluster)
|
||
}
|
||
|
||
async featureStatus(kc: KubeConfig): Promise<FeatureStatus> {
|
||
const client = kc.makeApiClient(AppsV1Api)
|
||
const status: FeatureStatus = {
|
||
currentVersion: null,
|
||
installed: false,
|
||
latestVersion: this.latestVersion,
|
||
canUpgrade: false, // Dunno yet
|
||
};
|
||
|
||
try {
|
||
const prometheus = (await client.readNamespacedStatefulSet('prometheus', 'lens-metrics')).body;
|
||
status.installed = true;
|
||
status.currentVersion = prometheus.spec.template.spec.containers[0].image.split(":")[1];
|
||
status.canUpgrade = semver.lt(status.currentVersion, this.latestVersion, true);
|
||
} catch {
|
||
// ignore error
|
||
}
|
||
|
||
return status;
|
||
}
|
||
|
||
async uninstall(cluster: Cluster): Promise<void> {
|
||
const rbacClient = cluster.getProxyKubeconfig().makeApiClient(RbacAuthorizationV1Api)
|
||
|
||
await this.deleteNamespace(cluster.getProxyKubeconfig(), "lens-metrics")
|
||
await rbacClient.deleteClusterRole("lens-prometheus");
|
||
await rbacClient.deleteClusterRoleBinding("lens-prometheus");
|
||
}
|
||
}
|