@highstate/k8s 0.4.5

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.
@@ -0,0 +1,64 @@
1
+ import { readdirSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { output, toPromise, resolvePackagePath } from '@highstate/pulumi';
4
+ import { Provider, core } from '@pulumi/kubernetes';
5
+ import { mergeDeep } from 'remeda';
6
+
7
+ function createProvider(cluster) {
8
+ const provider = output(cluster).apply((cluster2) => {
9
+ return new Provider(cluster2.name, {
10
+ kubeconfig: cluster2.kubeconfig
11
+ });
12
+ });
13
+ return toPromise(provider);
14
+ }
15
+ function createNamespace(name, provider, args = {}) {
16
+ return new core.v1.Namespace(
17
+ name,
18
+ mergeDeep(args, {
19
+ metadata: {
20
+ name
21
+ }
22
+ }),
23
+ { provider }
24
+ );
25
+ }
26
+ const commonExtraArgs = ["name", "namespace", "metadata"];
27
+ function mapMetadata(args, fallbackName) {
28
+ return {
29
+ ...args.metadata,
30
+ name: args.name ?? args.metadata?.name ?? fallbackName,
31
+ namespace: args.namespace ? mapNamespaceLikeToNamespaceName(args.namespace) : void 0
32
+ };
33
+ }
34
+ function resolveChartPath(packageName, chartName, parent) {
35
+ const resolvedChartsPath = resolvePackagePath(packageName, "assets", parent);
36
+ const files = readdirSync(resolvedChartsPath).filter((file) => file.startsWith(chartName));
37
+ if (files.length === 0) {
38
+ throw new Error(`No chart found for ${chartName}`);
39
+ }
40
+ if (files.length > 1) {
41
+ throw new Error(`Multiple charts found for ${chartName}`);
42
+ }
43
+ return resolve(resolvedChartsPath, files[0]);
44
+ }
45
+ function mapSelectorLikeToSelector(selector) {
46
+ if ("matchLabels" in selector || "matchExpressions" in selector) {
47
+ return selector;
48
+ }
49
+ return {
50
+ matchLabels: selector
51
+ };
52
+ }
53
+ function mapNamespaceLikeToNamespaceName(namespace) {
54
+ return core.v1.Namespace.isInstance(namespace) ? namespace.metadata.name : output(namespace);
55
+ }
56
+ function mapNamespaceNameToSelector(namespace) {
57
+ return {
58
+ matchLabels: {
59
+ "kubernetes.io/metadata.name": namespace
60
+ }
61
+ };
62
+ }
63
+
64
+ export { mapSelectorLikeToSelector as a, mapNamespaceNameToSelector as b, commonExtraArgs as c, mapNamespaceLikeToNamespaceName as d, createProvider as e, createNamespace as f, mapMetadata as m, resolveChartPath as r };
@@ -0,0 +1,13 @@
1
+ import { k8s } from '@highstate/library';
2
+ import { forUnit } from '@highstate/pulumi';
3
+
4
+ const { inputs, outputs } = forUnit(k8s.accessPoint);
5
+ var index = outputs({
6
+ accessPoint: {
7
+ dnsProvider: inputs.dnsProvider,
8
+ gateway: inputs.gateway,
9
+ tlsIssuer: inputs.tlsIssuer
10
+ }
11
+ });
12
+
13
+ export { index as default };
@@ -0,0 +1,34 @@
1
+ import { k8s } from '@highstate/library';
2
+ import { forUnit } from '@highstate/pulumi';
3
+ import { helm } from '@pulumi/kubernetes';
4
+ import { e as createProvider, f as createNamespace, r as resolveChartPath } from '../../shared-hajqPzR4.js';
5
+ import 'node:fs';
6
+ import 'node:path';
7
+ import 'remeda';
8
+
9
+ const { inputs, outputs } = forUnit(k8s.certManager);
10
+ const provider = await createProvider(inputs.k8sCluster);
11
+ const namespace = createNamespace("cert-manager", provider);
12
+ new helm.v4.Chart(
13
+ "cert-manager",
14
+ {
15
+ namespace: namespace.metadata.name,
16
+ chart: resolveChartPath("@highstate/k8s", "cert-manager", import.meta.url),
17
+ values: {
18
+ crds: {
19
+ enabled: true
20
+ },
21
+ config: {
22
+ apiVersion: "controller.config.cert-manager.io/v1alpha1",
23
+ kind: "ControllerConfiguration",
24
+ enableGatewayAPI: true
25
+ }
26
+ }
27
+ },
28
+ { provider }
29
+ );
30
+ var index = outputs({
31
+ k8sCluster: inputs.k8sCluster
32
+ });
33
+
34
+ export { index as default };
@@ -0,0 +1,51 @@
1
+ import { k8s } from '@highstate/library';
2
+ import { toPromise, forUnit, unsecret } from '@highstate/pulumi';
3
+ import { cert_manager } from '@highstate/cert-manager';
4
+ import { e as createProvider } from '../../shared-hajqPzR4.js';
5
+ import { capitalize } from 'remeda';
6
+ import 'node:fs';
7
+ import 'node:path';
8
+ import '@pulumi/kubernetes';
9
+
10
+ async function createDns01Solver(dnsProviderInput, provider) {
11
+ const dnsProvider = await toPromise(dnsProviderInput);
12
+ const implName = `create${capitalize(dnsProvider.type)}Dns01Solver`;
13
+ const implModule = await import(`@highstate/${dnsProvider.type}`);
14
+ const implFunction = implModule[implName];
15
+ return implFunction(dnsProvider, provider);
16
+ }
17
+
18
+ const { name, inputs, outputs } = forUnit(k8s.dns01TlsIssuer);
19
+ const provider = await createProvider(inputs.k8sCluster);
20
+ const dns01Solver = await createDns01Solver(inputs.dnsProvider, provider);
21
+ new cert_manager.v1.ClusterIssuer(
22
+ name,
23
+ {
24
+ metadata: {
25
+ name
26
+ },
27
+ spec: {
28
+ acme: {
29
+ server: "https://acme-v02.api.letsencrypt.org/directory",
30
+ solvers: [
31
+ {
32
+ dns01: dns01Solver,
33
+ selector: { dnsZones: [inputs.dnsProvider.domain] }
34
+ }
35
+ ],
36
+ privateKeySecretRef: {
37
+ name
38
+ }
39
+ }
40
+ }
41
+ },
42
+ { provider }
43
+ );
44
+ var index = outputs({
45
+ tlsIssuer: {
46
+ clusterName: unsecret(inputs.k8sCluster.name),
47
+ clusterIssuerName: name
48
+ }
49
+ });
50
+
51
+ export { index as default };
@@ -0,0 +1,38 @@
1
+ import { text } from '@highstate/contract';
2
+ import { k8s } from '@highstate/library';
3
+ import { forUnit } from '@highstate/pulumi';
4
+
5
+ const { name, secrets, outputs } = forUnit(k8s.existingCluster);
6
+ const kubeconfig = secrets.kubeconfig.apply(JSON.stringify);
7
+ var index = outputs({
8
+ cluster: {
9
+ name,
10
+ kubeconfig,
11
+ // TODO: detect CNI
12
+ cni: "unknown"
13
+ },
14
+ $terminals: {
15
+ management: {
16
+ title: "Cluster Management",
17
+ image: "ghcr.io/exeteres/highstate/terminal-kubectl",
18
+ command: ["bash", "/welcome.sh"],
19
+ files: {
20
+ "/kubeconfig": kubeconfig,
21
+ "/welcome.sh": text`
22
+ echo "Connecting to the cluster..."
23
+ kubectl cluster-info
24
+
25
+ echo "Use 'kubectl' and 'helm' to manage the cluster."
26
+ echo
27
+
28
+ exec script -q -c bash /dev/null
29
+ `
30
+ },
31
+ env: {
32
+ KUBECONFIG: "/kubeconfig"
33
+ }
34
+ }
35
+ }
36
+ });
37
+
38
+ export { index as default };
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@highstate/k8s",
3
+ "version": "0.4.5",
4
+ "type": "module",
5
+ "module": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "exports": {
11
+ ".": {
12
+ "default": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./access-point": "./dist/units/access-point/index.js",
16
+ "./cert-manager": "./dist/units/cert-manager/index.js",
17
+ "./dns01-issuer": "./dist/units/dns01-issuer/index.js",
18
+ "./existing-cluster": "./dist/units/existing-cluster/index.js"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "build": "pkgroll --tsconfig=tsconfig.build.json",
25
+ "update-assets": "./scripts/update-assets.sh",
26
+ "generate-crds": "./scripts/generate-crds.sh"
27
+ },
28
+ "dependencies": {
29
+ "@highstate/cert-manager": "^0.4.5",
30
+ "@highstate/common": "^0.4.5",
31
+ "@highstate/contract": "^0.4.5",
32
+ "@highstate/gateway-api": "^0.4.5",
33
+ "@highstate/pulumi": "^0.4.5",
34
+ "@pulumi/command": "^1.0.2",
35
+ "@pulumi/kubernetes": "^4.18.0",
36
+ "@pulumi/pulumi": "^3.152.0",
37
+ "deepmerge-ts": "^7.1.5",
38
+ "remeda": "^2.21.0"
39
+ },
40
+ "peerDependencies": {
41
+ "@highstate/library": "workspace:^0.4.4"
42
+ },
43
+ "devDependencies": {
44
+ "pkgroll": "^2.5.1"
45
+ },
46
+ "gitHead": "afd601fdade1bcf31af58072eea3c08ee26349b8"
47
+ }