@highstate/k8s 0.19.1 → 0.21.1

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 (107) hide show
  1. package/dist/chunk-23vn2rdc.js +11 -0
  2. package/dist/chunk-2pfx13ay.js +11 -0
  3. package/dist/chunk-46ntav0c.js +299 -0
  4. package/dist/chunk-556pc9e6.js +155 -0
  5. package/dist/chunk-7kgjgcft.js +170 -0
  6. package/dist/{chunk-LGHFSXNT.js → chunk-9hs97f1q.js} +23 -17
  7. package/dist/chunk-aame3x1b.js +11 -0
  8. package/dist/chunk-b05q6fm2.js +37 -0
  9. package/dist/chunk-bmvc9d2d.js +11 -0
  10. package/dist/chunk-de82bbp2.js +7 -0
  11. package/dist/chunk-facs31cb.js +624 -0
  12. package/dist/chunk-h1b79v66.js +1425 -0
  13. package/dist/chunk-k4w9zpn5.js +215 -0
  14. package/dist/chunk-pqc6w52f.js +352 -0
  15. package/dist/chunk-qyshvz32.js +176 -0
  16. package/dist/chunk-tpfyj6fe.js +199 -0
  17. package/dist/chunk-z6bmpnm7.js +180 -0
  18. package/dist/highstate.manifest.json +3 -2
  19. package/dist/impl/dynamic-endpoint-resolver.js +91 -0
  20. package/dist/impl/gateway-route.js +226 -166
  21. package/dist/impl/tls-certificate.js +31 -31
  22. package/dist/index.js +293 -166
  23. package/dist/units/cert-manager/index.js +19 -14
  24. package/dist/units/cluster-patch/index.js +14 -13
  25. package/dist/units/dns01-issuer/index.js +82 -42
  26. package/dist/units/existing-cluster/index.js +59 -26
  27. package/dist/units/gateway-api/index.js +15 -16
  28. package/dist/units/reduced-access-cluster/index.js +32 -36
  29. package/package.json +23 -21
  30. package/src/cluster.ts +12 -8
  31. package/src/config-map.ts +15 -5
  32. package/src/container.ts +4 -2
  33. package/src/cron-job.ts +51 -5
  34. package/src/deployment.ts +49 -18
  35. package/src/gateway/backend.ts +3 -3
  36. package/src/gateway/gateway.ts +12 -56
  37. package/src/helm.ts +354 -22
  38. package/src/impl/dynamic-endpoint-resolver.ts +109 -0
  39. package/src/impl/gateway-route.ts +231 -57
  40. package/src/impl/tls-certificate.ts +8 -3
  41. package/src/index.ts +1 -0
  42. package/src/job.ts +38 -6
  43. package/src/kubectl.ts +166 -0
  44. package/src/namespace.ts +47 -3
  45. package/src/network-policy.ts +1 -1
  46. package/src/pvc.ts +12 -2
  47. package/src/rbac.ts +28 -5
  48. package/src/scripting/bundle.ts +21 -98
  49. package/src/scripting/environment.ts +4 -10
  50. package/src/secret.ts +15 -5
  51. package/src/service.ts +28 -6
  52. package/src/shared.ts +31 -3
  53. package/src/stateful-set.ts +49 -18
  54. package/src/tls.ts +31 -5
  55. package/src/units/cluster-patch/index.ts +5 -5
  56. package/src/units/dns01-issuer/index.ts +56 -12
  57. package/src/units/existing-cluster/index.ts +36 -15
  58. package/src/units/reduced-access-cluster/index.ts +6 -3
  59. package/src/worker.ts +4 -2
  60. package/src/workload.ts +474 -217
  61. package/LICENSE +0 -21
  62. package/dist/chunk-4G6LLC2X.js +0 -240
  63. package/dist/chunk-4G6LLC2X.js.map +0 -1
  64. package/dist/chunk-BR2CLUUD.js +0 -230
  65. package/dist/chunk-BR2CLUUD.js.map +0 -1
  66. package/dist/chunk-DCUMJSO6.js +0 -427
  67. package/dist/chunk-DCUMJSO6.js.map +0 -1
  68. package/dist/chunk-FE4SHRAJ.js +0 -286
  69. package/dist/chunk-FE4SHRAJ.js.map +0 -1
  70. package/dist/chunk-HH2JJELM.js +0 -13
  71. package/dist/chunk-HH2JJELM.js.map +0 -1
  72. package/dist/chunk-KMLRI5UZ.js +0 -155
  73. package/dist/chunk-KMLRI5UZ.js.map +0 -1
  74. package/dist/chunk-LGHFSXNT.js.map +0 -1
  75. package/dist/chunk-MIC2BHGS.js +0 -301
  76. package/dist/chunk-MIC2BHGS.js.map +0 -1
  77. package/dist/chunk-OBDQONMV.js +0 -401
  78. package/dist/chunk-OBDQONMV.js.map +0 -1
  79. package/dist/chunk-P2VOUU7E.js +0 -1626
  80. package/dist/chunk-P2VOUU7E.js.map +0 -1
  81. package/dist/chunk-PZ5AY32C.js +0 -9
  82. package/dist/chunk-PZ5AY32C.js.map +0 -1
  83. package/dist/chunk-RVB4WWZZ.js +0 -267
  84. package/dist/chunk-RVB4WWZZ.js.map +0 -1
  85. package/dist/chunk-TWBMG6TD.js +0 -315
  86. package/dist/chunk-TWBMG6TD.js.map +0 -1
  87. package/dist/chunk-VCXWCZ43.js +0 -279
  88. package/dist/chunk-VCXWCZ43.js.map +0 -1
  89. package/dist/chunk-YIJUVPU2.js +0 -297
  90. package/dist/chunk-YIJUVPU2.js.map +0 -1
  91. package/dist/cron-job-NX4HD4FI.js +0 -8
  92. package/dist/cron-job-NX4HD4FI.js.map +0 -1
  93. package/dist/deployment-O2LJ5WR5.js +0 -8
  94. package/dist/deployment-O2LJ5WR5.js.map +0 -1
  95. package/dist/impl/gateway-route.js.map +0 -1
  96. package/dist/impl/tls-certificate.js.map +0 -1
  97. package/dist/index.js.map +0 -1
  98. package/dist/job-SYME6Y43.js +0 -8
  99. package/dist/job-SYME6Y43.js.map +0 -1
  100. package/dist/stateful-set-VJYKTQ72.js +0 -8
  101. package/dist/stateful-set-VJYKTQ72.js.map +0 -1
  102. package/dist/units/cert-manager/index.js.map +0 -1
  103. package/dist/units/cluster-patch/index.js.map +0 -1
  104. package/dist/units/dns01-issuer/index.js.map +0 -1
  105. package/dist/units/existing-cluster/index.js.map +0 -1
  106. package/dist/units/gateway-api/index.js.map +0 -1
  107. package/dist/units/reduced-access-cluster/index.js.map +0 -1
