Improve how extensions can manage cluster/workspace stores (#1176)

Signed-off-by: Jari Kolehmainen <jari.kolehmainen@gmail.com>
This commit is contained in:
Jari Kolehmainen authored and GitHub committed 2020-10-30 09:45:09 +02:00
1 parent e4c56512e7
commit 4a6553967d
15 files changed
+256 -95

No files matched your search

+1 -1
View File
@@ -10,7 +10,7 @@ export class ClusterManager {
constructor(public readonly port: number) {
// auto-init clusters
autorun(() => {
clusterStore.clusters.forEach(cluster => {
clusterStore.enabledClustersList.forEach(cluster => {
if (!cluster.initialized) {
logger.info(`[CLUSTER-MANAGER]: init cluster`, cluster.getMeta());
cluster.init(port);
+29 -15
View File
@@ -1,3 +1,4 @@
import { ipcMain } from "electron"
import type { ClusterId, ClusterMetadata, ClusterModel, ClusterPreferences } from "../common/cluster-store"
import type { IMetricsReqParams } from "../renderer/api/endpoints/metrics.api";
import type { WorkspaceId } from "../common/workspace-store";
@@ -33,7 +34,7 @@ export type ClusterRefreshOptions = {
refreshMetadata?: boolean
}
export interface ClusterState extends ClusterModel {
export interface ClusterState {
initialized: boolean;
apiUrl: string;
online: boolean;
@@ -47,11 +48,12 @@ export interface ClusterState extends ClusterModel {
allowedResources: string[]
}
export class Cluster implements ClusterModel {
export class Cluster implements ClusterModel, ClusterState {
public id: ClusterId;
public frameId: number;
public kubeCtl: Kubectl
public contextHandler: ContextHandler;
public ownerRef: string;
protected kubeconfigManager: KubeconfigManager;
protected eventDisposers: Function[] = [];
protected activated = false;
@@ -65,6 +67,7 @@ export class Cluster implements ClusterModel {
@observable kubeConfigPath: string;
@observable apiUrl: string; // cluster server url
@observable kubeProxyUrl: string; // lens-proxy to kube-api url
@observable enabled = false;
@observable online = false;
@observable accessible = false;
@observable ready = false;
@@ -81,6 +84,7 @@ export class Cluster implements ClusterModel {
@computed get available() {
return this.accessible && !this.disconnected;
}
get version(): string {
return String(this.metadata?.version) || ""
}
@@ -93,6 +97,10 @@ export class Cluster implements ClusterModel {
}
}
get isManaged(): boolean {
return !!this.ownerRef
}
@action
updateModel(model: ClusterModel) {
Object.assign(this, model);
@@ -123,13 +131,15 @@ export class Cluster implements ClusterModel {
const refreshTimer = setInterval(() => !this.disconnected && this.refresh(), 30000); // every 30s
const refreshMetadataTimer = setInterval(() => !this.disconnected && this.refreshMetadata(), 900000); // every 15 minutes
this.eventDisposers.push(
reaction(this.getState, this.pushState),
() => {
clearInterval(refreshTimer);
clearInterval(refreshMetadataTimer);
},
);
if (ipcMain) {
this.eventDisposers.push(
reaction(() => this.getState(), () => this.pushState()),
() => {
clearInterval(refreshTimer);
clearInterval(refreshMetadataTimer);
},
);
}
}
protected unbindEvents() {
@@ -361,6 +371,7 @@ export class Cluster implements ClusterModel {
workspace: this.workspace,
preferences: this.preferences,
metadata: this.metadata,
ownerRef: this.ownerRef
};
return toJS(model, {
recurseEverything: true
@@ -368,9 +379,8 @@ export class Cluster implements ClusterModel {
}
// serializable cluster-state used for sync btw main <-> renderer
getState = (): ClusterState => {
getState(): ClusterState {
const state: ClusterState = {
...this.toJSON(),
initialized: this.initialized,
apiUrl: this.apiUrl,
online: this.online,
@@ -388,14 +398,18 @@ export class Cluster implements ClusterModel {
})
}
pushState = (state = this.getState()): ClusterState => {
@action
setState(state: ClusterState) {
Object.assign(this, state)
}
pushState(state = this.getState()) {
logger.silly(`[CLUSTER]: push-state`, state);
broadcastIpc({
channel: "cluster:state",
frameId: this.frameId,
args: [state],
});
return state;
args: [this.id, state],
})
}
// get cluster system meta, e.g. use in "logger"
+1 -1
View File
@@ -80,7 +80,7 @@ export function createTrayMenu(windowManager: WindowManager): Menu {
},
{
label: "Clusters",
submenu: workspaceStore.workspacesList
submenu: workspaceStore.enabledWorkspacesList
.filter(workspace => clusterStore.getByWorkspaceId(workspace.id).length > 0) // hide empty workspaces
.map(workspace => {
const clusters = clusterStore.getByWorkspaceId(workspace.id);