This repository was archived by the owner on Jul 10, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmicrok8s-cloud-provider.ts
More file actions
109 lines (95 loc) · 3.91 KB
/
microk8s-cloud-provider.ts
File metadata and controls
109 lines (95 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import * as vscode from 'vscode';
import * as k8s from 'vscode-kubernetes-tools-api';
import * as microk8s from './microk8s/microk8s';
class Microk8sCloudProvider implements k8s.CloudExplorerV1.CloudProvider {
readonly cloudName = "MicroK8s";
readonly treeDataProvider = new Microk8sTreeDataProvider();
async getKubeconfigYaml(cluster: any): Promise<string | undefined> {
const treeNode = cluster as Microk8sCloudProviderTreeNode;
if (treeNode.nodeType === 'cluster') {
return getMicroK8sKubeconfigYaml();
}
return undefined;
}
}
export interface Microk8sClusterNode {
readonly nodeType: 'cluster';
}
export interface Microk8sErrorNode {
readonly nodeType: 'error';
readonly diagnostic: string;
}
// TODO: the actual type
export type Microk8sCloudProviderTreeNode = Microk8sClusterNode | Microk8sErrorNode;
class Microk8sTreeDataProvider implements vscode.TreeDataProvider<Microk8sCloudProviderTreeNode> {
private readonly onDidChangeTreeDataEmitter: vscode.EventEmitter<Microk8sCloudProviderTreeNode | undefined> = new vscode.EventEmitter<Microk8sCloudProviderTreeNode | undefined>();
readonly onDidChangeTreeData: vscode.Event<Microk8sCloudProviderTreeNode | undefined> = this.onDidChangeTreeDataEmitter.event;
getTreeItem(element: Microk8sCloudProviderTreeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
if (element.nodeType === 'error') {
const treeItem = new vscode.TreeItem("Error", vscode.TreeItemCollapsibleState.None);
treeItem.tooltip = element.diagnostic;
return treeItem;
} else {
const treeItem = new vscode.TreeItem("Kubeconfig", vscode.TreeItemCollapsibleState.None);
treeItem.contextValue = `microk8s.cluster ${k8s.CloudExplorerV1.SHOW_KUBECONFIG_COMMANDS_CONTEXT}`;
return treeItem;
}
}
getChildren(element?: Microk8sCloudProviderTreeNode | undefined): vscode.ProviderResult<Microk8sCloudProviderTreeNode[]> {
if (element) {
return [];
}
return [{ nodeType: 'cluster' }];
}
}
function getMicroK8sKubeconfigYaml(): string | undefined {
try {
const originalKubeconfig = microk8s.getKubeconfigYaml();
const distinctKubeconfig = renameDistinctUser(originalKubeconfig);
return distinctKubeconfig;
} catch (ex) {
vscode.window.showErrorMessage("Can't get kubeconfig for Microk8s. "+ ex.message);
return undefined;
}
}
function renameDistinctUser(kubeconfig: string): string {
// kubeconfig is YAML of the following form. The 'admin' user name
// risks clashing with other admin users or other Microk8s instances.
// So we rename the user to something with a lower risk of clashing
//
// apiVersion: v1
// clusters:
// - ...
// contexts:
// - context:
// cluster: microk8s-cluster
// user: admin # mentions non-distinct name
// name: microk8s
// current-context: microk8s
// kind: Config
// preferences: {}
// users:
// - name: admin # mentions non-distinct name
// user:
// password: ...
// username: ...
const distinctName = 'microk8s-admin-' + randomDigitSequence(3);
return kubeconfig.replace('user: admin', `user: ${distinctName}`)
.replace('name: admin', `name: ${distinctName}`);
}
function randomDigitSequence(length: number): string {
if (length <= 0 || length >= 7) {
throw new Error("randomDigitSequence length out of range");
}
const r = Math.random(); // between 0 and 1
const rstr = r.toString();
const digits = rstr.substr(2, length);
return digits;
}
export const MICROK8S_CLOUD_PROVIDER = new Microk8sCloudProvider();
export async function refresh(): Promise<void> {
const cloudExplorer = await k8s.extension.cloudExplorer.v1;
if (cloudExplorer.available) {
cloudExplorer.api.refresh();
}
}