@highstate/k8s 0.18.0 → 0.20.0

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.
Files changed (105) hide show
  1. package/dist/{chunk-FE4SHRAJ.js → chunk-23X5SXQG.js} +22 -7
  2. package/dist/chunk-23X5SXQG.js.map +1 -0
  3. package/dist/{chunk-LGHFSXNT.js → chunk-ADHZK6V2.js} +14 -10
  4. package/dist/chunk-ADHZK6V2.js.map +1 -0
  5. package/dist/{chunk-VCXWCZ43.js → chunk-BTAEFJ5N.js} +27 -15
  6. package/dist/chunk-BTAEFJ5N.js.map +1 -0
  7. package/dist/{chunk-BR2CLUUD.js → chunk-IXE3OKB4.js} +27 -8
  8. package/dist/chunk-IXE3OKB4.js.map +1 -0
  9. package/dist/{chunk-TWBMG6TD.js → chunk-OG2OPX7B.js} +30 -12
  10. package/dist/chunk-OG2OPX7B.js.map +1 -0
  11. package/dist/{chunk-DCUMJSO6.js → chunk-P26SQ2ZB.js} +17 -51
  12. package/dist/chunk-P26SQ2ZB.js.map +1 -0
  13. package/dist/{chunk-MIC2BHGS.js → chunk-PG27ZY2H.js} +25 -7
  14. package/dist/chunk-PG27ZY2H.js.map +1 -0
  15. package/dist/chunk-PZYGZSN5.js +54 -0
  16. package/dist/{chunk-PZ5AY32C.js.map → chunk-PZYGZSN5.js.map} +1 -1
  17. package/dist/{chunk-YIJUVPU2.js → chunk-S77TE7UC.js} +27 -15
  18. package/dist/chunk-S77TE7UC.js.map +1 -0
  19. package/dist/{chunk-P2VOUU7E.js → chunk-SZKOAHNX.js} +383 -205
  20. package/dist/chunk-SZKOAHNX.js.map +1 -0
  21. package/dist/chunk-TOLFVF4S.js +889 -0
  22. package/dist/chunk-TOLFVF4S.js.map +1 -0
  23. package/dist/{chunk-RVB4WWZZ.js → chunk-TVKT3ZYX.js} +174 -18
  24. package/dist/chunk-TVKT3ZYX.js.map +1 -0
  25. package/dist/cron-job-RKB2HYTO.js +7 -0
  26. package/dist/{cron-job-NX4HD4FI.js.map → cron-job-RKB2HYTO.js.map} +1 -1
  27. package/dist/deployment-T35TUOL2.js +7 -0
  28. package/dist/{deployment-O2LJ5WR5.js.map → deployment-T35TUOL2.js.map} +1 -1
  29. package/dist/highstate.manifest.json +3 -2
  30. package/dist/impl/dynamic-endpoint-resolver.js +90 -0
  31. package/dist/impl/dynamic-endpoint-resolver.js.map +1 -0
  32. package/dist/impl/gateway-route.js +159 -62
  33. package/dist/impl/gateway-route.js.map +1 -1
  34. package/dist/impl/tls-certificate.js +6 -5
  35. package/dist/impl/tls-certificate.js.map +1 -1
  36. package/dist/index.js +106 -23
  37. package/dist/index.js.map +1 -1
  38. package/dist/job-PE4AKOHB.js +7 -0
  39. package/dist/job-PE4AKOHB.js.map +1 -0
  40. package/dist/stateful-set-LUIRHQJY.js +7 -0
  41. package/dist/{stateful-set-VJYKTQ72.js.map → stateful-set-LUIRHQJY.js.map} +1 -1
  42. package/dist/units/cert-manager/index.js +7 -8
  43. package/dist/units/cert-manager/index.js.map +1 -1
  44. package/dist/units/cluster-patch/index.js +6 -6
  45. package/dist/units/cluster-patch/index.js.map +1 -1
  46. package/dist/units/dns01-issuer/index.js +52 -15
  47. package/dist/units/dns01-issuer/index.js.map +1 -1
  48. package/dist/units/existing-cluster/index.js +39 -18
  49. package/dist/units/existing-cluster/index.js.map +1 -1
  50. package/dist/units/gateway-api/index.js +2 -2
  51. package/dist/units/reduced-access-cluster/index.js +8 -8
  52. package/dist/units/reduced-access-cluster/index.js.map +1 -1
  53. package/package.json +9 -7
  54. package/src/cluster.ts +12 -8
  55. package/src/config-map.ts +15 -5
  56. package/src/container.ts +4 -2
  57. package/src/cron-job.ts +25 -4
  58. package/src/deployment.ts +32 -17
  59. package/src/gateway/backend.ts +3 -3
  60. package/src/gateway/gateway.ts +12 -56
  61. package/src/helm.ts +354 -22
  62. package/src/impl/dynamic-endpoint-resolver.ts +109 -0
  63. package/src/impl/gateway-route.ts +231 -57
  64. package/src/impl/tls-certificate.ts +8 -3
  65. package/src/index.ts +1 -0
  66. package/src/job.ts +23 -5
  67. package/src/kubectl.ts +166 -0
  68. package/src/namespace.ts +47 -3
  69. package/src/network-policy.ts +1 -1
  70. package/src/pvc.ts +12 -2
  71. package/src/rbac.ts +28 -5
  72. package/src/scripting/environment.ts +3 -2
  73. package/src/secret.ts +15 -5
  74. package/src/service.ts +28 -6
  75. package/src/shared.ts +30 -2
  76. package/src/stateful-set.ts +32 -17
  77. package/src/tls.ts +31 -5
  78. package/src/units/cluster-patch/index.ts +5 -5
  79. package/src/units/dns01-issuer/index.ts +56 -12
  80. package/src/units/existing-cluster/index.ts +36 -15
  81. package/src/units/reduced-access-cluster/index.ts +6 -3
  82. package/src/worker.ts +4 -2
  83. package/src/workload.ts +453 -213
  84. package/dist/chunk-4G6LLC2X.js +0 -240
  85. package/dist/chunk-4G6LLC2X.js.map +0 -1
  86. package/dist/chunk-BR2CLUUD.js.map +0 -1
  87. package/dist/chunk-DCUMJSO6.js.map +0 -1
  88. package/dist/chunk-FE4SHRAJ.js.map +0 -1
  89. package/dist/chunk-KMLRI5UZ.js +0 -155
  90. package/dist/chunk-KMLRI5UZ.js.map +0 -1
  91. package/dist/chunk-LGHFSXNT.js.map +0 -1
  92. package/dist/chunk-MIC2BHGS.js.map +0 -1
  93. package/dist/chunk-OBDQONMV.js +0 -401
  94. package/dist/chunk-OBDQONMV.js.map +0 -1
  95. package/dist/chunk-P2VOUU7E.js.map +0 -1
  96. package/dist/chunk-PZ5AY32C.js +0 -9
  97. package/dist/chunk-RVB4WWZZ.js.map +0 -1
  98. package/dist/chunk-TWBMG6TD.js.map +0 -1
  99. package/dist/chunk-VCXWCZ43.js.map +0 -1
  100. package/dist/chunk-YIJUVPU2.js.map +0 -1
  101. package/dist/cron-job-NX4HD4FI.js +0 -8
  102. package/dist/deployment-O2LJ5WR5.js +0 -8
  103. package/dist/job-SYME6Y43.js +0 -8
  104. package/dist/job-SYME6Y43.js.map +0 -1
  105. package/dist/stateful-set-VJYKTQ72.js +0 -8