@@ -1,401 +0,0 @@
1
- import { __export } from './chunk-PZ5AY32C.js';
2
- import { getOrCreate } from '@highstate/contract';
3
- import { secret, toPromise, output, ComponentResource } from '@highstate/pulumi';
4
- import { Provider, core } from '@pulumi/kubernetes';
5
- import { output as output$1 } from '@pulumi/pulumi';
6
-
7
- // assets/images.json
8
- var images_exports = {};
9
- __export(images_exports, {
10
- default: () => images_default,
11
- "terminal-kubectl": () => terminal_kubectl,
12
- "worker.k8s-monitor": () => worker_k8s_monitor
13
- });
14
- var terminal_kubectl = {
15
- name: "ghcr.io/highstate-io/highstate/terminal.kubectl",
16
- tag: "latest",
17
- image: "ghcr.io/highstate-io/highstate/terminal.kubectl:latest@sha256:31cf095ec6acc0b3a5088c92483d88dc1e2e7dd7fcbf2ec8de29a0171debd8aa"
18
- };
19
- var worker_k8s_monitor = {
20
- name: "ghcr.io/highstate-io/highstate/worker.k8s-monitor",
21
- tag: "latest",
22
- image: "ghcr.io/highstate-io/highstate/worker.k8s-monitor:latest@sha256:1a3743611f1ae0dce76e6eceede827271f426992aac60ab5fdf4ad5e2948e2cd"
23
- };
24
- var images_default = {
25
- "terminal-kubectl": terminal_kubectl,
26
- "worker.k8s-monitor": worker_k8s_monitor
27
- };
28
- var providers = /* @__PURE__ */ new Map();
29
- function getProvider(cluster) {
30
- const name = `${cluster.name}.${cluster.connectionId}`;
31
- const existing = providers.get(name);
32
- if (existing) {
33
- return existing;
34
- }
35
- const provider = new Provider(name, { kubeconfig: secret(cluster.kubeconfig) });
36
- providers.set(name, provider);
37
- return provider;
38
- }
39
- async function getProviderAsync(cluster) {
40
- const resolvedCluster = await toPromise(cluster);
41
- return getProvider(resolvedCluster);
42
- }
43
- var commonExtraArgs = ["name", "namespace", "metadata"];
44
- function mapMetadata(args, fallbackName) {
45
- return output(args.metadata).apply(
46
- (metadata) => output({
47
- ...metadata,
48
- name: args.name ?? metadata?.name ?? fallbackName,
49
- namespace: metadata?.namespace ?? (args.namespace ? output(args.namespace).metadata.name : void 0)
50
- })
51
- );
52
- }
53
- function mapSelectorLikeToSelector(selector) {
54
- if ("matchLabels" in selector || "matchExpressions" in selector) {
55
- return selector;
56
- }
57
- return {
58
- matchLabels: selector
59
- };
60
- }
61
- function getNamespaceName(namespace) {
62
- if (Namespace.isInstance(namespace)) {
63
- return namespace.metadata.name;
64
- }
65
- if (core.v1.Namespace.isInstance(namespace)) {
66
- return namespace.metadata.name;
67
- }
68
- return output(namespace);
69
- }
70
- function mapNamespaceNameToSelector(namespace) {
71
- return {
72
- matchLabels: {
73
- "kubernetes.io/metadata.name": namespace
74
- }
75
- };
76
- }
77
- function validateCluster(entity, cluster) {
78
- return output({ entity, cluster }).apply(({ entity: entity2, cluster: cluster2 }) => {
79
- if (entity2.clusterId !== cluster2.id) {
80
- throw new Error(
81
- `Cluster mismatch for ${entity2.kind} "${entity2.metadata.name}": "${entity2.clusterId}" != "${cluster2.id}"`
82
- );
83
- }
84
- return cluster2;
85
- });
86
- }
87
- var Resource = class extends ComponentResource {
88
- constructor(type, name, args, opts, cluster, metadata) {
89
- super(type, name, args, opts);
90
- this.cluster = cluster;
91
- this.metadata = metadata;
92
- }
93
- /**
94
- * The Kubernetes API version (e.g., "v1", "apps/v1", "batch/v1").
95
- */
96
- static apiVersion;
97
- /**
98
- * The Kubernetes kind (e.g., "ConfigMap", "Deployment", "CronJob").
99
- */
100
- static kind;
101
- /**
102
- * Whether the resource is namespaced.
103
- */
104
- static isNamespaced = false;
105
- /**
106
- * The Kubernetes API version (e.g., "v1", "apps/v1", "batch/v1").
107
- */
108
- get apiVersion() {
109
- return this.constructor.apiVersion;
110
- }
111
- /**
112
- * The Kubernetes kind (e.g., "ConfigMap", "Deployment", "CronJob").
113
- */
114
- get kind() {
115
- return this.constructor.kind;
116
- }
117
- get isNamespaced() {
118
- return this.constructor.isNamespaced;
119
- }
120
- get entityBase() {
121
- return {
122
- clusterId: this.cluster.id,
123
- clusterName: this.cluster.name,
124
- apiVersion: this.apiVersion,
125
- kind: this.kind,
126
- isNamespaced: false,
127
- metadata: this.metadata
128
- };
129
- }
130
- };
131
- var NamespacedResource = class extends Resource {
132
- constructor(type, name, args, opts, metadata, namespace) {
133
- super(type, name, args, opts, namespace.cluster, metadata);
134
- this.namespace = namespace;
135
- }
136
- static isNamespaced = true;
137
- get entityBase() {
138
- return {
139
- clusterId: this.cluster.id,
140
- clusterName: this.cluster.name,
141
- apiVersion: this.apiVersion,
142
- kind: this.kind,
143
- isNamespaced: true,
144
- metadata: this.metadata
145
- };
146
- }
147
- };
148
-
149
- // src/namespace.ts
150
- var Namespace = class _Namespace extends Resource {
151
- constructor(type, name, args, opts, cluster, metadata, spec, status) {
152
- super(type, name, args, opts, cluster, metadata);
153
- this.spec = spec;
154
- this.status = status;
155
- }
156
- static apiVersion = "v1";
157
- static kind = "Namespace";
158
- /**
159
- * The Highstate namespace entity.
160
- */
161
- get entity() {
162
- return output$1(this.entityBase);
163
- }
164
- /**
165
- * Creates a new namespace.
166
- */
167
- static create(name, args, opts) {
168
- return new CreatedNamespace(name, args, opts);
169
- }
170
- /**
171
- * Wraps an existing Kubernetes namespace.
172
- */
173
- static wrap(name, args, opts) {
174
- return new WrappedNamespace(name, args, opts);
175
- }
176
- /**
177
- * Creates a new namespace or gets an existing one.
178
- *
179
- * @param name The name of the resource. May not be the same as the namespace name. Will not be used when existing namespace is retrieved.
180
- * @param args The arguments to create or get the namespace with.
181
- * @param opts Optional resource options.
182
- */
183
- static async createOrGet(name, args, opts) {
184
- if (args.resource) {
185
- return await _Namespace.forResourceAsync(args.resource, args.cluster);
186
- }
187
- if (args.existing) {
188
- return await _Namespace.forAsync(args.existing, args.cluster);
189
- }
190
- return new CreatedNamespace(name, args, opts);
191
- }
192
- /**
193
- * Creates a new namespace or patches an existing one.
194
- *
195
- * @param name The name of the resource. May not be the same as the namespace name.
196
- * @param args The arguments to create or patch the namespace with.
197
- * @param opts Optional resource options.
198
- */
199
- static createOrPatch(name, args, opts) {
200
- if (args.resource) {
201
- return new NamespacePatch(name, {
202
- ...args,
203
- name: output$1(args.resource).metadata.namespace,
204
- cluster: validateCluster(args.resource, args.cluster)
205
- });
206
- }
207
- if (args.existing) {
208
- return new NamespacePatch(name, {
209
- ...args,
210
- name: output$1(args.existing).metadata.name,
211
- cluster: validateCluster(args.existing, args.cluster)
212
- });
213
- }
214
- return new CreatedNamespace(name, args, opts);
215
- }
216
- /**
217
- * Patches an existing namespace.
218
- *
219
- * Will throw an error if the namespace does not exist.
220
- *
221
- * @param name The name of the resource. May not be the same as the namespace name.
222
- * @param args The arguments to patch the namespace with.
223
- * @param opts Optional resource options.
224
- */
225
- static patch(name, args, opts) {
226
- return new NamespacePatch(name, args, opts);
227
- }
228
- /**
229
- * Gets an existing namespace.
230
- *
231
- * Will throw an error if the namespace does not exist.
232
- *
233
- * @param name The name of the resource. May not be the same as the namespace name.
234
- * @param args The arguments to get the namespace with.
235
- * @param opts Optional resource options.
236
- */
237
- static get(name, args, opts) {
238
- return new ExternalNamespace(name, args, opts);
239
- }
240
- static namespaceCache = /* @__PURE__ */ new Map();
241
- /**
242
- * Gets an existing namespace for a given entity.
243
- * Prefer this method over `get` when possible.
244
- *
245
- * It automatically names the resource with the following format: `{clusterName}.{namespace}.{clusterId}`.
246
- *
247
- * This method it idempotent and will return the same instance for the same entity.
248
- *
249
- * @param entity The entity to get the namespace for.
250
- * @param cluster The cluster where the namespace is located.
251
- */
252
- static for(entity, cluster) {
253
- return getOrCreate(
254
- _Namespace.namespaceCache,
255
- `${entity.clusterName}.${entity.metadata.name}.${entity.clusterId}`,
256
- (name) => {
257
- return _Namespace.get(name, {
258
- name: entity.metadata.name,
259
- cluster: validateCluster(entity, cluster)
260
- });
261
- }
262
- );
263
- }
264
- /**
265
- * Gets an existing namespace for a given entity.
266
- * Prefer this method over `get` when possible.
267
- *
268
- * @param entity The entity to get the namespace for.
269
- * @param cluster The cluster where the namespace is located.
270
- */
271
- static async forAsync(entity, cluster) {
272
- const resolvedEntity = await toPromise(entity);
273
- return _Namespace.for(resolvedEntity, cluster);
274
- }
275
- /**
276
- * Gets an existing namespace where the provided resource is located.
277
- * Prefer this method over `get` when possible.
278
- *
279
- * It automatically names the resource with the following format: `{clusterName}.{namespace}.{clusterId}`.
280
- *
281
- * This method it idempotent and will return the same instance for the same resource.
282
- *
283
- * @param resource The resource to get the namespace for.
284
- * @param cluster The cluster where the namespace is located.
285
- */
286
- static forResource(resource, cluster) {
287
- return getOrCreate(
288
- _Namespace.namespaceCache,
289
- `${resource.clusterName}.${resource.metadata.namespace}.${resource.clusterId}`,
290
- (name) => {
291
- return _Namespace.get(name, {
292
- name: resource.metadata.namespace,
293
- cluster: validateCluster(resource, cluster)
294
- });
295
- }
296
- );
297
- }
298
- /**
299
- * Gets an existing namespace for a given entity.
300
- * Prefer this method over `get` when possible.
301
- *
302
- * @param resource The resource to get the namespace for.
303
- * @param cluster The cluster where the namespace is located.
304
- */
305
- static async forResourceAsync(resource, cluster) {
306
- const resolvedResource = await toPromise(resource);
307
- return _Namespace.forResource(resolvedResource, cluster);
308
- }
309
- };
310
- function mapNamespaceMetadata(args, fallbackName) {
311
- return mapMetadata(args, fallbackName).apply((metadata) => {
312
- if (args.privileged) {
313
- metadata.labels = {
314
- ...metadata.labels,
315
- "pod-security.kubernetes.io/enforce": "privileged"
316
- };
317
- }
318
- return metadata;
319
- });
320
- }
321
- var CreatedNamespace = class extends Namespace {
322
- constructor(name, args, opts) {
323
- const namespace = output$1(args.cluster).apply((cluster) => {
324
- return new core.v1.Namespace(
325
- name,
326
- { metadata: mapNamespaceMetadata(args, name) },
327
- { ...opts, parent: this, provider: getProvider(cluster) }
328
- );
329
- });
330
- super(
331
- "highstate:k8s:Namespace",
332
- name,
333
- args,
334
- opts,
335
- output$1(args.cluster),
336
- namespace.metadata,
337
- namespace.spec,
338
- namespace.status
339
- );
340
- }
341
- };
342
- var NamespacePatch = class extends Namespace {
343
- constructor(name, args, opts) {
344
- const namespace = output$1(args.cluster).apply((cluster) => {
345
- return new core.v1.NamespacePatch(
346
- name,
347
- { metadata: mapNamespaceMetadata(args, name) },
348
- { ...opts, parent: this, provider: getProvider(cluster) }
349
- );
350
- });
351
- super(
352
- "highstate:k8s:NamespacePatch",
353
- name,
354
- args,
355
- opts,
356
- output$1(args.cluster),
357
- namespace.metadata,
358
- namespace.spec,
359
- namespace.status
360
- );
361
- }
362
- };
363
- var ExternalNamespace = class extends Namespace {
364
- constructor(name, args, opts) {
365
- const namespace = output$1(args.cluster).apply((cluster) => {
366
- return core.v1.Namespace.get(name, args.name, {
367
- ...opts,
368
- parent: this,
369
- provider: getProvider(cluster)
370
- });
371
- });
372
- super(
373
- "highstate:k8s:ExternalNamespace",
374
- name,
375
- args,
376
- opts,
377
- output$1(args.cluster),
378
- namespace.metadata,
379
- namespace.spec,
380
- namespace.status
381
- );
382
- }
383
- };
384
- var WrappedNamespace = class extends Namespace {
385
- constructor(name, args, opts) {
386
- super(
387
- "highstate:k8s:WrappedNamespace",
388
- name,
389
- args,
390
- opts,
391
- output$1(args.cluster),
392
- output$1(args.namespace).metadata,
393
- output$1(args.namespace).spec,
394
- output$1(args.namespace).status
395
- );
396
- }
397
- };
398
-
399
- export { Namespace, NamespacedResource, Resource, commonExtraArgs, getNamespaceName, getProvider, getProviderAsync, images_exports, mapMetadata, mapNamespaceNameToSelector, mapSelectorLikeToSelector, validateCluster };
400
- //# sourceMappingURL=chunk-OBDQONMV.js.map
401
- //# sourceMappingURL=chunk-OBDQONMV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../assets/images.json","../src/shared.ts","../src/namespace.ts"],"names":["terminal-kubectl","worker.k8s-monitor","entity","cluster","output","toPromise","core"],"mappings":"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","file":"chunk-OBDQONMV.js","sourcesContent":["{\n \"terminal-kubectl\": {\n \"name\": \"ghcr.io/highstate-io/highstate/terminal.kubectl\",\n \"tag\": \"latest\",\n \"image\": \"ghcr.io/highstate-io/highstate/terminal.kubectl:latest@sha256:31cf095ec6acc0b3a5088c92483d88dc1e2e7dd7fcbf2ec8de29a0171debd8aa\"\n },\n \"worker.k8s-monitor\": {\n \"name\": \"ghcr.io/highstate-io/highstate/worker.k8s-monitor\",\n \"tag\": \"latest\",\n \"image\": \"ghcr.io/highstate-io/highstate/worker.k8s-monitor:latest@sha256:1a3743611f1ae0dce76e6eceede827271f426992aac60ab5fdf4ad5e2948e2cd\"\n }\n}\n","import type { PartialKeys } from \"@highstate/contract\"\nimport type { k8s } from \"@highstate/library\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n type Output,\n output,\n secret,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { core, Provider, type types } from \"@pulumi/kubernetes\"\nimport * as images from \"../assets/images.json\"\nimport { Namespace } from \"./namespace\"\n\nconst providers = new Map<`${string}.${string}`, Provider>()\n\nexport function getProvider(cluster: k8s.Cluster): Provider {\n const name = `${cluster.name}.${cluster.connectionId}` as const\n const existing = providers.get(name)\n if (existing) {\n return existing\n }\n\n const provider = new Provider(name, { kubeconfig: secret(cluster.kubeconfig) })\n providers.set(name, provider)\n\n return provider\n}\n\nexport async function getProviderAsync(cluster: Input<k8s.Cluster>): Promise<Provider> {\n const resolvedCluster = await toPromise(cluster)\n\n return getProvider(resolvedCluster)\n}\n\nexport type NamespaceLike = core.v1.Namespace | Namespace | string\n\nexport type ScopedResourceArgs = {\n /**\n * The name of the resource.\n */\n name?: Input<string>\n\n /**\n * The namespace to create the resource in.\n */\n namespace: Input<Namespace>\n\n /**\n * The metadata to apply to the resource.\n */\n metadata?: Input<types.input.meta.v1.ObjectMeta>\n}\n\nexport const commonExtraArgs = [\"name\", \"namespace\", \"metadata\"] as const\n\nexport function mapMetadata(\n args: PartialKeys<ScopedResourceArgs, \"namespace\">,\n fallbackName?: string,\n): Output<Unwrap<types.input.meta.v1.ObjectMeta>> {\n return output(args.metadata).apply(metadata =>\n output({\n ...metadata,\n name: args.name ?? metadata?.name ?? fallbackName,\n namespace:\n metadata?.namespace ?? (args.namespace ? output(args.namespace).metadata.name : undefined),\n }),\n )\n}\n\nexport type SelectorLike = types.input.meta.v1.LabelSelector | Record<string, Input<string>>\n\nexport function mapSelectorLikeToSelector(\n selector: SelectorLike,\n): types.input.meta.v1.LabelSelector {\n if (\"matchLabels\" in selector || \"matchExpressions\" in selector) {\n return selector\n }\n\n return {\n matchLabels: selector as Record<string, Input<string>>,\n }\n}\n\nexport function getNamespaceName(namespace: NamespaceLike): Output<string> {\n if (Namespace.isInstance(namespace)) {\n return namespace.metadata.name\n }\n\n if (core.v1.Namespace.isInstance(namespace)) {\n return namespace.metadata.name\n }\n\n return output(namespace)\n}\n\nexport function mapNamespaceNameToSelector(\n namespace: Input<string>,\n): types.input.meta.v1.LabelSelector {\n return {\n matchLabels: {\n \"kubernetes.io/metadata.name\": namespace,\n },\n }\n}\n\nexport function validateCluster(\n entity: Input<k8s.Resource>,\n cluster: Input<k8s.Cluster>,\n): Input<k8s.Cluster> {\n return output({ entity, cluster }).apply(({ entity, cluster }) => {\n if (entity.clusterId !== cluster.id) {\n throw new Error(\n `Cluster mismatch for ${entity.kind} \"${entity.metadata.name}\": \"${entity.clusterId}\" != \"${cluster.id}\"`,\n )\n }\n\n return cluster\n })\n}\n\nexport { images }\n\n/**\n * Base class for all Kubernetes resources.\n *\n * Provides common functionality for resources that have a cluster and entity.\n */\nexport abstract class Resource extends ComponentResource {\n /**\n * The Kubernetes API version (e.g., \"v1\", \"apps/v1\", \"batch/v1\").\n */\n static readonly apiVersion: string\n\n /**\n * The Kubernetes kind (e.g., \"ConfigMap\", \"Deployment\", \"CronJob\").\n */\n static readonly kind: string\n\n /**\n * Whether the resource is namespaced.\n */\n static readonly isNamespaced: boolean = false\n\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n /**\n * The cluster where the resource is located.\n */\n readonly cluster: Output<k8s.Cluster>,\n\n /**\n * The metadata of the underlying Kubernetes resource.\n */\n readonly metadata: Output<types.output.meta.v1.ObjectMeta>,\n ) {\n super(type, name, args, opts)\n }\n\n /**\n * The Kubernetes API version (e.g., \"v1\", \"apps/v1\", \"batch/v1\").\n */\n get apiVersion() {\n return (this.constructor as typeof Resource).apiVersion\n }\n\n /**\n * The Kubernetes kind (e.g., \"ConfigMap\", \"Deployment\", \"CronJob\").\n */\n get kind() {\n return (this.constructor as typeof Resource).kind\n }\n\n get isNamespaced() {\n return (this.constructor as typeof Resource).isNamespaced\n }\n\n protected get entityBase() {\n return {\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n apiVersion: this.apiVersion,\n kind: this.kind,\n isNamespaced: false,\n metadata: this.metadata,\n }\n }\n}\n\n/**\n * Base class for all Kubernetes namespaced resources.\n *\n * Provides common functionality for resources that have a cluster, namespace, metadata, and entity.\n */\nexport abstract class NamespacedResource extends Resource {\n static readonly isNamespaced = true\n\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The namespace where the resource is located.\n */\n readonly namespace: Output<Namespace>,\n ) {\n super(type, name, args, opts, namespace.cluster, metadata)\n }\n\n /**\n * The Highstate resource entity.\n */\n abstract get entity(): Output<k8s.NamespacedResource>\n\n protected get entityBase() {\n return {\n clusterId: this.cluster.id,\n clusterName: this.cluster.name,\n apiVersion: this.apiVersion,\n kind: this.kind,\n isNamespaced: true,\n metadata: this.metadata,\n } as const\n }\n}\n","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 type Output,\n output,\n type Unwrap,\n} from \"@pulumi/pulumi\"\nimport {\n getProvider,\n mapMetadata,\n Resource,\n type ScopedResourceArgs,\n validateCluster,\n} from \"./shared\"\n\nexport type NamespaceArgs = Omit<ScopedResourceArgs, \"namespace\"> & {\n /**\n * The cluster where the namespace is located.\n */\n cluster: Input<k8s.Cluster>\n\n /**\n * Whether to apply \"pod-security.kubernetes.io/enforce=privileged\" label to the namespace.\n */\n privileged?: boolean\n}\n\nexport type CreateOrGetNamespaceArgs = NamespaceArgs & {\n /**\n * The resource to use to determine the name of the namespace.\n *\n * If not provided, the namespace will be created, otherwise it will be retrieved/patched.\n */\n resource?: Input<k8s.NamespacedResource>\n\n /**\n * The namespace entity to patch/retrieve.\n */\n existing?: Input<k8s.Namespace> | undefined\n}\n\nexport abstract class Namespace extends Resource {\n static readonly apiVersion = \"v1\"\n static readonly kind = \"Namespace\"\n\n constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n cluster: Output<k8s.Cluster>,\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n\n /**\n * The spec of the underlying Kubernetes namespace.\n */\n readonly spec: Output<types.output.core.v1.NamespaceSpec>,\n\n /**\n * The status of the underlying Kubernetes namespace.\n */\n readonly status: Output<types.output.core.v1.NamespaceStatus>,\n ) {\n super(type, name, args, opts, cluster, metadata)\n }\n\n /**\n * The Highstate namespace entity.\n */\n get entity(): Output<k8s.Namespace> {\n return output(this.entityBase) as Output<k8s.Namespace>\n }\n\n /**\n * Creates a new namespace.\n */\n static create(name: string, args: NamespaceArgs, opts?: ComponentResourceOptions): Namespace {\n return new CreatedNamespace(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes namespace.\n */\n static wrap(\n name: string,\n args: WrappedNamespaceArgs,\n opts?: ComponentResourceOptions,\n ): Namespace {\n return new WrappedNamespace(name, args, opts)\n }\n\n /**\n * Creates a new namespace or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the namespace name. Will not be used when existing namespace is retrieved.\n * @param args The arguments to create or get the namespace with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetNamespaceArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Namespace> {\n if (args.resource) {\n return await Namespace.forResourceAsync(args.resource, args.cluster)\n }\n\n if (args.existing) {\n return await Namespace.forAsync(args.existing, args.cluster)\n }\n\n return new CreatedNamespace(name, args, opts)\n }\n\n /**\n * Creates a new namespace or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the namespace name.\n * @param args The arguments to create or patch the namespace with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetNamespaceArgs,\n opts?: ComponentResourceOptions,\n ): Namespace {\n if (args.resource) {\n return new NamespacePatch(name, {\n ...args,\n name: output(args.resource).metadata.namespace,\n cluster: validateCluster(args.resource, args.cluster),\n })\n }\n\n if (args.existing) {\n return new NamespacePatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n cluster: validateCluster(args.existing, args.cluster),\n })\n }\n\n return new CreatedNamespace(name, args, opts)\n }\n\n /**\n * Patches an existing namespace.\n *\n * Will throw an error if the namespace does not exist.\n *\n * @param name The name of the resource. May not be the same as the namespace name.\n * @param args The arguments to patch the namespace with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: NamespaceArgs, opts?: ComponentResourceOptions): Namespace {\n return new NamespacePatch(name, args, opts)\n }\n\n /**\n * Gets an existing namespace.\n *\n * Will throw an error if the namespace does not exist.\n *\n * @param name The name of the resource. May not be the same as the namespace name.\n * @param args The arguments to get the namespace with.\n * @param opts Optional resource options.\n */\n static get(\n name: string,\n args: ExternalNamespaceArgs,\n opts?: ComponentResourceOptions,\n ): Namespace {\n return new ExternalNamespace(name, args, opts)\n }\n\n private static readonly namespaceCache = new Map<string, Namespace>()\n\n /**\n * Gets an existing namespace 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}.{clusterId}`.\n *\n * This method it idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the namespace for.\n * @param cluster The cluster where the namespace is located.\n */\n static for(entity: k8s.Namespace, cluster: Input<k8s.Cluster>): Namespace {\n return getOrCreate(\n Namespace.namespaceCache,\n `${entity.clusterName}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Namespace.get(name, {\n name: entity.metadata.name,\n cluster: validateCluster(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing namespace for a given entity.\n * Prefer this method over `get` when possible.\n *\n * @param entity The entity to get the namespace for.\n * @param cluster The cluster where the namespace is located.\n */\n static async forAsync(\n entity: Input<k8s.Namespace>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Namespace> {\n const resolvedEntity = await toPromise(entity)\n\n return Namespace.for(resolvedEntity, cluster)\n }\n\n /**\n * Gets an existing namespace where the provided resource is located.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{clusterId}`.\n *\n * This method it idempotent and will return the same instance for the same resource.\n *\n * @param resource The resource to get the namespace for.\n * @param cluster The cluster where the namespace is located.\n */\n static forResource(resource: k8s.NamespacedResource, cluster: Input<k8s.Cluster>): Namespace {\n return getOrCreate(\n Namespace.namespaceCache,\n `${resource.clusterName}.${resource.metadata.namespace}.${resource.clusterId}`,\n name => {\n return Namespace.get(name, {\n name: resource.metadata.namespace,\n cluster: validateCluster(resource, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing namespace for a given entity.\n * Prefer this method over `get` when possible.\n *\n * @param resource The resource to get the namespace for.\n * @param cluster The cluster where the namespace is located.\n */\n static async forResourceAsync(\n resource: Input<k8s.NamespacedResource>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Namespace> {\n const resolvedResource = await toPromise(resource)\n\n return Namespace.forResource(resolvedResource, cluster)\n }\n}\n\nfunction mapNamespaceMetadata(\n args: NamespaceArgs,\n fallbackName: string,\n): Output<Unwrap<types.input.meta.v1.ObjectMeta>> {\n return mapMetadata(args, fallbackName).apply(metadata => {\n if (args.privileged) {\n metadata.labels = {\n ...metadata.labels,\n \"pod-security.kubernetes.io/enforce\": \"privileged\",\n }\n }\n\n return metadata\n })\n}\n\nclass CreatedNamespace extends Namespace {\n constructor(name: string, args: NamespaceArgs, opts?: ComponentResourceOptions) {\n const namespace = output(args.cluster).apply(cluster => {\n return new core.v1.Namespace(\n name,\n { metadata: mapNamespaceMetadata(args, name) },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Namespace\",\n name,\n args,\n opts,\n output(args.cluster),\n namespace.metadata,\n namespace.spec,\n namespace.status,\n )\n }\n}\n\nclass NamespacePatch extends Namespace {\n constructor(name: string, args: NamespaceArgs, opts?: ComponentResourceOptions) {\n const namespace = output(args.cluster).apply(cluster => {\n return new core.v1.NamespacePatch(\n name,\n { metadata: mapNamespaceMetadata(args, name) },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:NamespacePatch\",\n name,\n args,\n opts,\n output(args.cluster),\n namespace.metadata,\n namespace.spec,\n namespace.status,\n )\n }\n}\n\nexport type WrappedNamespaceArgs = {\n /**\n * The underlying Kubernetes namespace to wrap.\n */\n namespace: Input<core.v1.Namespace>\n\n /**\n * The cluster where the namespace is located.\n */\n cluster: Input<k8s.Cluster>\n}\n\nexport type ExternalNamespaceArgs = {\n /**\n * The real name of the namespace in the cluster.\n */\n name: Input<string>\n\n /**\n * The cluster where the namespace is located.\n */\n cluster: Input<k8s.Cluster>\n}\n\nclass ExternalNamespace extends Namespace {\n constructor(name: string, args: ExternalNamespaceArgs, opts?: ComponentResourceOptions) {\n const namespace = output(args.cluster).apply(cluster => {\n return core.v1.Namespace.get(name, args.name, {\n ...opts,\n parent: this,\n provider: getProvider(cluster),\n })\n })\n\n super(\n \"highstate:k8s:ExternalNamespace\",\n name,\n args,\n opts,\n output(args.cluster),\n namespace.metadata,\n namespace.spec,\n namespace.status,\n )\n }\n}\n\nclass WrappedNamespace extends Namespace {\n constructor(name: string, args: WrappedNamespaceArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedNamespace\",\n name,\n args,\n opts,\n\n output(args.cluster),\n output(args.namespace).metadata,\n output(args.namespace).spec,\n output(args.namespace).status,\n )\n }\n}\n"]}