mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
- All KubeApi and KubeObjectStore's - All of Catalog - ApiManager - KubeObjectDetailRegistry - All BaseStore's and their migrations - LensProxy and Router - WindowManager - App Menu - Tray Icon - ThemeStore Signed-off-by: Sebastian Malton <sebastian@malton.name>
139 lines
4.2 KiB
TypeScript
139 lines
4.2 KiB
TypeScript
/**
|
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
*/
|
|
|
|
import { CatalogEntity, CatalogEntityActionContext, CatalogEntityContextMenuContext, CatalogEntityMetadata, CatalogEntityStatus, CatalogCategory, CatalogCategorySpec } from "../catalog";
|
|
import { clusterActivateHandler, clusterDisconnectHandler } from "../cluster-ipc";
|
|
import { broadcastMessage, requestMain } from "../ipc";
|
|
import { app, ipcMain } from "electron";
|
|
import type { CatalogEntitySpec } from "../catalog/catalog-entity";
|
|
import { IpcRendererNavigationEvents } from "../../renderer/navigation/events";
|
|
|
|
export interface KubernetesClusterPrometheusMetrics {
|
|
address?: {
|
|
namespace: string;
|
|
service: string;
|
|
port: number;
|
|
prefix: string;
|
|
};
|
|
type?: string;
|
|
}
|
|
|
|
export interface KubernetesClusterSpec extends CatalogEntitySpec {
|
|
kubeconfigPath: string;
|
|
kubeconfigContext: string;
|
|
metrics?: {
|
|
source: string;
|
|
prometheus?: KubernetesClusterPrometheusMetrics;
|
|
};
|
|
icon?: {
|
|
// TODO: move to CatalogEntitySpec once any-entity icons are supported
|
|
src?: string;
|
|
material?: string;
|
|
background?: string;
|
|
};
|
|
accessibleNamespaces?: string[];
|
|
}
|
|
|
|
export enum LensKubernetesClusterStatus {
|
|
DELETING = "deleting",
|
|
CONNECTING = "connecting",
|
|
CONNECTED = "connected",
|
|
DISCONNECTED = "disconnected",
|
|
}
|
|
|
|
export interface KubernetesClusterMetadata extends CatalogEntityMetadata {
|
|
distro?: string;
|
|
kubeVersion?: string;
|
|
}
|
|
|
|
/**
|
|
* @deprecated This is no longer used as it is incorrect. Other sources can add more values
|
|
*/
|
|
export type KubernetesClusterStatusPhase = "connected" | "connecting" | "disconnected" | "deleting";
|
|
|
|
export interface KubernetesClusterStatus extends CatalogEntityStatus {
|
|
}
|
|
|
|
export class KubernetesCluster extends CatalogEntity<KubernetesClusterMetadata, KubernetesClusterStatus, KubernetesClusterSpec> {
|
|
public static readonly apiVersion: string = "entity.k8slens.dev/v1alpha1";
|
|
public static readonly kind: string = "KubernetesCluster";
|
|
|
|
public readonly apiVersion = KubernetesCluster.apiVersion;
|
|
public readonly kind = KubernetesCluster.kind;
|
|
|
|
async connect(): Promise<void> {
|
|
if (app) {
|
|
// TODO refactor
|
|
ipcMain.emit(clusterActivateHandler, this.metadata.uid, false);
|
|
} else {
|
|
await requestMain(clusterActivateHandler, this.metadata.uid, false);
|
|
}
|
|
}
|
|
|
|
async disconnect(): Promise<void> {
|
|
if (app) {
|
|
ipcMain.emit(clusterDisconnectHandler, this.metadata.uid, false);
|
|
} else {
|
|
await requestMain(clusterDisconnectHandler, this.metadata.uid, false);
|
|
}
|
|
}
|
|
|
|
onRun(context: CatalogEntityActionContext) {
|
|
context.navigate(`/cluster/${this.metadata.uid}`);
|
|
}
|
|
|
|
onContextMenuOpen(context: CatalogEntityContextMenuContext) {
|
|
if (!this.metadata.source || this.metadata.source === "local") {
|
|
context.menuItems.push({
|
|
title: "Settings",
|
|
icon: "settings",
|
|
onClick: () => broadcastMessage(
|
|
IpcRendererNavigationEvents.NAVIGATE_IN_APP,
|
|
`/entity/${this.metadata.uid}/settings`,
|
|
),
|
|
});
|
|
}
|
|
|
|
switch (this.status.phase) {
|
|
case LensKubernetesClusterStatus.CONNECTED:
|
|
case LensKubernetesClusterStatus.CONNECTING:
|
|
context.menuItems.push({
|
|
title: "Disconnect",
|
|
icon: "link_off",
|
|
onClick: () => requestMain(clusterDisconnectHandler, this.metadata.uid),
|
|
});
|
|
break;
|
|
case LensKubernetesClusterStatus.DISCONNECTED:
|
|
context.menuItems.push({
|
|
title: "Connect",
|
|
icon: "link",
|
|
onClick: () => context.navigate(`/cluster/${this.metadata.uid}`),
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
export class KubernetesClusterCategory extends CatalogCategory {
|
|
public readonly apiVersion = "catalog.k8slens.dev/v1alpha1";
|
|
public readonly kind = "CatalogCategory";
|
|
public metadata = {
|
|
name: "Clusters",
|
|
icon: require(`!!raw-loader!./icons/kubernetes.svg`).default, // eslint-disable-line
|
|
};
|
|
public spec: CatalogCategorySpec = {
|
|
group: "entity.k8slens.dev",
|
|
versions: [
|
|
{
|
|
name: "v1alpha1",
|
|
entityClass: KubernetesCluster,
|
|
},
|
|
],
|
|
names: {
|
|
kind: "KubernetesCluster",
|
|
},
|
|
};
|
|
}
|