From 87f56735769405c9c6db44b032f50a6aa7fc9f4b Mon Sep 17 00:00:00 2001 From: Jari Kolehmainen Date: Thu, 1 Apr 2021 13:27:06 +0300 Subject: [PATCH] sync fixes Signed-off-by: Jari Kolehmainen --- src/main/catalog-pusher.ts | 1 + src/main/cluster-manager.ts | 43 +++++++++++++++++++ .../+landing-page/catalog-entity.store.ts | 6 ++- .../components/+landing-page/landing-page.tsx | 6 ++- 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/main/catalog-pusher.ts b/src/main/catalog-pusher.ts index 268566b81e..b0c94a399d 100644 --- a/src/main/catalog-pusher.ts +++ b/src/main/catalog-pusher.ts @@ -21,6 +21,7 @@ export class CatalogPusher { } broadcast() { + console.log("BROADCAST", toJS(this.catalog.items, { recurseEverything: true })); broadcastMessage("catalog:items", toJS(this.catalog.items, { recurseEverything: true })); } } diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts index c03b06f737..a1e9401e10 100644 --- a/src/main/cluster-manager.ts +++ b/src/main/cluster-manager.ts @@ -11,6 +11,8 @@ import { CatalogEntity } from "../common/catalog-entity"; import { KubernetesCluster } from "../common/catalog-entities/kubernetes-cluster"; import { catalogEntityRegistry } from "../common/catalog-entity-registry"; +const clusterOwnerRef = "ClusterManager"; + export class ClusterManager extends Singleton { @observable.deep catalogSource: CatalogEntity[] = []; @@ -33,6 +35,10 @@ export class ClusterManager extends Singleton { this.updateCatalogSource(clusterStore.enabledClustersList); }, { fireImmediately: true }); + reaction(() => catalogEntityRegistry.getItemsForApiKind("entity.k8slens.dev/v1alpha1", "KubernetesCluster"), (entities) => { + this.syncClustersFromCatalog(entities); + }); + // auto-stop removed clusters autorun(() => { @@ -69,12 +75,49 @@ export class ClusterManager extends Singleton { if (entityIndex === -1) { this.catalogSource.push(newEntity); } else { + const oldEntity = this.catalogSource[entityIndex]; + + newEntity.status.phase = cluster.disconnected ? "disconnected" : "connected"; newEntity.status.active = !cluster.disconnected; + newEntity.metadata.labels = { + ...newEntity.metadata.labels, + ...oldEntity.metadata.labels + }; this.catalogSource.splice(entityIndex, 1, newEntity); } }); } + @action syncClustersFromCatalog(entities: KubernetesCluster[]) { + entities.filter((entity) => entity.metadata.source !== "local").forEach((entity: KubernetesCluster) => { + const cluster = clusterStore.getById(entity.metadata.uid); + + if (!cluster) { + clusterStore.addCluster({ + id: entity.metadata.uid, + enabled: true, + ownerRef: clusterOwnerRef, + preferences: { + clusterName: entity.metadata.name + }, + kubeConfigPath: entity.spec.kubeconfigPath, + contextName: entity.spec.kubeconfigContext + }); + } else { + cluster.enabled = true; + if (!cluster.ownerRef) cluster.ownerRef = clusterOwnerRef; + cluster.preferences.clusterName = entity.metadata.name; + cluster.kubeConfigPath = entity.spec.kubeconfigPath; + cluster.contextName = entity.spec.kubeconfigContext; + + entity.status = { + phase: cluster.disconnected ? "disconnected" : "connected", + active: !cluster.disconnected + }; + } + }); + } + protected catalogEntityFromCluster(cluster: Cluster) { return new KubernetesCluster(toJS({ apiVersion: "entity.k8slens.dev/v1alpha1", diff --git a/src/renderer/components/+landing-page/catalog-entity.store.ts b/src/renderer/components/+landing-page/catalog-entity.store.ts index 83cfdf915b..f99b4b768c 100644 --- a/src/renderer/components/+landing-page/catalog-entity.store.ts +++ b/src/renderer/components/+landing-page/catalog-entity.store.ts @@ -22,7 +22,7 @@ export class CatalogEntityItem implements ItemObject { return this.id; } - get phase() { + @computed get phase() { return this.entity.status.phase; } @@ -38,6 +38,10 @@ export class CatalogEntityItem implements ItemObject { return labels; } + get source() { + return this.entity.metadata.source || "unknown"; + } + onRun(ctx: any) { this.entity.onRun(ctx); } diff --git a/src/renderer/components/+landing-page/landing-page.tsx b/src/renderer/components/+landing-page/landing-page.tsx index e459f3de48..51e110a59f 100644 --- a/src/renderer/components/+landing-page/landing-page.tsx +++ b/src/renderer/components/+landing-page/landing-page.tsx @@ -2,7 +2,7 @@ import "./landing-page.scss"; import React from "react"; import { observer } from "mobx-react"; import { ItemListLayout } from "../item-object-list"; -import { IReactionDisposer, observable, reaction, toJS } from "mobx"; +import { IReactionDisposer, observable } from "mobx"; import { CatalogEntityItem, CatalogEntityStore } from "./catalog-entity.store"; import { navigate } from "../../navigation"; import { kebabCase } from "lodash"; @@ -17,6 +17,7 @@ import { autobind } from "../../utils"; enum sortBy { name = "name", + source = "source", status = "status" } @@ -100,15 +101,18 @@ export class LandingPage extends React.Component { store={this.catalogEntityStore} sortingCallbacks={{ [sortBy.name]: (item: CatalogEntityItem) => item.name, + [sortBy.source]: (item: CatalogEntityItem) => item.source, [sortBy.status]: (item: CatalogEntityItem) => item.phase, }} renderTableHeader={[ { title: "Name", className: "name", sortBy: sortBy.name }, + { title: "Source", className: "source" }, { title: "Labels", className: "labels" }, { title: "Status", className: "status", sortBy: sortBy.status }, ]} renderTableContents={(item: CatalogEntityItem) => [ item.name, + item.source, item.labels.map((label) => ), { title: item.phase, className: kebabCase(item.phase) } ]}