fix: detect new contexts on startup and show in add-cluster page

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman committed 2020-07-25 14:09:52 +03:00
1 parent 0489ee25b5
commit dd9b2efdc7
6 files changed
+83 -39

No files matched your search

+2
View File
@@ -103,6 +103,7 @@ export class ClusterStore extends BaseStore<ClusterStoreModel> {
@action
async addCluster(model: ClusterModel, activate = true): Promise<Cluster> {
tracker.event("cluster", "add");
const cluster = new Cluster(model);
this.clusters.set(model.id, cluster);
if (activate) this.activeClusterId = model.id;
@@ -111,6 +112,7 @@ export class ClusterStore extends BaseStore<ClusterStoreModel> {
@action
async removeById(clusterId: ClusterId) {
tracker.event("cluster", "remove");
const cluster = this.getById(clusterId);
if (cluster) {
this.clusters.delete(clusterId);
+11 -1
View File
@@ -1,6 +1,6 @@
import { app, remote } from "electron";
import { KubeConfig, V1Node, V1Pod } from "@kubernetes/client-node"
import { ensureDirSync, writeFileSync } from "fs-extra";
import { ensureDirSync, readFile, writeFileSync } from "fs-extra";
import path from "path"
import os from "os"
import yaml from "js-yaml"
@@ -150,3 +150,13 @@ export function saveConfigToAppFiles(clusterId: string, kubeConfig: KubeConfig |
writeFileSync(kubeConfigFile, kubeConfigContents);
return kubeConfigFile;
}
export async function getKubeConfigLocal(): Promise<string> {
try {
const configFile = path.join(process.env.HOME, '.kube', 'config');
return readFile(configFile, "utf8");
} catch (err) {
logger.debug(`Cannot read local kube-config: ${err}`)
return "";
}
}
+33 -10
View File
@@ -4,10 +4,9 @@ import { action, observable, reaction, toJS } from "mobx";
import { BaseStore } from "./base-store";
import migrations from "../migrations/user-store"
import { getAppVersion } from "./utils/app-version";
import { getKubeConfigLocal, loadConfig } from "./kube-helpers";
import { tracker } from "./tracker";
// fixme: detect new contexts from .kube/config since last open
export interface UserStoreModel {
lastSeenAppVersion: string;
seenContexts: string[];
@@ -27,7 +26,7 @@ export class UserStore extends BaseStore<UserStoreModel> {
private constructor() {
super({
// configName: "lens-user-store", // todo: migrate from default filename
// configName: "lens-user-store", // todo: migrate from default "config.json"
migrations: migrations,
});
@@ -35,18 +34,21 @@ export class UserStore extends BaseStore<UserStoreModel> {
reaction(() => this.preferences.allowTelemetry, allowed => {
tracker.event("telemetry", allowed ? "enabled" : "disabled");
});
// refresh new contexts
this.whenLoaded.then(this.refreshNewContexts);
reaction(() => this.seenContexts.size, this.refreshNewContexts);
}
@observable lastSeenAppVersion = "0.0.0"
@observable seenContexts: string[] = [];
@observable newContexts: string[] = [];
@observable seenContexts = observable.set<string>();
@observable newContexts = observable.set<string>();
@observable preferences: UserPreferences = {
allowTelemetry: true,
allowUntrustedCAs: false,
colorTheme: UserStore.defaultTheme,
downloadMirror: "default",
httpsProxy: "",
};
get isNewVersion() {
@@ -64,22 +66,43 @@ export class UserStore extends BaseStore<UserStoreModel> {
this.lastSeenAppVersion = getAppVersion();
}
protected refreshNewContexts = async () => {
const kubeConfig = await getKubeConfigLocal();
if (kubeConfig) {
this.newContexts.clear();
const localContexts = loadConfig(kubeConfig).getContexts();
localContexts.forEach(({ name }) => {
if (!this.seenContexts.has(name)) {
this.newContexts.add(name);
}
})
}
}
@action
markNewContextsAsSeen() {
const { seenContexts, newContexts } = this;
this.seenContexts.replace([...seenContexts, ...newContexts]);
this.newContexts.clear();
}
@action
protected fromStore(data: Partial<UserStoreModel> = {}) {
const { lastSeenAppVersion, seenContexts = [], preferences } = data
if (lastSeenAppVersion) {
this.lastSeenAppVersion = lastSeenAppVersion;
}
this.seenContexts = seenContexts;
this.seenContexts.replace(seenContexts);
Object.assign(this.preferences, preferences);
}
toJSON() {
return toJS({
toJSON(): UserStoreModel {
const model: UserStoreModel = {
lastSeenAppVersion: this.lastSeenAppVersion,
seenContexts: Array.from(this.seenContexts),
preferences: this.preferences,
}, {
}
return toJS(model, {
recurseEverything: true,
})
}