diff --git a/src/common/catalog-entities/kubernetes-cluster.ts b/src/common/catalog-entities/kubernetes-cluster.ts index 3335d3803d..31e0251966 100644 --- a/src/common/catalog-entities/kubernetes-cluster.ts +++ b/src/common/catalog-entities/kubernetes-cluster.ts @@ -54,15 +54,24 @@ export interface KubernetesClusterSpec extends CatalogEntitySpec { 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 { - phase: KubernetesClusterStatusPhase; } export class KubernetesCluster extends CatalogEntity { @@ -110,15 +119,15 @@ export class KubernetesCluster extends CatalogEntity requestMain(clusterDisconnectHandler, this.metadata.uid) }); break; - case "disconnected": + case LensKubernetesClusterStatus.DISCONNECTED: context.menuItems.push({ title: "Connect", icon: "link", diff --git a/src/extensions/common-api/catalog.ts b/src/extensions/common-api/catalog.ts index 689310b69d..2d703b0dff 100644 --- a/src/extensions/common-api/catalog.ts +++ b/src/extensions/common-api/catalog.ts @@ -19,5 +19,22 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -export * from "../../common/catalog-entities"; +export { + KubernetesCluster, + kubernetesClusterCategory, + GeneralEntity, + WebLink, +} from "../../common/catalog-entities"; + +export type { + KubernetesClusterPrometheusMetrics, + KubernetesClusterSpec, + KubernetesClusterMetadata, + WebLinkSpec, + WebLinkStatus, + WebLinkStatusPhase, + KubernetesClusterStatusPhase, + KubernetesClusterStatus, +} from "../../common/catalog-entities"; + export * from "../../common/catalog/catalog-entity"; diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts index e72cbd59cc..8cd6664b6a 100644 --- a/src/main/cluster-manager.ts +++ b/src/main/cluster-manager.ts @@ -27,7 +27,7 @@ import logger from "./logger"; import { apiKubePrefix } from "../common/vars"; import { getClusterIdFromHost, Singleton } from "../common/utils"; import { catalogEntityRegistry } from "./catalog"; -import { KubernetesCluster, KubernetesClusterPrometheusMetrics, KubernetesClusterStatusPhase } from "../common/catalog-entities/kubernetes-cluster"; +import { KubernetesCluster, KubernetesClusterPrometheusMetrics, LensKubernetesClusterStatus } from "../common/catalog-entities/kubernetes-cluster"; import { ipcMainOn } from "../common/ipc"; import { once } from "lodash"; import { ClusterStore } from "../common/cluster-store"; @@ -35,6 +35,8 @@ import type { ClusterId } from "../common/cluster-types"; const logPrefix = "[CLUSTER-MANAGER]:"; +const lensSpecificClusterStatuses: Set = new Set(Object.values(LensKubernetesClusterStatus)); + export class ClusterManager extends Singleton { private store = ClusterStore.getInstance(); deleting = observable.set(); @@ -90,6 +92,8 @@ export class ClusterManager extends Singleton { @action protected updateCatalog(clusters: Cluster[]) { + logger.debug("[CLUSTER-MANAGER]: updating catalog from cluster store"); + for (const cluster of clusters) { this.updateEntityFromCluster(cluster); } @@ -144,27 +148,28 @@ export class ClusterManager extends Singleton { @action protected updateEntityStatus(entity: KubernetesCluster, cluster?: Cluster) { if (this.deleting.has(entity.getId())) { - entity.status.phase = "deleting"; + entity.status.phase = LensKubernetesClusterStatus.DELETING; entity.status.enabled = false; } else { - entity.status.phase = ((): KubernetesClusterStatusPhase => { + entity.status.phase = (() => { if (!cluster) { - return "disconnected"; + return LensKubernetesClusterStatus.DISCONNECTED; } if (cluster.accessible) { - return "connected"; + return LensKubernetesClusterStatus.CONNECTED; } if (!cluster.disconnected) { - return "connecting"; + return LensKubernetesClusterStatus.CONNECTING; } - if (entity?.status?.phase) { + // Extensions are not allowed to use the Lens specific status phases + if (!lensSpecificClusterStatuses.has(entity?.status?.phase)) { return entity.status.phase; } - return "disconnected"; + return LensKubernetesClusterStatus.DISCONNECTED; })(); entity.status.enabled = true; @@ -276,7 +281,9 @@ export function catalogEntityFromCluster(cluster: Cluster) { icon: {} }, status: { - phase: cluster.disconnected ? "disconnected" : "connected", + phase: cluster.disconnected + ? LensKubernetesClusterStatus.DISCONNECTED + : LensKubernetesClusterStatus.CONNECTED, reason: "", message: "", active: !cluster.disconnected diff --git a/src/main/cluster.ts b/src/main/cluster.ts index fd8142aa57..b84939a5d3 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -394,7 +394,6 @@ export class Cluster implements ClusterModel, ClusterState { * @internal */ @action disconnect() { - logger.info(`[CLUSTER]: disconnect`, this.getMeta()); this.unbindEvents(); this.contextHandler?.stopServer(); this.disconnected = true; @@ -405,6 +404,7 @@ export class Cluster implements ClusterModel, ClusterState { this.allowedNamespaces = []; this.resourceAccessStatuses.clear(); this.pushState(); + logger.info(`[CLUSTER]: disconnect`, this.getMeta()); } /** diff --git a/src/renderer/components/hotbar/hotbar-entity-icon.tsx b/src/renderer/components/hotbar/hotbar-entity-icon.tsx index fc6628f3eb..05ce960a23 100644 --- a/src/renderer/components/hotbar/hotbar-entity-icon.tsx +++ b/src/renderer/components/hotbar/hotbar-entity-icon.tsx @@ -31,6 +31,7 @@ import { cssNames, IClassName } from "../../utils"; import { Icon } from "../icon"; import { HotbarIcon } from "./hotbar-icon"; import { HotbarStore } from "../../../common/hotbar-store"; +import { LensKubernetesClusterStatus } from "../../../common/catalog-entities/kubernetes-cluster"; interface Props extends DOMAttributes { entity: CatalogEntity; @@ -78,7 +79,7 @@ export class HotbarEntityIcon extends React.Component { return null; } - const className = cssNames("led", { online: this.props.entity.status.phase == "connected"}); // TODO: make it more generic + const className = cssNames("led", { online: this.props.entity.status.phase === LensKubernetesClusterStatus.CONNECTED}); // TODO: make it more generic return
; }