@highstate/k3s 0.9.14 → 0.9.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,13 @@
1
+ import { parseL3Endpoint, l3EndpointToString, l3ToL4Endpoint, l4EndpointToString, Command, filterEndpoints } from '@highstate/common';
2
+ import { k3s } from '@highstate/library';
3
+ import { forUnit, toPromise, output, interpolate, secret, fileFromString } from '@highstate/pulumi';
4
+ import { KubeConfig } from '@kubernetes/client-node';
5
+ import { Provider, core } from '@pulumi/kubernetes';
6
+ import '@highstate/k8s';
7
+ import '@highstate/contract';
8
+ import { uniqueBy, isIncludedIn } from 'remeda';
9
+
1
10
  // src/cluster/index.ts
2
- import {
3
- Command,
4
- filterEndpoints,
5
- l3EndpointToString,
6
- l3ToL4Endpoint,
7
- l4EndpointToString,
8
- parseL3Endpoint
9
- } from "@highstate/common";
10
- import { k3s } from "@highstate/library";
11
- import {
12
- fileFromString,
13
- forUnit,
14
- interpolate,
15
- output,
16
- secret,
17
- toPromise
18
- } from "@highstate/pulumi";
19
- import { KubeConfig } from "@kubernetes/client-node";
20
- import { core, Provider } from "@pulumi/kubernetes";
21
- import { createK8sTerminal } from "@highstate/k8s";
22
- import { text } from "@highstate/contract";
23
- import { uniqueBy, isIncludedIn } from "remeda";
24
11
  var { name, args, inputs, outputs } = forUnit(k3s.cluster);
25
12
  var { masters, workers } = await toPromise(inputs);
26
13
  var seed = masters[0];
@@ -102,7 +89,7 @@ function createNode(server, type, env, dependsOn) {
102
89
  dependsOn: [
103
90
  configFileCommand.command,
104
91
  registryConfigFileCommand.command,
105
- ...dependsOn ? [dependsOn] : []
92
+ ...[]
106
93
  ]
107
94
  }
108
95
  );
@@ -124,7 +111,7 @@ var kubeConfig = new KubeConfig();
124
111
  kubeConfig.loadFromString(kubeconfig);
125
112
  var provider = new Provider(name, { kubeconfig: secret(kubeconfig) });
126
113
  var kubeSystem = core.v1.Namespace.get("kube-system", "kube-system", { provider });