@@ -1,240 +0,0 @@
1
- import { NamespacedResource, Namespace, mapMetadata, getProvider } from './chunk-OBDQONMV.js';
2
- import { getOrCreate } from '@highstate/contract';
3
- import { toPromise } from '@highstate/pulumi';
4
- import { core } from '@pulumi/kubernetes';
5
- import { output, interpolate } from '@pulumi/pulumi';
6
-
7
- var Secret = class _Secret extends NamespacedResource {
8
- constructor(type, name, args, opts, metadata, namespace, data, stringData) {
9
- super(type, name, args, opts, metadata, namespace);
10
- this.data = data;
11
- this.stringData = stringData;
12
- }
13
- static apiVersion = "v1";
14
- static kind = "Secret";
15
- /**
16
- * The Highstate secret entity.
17
- */
18
- get entity() {
19
- return output(this.entityBase);
20
- }
21
- /**
22
- * Gets the value of the secret field by the given key in `data`.
23
- *
24
- * Automatically decodes the base64 value.
25
- *
26
- * @param key The key of the secret.
27
- * @returns The value of the secret.
28
- */
29
- getValue(key) {
30
- return this.data[key].apply((value) => Buffer.from(value, "base64").toString());
31
- }
32
- /**
33
- * Creates a new secret.
34
- */
35
- static create(name, args, opts) {
36
- return new CreatedSecret(name, args, opts);
37
- }
38
- /**
39
- * Creates a new secret or patches an existing one.
40
- *
41
- * @param name The name of the resource. May not be the same as the secret name.
42
- * @param args The arguments to create or patch the secret with.
43
- * @param opts Optional resource options.
44
- */
45
- static createOrPatch(name, args, opts) {
46
- if (args.existing) {
47
- return new SecretPatch(name, {
48
- ...args,
49
- name: output(args.existing).metadata.name
50
- });
51
- }
52
- return new CreatedSecret(name, args, opts);
53
- }
54
- /**
55
- * Creates a new secret or gets an existing one.
56
- *
57
- * @param name The name of the resource. May not be the same as the secret name. Will not be used when existing secret is retrieved.
58
- * @param args The arguments to create or get the secret with.
59
- * @param opts Optional resource options.
60
- */
61
- static async createOrGet(name, args, opts) {
62
- if (args.existing) {
63
- return await _Secret.forAsync(args.existing, output(args.namespace).cluster);
64
- }
65
- return new CreatedSecret(name, args, opts);
66
- }
67
- /**
68
- * Patches an existing secret.
69
- *
70
- * Will throw an error if the secret does not exist.
71
- *
72
- * @param name The name of the resource. May not be the same as the secret name.
73
- * @param args The arguments to patch the secret with.
74
- * @param opts Optional resource options.
75
- */
76
- static patch(name, args, opts) {
77
- return new SecretPatch(name, args, opts);
78
- }
79
- /**
80
- * Wraps an existing Kubernetes secret.
81
- */
82
- static wrap(name, args, opts) {
83
- return new WrappedSecret(name, args, opts);
84
- }
85
- /**
86
- * Gets an existing secret.
87
- *
88
- * Will throw an error if the secret does not exist.
89
- */
90
- static get(name, args, opts) {
91
- return new ExternalSecret(name, args, opts);
92
- }
93
- static secretCache = /* @__PURE__ */ new Map();
94
- /**
95
- * Gets an existing secret for a given entity.
96
- * Prefer this method over `get` when possible.
97
- *
98
- * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.
99
- *
100
- * This method is idempotent and will return the same instance for the same entity.
101
- *
102
- * @param entity The entity to get the secret for.
103
- * @param cluster The cluster where the secret is located.
104
- */
105
- static for(entity, cluster) {
106
- return getOrCreate(
107
- _Secret.secretCache,
108
- `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,
109
- (name) => {
110
- return _Secret.get(name, {
111
- name: entity.metadata.name,
112
- namespace: Namespace.forResource(entity, cluster)
113
- });
114
- }
115
- );
116
- }
117
- /**
118
- * Gets an existing secret for a given entity.
119
- * Prefer this method over `get` when possible.
120
- *
121
- * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.
122
- *
123
- * This method is idempotent and will return the same instance for the same entity.
124
- *
125
- * @param entity The entity to get the secret for.
126
- * @param cluster The cluster where the secret is located.
127
- */
128
- static async forAsync(entity, cluster) {
129
- const resolvedEntity = await toPromise(entity);
130
- return _Secret.for(resolvedEntity, cluster);
131
- }
132
- };
133
- var CreatedSecret = class extends Secret {
134
- constructor(name, args, opts) {
135
- const secret = output(args.namespace).cluster.apply((cluster) => {
136
- return new core.v1.Secret(
137
- name,
138
- {
139
- metadata: mapMetadata(args, name),
140
- data: args.data,
141
- stringData: args.stringData,
142
- type: args.type,
143
- immutable: args.immutable
144
- },
145
- {
146
- ...opts,
147
- parent: this,
148
- provider: getProvider(cluster)
149
- }
150
- );
151
- });
152
- super(
153
- "highstate:k8s:Secret",
154
- name,
155
- args,
156
- opts,
157
- secret.metadata,
158
- output(args.namespace),
159
- secret.data,
160
- secret.stringData
161
- );
162
- }
163
- };
164
- var SecretPatch = class extends Secret {
165
- constructor(name, args, opts) {
166
- const secret = output(args.namespace).cluster.apply((cluster) => {
167
- return new core.v1.SecretPatch(
168
- name,
169
- {
170
- metadata: mapMetadata(args, name),
171
- data: args.data,
172
- stringData: args.stringData,
173
- type: args.type,
174
- immutable: args.immutable
175
- },
176
- {
177
- ...opts,
178
- parent: this,
179
- provider: getProvider(cluster)
180
- }
181
- );
182
- });
183
- super(
184
- "highstate:k8s:SecretPatch",
185
- name,
186
- args,
187
- opts,
188
- secret.metadata,
189
- output(args.namespace),
190
- secret.data,
191
- secret.stringData
192
- );
193
- }
194
- };
195
- var WrappedSecret = class extends Secret {
196
- constructor(name, args, opts) {
197
- super(
198
- "highstate:k8s:WrappedSecret",
199
- name,
200
- args,
201
- opts,
202
- output(args.secret).metadata,
203
- output(args.namespace),
204
- output(args.secret).data,
205
- output(args.secret).stringData
206
- );
207
- }
208
- };
209
- var ExternalSecret = class extends Secret {
210
- constructor(name, args, opts) {
211
- const secret = output(args.namespace).cluster.apply(async (cluster) => {
212
- const secret2 = core.v1.Secret.get(
213
- name,
214
- interpolate`${output(args.namespace).metadata.name}/${args.name}`,
215
- { ...opts, parent: this, provider: getProvider(cluster) }
216
- );
217
- const namespace = await toPromise(output(args.namespace).metadata.name);
218
- const resolvedName = await toPromise(args.name);
219
- const metadata = await toPromise(secret2.metadata);
220
- if (!metadata) {
221
- throw new Error(`Secret ${resolvedName} in namespace ${namespace} not found`);
222
- }
223
- return secret2;
224
- });
225
- super(
226
- "highstate:k8s:ExternalSecret",
227
- name,
228
- args,
229
- opts,
230
- secret.metadata,
231
- output(args.namespace),
232
- secret.data,
233
- secret.stringData
234
- );
235
- }
236
- };
237
-
238
- export { Secret };
239
- //# sourceMappingURL=chunk-4G6LLC2X.js.map
240
- //# sourceMappingURL=chunk-4G6LLC2X.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/secret.ts"],"names":["secret"],"mappings":"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","file":"chunk-4G6LLC2X.js","sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport { getOrCreate } from \"@highstate/contract\"\nimport { toPromise } from \"@highstate/pulumi\"\nimport { core, type types } from \"@pulumi/kubernetes\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n} from \"@pulumi/pulumi\"\nimport { Namespace } from \"./namespace\"\nimport { getProvider, mapMetadata, NamespacedResource, type ScopedResourceArgs } from \"./shared\"\n\nexport type SecretArgs = ScopedResourceArgs &\n Omit<types.input.core.v1.Secret, \"kind\" | \"metadata\" | \"apiVersion\">\n\nexport type CreateOrGetSecretArgs = SecretArgs & {\n /**\n * The secret entity to patch/retrieve.\n */\n existing: Input<k8s.NamespacedResource> | undefined\n}\n\n/**\n * Represents a Kubernetes Secret resource with metadata and data.\n */\nexport abstract class Secret extends NamespacedResource {\n static apiVersion = \"v1\"\n static kind = \"Secret\"\n\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n namespace: Output<Namespace>,\n\n /**\n * The data of the underlying Kubernetes secret.\n */\n readonly data: Output<Record<string, string>>,\n\n /**\n * The stringData of the underlying Kubernetes secret.\n */\n readonly stringData: Output<Record<string, string>>,\n ) {\n super(type, name, args, opts, metadata, namespace)\n }\n\n /**\n * The Highstate secret entity.\n */\n get entity(): Output<k8s.Secret> {\n return output(this.entityBase)\n }\n\n /**\n * Gets the value of the secret field by the given key in `data`.\n *\n * Automatically decodes the base64 value.\n *\n * @param key The key of the secret.\n * @returns The value of the secret.\n */\n getValue(key: string): Output<string> {\n return this.data[key].apply(value => Buffer.from(value, \"base64\").toString())\n }\n\n /**\n * Creates a new secret.\n */\n static create(name: string, args: SecretArgs, opts?: ComponentResourceOptions): Secret {\n return new CreatedSecret(name, args, opts)\n }\n\n /**\n * Creates a new secret or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the secret name.\n * @param args The arguments to create or patch the secret with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetSecretArgs,\n opts?: ComponentResourceOptions,\n ): Secret {\n if (args.existing) {\n return new SecretPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n })\n }\n\n return new CreatedSecret(name, args, opts)\n }\n\n /**\n * Creates a new secret or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the secret name. Will not be used when existing secret is retrieved.\n * @param args The arguments to create or get the secret with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetSecretArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Secret> {\n if (args.existing) {\n return await Secret.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedSecret(name, args, opts)\n }\n\n /**\n * Patches an existing secret.\n *\n * Will throw an error if the secret does not exist.\n *\n * @param name The name of the resource. May not be the same as the secret name.\n * @param args The arguments to patch the secret with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: SecretArgs, opts?: ComponentResourceOptions): Secret {\n return new SecretPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes secret.\n */\n static wrap(name: string, args: WrappedSecretArgs, opts?: ComponentResourceOptions): Secret {\n return new WrappedSecret(name, args, opts)\n }\n\n /**\n * Gets an existing secret.\n *\n * Will throw an error if the secret does not exist.\n */\n static get(name: string, args: ExternalSecretArgs, opts?: ComponentResourceOptions): Secret {\n return new ExternalSecret(name, args, opts)\n }\n\n private static readonly secretCache = new Map<string, Secret>()\n\n /**\n * Gets an existing secret for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the secret for.\n * @param cluster The cluster where the secret is located.\n */\n static for(entity: k8s.NamespacedResource, cluster: Input<k8s.Cluster>): Secret {\n return getOrCreate(\n Secret.secretCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Secret.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing secret for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the secret for.\n * @param cluster The cluster where the secret is located.\n */\n static async forAsync(\n entity: Input<k8s.NamespacedResource>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Secret> {\n const resolvedEntity = await toPromise(entity)\n return Secret.for(resolvedEntity, cluster)\n }\n}\n\nclass CreatedSecret extends Secret {\n constructor(name: string, args: SecretArgs, opts?: ComponentResourceOptions) {\n const secret = output(args.namespace).cluster.apply(cluster => {\n return new core.v1.Secret(\n name,\n {\n metadata: mapMetadata(args, name),\n data: args.data,\n stringData: args.stringData,\n type: args.type,\n immutable: args.immutable,\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:Secret\",\n name,\n args,\n opts,\n secret.metadata,\n output(args.namespace),\n secret.data,\n secret.stringData,\n )\n }\n}\n\nclass SecretPatch extends Secret {\n constructor(name: string, args: SecretArgs, opts?: ComponentResourceOptions) {\n const secret = output(args.namespace).cluster.apply(cluster => {\n return new core.v1.SecretPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n data: args.data,\n stringData: args.stringData,\n type: args.type,\n immutable: args.immutable,\n },\n {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n },\n )\n })\n\n super(\n \"highstate:k8s:SecretPatch\",\n name,\n args,\n opts,\n secret.metadata,\n output(args.namespace),\n secret.data,\n secret.stringData,\n )\n }\n}\n\nexport type WrappedSecretArgs = {\n /**\n * The underlying Kubernetes secret to wrap.\n */\n secret: Input<core.v1.Secret>\n\n /**\n * The namespace where the secret is located.\n */\n namespace: Input<Namespace>\n}\n\nclass WrappedSecret extends Secret {\n constructor(name: string, args: WrappedSecretArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedSecret\",\n name,\n args,\n opts,\n output(args.secret).metadata,\n output(args.namespace),\n output(args.secret).data,\n output(args.secret).stringData,\n )\n }\n}\n\nexport type ExternalSecretArgs = {\n /**\n * The name of the secret to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the secret is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalSecret extends Secret {\n constructor(name: string, args: ExternalSecretArgs, opts?: ComponentResourceOptions) {\n const secret = output(args.namespace).cluster.apply(async cluster => {\n const secret = core.v1.Secret.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n\n // TODO: investigate why this needed\n const namespace = await toPromise(output(args.namespace).metadata.name)\n const resolvedName = await toPromise(args.name)\n const metadata = await toPromise(secret.metadata)\n if (!metadata) {\n throw new Error(`Secret ${resolvedName} in namespace ${namespace} not found`)\n }\n\n return secret\n })\n\n super(\n \"highstate:k8s:ExternalSecret\",\n name,\n args,\n opts,\n secret.metadata,\n output(args.namespace),\n secret.data,\n secret.stringData,\n )\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tls.ts"],"names":[],"mappings":"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","file":"chunk-BR2CLUUD.js","sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport type { types } from \"@pulumi/kubernetes\"\nimport { cert_manager, type types as cmTypes } from \"@highstate/cert-manager\"\nimport { getOrCreate } from \"@highstate/contract\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"./namespace\"\nimport { Secret } from \"./secret\"\nimport {\n commonExtraArgs,\n getProvider,\n mapMetadata,\n NamespacedResource,\n type ScopedResourceArgs,\n} from \"./shared\"\n\nexport type CertificateArgs = ScopedResourceArgs & cmTypes.input.cert_manager.v1.CertificateSpec\n\nexport type CreateOrGetCertificateArgs = CertificateArgs & {\n /**\n * The certificate entity to patch/retrieve.\n */\n existing: Input<k8s.Certificate> | undefined\n}\n\n/**\n * Represents a cert-manager Certificate resource with metadata and secret.\n */\nexport abstract class Certificate extends NamespacedResource {\n static readonly apiVersion = \"cert-manager.io/v1\"\n static readonly kind = \"Certificate\"\n\n private _secret?: Output<Secret>\n\n protected constructor(\n type: string,\n private readonly name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n namespace: Output<Namespace>,\n\n /**\n * The spec of the underlying cert-manager certificate.\n */\n readonly spec: Output<cmTypes.output.cert_manager.v1.CertificateSpec>,\n\n /**\n * The status of the underlying cert-manager certificate.\n */\n readonly status: Output<cmTypes.output.cert_manager.v1.CertificateStatus>,\n ) {\n super(type, name, args, opts, metadata, namespace)\n }\n\n /**\n * The Highstate certificate entity.\n */\n get entity(): Output<k8s.NamespacedResource> {\n return output(this.entityBase)\n }\n\n /**\n * The secret containing the certificate data.\n */\n get secret(): Output<Secret> {\n if (this._secret) {\n return this._secret\n }\n\n this._secret = output({\n secretName: this.spec.apply(spec => spec.secretName),\n namespace: this.namespace,\n }).apply(({ secretName, namespace }) => {\n return Secret.get(`${this.name}.secret`, {\n name: secretName,\n namespace,\n })\n })\n\n return this._secret\n }\n\n /**\n * Creates a new certificate.\n */\n static create(name: string, args: CertificateArgs, opts?: ComponentResourceOptions): Certificate {\n return new CreatedCertificate(name, args, opts)\n }\n\n /**\n * Creates a new certificate or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the certificate name.\n * @param args The arguments to create or patch the certificate with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetCertificateArgs,\n opts?: ComponentResourceOptions,\n ): Certificate {\n if (args.existing) {\n return new CertificatePatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedCertificate(name, args, opts)\n }\n\n /**\n * Creates a new certificate or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the certificate name. Will not be used when existing certificate is retrieved.\n * @param args The arguments to create or get the certificate with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetCertificateArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Certificate> {\n if (args.existing) {\n return await Certificate.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedCertificate(name, args, opts)\n }\n\n /**\n * Patches an existing certificate.\n *\n * Will throw an error if the certificate does not exist.\n *\n * @param name The name of the resource. May not be the same as the certificate name.\n * @param args The arguments to patch the certificate with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: CertificateArgs, opts?: ComponentResourceOptions): Certificate {\n return new CertificatePatch(name, args, opts)\n }\n\n /**\n * Wraps an existing cert-manager certificate.\n */\n static wrap(\n name: string,\n args: WrappedCertificateArgs,\n opts?: ComponentResourceOptions,\n ): Certificate {\n return new WrappedCertificate(name, args, opts)\n }\n\n /**\n * Gets an existing certificate.\n *\n * Will throw an error if the certificate does not exist.\n */\n static get(\n name: string,\n args: ExternalCertificateArgs,\n opts?: ComponentResourceOptions,\n ): Certificate {\n return new ExternalCertificate(name, args, opts)\n }\n\n private static readonly certificateCache = new Map<string, Certificate>()\n\n /**\n * Gets an existing certificate for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the certificate for.\n * @param cluster The cluster where the certificate is located.\n */\n static for(entity: k8s.Certificate, cluster: Input<k8s.Cluster>): Certificate {\n return getOrCreate(\n Certificate.certificateCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Certificate.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResourceAsync(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing certificate for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the certificate for.\n * @param cluster The cluster where the certificate is located.\n */\n static async forAsync(\n entity: Input<k8s.Certificate>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Certificate> {\n const resolvedEntity = await toPromise(entity)\n return Certificate.for(resolvedEntity, output(cluster))\n }\n}\n\nclass CreatedCertificate extends Certificate {\n constructor(name: string, args: CertificateArgs, opts?: ComponentResourceOptions) {\n const certificate = output(args.namespace).cluster.apply(cluster => {\n return new cert_manager.v1.Certificate(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: omit(args, commonExtraArgs),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Certificate\",\n name,\n args,\n opts,\n\n certificate.metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n certificate.spec,\n certificate.status,\n )\n }\n}\n\nclass CertificatePatch extends Certificate {\n constructor(name: string, args: CertificateArgs, opts?: ComponentResourceOptions) {\n const certificate = output(args.namespace).cluster.apply(cluster => {\n return new cert_manager.v1.CertificatePatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: omit(args, commonExtraArgs),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:CertificatePatch\",\n name,\n args,\n opts,\n\n certificate.metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n certificate.spec,\n certificate.status,\n )\n }\n}\n\nexport type WrappedCertificateArgs = {\n /**\n * The underlying cert-manager certificate to wrap.\n */\n certificate: Input<cert_manager.v1.Certificate>\n\n /**\n * The namespace where the certificate is located.\n */\n namespace: Input<Namespace>\n}\n\nclass WrappedCertificate extends Certificate {\n constructor(name: string, args: WrappedCertificateArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedCertificate\",\n name,\n args,\n opts,\n\n output(args.certificate).metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n output(args.certificate).spec,\n output(args.certificate).status,\n )\n }\n}\n\nexport type ExternalCertificateArgs = {\n /**\n * The name of the certificate to get.\n */\n name: Input<string>\n\n /**\n * The namespace of the certificate to get.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalCertificate extends Certificate {\n constructor(name: string, args: ExternalCertificateArgs, opts?: ComponentResourceOptions) {\n const certificate = output(args.namespace).cluster.apply(cluster => {\n return cert_manager.v1.Certificate.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalCertificate\",\n name,\n args,\n opts,\n\n certificate.metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n certificate.spec,\n certificate.status,\n )\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/gateway/backend.ts","../src/gateway/gateway.ts","../src/gateway/http-route.ts","../src/gateway/tcp-route.ts","../src/gateway/udp-route.ts"],"names":["output","gateway","ComponentResource","normalizeInputsAndMap"],"mappings":"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","file":"chunk-DCUMJSO6.js","sourcesContent":["import type { core } from \"@pulumi/kubernetes\"\nimport { type Input, type Output, output, type Unwrap } from \"@highstate/pulumi\"\nimport { Service } from \"../service\"\n\nexport interface FullBackendRef {\n /**\n * The name of the resource being referenced.\n */\n name: Input<string>\n\n /**\n * The namespace of the resource being referenced.\n * May be undefined if the resource is not in a namespace.\n */\n namespace?: Input<string | undefined>\n\n /**\n * The port of the resource being referenced.\n */\n port: Input<number>\n}\n\nexport interface ServiceBackendRef {\n /**\n * The name of the service being referenced.\n */\n service: Input<core.v1.Service>\n\n /**\n * The port of the service being referenced.\n */\n port: Input<number>\n}\n\nexport type BackendRef = FullBackendRef | ServiceBackendRef | Service\n\nexport function resolveBackendRef(ref: BackendRef): Output<Unwrap<FullBackendRef>> {\n if (Service.isInstance(ref)) {\n return output({\n name: ref.metadata.name,\n namespace: ref.metadata.namespace,\n port: ref.spec.ports[0].port,\n })\n }\n\n if (\"service\" in ref) {\n const service = output(ref.service)\n\n return output({\n name: service.metadata.name,\n namespace: service.metadata.namespace,\n port: ref.port,\n })\n }\n\n return output({\n name: ref.name,\n namespace: ref.namespace,\n port: ref.port,\n })\n}\n","import type { k8s, network } from \"@highstate/library\"\nimport type { types } from \"@pulumi/kubernetes\"\nimport type { SetRequired } from \"type-fest\"\nimport { parseEndpoint } from \"@highstate/common\"\nimport { getOrCreate } from \"@highstate/contract\"\nimport { gateway, type types as gwTypes } from \"@highstate/gateway-api\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"../namespace\"\nimport {\n commonExtraArgs,\n getProvider,\n mapMetadata,\n NamespacedResource,\n type ScopedResourceArgs,\n} from \"../shared\"\n\nexport type GatewayArgs = ScopedResourceArgs & {\n /**\n * The FQDN to configure the listeners for.\n */\n fqdn?: Input<string>\n\n /**\n * The FQDNs to configure the listeners for.\n */\n fqdns?: InputArray<string>\n} & gwTypes.input.gateway.v1.GatewaySpec\n\nexport type CreateOrGetGatewayArgs = GatewayArgs & {\n /**\n * The gateway entity to patch/retrieve.\n */\n existing: Input<k8s.Gateway> | undefined\n}\n\nconst gatewayExtraArgs = [...commonExtraArgs, \"fqdn\", \"fqdns\"] as const\n\n/**\n * Represents a Kubernetes Gateway resource.\n */\nexport abstract class Gateway extends NamespacedResource {\n static readonly apiVersion = \"gateway.networking.k8s.io/v1\"\n static readonly kind = \"Gateway\"\n\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n /**\n * The namespace where the gateway is located.\n */\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n namespace: Output<Namespace>,\n\n /**\n * The spec of the underlying Gateway resource.\n */\n readonly spec: Output<gwTypes.output.gateway.v1.GatewaySpec>,\n\n /**\n * The status of the underlying Gateway resource.\n */\n readonly status: Output<gwTypes.output.gateway.v1.GatewayStatus>,\n ) {\n super(type, name, args, opts, metadata, namespace)\n }\n\n /**\n * The Highstate gateway entity.\n */\n get entity(): Output<k8s.Gateway> {\n return output(this.entityBase)\n }\n\n /**\n * Returns the endpoints L3 endpoints on which the gateway is exposed.\n */\n get endpoints(): Output<network.L3Endpoint[]> {\n return this.status.addresses.apply(addresses => {\n if (!addresses) {\n return []\n }\n\n return addresses.map(address => parseEndpoint(address.value))\n })\n }\n\n /**\n * Creates a new gateway.\n */\n static create(name: string, args: GatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new CreatedGateway(name, args, opts)\n }\n\n /**\n * Creates a new gateway or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the gateway name.\n * @param args The arguments to create or patch the gateway with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetGatewayArgs,\n opts?: ComponentResourceOptions,\n ): Gateway {\n if (args.existing) {\n return new GatewayPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedGateway(name, args, opts)\n }\n\n /**\n * Creates a new gateway or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the gateway name. Will not be used when existing gateway is retrieved.\n * @param args The arguments to create or get the gateway with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetGatewayArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Gateway> {\n if (args.existing) {\n return await Gateway.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedGateway(name, args, opts)\n }\n\n /**\n * Patches an existing gateway.\n *\n * Will throw an error if the gateway does not exist.\n *\n * @param name The name of the resource. May not be the same as the gateway name.\n * @param args The arguments to patch the gateway with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: GatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new GatewayPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes gateway.\n */\n static wrap(name: string, args: WrappedGatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new WrappedGateway(name, args, opts)\n }\n\n /**\n * Gets an existing gateway.\n *\n * Will throw an error if the gateway does not exist.\n */\n static get(name: string, args: ExternalGatewayArgs, opts?: ComponentResourceOptions): Gateway {\n return new ExternalGateway(name, args, opts)\n }\n\n private static readonly gatewayCache = new Map<string, Gateway>()\n\n /**\n * Gets an existing gateway for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{gatewayName}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the gateway for.\n * @param cluster The cluster where the gateway is located.\n */\n static for(entity: k8s.Gateway, cluster: Input<k8s.Cluster>): Gateway {\n return getOrCreate(\n Gateway.gatewayCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Gateway.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResourceAsync(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing gateway for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{gatewayName}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the gateway for.\n * @param cluster The cluster where the gateway is located.\n */\n static async forAsync(entity: Input<k8s.Gateway>, cluster: Input<k8s.Cluster>): Promise<Gateway> {\n const resolvedEntity = await toPromise(entity)\n\n return Gateway.for(resolvedEntity, output(cluster))\n }\n\n /**\n * Creates a gateway with the provided name/namespace/cluster only once.\n *\n * It automatically names the resource with the following format: `{name}.{namespace}.{clusterName}.{clusterId}`.\n *\n * On subsequent calls the gateway is patched with the union of existing and requested listeners.\n * Only the listeners field is modified to avoid altering other spec fields.\n *\n * @param name The name of the gateway to create.\n * @param args The arguments to create the gateway with.\n * @param opts Optional resource options.\n */\n static async createOnce(\n args: SetRequired<GatewayArgs, \"name\">,\n opts?: ComponentResourceOptions,\n ): Promise<Gateway> {\n const { name, namespace, cluster } = await toPromise({\n name: args.name,\n namespace: output(args.namespace).metadata.name,\n cluster: output(args.namespace).cluster,\n })\n\n const fullName = `${name}.${namespace}.${cluster.name}.${cluster.id}`\n\n const existing = Gateway.gatewayCache.get(fullName)\n if (existing) {\n Gateway.patch(\n fullName,\n {\n name,\n namespace: args.namespace,\n listeners: args.listeners,\n },\n opts,\n )\n\n return existing\n }\n\n const created = Gateway.create(\n fullName,\n {\n ...args,\n name,\n namespace: args.namespace,\n },\n opts,\n )\n\n Gateway.gatewayCache.set(fullName, created)\n return created\n }\n}\n\nclass CreatedGateway extends Gateway {\n constructor(name: string, args: GatewayArgs, opts?: ComponentResourceOptions) {\n const gatewayResource = output(args.namespace).cluster.apply(cluster => {\n return new gateway.v1.Gateway(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: omit(args, gatewayExtraArgs),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Gateway\",\n name,\n args,\n opts,\n\n gatewayResource.metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n gatewayResource.spec,\n gatewayResource.status,\n )\n }\n}\n\nclass GatewayPatch extends Gateway {\n constructor(name: string, args: GatewayArgs, opts?: ComponentResourceOptions) {\n const gatewayResource = output(args.namespace).cluster.apply(cluster => {\n return new gateway.v1.GatewayPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: omit(args, gatewayExtraArgs),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:GatewayPatch\",\n name,\n args,\n opts,\n\n gatewayResource.metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n gatewayResource.spec,\n gatewayResource.status,\n )\n }\n}\n\nexport type WrappedGatewayArgs = {\n /**\n * The underlying Kubernetes gateway to wrap.\n */\n gateway: Input<gateway.v1.Gateway>\n\n /**\n * The namespace where the gateway is located.\n */\n namespace: Input<Namespace>\n}\n\nclass WrappedGateway extends Gateway {\n constructor(name: string, args: WrappedGatewayArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedGateway\",\n name,\n args,\n opts,\n\n output(args.gateway).metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n output(args.gateway).spec,\n output(args.gateway).status,\n )\n }\n}\n\nexport type ExternalGatewayArgs = {\n /**\n * The name of the gateway to get.\n */\n name: Input<string>\n\n /**\n * The namespace of the gateway to get.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalGateway extends Gateway {\n constructor(name: string, args: ExternalGatewayArgs, opts?: ComponentResourceOptions) {\n const gatewayResource = output(args.namespace).cluster.apply(cluster => {\n return gateway.v1.Gateway.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalGateway\",\n name,\n args,\n opts,\n\n gatewayResource.metadata as Output<types.output.meta.v1.ObjectMeta>,\n output(args.namespace),\n gatewayResource.spec,\n gatewayResource.status,\n )\n }\n}\n","import type { Gateway } from \"./gateway\"\nimport { gateway, type types } from \"@highstate/gateway-api\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n normalize,\n normalizeInputs,\n normalizeInputsAndMap,\n type Output,\n output,\n} from \"@highstate/pulumi\"\nimport { map, pipe } from \"remeda\"\nimport { getProvider, mapMetadata, type ScopedResourceArgs } from \"../shared\"\nimport { type BackendRef, resolveBackendRef } from \"./backend\"\n\nexport type HttpRouteArgs = Omit<ScopedResourceArgs, \"namespace\"> & {\n /**\n * The gateway to associate with the route.\n */\n gateway: Input<Gateway>\n\n /**\n * The alias for `hostnames: [hostname]`.\n */\n hostname?: Input<string>\n\n /**\n * The rule of the route.\n */\n rule?: Input<HttpRouteRuleArgs>\n\n /**\n * The rules of the route.\n */\n rules?: InputArray<HttpRouteRuleArgs>\n} & Omit<Partial<types.input.gateway.v1.HTTPRouteSpec>, \"rules\">\n\nexport type HttpRouteRuleArgs = Omit<\n types.input.gateway.v1.HTTPRouteSpecRules,\n \"matches\" | \"filters\" | \"backendRefs\"\n> & {\n /**\n * The conditions of the rule.\n * Can be specified as string to match on the path.\n */\n matches?: InputArray<HttpRouteRuleMatchOptions>\n\n /**\n * The condition of the rule.\n * Can be specified as string to match on the path.\n */\n match?: Input<HttpRouteRuleMatchOptions>\n\n /**\n * The filters of the rule.\n */\n filters?: InputArray<types.input.gateway.v1.HTTPRouteSpecRulesFilters>\n\n /**\n * The filter of the rule.\n */\n filter?: Input<types.input.gateway.v1.HTTPRouteSpecRulesFilters>\n\n /**\n * The service to route to.\n */\n backend?: Input<BackendRef>\n\n /**\n * The services to route to.\n */\n backends?: InputArray<BackendRef>\n}\n\nexport type HttpRouteRuleMatchOptions = types.input.gateway.v1.HTTPRouteSpecRulesMatches | string\n\nexport class HttpRoute extends ComponentResource {\n /**\n * The underlying Kubernetes resource.\n */\n public readonly route: Output<gateway.v1.HTTPRoute>\n\n constructor(name: string, args: HttpRouteArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:k8s:HttpRoute\", name, args, opts)\n\n this.route = output(args.gateway).cluster.apply(cluster => {\n return new gateway.v1.HTTPRoute(\n name,\n {\n metadata: mapMetadata(args, name).apply(metadata => ({\n ...metadata,\n namespace: output(args.gateway).namespace.metadata.name,\n })),\n spec: {\n hostnames: normalizeInputs(args.hostname, args.hostnames),\n\n parentRefs: [\n {\n name: output(args.gateway).metadata.name,\n },\n ],\n\n rules: normalizeInputsAndMap(args.rule, args.rules, rule => ({\n timeouts: rule.timeouts,\n\n matches: pipe(\n normalize(rule.match, rule.matches),\n map(mapHttpRouteRuleMatch),\n addDefaultPathMatch,\n ),\n\n filters: normalize(rule.filter, rule.filters),\n backendRefs: normalizeInputsAndMap(rule.backend, rule.backends, resolveBackendRef),\n })),\n } satisfies types.input.gateway.v1.HTTPRouteSpec,\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n }\n}\n\nfunction addDefaultPathMatch(\n matches: types.input.gateway.v1.HTTPRouteSpecRulesMatches[],\n): types.input.gateway.v1.HTTPRouteSpecRulesMatches[] {\n return matches.length ? matches : [{ path: { type: \"PathPrefix\", value: \"/\" } }]\n}\n\nexport function mapHttpRouteRuleMatch(\n match: HttpRouteRuleMatchOptions,\n): types.input.gateway.v1.HTTPRouteSpecRulesMatches {\n if (typeof match === \"string\") {\n return { path: { type: \"PathPrefix\", value: match } }\n }\n\n return match\n}\n","import type { Gateway } from \"./gateway\"\nimport { gateway, type types } from \"@highstate/gateway-api\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n normalizeInputsAndMap,\n type Output,\n output,\n} from \"@highstate/pulumi\"\nimport { getProvider, mapMetadata, type ScopedResourceArgs } from \"../shared\"\nimport { type BackendRef, resolveBackendRef } from \"./backend\"\n\nexport type TcpRouteArgs = Omit<ScopedResourceArgs, \"namespace\"> & {\n /**\n * The gateway to associate with the route.\n */\n gateway: Input<Gateway>\n\n /**\n * The name of the listener to attach the route to.\n */\n listenerName: Input<string>\n\n /**\n * The backend reference handled by the route.\n */\n backend?: Input<BackendRef>\n\n /**\n * The backend references handled by the route.\n */\n backends?: InputArray<BackendRef>\n}\n\nexport class TcpRoute extends ComponentResource {\n /**\n * The underlying Kubernetes resource.\n */\n public readonly route: Output<gateway.v1alpha2.TCPRoute>\n\n constructor(name: string, args: TcpRouteArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:k8s:TcpRoute\", name, args, opts)\n\n const gatewayOutput = output(args.gateway)\n\n const parentRefs = output({\n gateway: gatewayOutput,\n listenerName: args.listenerName,\n }).apply(\n ({ gateway, listenerName }) =>\n [\n {\n group: \"gateway.networking.k8s.io\",\n kind: \"Gateway\",\n name: gateway.metadata.name,\n namespace: gateway.namespace.metadata.name,\n sectionName: listenerName,\n },\n ] satisfies types.input.gateway.v1alpha2.TCPRouteSpecParentRefs[],\n )\n\n const backendRefs = normalizeInputsAndMap(args.backend, args.backends, resolveBackendRef)\n\n this.route = gatewayOutput.cluster.apply(cluster => {\n return new gateway.v1alpha2.TCPRoute(\n name,\n {\n metadata: mapMetadata(args, name).apply(metadata => ({\n ...metadata,\n namespace: gatewayOutput.namespace.metadata.name,\n })),\n spec: {\n parentRefs,\n rules: [\n {\n backendRefs,\n },\n ],\n } satisfies types.input.gateway.v1alpha2.TCPRouteSpec,\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n }\n}\n","import type { Gateway } from \"./gateway\"\nimport { gateway, type types } from \"@highstate/gateway-api\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n normalizeInputsAndMap,\n type Output,\n output,\n} from \"@highstate/pulumi\"\nimport { getProvider, mapMetadata, type ScopedResourceArgs } from \"../shared\"\nimport { type BackendRef, resolveBackendRef } from \"./backend\"\n\nexport type UdpRouteArgs = Omit<ScopedResourceArgs, \"namespace\"> & {\n /**\n * The gateway to associate with the route.\n */\n gateway: Input<Gateway>\n\n /**\n * The name of the listener to attach the route to.\n */\n listenerName: Input<string>\n\n /**\n * The backend reference handled by the route.\n */\n backend?: Input<BackendRef>\n\n /**\n * The backend references handled by the route.\n */\n backends?: InputArray<BackendRef>\n}\n\nexport class UdpRoute extends ComponentResource {\n /**\n * The underlying Kubernetes resource.\n */\n public readonly route: Output<gateway.v1alpha2.UDPRoute>\n\n constructor(name: string, args: UdpRouteArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:k8s:UdpRoute\", name, args, opts)\n\n const gatewayOutput = output(args.gateway)\n\n const parentRefs = output({\n gateway: gatewayOutput,\n listenerName: args.listenerName,\n }).apply(\n ({ gateway, listenerName }) =>\n [\n {\n group: \"gateway.networking.k8s.io\",\n kind: \"Gateway\",\n name: gateway.metadata.name,\n namespace: gateway.namespace.metadata.name,\n sectionName: listenerName,\n },\n ] satisfies types.input.gateway.v1alpha2.UDPRouteSpecParentRefs[],\n )\n\n const backendRefs = normalizeInputsAndMap(args.backend, args.backends, resolveBackendRef)\n\n this.route = gatewayOutput.cluster.apply(cluster => {\n return new gateway.v1alpha2.UDPRoute(\n name,\n {\n metadata: mapMetadata(args, name).apply(metadata => ({\n ...metadata,\n namespace: gatewayOutput.namespace.metadata.name,\n })),\n spec: {\n parentRefs,\n rules: [\n {\n backendRefs,\n },\n ],\n } satisfies types.input.gateway.v1alpha2.UDPRouteSpec,\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/job.ts"],"names":["args","podTemplate"],"mappings":"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","file":"chunk-FE4SHRAJ.js","sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport type { Container } from \"./container\"\nimport type { NetworkPolicy } from \"./network-policy\"\nimport { getOrCreate, type UnitTerminal } from \"@highstate/contract\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n type Output,\n output,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { batch, type types } from \"@pulumi/kubernetes\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"./namespace\"\nimport { commonExtraArgs, getProvider, mapMetadata, type ScopedResourceArgs } from \"./shared\"\nimport {\n getWorkloadComponents,\n Workload,\n type WorkloadArgs,\n type WorkloadTerminalArgs,\n} from \"./workload\"\n\nexport type JobArgs = ScopedResourceArgs &\n Omit<Partial<types.input.batch.v1.JobSpec>, \"template\"> & {\n template?: {\n metadata?: types.input.meta.v1.ObjectMeta\n spec?: Partial<types.input.core.v1.PodSpec>\n }\n } & WorkloadArgs\n\nexport type CreateOrGetJobArgs = JobArgs & {\n /**\n * The job entity to patch/retrieve.\n */\n existing: Input<k8s.NamespacedResource> | undefined\n}\n\n/**\n * Represents a Kubernetes Job resource with metadata and spec.\n */\nexport abstract class Job extends Workload {\n static apiVersion = \"batch/v1\"\n static kind = \"Job\"\n\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n namespace: Output<Namespace>,\n terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,\n containers: Output<Container[]>,\n networkPolicy: Output<NetworkPolicy | undefined>,\n\n /**\n * The spec of the underlying Kubernetes job.\n */\n readonly spec: Output<types.output.batch.v1.JobSpec>,\n\n /**\n * The status of the underlying Kubernetes job.\n */\n readonly status: Output<types.output.batch.v1.JobStatus>,\n ) {\n super(\n type,\n name,\n args,\n opts,\n metadata,\n namespace,\n terminalArgs,\n containers,\n spec.template,\n networkPolicy,\n )\n }\n\n protected override get templateMetadata(): Output<types.output.meta.v1.ObjectMeta> {\n return this.spec.template.metadata\n }\n\n /**\n * The Highstate job entity.\n */\n get entity(): Output<k8s.Job> {\n return output(this.entityBase)\n }\n\n protected getTerminalMeta(): Output<UnitTerminal[\"meta\"]> {\n return output({\n title: \"Job\",\n globalTitle: interpolate`Job | ${this.metadata.name}`,\n description: \"The shell inside the job.\",\n icon: \"devicon:kubernetes\",\n })\n }\n\n protected get resourceType(): string {\n return \"job\"\n }\n\n /**\n * Creates a new job.\n */\n static create(name: string, args: JobArgs, opts?: ComponentResourceOptions): Job {\n return new CreatedJob(name, args, opts)\n }\n\n /**\n * Creates a new job or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the job name.\n * @param args The arguments to create or patch the job with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetJobArgs,\n opts?: ComponentResourceOptions,\n ): Job {\n if (args.existing) {\n return new JobPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedJob(name, args, opts)\n }\n\n /**\n * Creates a new job or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the job name. Will not be used when existing job is retrieved.\n * @param args The arguments to create or get the job with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetJobArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Job> {\n if (args.existing) {\n return await Job.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedJob(name, args, opts)\n }\n\n /**\n * Patches an existing job.\n *\n * Will throw an error if the job does not exist.\n *\n * @param name The name of the resource. May not be the same as the job name.\n * @param args The arguments to patch the job with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: JobArgs, opts?: ComponentResourceOptions): Job {\n return new JobPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes job.\n */\n static wrap(name: string, args: WrappedJobArgs, opts?: ComponentResourceOptions): Job {\n return new WrappedJob(name, args, opts)\n }\n\n /**\n * Gets an existing job.\n *\n * Will throw an error if the job does not exist.\n */\n static get(name: string, args: ExternalJobArgs, opts?: ComponentResourceOptions): Job {\n return new ExternalJob(name, args, opts)\n }\n\n private static readonly jobCache = new Map<string, Job>()\n\n /**\n * Gets an existing job for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the job for.\n * @param cluster The cluster where the job is located.\n */\n static for(entity: k8s.NamespacedResource, cluster: Input<k8s.Cluster>): Job {\n return getOrCreate(\n Job.jobCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Job.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing job for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the job for.\n * @param cluster The cluster where the job is located.\n */\n static async forAsync(\n entity: Input<k8s.NamespacedResource>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Job> {\n const resolvedEntity = await toPromise(entity)\n return Job.for(resolvedEntity, cluster)\n }\n}\n\nconst jobExtraArgs = [...commonExtraArgs, \"container\", \"containers\"] as const\n\nclass CreatedJob extends Job {\n constructor(name: string, args: JobArgs, opts?: ComponentResourceOptions) {\n const { podTemplate, containers, networkPolicy } = getWorkloadComponents(\n name,\n args,\n () => this,\n opts,\n )\n\n const job = output(args.namespace).cluster.apply(cluster => {\n return new batch.v1.Job(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate }).apply(({ args, podTemplate }) => {\n return deepmerge(\n {\n template: deepmerge(\n {\n spec: {\n restartPolicy: \"Never\",\n },\n },\n podTemplate,\n ),\n },\n omit(args, jobExtraArgs) as types.input.batch.v1.JobSpec,\n )\n }),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Job\",\n name,\n args,\n opts,\n job.metadata,\n output(args.namespace),\n output(args.terminal ?? {}),\n containers,\n networkPolicy,\n job.spec,\n job.status,\n )\n }\n}\n\nclass JobPatch extends Job {\n constructor(name: string, args: JobArgs, opts?: ComponentResourceOptions) {\n const { podTemplate, containers, networkPolicy } = getWorkloadComponents(\n name,\n args,\n () => this,\n opts,\n true,\n )\n\n const job = output(args.namespace).cluster.apply(cluster => {\n return new batch.v1.JobPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate }).apply(({ args, podTemplate }) => {\n return deepmerge(\n { template: podTemplate } satisfies types.input.batch.v1.JobSpec,\n omit(args, jobExtraArgs) as types.input.batch.v1.JobSpec,\n )\n }),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:JobPatch\",\n name,\n args,\n opts,\n job.metadata,\n output(args.namespace),\n output(args.terminal ?? {}),\n containers,\n networkPolicy,\n job.spec,\n job.status,\n )\n\n this.registerOutputs({\n metadata: this.metadata,\n spec: this.spec,\n status: this.status,\n })\n }\n}\n\nexport type WrappedJobArgs = {\n /**\n * The underlying Kubernetes job to wrap.\n */\n job: Input<batch.v1.Job>\n\n /**\n * The namespace where the job is located.\n */\n namespace: Input<Namespace>\n\n /**\n * The args for the terminal to use.\n */\n terminal?: Input<WorkloadTerminalArgs>\n}\n\nclass WrappedJob extends Job {\n constructor(name: string, args: WrappedJobArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedJob\",\n name,\n args,\n opts,\n\n output(args.job).metadata,\n output(args.namespace),\n output(args.terminal ?? {}),\n output([]),\n output(undefined),\n\n output(args.job).spec,\n output(args.job).status,\n )\n }\n}\n\nexport type ExternalJobArgs = {\n /**\n * The name of the job to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the job is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalJob extends Job {\n constructor(name: string, args: ExternalJobArgs, opts?: ComponentResourceOptions) {\n const job = output(args.namespace).cluster.apply(cluster => {\n return batch.v1.Job.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalJob\",\n name,\n args,\n opts,\n\n job.metadata,\n output(args.namespace),\n output({}),\n output([]),\n output(undefined),\n\n job.spec,\n job.status,\n )\n }\n}\n"]}
@@ -1,155 +0,0 @@
1
- import { Secret } from './chunk-4G6LLC2X.js';
2
- import { getProvider, getNamespaceName, NamespacedResource } from './chunk-OBDQONMV.js';
3
- import { ComponentResource, output, normalizeInputs, interpolate, toPromise } from '@highstate/pulumi';
4
- import { KubeConfig } from '@kubernetes/client-node';
5
- import { core, rbac } from '@pulumi/kubernetes';
6
- import { map, unique } from 'remeda';
7
- import { stringify } from 'yaml';
8
-
9
- var ClusterAccessScope = class extends ComponentResource {
10
- /**
11
- * The cluster entity with the reduced access.
12
- */
13
- cluster;
14
- constructor(name, args, opts) {
15
- super("highstate:k8s:ClusterAccessScope", name, args, opts);
16
- const { serviceAccount, kubeconfig } = output(args.namespace).cluster.apply((cluster) => {
17
- const provider = getProvider(cluster);
18
- const namespaceName = output(args.namespace).metadata.name;
19
- const serviceAccount2 = new core.v1.ServiceAccount(
20
- name,
21
- {
22
- metadata: {
23
- name,
24
- namespace: namespaceName
25
- }
26
- },
27
- { provider }
28
- );
29
- const clusterRole = new rbac.v1.ClusterRole(
30
- name,
31
- {
32
- metadata: {
33
- name: interpolate`hs.${namespaceName}.${name}`,
34
- annotations: {
35
- "kubernetes.io/description": interpolate`Created by Highstate for the ServiceAccount "${name}" in the namespace "${namespaceName}".`
36
- }
37
- },
38
- rules: output({
39
- rules: normalizeInputs(args.rule, args.rules),
40
- resources: args.resources ?? []
41
- }).apply(({ rules, resources }) => mergeResources(rules, resources))
42
- },
43
- { provider }
44
- );
45
- const createRoleBinding = (namespace) => {
46
- return new rbac.v1.RoleBinding(
47
- name,
48
- {
49
- metadata: { name, namespace },
50
- roleRef: {
51
- kind: "ClusterRole",
52
- name: clusterRole.metadata.name,
53
- apiGroup: "rbac.authorization.k8s.io"
54
- },
55
- subjects: [
56
- {
57
- kind: "ServiceAccount",
58
- name: serviceAccount2.metadata.name,
59
- namespace: namespaceName
60
- }
61
- ]
62
- },
63
- { provider }
64
- );
65
- };
66
- if (args.clusterWide) {
67
- new rbac.v1.ClusterRoleBinding(
68
- name,
69
- {
70
- metadata: { name },
71
- roleRef: {
72
- kind: "ClusterRole",
73
- name: clusterRole.metadata.name,
74
- apiGroup: "rbac.authorization.k8s.io"
75
- },
76
- subjects: [
77
- {
78
- kind: "ServiceAccount",
79
- name: serviceAccount2.metadata.name,
80
- namespace: namespaceName
81
- }
82
- ]
83
- },
84
- { provider }
85
- );
86
- } else {
87
- if (args.allowOriginNamespace !== false) {
88
- createRoleBinding(namespaceName);
89
- }
90
- output(args.extraNamespaces ?? []).apply(map(getNamespaceName)).apply(map(createRoleBinding));
91
- }
92
- return { serviceAccount: serviceAccount2, kubeconfig: cluster.kubeconfig };
93
- });
94
- const accessTokenSecret = Secret.create(`${name}-token`, {
95
- namespace: args.namespace,
96
- type: "kubernetes.io/service-account-token",
97
- metadata: {
98
- annotations: {
99
- "kubernetes.io/service-account.name": serviceAccount.metadata.name
100
- }
101
- }
102
- });
103
- this.cluster = output({
104
- cluster: output(args.namespace).cluster,
105
- kubeconfig,
106
- newToken: accessTokenSecret.getValue("token"),
107
- serviceAccount: serviceAccount.metadata.name
108
- }).apply(({ cluster, kubeconfig: kubeconfig2, newToken, serviceAccount: serviceAccount2 }) => {
109
- const config = new KubeConfig();
110
- config.loadFromString(kubeconfig2);
111
- config.users = [];
112
- config.contexts = [];
113
- config.addUser({ name: serviceAccount2, token: newToken });
114
- config.addContext({
115
- name: config.clusters[0].name,
116
- cluster: config.clusters[0].name,
117
- user: serviceAccount2
118
- });
119
- config.setCurrentContext(config.clusters[0].name);
120
- return {
121
- ...cluster,
122
- kubeconfig: stringify(JSON.parse(config.exportConfig()))
123
- };
124
- });
125
- }
126
- };
127
- async function mergeResources(rules, resources) {
128
- for (const resource of resources) {
129
- const entity = await toPromise(
130
- resource instanceof NamespacedResource ? resource.entity : resource
131
- );
132
- const apiGroup = entity.apiVersion.includes("/") ? entity.apiVersion.split("/")[0] : "";
133
- const resourceCollection = `${entity.kind.toLowerCase()}s`;
134
- const matchingRule = rules.find((rule) => {
135
- const apiGroupsMatch = rule.apiGroups?.length === 1 && rule.apiGroups[0] === apiGroup;
136
- const resourcesMatch = rule.resources?.length === 1 && rule.resources[0] === resourceCollection;
137
- return apiGroupsMatch && resourcesMatch;
138
- });
139
- if (!matchingRule) {
140
- continue;
141
- }
142
- matchingRule.resourceNames = await toPromise(
143
- unique([
144
- //
145
- ...matchingRule.resourceNames ?? [],
146
- entity.metadata.name
147
- ])
148
- );
149
- }
150
- return rules;
151
- }
152
-
153
- export { ClusterAccessScope };
154
- //# sourceMappingURL=chunk-KMLRI5UZ.js.map
155
- //# sourceMappingURL=chunk-KMLRI5UZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rbac.ts"],"names":["serviceAccount","kubeconfig"],"mappings":"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","file":"chunk-KMLRI5UZ.js","sourcesContent":["import type { k8s } from \"@highstate/library\"\nimport type { Namespace } from \"./namespace\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n interpolate,\n normalizeInputs,\n type Output,\n output,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { KubeConfig } from \"@kubernetes/client-node\"\nimport { core, rbac, type types } from \"@pulumi/kubernetes\"\nimport { map, unique } from \"remeda\"\nimport { stringify } from \"yaml\"\nimport { Secret } from \"./secret\"\nimport {\n getNamespaceName,\n getProvider,\n NamespacedResource,\n type NamespaceLike,\n type Resource,\n} from \"./shared\"\n\nexport type ClusterAccessScopeArgs = {\n /**\n * The namespace to create the ServiceAccount in.\n */\n namespace: Input<Namespace>\n\n /**\n * The RBAC rule to apply to the `ServiceAccount`.\n *\n * It will be used to create ClusterRole.\n */\n rule?: Input<types.input.rbac.v1.PolicyRule>\n\n /**\n * The RBAC rules to apply to the `ServiceAccount`.\n *\n * It will be used to create `ClusterRole`.\n */\n rules?: InputArray<types.input.rbac.v1.PolicyRule>\n\n /**\n * Whether to allow the `ServiceAccount` to access resources in the namespace where it is created.\n *\n * By default, it is set to `true`.\n */\n allowOriginNamespace?: boolean\n\n /**\n * The extra namespaces to bind to the `ClusterRole` and allow `ServiceAccount` to access them\n * with specified `rules`.\n */\n extraNamespaces?: InputArray<NamespaceLike>\n\n /**\n * Whether to create `ClusterRoleBinding` instead of `RoleBinding` to allow cluster-wide access.\n *\n * This will allow the `ServiceAccount` to access all namespaces and cluster resources.\n */\n clusterWide?: boolean\n\n /**\n * The extra resources to merge into passed rules.\n *\n * Resources will be merged into rule `resourceNames` if they exactly match rule's `apiGroups` and `resources`.\n * If rule specifies multiple apiGroups or resources, resources will not be merged into it.\n */\n resources?: InputArray<Resource | k8s.Resource>\n}\n\nexport class ClusterAccessScope extends ComponentResource {\n /**\n * The cluster entity with the reduced access.\n */\n readonly cluster: Output<k8s.Cluster>\n\n constructor(name: string, args: ClusterAccessScopeArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:k8s:ClusterAccessScope\", name, args, opts)\n\n const { serviceAccount, kubeconfig } = output(args.namespace).cluster.apply(cluster => {\n const provider = getProvider(cluster)\n const namespaceName = output(args.namespace).metadata.name\n\n const serviceAccount = new core.v1.ServiceAccount(\n name,\n {\n metadata: {\n name,\n namespace: namespaceName,\n },\n },\n { provider },\n )\n\n const clusterRole = new rbac.v1.ClusterRole(\n name,\n {\n metadata: {\n name: interpolate`hs.${namespaceName}.${name}`,\n annotations: {\n \"kubernetes.io/description\": interpolate`Created by Highstate for the ServiceAccount \"${name}\" in the namespace \"${namespaceName}\".`,\n },\n },\n rules: output({\n rules: normalizeInputs(args.rule, args.rules),\n resources: args.resources ?? [],\n }).apply(({ rules, resources }) => mergeResources(rules, resources)),\n },\n { provider },\n )\n\n const createRoleBinding = (namespace: Input<string>) => {\n return new rbac.v1.RoleBinding(\n name,\n {\n metadata: { name, namespace },\n roleRef: {\n kind: \"ClusterRole\",\n name: clusterRole.metadata.name,\n apiGroup: \"rbac.authorization.k8s.io\",\n },\n subjects: [\n {\n kind: \"ServiceAccount\",\n name: serviceAccount.metadata.name,\n namespace: namespaceName,\n },\n ],\n },\n { provider },\n )\n }\n\n if (args.clusterWide) {\n new rbac.v1.ClusterRoleBinding(\n name,\n {\n metadata: { name },\n roleRef: {\n kind: \"ClusterRole\",\n name: clusterRole.metadata.name,\n apiGroup: \"rbac.authorization.k8s.io\",\n },\n subjects: [\n {\n kind: \"ServiceAccount\",\n name: serviceAccount.metadata.name,\n namespace: namespaceName,\n },\n ],\n },\n { provider },\n )\n } else {\n if (args.allowOriginNamespace !== false) {\n createRoleBinding(namespaceName)\n }\n\n output(args.extraNamespaces ?? [])\n .apply(map(getNamespaceName))\n .apply(map(createRoleBinding))\n }\n\n return { serviceAccount, kubeconfig: cluster.kubeconfig }\n })\n\n const accessTokenSecret = Secret.create(`${name}-token`, {\n namespace: args.namespace,\n type: \"kubernetes.io/service-account-token\",\n metadata: {\n annotations: {\n \"kubernetes.io/service-account.name\": serviceAccount.metadata.name,\n },\n },\n })\n\n this.cluster = output({\n cluster: output(args.namespace).cluster,\n kubeconfig,\n newToken: accessTokenSecret.getValue(\"token\"),\n serviceAccount: serviceAccount.metadata.name,\n }).apply(({ cluster, kubeconfig, newToken, serviceAccount }) => {\n const config = new KubeConfig()\n config.loadFromString(kubeconfig)\n\n // clear all existing contexts and users\n config.users = []\n config.contexts = []\n\n config.addUser({ name: serviceAccount, token: newToken })\n\n config.addContext({\n name: config.clusters[0].name,\n cluster: config.clusters[0].name,\n user: serviceAccount,\n })\n\n config.setCurrentContext(config.clusters[0].name)\n\n return {\n ...cluster,\n kubeconfig: stringify(JSON.parse(config.exportConfig())),\n }\n })\n }\n}\n\nasync function mergeResources(\n rules: Unwrap<types.input.rbac.v1.PolicyRule>[],\n resources: (Resource | k8s.Resource)[],\n): Promise<types.input.rbac.v1.PolicyRule[]> {\n for (const resource of resources) {\n const entity = await toPromise(\n resource instanceof NamespacedResource ? resource.entity : resource,\n )\n\n const apiGroup = entity.apiVersion.includes(\"/\") // e.g., \"apps/v1\"\n ? entity.apiVersion.split(\"/\")[0]\n : \"\"\n\n const resourceCollection = `${entity.kind.toLowerCase()}s`\n\n const matchingRule = rules.find(rule => {\n const apiGroupsMatch = rule.apiGroups?.length === 1 && rule.apiGroups[0] === apiGroup\n const resourcesMatch =\n rule.resources?.length === 1 && rule.resources[0] === resourceCollection\n\n return apiGroupsMatch && resourcesMatch\n })\n\n if (!matchingRule) {\n continue\n }\n\n matchingRule.resourceNames = await toPromise(\n unique([\n //\n ...(matchingRule.resourceNames ?? []),\n entity.metadata.name,\n ]),\n )\n }\n\n return rules\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cluster.ts"],"names":[],"mappings":";;;;;;AAOA,eAAsB,iBAAA,CACpB,YACA,iBAAA,EAC4B;AAC5B,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,aAAA,CAAc,SAAS,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,EAAS;AAErC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,EAAQ,SAAA,IAAa,EAAC;AAE7C,IAAA,MAAM,aAAa,SAAA,CAAU,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,YAAY,CAAA;AAC1E,IAAA,MAAM,aAAa,SAAA,CAAU,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,YAAY,CAAA;AAE1E,IAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,YAAA,CAAa,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA;AACxE,IAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,YAAA,CAAa,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA;AAExE,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,eAAA,IAAmB,sBAAsB,QAAA,EAAU;AACrD,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,mBAAmB,iBAAA,KAAsB,QAAA,IAAY,CAAC,gBAAA,CAAiB,eAAe,CAAA,EAAG;AAC3F,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,SAAS,kBAAkB,UAAA,EAAiD;AACjF,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IAEN,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,2CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IAEA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,cAAA,CAAO,kBAAkB,CAAA,CAAE,KAAA;AAAA,MAClC,OAAA,EAAS,CAAC,MAAA,EAAQ,aAAa,CAAA;AAAA,MAE/B,KAAA,EAAO;AAAA,QACL,eAAe,cAAA,CAAe,YAAA,EAAc,YAAY,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,QAE1E,aAAA,EAAe,cAAA;AAAA,UACb,YAAA;AAAA,UACA,IAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,UAAA;AAAA;AASF,OACF;AAAA,MAEA,GAAA,EAAK;AAAA,QACH,UAAA,EAAY;AAAA;AACd;AACF,GACD,CAAA;AACH","file":"chunk-LGHFSXNT.js","sourcesContent":["import type { k8s, network } from \"@highstate/library\"\nimport { isPrivateAddress, parseAddress } from \"@highstate/common\"\nimport { text, type UnitTerminal } from \"@highstate/contract\"\nimport { fileFromString, type Input, type Output, output } from \"@highstate/pulumi\"\nimport { CoreV1Api, type KubeConfig } from \"@kubernetes/client-node\"\nimport { images } from \"./shared\"\n\nexport async function detectExternalIps(\n kubeConfig: KubeConfig,\n internalIpsPolicy: k8s.InternalIpsPolicy,\n): Promise<network.Address[]> {\n const nodeApi = kubeConfig.makeApiClient(CoreV1Api)\n const nodes = await nodeApi.listNode()\n\n return nodes.items.flatMap(node => {\n const addresses = node.status?.addresses ?? []\n\n const externalIp = addresses.find(address => address.type === \"ExternalIP\")\n const internalIp = addresses.find(address => address.type === \"InternalIP\")\n\n const externalAddress = externalIp ? parseAddress(externalIp.address) : undefined\n const internalAddress = internalIp ? parseAddress(internalIp.address) : undefined\n\n const result: network.Address[] = []\n\n if (externalAddress) {\n result.push(externalAddress)\n }\n\n if (internalAddress && internalIpsPolicy === \"always\") {\n result.push(internalAddress)\n }\n\n if (internalAddress && internalIpsPolicy === \"public\" && !isPrivateAddress(internalAddress)) {\n result.push(internalAddress)\n }\n\n return result\n })\n}\n\nexport function createK8sTerminal(kubeconfig: Input<string>): Output<UnitTerminal> {\n return output({\n name: \"management\",\n\n meta: {\n title: \"Cluster Management\",\n description: \"Manage the cluster using kubectl and helm\",\n icon: \"devicon:kubernetes\",\n },\n\n spec: {\n image: images[\"terminal-kubectl\"].image,\n command: [\"bash\", \"/welcome.sh\"],\n\n files: {\n \"/kubeconfig\": fileFromString(\"kubeconfig\", kubeconfig, { isSecret: true }),\n\n \"/welcome.sh\": fileFromString(\n \"welcome.sh\",\n text`\n echo \"Connecting to the cluster...\"\n kubectl cluster-info\n\n echo \"Use 'kubectl' and 'helm' to manage the cluster.\"\n echo\n\n exec bash\n `,\n ),\n },\n\n env: {\n KUBECONFIG: \"/kubeconfig\",\n },\n },\n })\n}\n"]}