From 584d45c5e0477f0d9b823cd381a83e6b14eac3e3 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Wed, 1 Sep 2021 12:50:11 +0300 Subject: [PATCH] Allow to configure default namespace used in terminal (#3706) * Allow to configure default namespace used in terminal Signed-off-by: Lauri Nevala * Fix lint issues Signed-off-by: Lauri Nevala --- src/common/cluster-types.ts | 1 + src/main/cluster.ts | 27 ++++++++ src/main/kubeconfig-manager.ts | 11 +++- .../components/cluster-home-dir-setting.tsx | 63 ++++++++++++++----- 4 files changed, 86 insertions(+), 16 deletions(-) diff --git a/src/common/cluster-types.ts b/src/common/cluster-types.ts index 705110b895..cdd498a419 100644 --- a/src/common/cluster-types.ts +++ b/src/common/cluster-types.ts @@ -95,6 +95,7 @@ export interface ClusterPreferences extends ClusterPrometheusPreferences { hiddenMetrics?: string[]; nodeShellImage?: string; imagePullSecret?: string; + defaultNamespace?: string; } /** diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 0dbf32e440..c3673e8a91 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -216,6 +216,18 @@ export class Cluster implements ClusterModel, ClusterState { return toJS({ prometheus, prometheusProvider }); } + /** + * defaultNamespace preference + * + * @computed + * @internal + */ + @computed get defaultNamespace(): string { + const { defaultNamespace } = this.preferences; + + return defaultNamespace; + } + constructor(model: ClusterModel) { makeObservable(this); this.id = model.id; @@ -298,10 +310,25 @@ export class Cluster implements ClusterModel, ClusterState { clearInterval(refreshTimer); clearInterval(refreshMetadataTimer); }, + reaction(() => this.defaultNamespace, () => this.recreateProxyKubeconfig()), ); } } + /** + * @internal + */ + async recreateProxyKubeconfig() { + logger.info("Recreate proxy kubeconfig"); + + try { + this.kubeconfigManager.clear(); + } catch { + // do nothing + } + this.getProxyKubeconfig(); + } + /** * internal */ diff --git a/src/main/kubeconfig-manager.ts b/src/main/kubeconfig-manager.ts index ab53118f60..c9b101d59f 100644 --- a/src/main/kubeconfig-manager.ts +++ b/src/main/kubeconfig-manager.ts @@ -56,6 +56,15 @@ export class KubeconfigManager { return this.tempFile; } + async clear() { + if (!this.tempFile) { + return; + } + + logger.info(`Deleting temporary kubeconfig: ${this.tempFile}`); + await fs.unlink(this.tempFile); + } + async unlink() { if (!this.tempFile) { return; @@ -106,7 +115,7 @@ export class KubeconfigManager { user: "proxy", name: contextName, cluster: contextName, - namespace: kubeConfig.getContextObject(contextName).namespace, + namespace: cluster.defaultNamespace || kubeConfig.getContextObject(contextName).namespace, } ] }; diff --git a/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx b/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx index 55abaf5dc6..550c5d9568 100644 --- a/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx +++ b/src/renderer/components/cluster-settings/components/cluster-home-dir-setting.tsx @@ -33,43 +33,76 @@ interface Props { @observer export class ClusterHomeDirSetting extends React.Component { @observable directory = ""; + @observable defaultNamespace = ""; constructor(props: Props) { super(props); makeObservable(this); } - componentDidMount() { + async componentDidMount() { + const kubeconfig = await this.props.cluster.getKubeconfig(); + + const defaultNamespace = this.props.cluster.preferences?.defaultNamespace || kubeconfig.getContextObject(this.props.cluster.contextName).namespace; + disposeOnUnmount(this, autorun(() => { this.directory = this.props.cluster.preferences.terminalCWD || ""; + this.defaultNamespace = defaultNamespace || ""; }) ); } - save = () => { + saveCWD = () => { this.props.cluster.preferences.terminalCWD = this.directory; }; - onChange = (value: string) => { + onChangeTerminalCWD = (value: string) => { this.directory = value; }; + saveDefaultNamespace = () => { + if (this.defaultNamespace) { + this.props.cluster.preferences.defaultNamespace = this.defaultNamespace; + } else { + this.props.cluster.preferences.defaultNamespace = undefined; + } + }; + + onChangeDefaultNamespace = (value: string) => { + this.defaultNamespace = value; + }; + render() { return ( <> - - - - An explicit start path where the terminal will be launched,{" "} - this is used as the current working directory (cwd) for the shell process. - +
+ + + + An explicit start path where the terminal will be launched,{" "} + this is used as the current working directory (cwd) for the shell process. + +
+
+ + + + Default namespace used for kubectl. + +
); }