127
- var kubeconfigFile = fileFromString("config", kubeconfig, "text/yaml", true);
114
+ fileFromString("config", kubeconfig, "text/yaml", true);
128
115
  var cluster_default = outputs({
129
116
  k8sCluster: {
130
117
  id: kubeSystem.metadata.uid,
@@ -134,49 +121,47 @@ var cluster_default = outputs({
134
121
  endpoints,
135
122
  apiEndpoints,
136
123
  quirks: {
137
- externalServiceType: "LoadBalancer"
124
+ externalServiceType: args.disabledComponents.includes("servicelb") ? "NodePort" : "LoadBalancer"
138
125
  },
139
126
  kubeconfig: secret(kubeconfig)
140
127
  },
141
128
  endpoints,
142
129
  apiEndpoints,
143
- $terminals: [createK8sTerminal(kubeconfig)],
144
- $status: {
130
+ // $terminals: [createK8sTerminal(kubeconfig)],
131
+ $statusFields: {
145
132
  endpoints: endpoints.map(l3EndpointToString),
146
133
  apiEndpoints: apiEndpoints.map(l4EndpointToString)
147
- },
148
- $pages: {
149
- index: {
150
- title: "K3s Cluster",
151
- content: [
152
- {
153
- type: "markdown",
154
- content: text`
155
- The cluster is up and running.
156
-
157
- You can access the cluster via the terminal or by using the kubeconfig file.
158
- `
159
- },
160
- {
161
- type: "file",
162
- fileMeta: kubeconfigFile.meta
163
- },
164
- {
165
- type: "markdown",
166
- content: secret(text`
167
- You can also copy the following content of the kubeconfig file and use it to access the cluster:
168
-
169
- \`\`\`yaml
170
- ${kubeconfig}
171
- \`\`\`
172
- `)
173
- }
174
- ]
175
- }
176
- },
177
- $files: [kubeconfigFile]
134
+ }
135
+ // $pages: {
136
+ // index: {
137
+ // title: "K3s Cluster",
138
+ // content: [
139
+ // {
140
+ // type: "markdown",
141
+ // content: text`
142
+ // The cluster is up and running.
143
+ // You can access the cluster via the terminal or by using the kubeconfig file.
144
+ // `,
145
+ // },
146
+ // {
147
+ // type: "file",
148
+ // meta: kubeconfigFile.meta,
149
+ // },
150
+ // {
151
+ // type: "markdown",
152
+ // content: secret(text`
153
+ // You can also copy the following content of the kubeconfig file and use it to access the cluster:
154
+ // \`\`\`yaml
155
+ // ${kubeconfig}
156
+ // \`\`\`
157
+ // `),
158
+ // },
159
+ // ],
160
+ // },
161
+ // },
162
+ // $files: [kubeconfigFile],
178
163
  });
179
- export {
180
- cluster_default as default
181
- };
164
+
165
+ export { cluster_default as default };
166
+ //# sourceMappingURL=index.js.map
182
167
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cluster/index.ts"],"sourcesContent":["import {\n Command,\n filterEndpoints,\n l3EndpointToString,\n l3ToL4Endpoint,\n l4EndpointToString,\n parseL3Endpoint,\n} from \"@highstate/common\"\nimport { common, k3s } from \"@highstate/library\"\nimport {\n fileFromString,\n forUnit,\n interpolate,\n output,\n Resource,\n secret,\n toPromise,\n type InputMap,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { text } from \"@highstate/contract\"\nimport { uniqueBy, isIncludedIn } from \"remeda\"\n\nconst { name, args, inputs, outputs } = forUnit(k3s.cluster)\n\nconst { masters, workers } = await toPromise(inputs)\n\nconst seed = masters[0]\n\nconst endpoints = uniqueBy(\n [...workers, ...masters].flatMap(server =>\n server.endpoints.map(endpoint => parseL3Endpoint(endpoint)),\n ),\n l3EndpointToString,\n)\n\nconst apiEndpoints = uniqueBy(\n masters.flatMap(server => server.endpoints.map(endpoint => l3ToL4Endpoint(endpoint, 6443))),\n l4EndpointToString,\n)\n\nconst config: Record<string, unknown> = {\n ...args.config,\n \"tls-san\": apiEndpoints.map(l4EndpointToString),\n disable: args.disabledComponents.filter(isIncludedIn(k3s.packagedComponents)),\n}\n\nfor (const disabledComponent of args.disabledComponents) {\n if (isIncludedIn(disabledComponent, k3s.internalComponents)) {\n config[`disable-${disabledComponent}`] = true\n }\n}\n\nif (args.cni === \"none\") {\n config[\"flannel-backend\"] = \"none\"\n}\n\nconst configContent = JSON.stringify(config, null, 2)\n\nconst seedInstallCommand = createNode(seed, \"server\", { K3S_CLUSTER_INIT: \"true\" })\n\nconst tokenCommand = Command.receiveTextFile(\n \"token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/node-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst agentTokenCommand = Command.receiveTextFile(\n \"agent-token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/agent-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nfor (const master of masters.slice(1)) {\n createNode(master, \"server\", {\n K3S_TOKEN: tokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfor (const worker of workers) {\n createNode(worker, \"agent\", {\n K3S_TOKEN: agentTokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfunction createNode(\n server: common.Server,\n type: \"server\" | \"agent\",\n env: InputMap<string>,\n dependsOn?: Resource,\n) {\n const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/config.yaml\",\n content: configContent,\n })\n\n const registryConfigFileCommand = Command.createTextFile(`registry-config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/registries.yaml\",\n content: JSON.stringify(args.registries ?? {}, null, 2),\n })\n\n const envString = output(env).apply(env => {\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n })\n\n return new Command(\n `install-${server.hostname}`,\n {\n host: server,\n create: interpolate`curl -sfL https://raw.githubusercontent.com/k3s-io/k3s/refs/heads/master/install.sh | ${envString} sh -s - ${type}`,\n delete: \"/usr/local/bin/k3s-uninstall.sh\",\n },\n {\n dependsOn: [\n configFileCommand.command,\n registryConfigFileCommand.command,\n ...(dependsOn ? [dependsOn] : []),\n ],\n },\n )\n}\n\nconst kubeconfigResult = Command.receiveTextFile(\n \"kubeconfig\",\n {\n host: seed,\n path: \"/etc/rancher/k3s/k3s.yaml\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst kubeconfig = await toPromise(\n kubeconfigResult.stdout.apply(kubeconfig =>\n kubeconfig.replace(\"127.0.0.1:6443\", l4EndpointToString(apiEndpoints[0])),\n ),\n)\n\nconst kubeConfig = new KubeConfig()\nkubeConfig.loadFromString(kubeconfig)\n\nconst provider = new Provider(name, { kubeconfig: secret(kubeconfig) })\nconst kubeSystem = core.v1.Namespace.get(\"kube-system\", \"kube-system\", { provider })\n\nconst kubeconfigFile = fileFromString(\"config\", kubeconfig, \"text/yaml\", true)\n\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n name,\n cni: \"other\",\n\n externalIps: filterEndpoints(endpoints, [\"public\", \"external\"])\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(l3EndpointToString),\n\n endpoints,\n apiEndpoints,\n\n quirks: {\n externalServiceType: \"LoadBalancer\",\n },\n\n kubeconfig: secret(kubeconfig),\n },\n\n endpoints,\n apiEndpoints,\n\n $terminals: [createK8sTerminal(kubeconfig)],\n\n $status: {\n endpoints: endpoints.map(l3EndpointToString),\n apiEndpoints: apiEndpoints.map(l4EndpointToString),\n },\n\n $pages: {\n index: {\n title: \"K3s Cluster\",\n content: [\n {\n type: \"markdown\",\n content: text`\n The cluster is up and running.\n\n You can access the cluster via the terminal or by using the kubeconfig file.\n `,\n },\n {\n type: \"file\",\n fileMeta: kubeconfigFile.meta,\n },\n {\n type: \"markdown\",\n content: secret(text`\n You can also copy the following content of the kubeconfig file and use it to access the cluster:\n\n \\`\\`\\`yaml\n ${kubeconfig}\n \\`\\`\\`\n `),\n },\n ],\n },\n },\n\n $files: [kubeconfigFile],\n})\n"],"mappings":"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","names":["env","kubeconfig"]}
1
+ {"version":3,"sources":["../../src/cluster/index.ts"],"names":["env","kubeconfig"],"mappings":"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","file":"index.js","sourcesContent":["import {\n Command,\n filterEndpoints,\n l3EndpointToString,\n l3ToL4Endpoint,\n l4EndpointToString,\n parseL3Endpoint,\n} from \"@highstate/common\"\nimport { common, k3s } from \"@highstate/library\"\nimport {\n fileFromString,\n forUnit,\n interpolate,\n output,\n Resource,\n secret,\n toPromise,\n type InputMap,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, Provider } from \"@pulumi/kubernetes\"\nimport { createK8sTerminal } from \"@highstate/k8s\"\nimport { text } from \"@highstate/contract\"\nimport { uniqueBy, isIncludedIn } from \"remeda\"\n\nconst { name, args, inputs, outputs } = forUnit(k3s.cluster)\n\nconst { masters, workers } = await toPromise(inputs)\n\nconst seed = masters[0]\n\nconst endpoints = uniqueBy(\n [...workers, ...masters].flatMap(server =>\n server.endpoints.map(endpoint => parseL3Endpoint(endpoint)),\n ),\n l3EndpointToString,\n)\n\nconst apiEndpoints = uniqueBy(\n masters.flatMap(server => server.endpoints.map(endpoint => l3ToL4Endpoint(endpoint, 6443))),\n l4EndpointToString,\n)\n\nconst config: Record<string, unknown> = {\n ...args.config,\n \"tls-san\": apiEndpoints.map(l4EndpointToString),\n disable: args.disabledComponents.filter(isIncludedIn(k3s.packagedComponents)),\n}\n\nfor (const disabledComponent of args.disabledComponents) {\n if (isIncludedIn(disabledComponent, k3s.internalComponents)) {\n config[`disable-${disabledComponent}`] = true\n }\n}\n\nif (args.cni === \"none\") {\n config[\"flannel-backend\"] = \"none\"\n}\n\nconst configContent = JSON.stringify(config, null, 2)\n\nconst seedInstallCommand = createNode(seed, \"server\", { K3S_CLUSTER_INIT: \"true\" })\n\nconst tokenCommand = Command.receiveTextFile(\n \"token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/node-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst agentTokenCommand = Command.receiveTextFile(\n \"agent-token\",\n {\n host: seed,\n path: \"/var/lib/rancher/k3s/server/agent-token\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nfor (const master of masters.slice(1)) {\n createNode(master, \"server\", {\n K3S_TOKEN: tokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfor (const worker of workers) {\n createNode(worker, \"agent\", {\n K3S_TOKEN: agentTokenCommand.stdout,\n K3S_URL: `https://${l4EndpointToString(apiEndpoints[0])}`,\n })\n}\n\nfunction createNode(\n server: common.Server,\n type: \"server\" | \"agent\",\n env: InputMap<string>,\n dependsOn?: Resource,\n) {\n const configFileCommand = Command.createTextFile(`config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/config.yaml\",\n content: configContent,\n })\n\n const registryConfigFileCommand = Command.createTextFile(`registry-config-${server.hostname}`, {\n host: server,\n path: \"/etc/rancher/k3s/registries.yaml\",\n content: JSON.stringify(args.registries ?? {}, null, 2),\n })\n\n const envString = output(env).apply(env => {\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\" \")\n })\n\n return new Command(\n `install-${server.hostname}`,\n {\n host: server,\n create: interpolate`curl -sfL https://raw.githubusercontent.com/k3s-io/k3s/refs/heads/master/install.sh | ${envString} sh -s - ${type}`,\n delete: \"/usr/local/bin/k3s-uninstall.sh\",\n },\n {\n dependsOn: [\n configFileCommand.command,\n registryConfigFileCommand.command,\n ...(dependsOn ? [dependsOn] : []),\n ],\n },\n )\n}\n\nconst kubeconfigResult = Command.receiveTextFile(\n \"kubeconfig\",\n {\n host: seed,\n path: \"/etc/rancher/k3s/k3s.yaml\",\n },\n { dependsOn: seedInstallCommand },\n)\n\nconst kubeconfig = await toPromise(\n kubeconfigResult.stdout.apply(kubeconfig =>\n kubeconfig.replace(\"127.0.0.1:6443\", l4EndpointToString(apiEndpoints[0])),\n ),\n)\n\nconst kubeConfig = new KubeConfig()\nkubeConfig.loadFromString(kubeconfig)\n\nconst provider = new Provider(name, { kubeconfig: secret(kubeconfig) })\nconst kubeSystem = core.v1.Namespace.get(\"kube-system\", \"kube-system\", { provider })\n\nconst kubeconfigFile = fileFromString(\"config\", kubeconfig, \"text/yaml\", true)\n\nexport default outputs({\n k8sCluster: {\n id: kubeSystem.metadata.uid,\n name,\n cni: \"other\",\n\n externalIps: filterEndpoints(endpoints, [\"public\", \"external\"])\n .filter(endpoint => endpoint.type !== \"hostname\")\n .map(l3EndpointToString),\n\n endpoints,\n apiEndpoints,\n\n quirks: {\n externalServiceType: args.disabledComponents.includes(\"servicelb\")\n ? \"NodePort\"\n : \"LoadBalancer\",\n },\n\n kubeconfig: secret(kubeconfig),\n },\n\n endpoints,\n apiEndpoints,\n\n // $terminals: [createK8sTerminal(kubeconfig)],\n\n $statusFields: {\n endpoints: endpoints.map(l3EndpointToString),\n apiEndpoints: apiEndpoints.map(l4EndpointToString),\n },\n\n // $pages: {\n // index: {\n // title: \"K3s Cluster\",\n // content: [\n // {\n // type: \"markdown\",\n // content: text`\n // The cluster is up and running.\n\n // You can access the cluster via the terminal or by using the kubeconfig file.\n // `,\n // },\n // {\n // type: \"file\",\n // meta: kubeconfigFile.meta,\n // },\n // {\n // type: \"markdown\",\n // content: secret(text`\n // You can also copy the following content of the kubeconfig file and use it to access the cluster:\n\n // \\`\\`\\`yaml\n // ${kubeconfig}\n // \\`\\`\\`\n // `),\n // },\n // ],\n // },\n // },\n\n // $files: [kubeconfigFile],\n})\n"]}
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "sourceHashes": {
3
- "./dist/cluster/index.js": "7650c8b2d12629c891f03594bebdf93946d0e94fe808758ce933f34020247281"
3
+ "./dist/cluster/index.js": 3411498878
4
4
  }
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highstate/k3s",
3
- "version": "0.9.14",
3
+ "version": "0.9.16",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -15,18 +15,18 @@
15
15
  "build": "highstate build"
16
16
  },
17
17
  "dependencies": {
18
- "@highstate/common": "^0.9.14",
19
- "@highstate/contract": "^0.9.14",
20
- "@highstate/k8s": "^0.9.14",
21
- "@highstate/library": "^0.9.14",
22
- "@highstate/pulumi": "^0.9.14",
18
+ "@highstate/common": "^0.9.16",
19
+ "@highstate/contract": "^0.9.16",
20
+ "@highstate/k8s": "^0.9.16",
21
+ "@highstate/library": "^0.9.16",
22
+ "@highstate/pulumi": "^0.9.16",
23
23
  "@kubernetes/client-node": "^1.1.0",
24
24
  "@pulumi/command": "^1.0.2",
25
25
  "@pulumi/kubernetes": "^4.18.0",
26
26
  "remeda": "^2.21.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@highstate/cli": "^0.9.14"
29
+ "@highstate/cli": "^0.9.16"
30
30
  },
31
- "gitHead": "8b5d1079961cc5bf9cf8ea3c10f7313384e3a2ff"
31
+ "gitHead": "458d6f1f9f6d4aec0ba75a2b2c4c01408cb9c8df"
32
32
  }