@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,13 +1,13 @@
1
- import { isEndpointFromCluster, mapServiceToLabelSelector, Service, mapContainerPortToServicePort } from './chunk-TWBMG6TD.js';
2
- import { Secret } from './chunk-4G6LLC2X.js';
3
- import { commonExtraArgs, NamespacedResource, Namespace, mapMetadata, getProvider, mapSelectorLikeToSelector, getProviderAsync, mapNamespaceNameToSelector, getNamespaceName, images_exports } from './chunk-OBDQONMV.js';
1
+ import { isEndpointFromCluster, mapServiceToLabelSelector, Service, mapContainerPortToServicePort } from './chunk-OG2OPX7B.js';
2
+ import { commonExtraArgs, NamespacedResource, Namespace, mapMetadata, getProvider, Secret, mapSelectorLikeToSelector, getProviderAsync, mapNamespaceNameToSelector, getNamespaceName, images_exports, getClusterKubeconfigContent } from './chunk-TOLFVF4S.js';
4
3
  import { z, getOrCreate, trimIndentation } from '@highstate/contract';
5
- import { ComponentResource, toPromise, output as output$1, interpolate as interpolate$1, normalize, normalizeInputs, fileFromString } from '@highstate/pulumi';
4
+ import { k8s } from '@highstate/library';
5
+ import { ComponentResource, makeEntityOutput, output, toPromise, interpolate, normalize, normalizeInputs, makeFileOutput } from '@highstate/pulumi';
6
6
  import { core, networking } from '@pulumi/kubernetes';
7
- import { output, interpolate } from '@pulumi/pulumi';
8
7
  import { deepmerge } from 'deepmerge-ts';
9
- import { omit, concat, map, groupBy, isNonNullish, mergeDeep, uniqueBy, flat, merge, filter, unique } from 'remeda';
8
+ import { omit, concat, map, groupBy, isNonNullish, mergeDeep, uniqueBy, flat, merge, unique, filter } from 'remeda';
10
9
  import { ImplementationMediator, parseEndpoint, addressToCidr, endpointToString, l3EndpointToCidr, AccessPointRoute, mergeEndpoints } from '@highstate/common';
10
+ import { output as output$1, interpolate as interpolate$1 } from '@pulumi/pulumi';
11
11
  import { sha256 } from 'crypto-hash';
12
12
 
13
13
  var ConfigMap = class _ConfigMap extends NamespacedResource {
@@ -21,7 +21,16 @@ var ConfigMap = class _ConfigMap extends NamespacedResource {
21
21
  * The Highstate config map entity.
22
22
  */
23
23
  get entity() {
24
- return output(this.entityBase);
24
+ return makeEntityOutput({
25
+ entity: k8s.configMapEntity,
26
+ identity: this.metadata.uid,
27
+ meta: {
28
+ title: this.metadata.name
29
+ },
30
+ value: {
31
+ ...this.entityBase
32
+ }
33
+ });
25
34
  }
26
35
  /**
27
36
  * Creates a new config map.
@@ -224,7 +233,16 @@ var PersistentVolumeClaim = class _PersistentVolumeClaim extends NamespacedResou
224
233
  * The Highstate PVC entity.
225
234
  */
226
235
  get entity() {
227
- return output$1(this.entityBase);
236
+ return makeEntityOutput({
237
+ entity: k8s.persistentVolumeClaimEntity,
238
+ identity: this.metadata.uid,
239
+ meta: {
240
+ title: this.metadata.name
241
+ },
242
+ value: {
243
+ ...this.entityBase
244
+ }
245
+ });
228
246
  }
229
247
  /**
230
248
  * Creates a new PVC.
@@ -243,7 +261,7 @@ var PersistentVolumeClaim = class _PersistentVolumeClaim extends NamespacedResou
243
261
  if (args.existing) {
244
262
  return new PersistentVolumeClaimPatch(name, {
245
263
  ...args,
246
- name: output$1(args.existing).metadata.name
264
+ name: output(args.existing).metadata.name
247
265
  });
248
266
  }
249
267
  return new CreatedPersistentVolumeClaim(name, args, opts);
@@ -257,7 +275,7 @@ var PersistentVolumeClaim = class _PersistentVolumeClaim extends NamespacedResou
257
275
  */
258
276
  static async createOrGet(name, args, opts) {
259
277
  if (args.existing) {
260
- return await _PersistentVolumeClaim.forAsync(args.existing, output$1(args.namespace).cluster);
278
+ return await _PersistentVolumeClaim.forAsync(args.existing, output(args.namespace).cluster);
261
279
  }
262
280
  return new CreatedPersistentVolumeClaim(name, args, opts);
263
281
  }
@@ -329,12 +347,12 @@ var PersistentVolumeClaim = class _PersistentVolumeClaim extends NamespacedResou
329
347
  };
330
348
  var CreatedPersistentVolumeClaim = class extends PersistentVolumeClaim {
331
349
  constructor(name, args, opts) {
332
- const pvc = output$1(args.namespace).cluster.apply((cluster) => {
350
+ const pvc = output(args.namespace).cluster.apply((cluster) => {
333
351
  return new core.v1.PersistentVolumeClaim(
334
352
  name,
335
353
  {
336
354
  metadata: mapMetadata(args, name),
337
- spec: output$1(args).apply((args2) => {
355
+ spec: output(args).apply((args2) => {
338
356
  return deepmerge(
339
357
  {
340
358
  accessModes: ["ReadWriteOnce"],
@@ -361,7 +379,7 @@ var CreatedPersistentVolumeClaim = class extends PersistentVolumeClaim {
361
379
  args,
362
380
  opts,
363
381
  pvc.metadata,
364
- output$1(args.namespace),
382
+ output(args.namespace),
365
383
  pvc.spec,
366
384
  pvc.status
367
385
  );
@@ -369,12 +387,12 @@ var CreatedPersistentVolumeClaim = class extends PersistentVolumeClaim {
369
387
  };
370
388
  var PersistentVolumeClaimPatch = class extends PersistentVolumeClaim {
371
389
  constructor(name, args, opts) {
372
- const pvc = output$1(args.namespace).cluster.apply((cluster) => {
390
+ const pvc = output(args.namespace).cluster.apply((cluster) => {
373
391
  return new core.v1.PersistentVolumeClaimPatch(
374
392
  name,
375
393
  {
376
394
  metadata: mapMetadata(args, name),
377
- spec: output$1(args).apply((args2) => {
395
+ spec: output(args).apply((args2) => {
378
396
  return deepmerge(
379
397
  {
380
398
  accessModes: ["ReadWriteOnce"],
@@ -401,7 +419,7 @@ var PersistentVolumeClaimPatch = class extends PersistentVolumeClaim {
401
419
  args,
402
420
  opts,
403
421
  pvc.metadata,
404
- output$1(args.namespace),
422
+ output(args.namespace),
405
423
  pvc.spec,
406
424
  pvc.status
407
425
  );
@@ -414,19 +432,19 @@ var WrappedPersistentVolumeClaim = class extends PersistentVolumeClaim {
414
432
  name,
415
433
  args,
416
434
  opts,
417
- output$1(args.pvc).metadata,
418
- output$1(args.namespace),
419
- output$1(args.pvc).spec,
420
- output$1(args.pvc).status
435
+ output(args.pvc).metadata,
436
+ output(args.namespace),
437
+ output(args.pvc).spec,
438
+ output(args.pvc).status
421
439
  );
422
440
  }
423
441
  };
424
442
  var ExternalPersistentVolumeClaim = class extends PersistentVolumeClaim {
425
443
  constructor(name, args, opts) {
426
- const pvc = output$1(args.namespace).cluster.apply((cluster) => {
444
+ const pvc = output(args.namespace).cluster.apply((cluster) => {
427
445
  return core.v1.PersistentVolumeClaim.get(
428
446
  name,
429
- interpolate$1`${output$1(args.namespace).metadata.name}/${args.name}`,
447
+ interpolate`${output(args.namespace).metadata.name}/${args.name}`,
430
448
  { ...opts, parent: this, provider: getProvider(cluster) }
431
449
  );
432
450
  });
@@ -436,7 +454,7 @@ var ExternalPersistentVolumeClaim = class extends PersistentVolumeClaim {
436
454
  args,
437
455
  opts,
438
456
  pvc.metadata,
439
- output$1(args.namespace),
457
+ output(args.namespace),
440
458
  pvc.spec,
441
459
  pvc.status
442
460
  );
@@ -543,7 +561,7 @@ function mapVolumeMount(volumeMount) {
543
561
  return omit(
544
562
  {
545
563
  ...volumeMount,
546
- name: output$1(volumeMount.volume).apply(mapWorkloadVolume).apply((volume) => output$1(volume.name))
564
+ name: output(volumeMount.volume).apply(mapWorkloadVolume).apply((volume) => output(volume.name))
547
565
  },
548
566
  ["volume"]
549
567
  );
@@ -554,14 +572,14 @@ function mapVolumeMount(volumeMount) {
554
572
  };
555
573
  }
556
574
  function mapEnvironmentSource(envFrom) {
557
- if (envFrom instanceof core.v1.ConfigMap) {
575
+ if (envFrom instanceof core.v1.ConfigMap || envFrom instanceof ConfigMap) {
558
576
  return {
559
577
  configMapRef: {
560
578
  name: envFrom.metadata.name
561
579
  }
562
580
  };
563
581
  }
564
- if (envFrom instanceof core.v1.Secret) {
582
+ if (envFrom instanceof core.v1.Secret || envFrom instanceof Secret) {
565
583
  return {
566
584
  secretRef: {
567
585
  name: envFrom.metadata.name
@@ -640,7 +658,7 @@ function getWorkloadVolumeResourceUuid(volume) {
640
658
  if (core.v1.Secret.isInstance(volume)) {
641
659
  return volume.metadata.uid;
642
660
  }
643
- return output$1(void 0);
661
+ return output(void 0);
644
662
  }
645
663
 
646
664
  // src/network.ts
@@ -684,7 +702,7 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
684
702
  networkPolicy;
685
703
  constructor(name, args, opts) {
686
704
  super("k8s:network-policy", name, args, opts);
687
- const normalizedArgs = output$1(args).apply(async (args2) => {
705
+ const normalizedArgs = output(args).apply(async (args2) => {
688
706
  const ingressRules = normalize(args2.ingressRule, args2.ingressRules);
689
707
  const egressRules = normalize(args2.egressRule, args2.egressRules);
690
708
  const cluster = await toPromise(args2.namespace.cluster);
@@ -774,7 +792,7 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
774
792
  }).concat(extraEgressRules)
775
793
  };
776
794
  });
777
- this.networkPolicy = output$1(
795
+ this.networkPolicy = output(
778
796
  normalizedArgs.apply(async (args2) => {
779
797
  const cluster = args2.cluster;
780
798
  if (cluster.networkPolicyImplRef) {
@@ -786,7 +804,7 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
786
804
  const nativePolicy = new NativeNetworkPolicy(name, args2, {
787
805
  ...opts,
788
806
  parent: this,
789
- provider: await getProviderAsync(output$1(args2.namespace).cluster)
807
+ provider: await getProviderAsync(output(args2.namespace).cluster)
790
808
  });
791
809
  return nativePolicy.networkPolicy;
792
810
  })
@@ -827,8 +845,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
827
845
  * @param opts Optional resource options.
828
846
  */
829
847
  static async isolateNamespace(namespace, opts) {
830
- const name = await toPromise(output$1(namespace).metadata.name);
831
- const cluster = await toPromise(output$1(namespace).cluster);
848
+ const name = await toPromise(output(namespace).metadata.name);
849
+ const cluster = await toPromise(output(namespace).cluster);
832
850
  return new _NetworkPolicy(
833
851
  `isolate-namespace.${cluster.name}.${name}.${cluster.id}`,
834
852
  {
@@ -849,8 +867,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
849
867
  * @param opts Optional resource options.
850
868
  */
851
869
  static async allowInsideNamespace(namespace, opts) {
852
- const nsName = await toPromise(output$1(namespace).metadata.name);
853
- const cluster = await toPromise(output$1(namespace).cluster);
870
+ const nsName = await toPromise(output(namespace).metadata.name);
871
+ const cluster = await toPromise(output(namespace).cluster);
854
872
  return new _NetworkPolicy(
855
873
  `allow-inside-namespace.${cluster.name}.${nsName}.${cluster.id}`,
856
874
  {
@@ -871,8 +889,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
871
889
  * @param opts Optional resource options.
872
890
  */
873
891
  static async allowKubeApiServer(namespace, opts) {
874
- const nsName = await toPromise(output$1(namespace).metadata.name);
875
- const cluster = await toPromise(output$1(namespace).cluster);
892
+ const nsName = await toPromise(output(namespace).metadata.name);
893
+ const cluster = await toPromise(output(namespace).cluster);
876
894
  return new _NetworkPolicy(
877
895
  `allow-kube-api-server.${cluster.name}.${nsName}.${cluster.id}`,
878
896
  {
@@ -892,8 +910,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
892
910
  * @param opts Optional resource options.
893
911
  */
894
912
  static async allowKubeDns(namespace, opts) {
895
- const nsName = await toPromise(output$1(namespace).metadata.name);
896
- const cluster = await toPromise(output$1(namespace).cluster);
913
+ const nsName = await toPromise(output(namespace).metadata.name);
914
+ const cluster = await toPromise(output(namespace).cluster);
897
915
  return new _NetworkPolicy(
898
916
  `allow-kube-dns.${cluster.name}.${nsName}.${cluster.id}`,
899
917
  {
@@ -913,8 +931,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
913
931
  * @param opts Optional resource options.
914
932
  */
915
933
  static async allowAllEgress(namespace, opts) {
916
- const nsName = await toPromise(output$1(namespace).metadata.name);
917
- const cluster = await toPromise(output$1(namespace).cluster);
934
+ const nsName = await toPromise(output(namespace).metadata.name);
935
+ const cluster = await toPromise(output(namespace).cluster);
918
936
  return new _NetworkPolicy(
919
937
  `allow-all-egress.${cluster.name}.${nsName}.${cluster.id}`,
920
938
  {
@@ -934,8 +952,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
934
952
  * @param opts Optional resource options.
935
953
  */
936
954
  static async allowAllIngress(namespace, opts) {
937
- const nsName = await toPromise(output$1(namespace).metadata.name);
938
- const cluster = await toPromise(output$1(namespace).cluster);
955
+ const nsName = await toPromise(output(namespace).metadata.name);
956
+ const cluster = await toPromise(output(namespace).cluster);
939
957
  return new _NetworkPolicy(
940
958
  `allow-all-ingress.${cluster.name}.${nsName}.${cluster.id}`,
941
959
  {
@@ -958,8 +976,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
958
976
  static async allowEgressToEndpoint(namespace, endpoint, opts) {
959
977
  const parsedEndpoint = parseEndpoint(endpoint);
960
978
  const endpointStr = endpointToString(parsedEndpoint).replace(/:/g, "-");
961
- const nsName = await toPromise(output$1(namespace).metadata.name);
962
- const cluster = await toPromise(output$1(namespace).cluster);
979
+ const nsName = await toPromise(output(namespace).metadata.name);
980
+ const cluster = await toPromise(output(namespace).cluster);
963
981
  return new _NetworkPolicy(
964
982
  `allow-egress-to-${endpointStr}.${cluster.name}.${nsName}.${cluster.id}`,
965
983
  {
@@ -980,8 +998,8 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
980
998
  * @param opts Optional resource options.
981
999
  */
982
1000
  static async allowEgressToBestEndpoint(namespace, endpoints, opts) {
983
- const cluster = await toPromise(output$1(namespace).cluster);
984
- const resolvedEndpoints = await toPromise(output$1(endpoints));
1001
+ const cluster = await toPromise(output(namespace).cluster);
1002
+ const resolvedEndpoints = await toPromise(output(endpoints));
985
1003
  const bestEndpoint = requireBestEndpoint(
986
1004
  resolvedEndpoints.map((endpoint) => parseEndpoint(endpoint)),
987
1005
  cluster
@@ -1000,13 +1018,13 @@ var NetworkPolicy = class _NetworkPolicy extends ComponentResource {
1000
1018
  static async allowIngressFromEndpoint(namespace, endpoint, opts) {
1001
1019
  const parsedEndpoint = parseEndpoint(endpoint);
1002
1020
  const endpointStr = endpointToString(parsedEndpoint).replace(/:/g, "-");
1003
- const nsName = await toPromise(output$1(namespace).metadata.name);
1004
- const cluster = await toPromise(output$1(namespace).cluster);
1021
+ const nsName = await toPromise(output(namespace).metadata.name);
1022
+ const cluster = await toPromise(output(namespace).cluster);
1005
1023
  return new _NetworkPolicy(
1006
1024
  `allow-ingress-from-${endpointStr}.${cluster.name}.${nsName}.${cluster.id}`,
1007
1025
  {
1008
1026
  namespace,
1009
- description: interpolate$1`Allow ingress traffic from "${endpointToString(parsedEndpoint)}" to the namespace.`,
1027
+ description: interpolate`Allow ingress traffic from "${endpointToString(parsedEndpoint)}" to the namespace.`,
1010
1028
  ingressRule: { fromEndpoint: endpoint }
1011
1029
  },
1012
1030
  opts
@@ -1179,7 +1197,40 @@ var podSpecDefaults = {
1179
1197
  automountServiceAccountToken: false
1180
1198
  };
1181
1199
  var workloadExtraArgs = [...commonExtraArgs, "container", "containers"];
1182
- var exposableWorkloadExtraArgs = [
1200
+ function filterPatchOwnedContainersInTemplate(template, ownedTemplate) {
1201
+ const ownedContainerNames = unique(
1202
+ (ownedTemplate.spec?.containers ?? []).map((container) => container.name).filter(isNonNullish)
1203
+ );
1204
+ const ownedInitContainerNames = unique(
1205
+ (ownedTemplate.spec?.initContainers ?? []).map((container) => container.name).filter(isNonNullish)
1206
+ );
1207
+ const filterByOwnedNames = (source, ownedNames) => {
1208
+ if (!source || source.length === 0 || ownedNames.length === 0) {
1209
+ return void 0;
1210
+ }
1211
+ const filtered = source.filter(
1212
+ (container) => container.name ? ownedNames.includes(container.name) : false
1213
+ );
1214
+ return filtered.length > 0 ? filtered : void 0;
1215
+ };
1216
+ const containers = filterByOwnedNames(template.spec?.containers, ownedContainerNames);
1217
+ const initContainers = filterByOwnedNames(template.spec?.initContainers, ownedInitContainerNames);
1218
+ const {
1219
+ containers: _containers,
1220
+ initContainers: _initContainers,
1221
+ ...restSpec
1222
+ } = template.spec ?? {};
1223
+ const spec = {
1224
+ ...restSpec,
1225
+ ...containers ? { containers } : {},
1226
+ ...initContainers ? { initContainers } : {}
1227
+ };
1228
+ return {
1229
+ ...template,
1230
+ spec
1231
+ };
1232
+ }
1233
+ var workloadServiceExtraArgs = [
1183
1234
  ...workloadExtraArgs,
1184
1235
  "service",
1185
1236
  "route",
@@ -1187,11 +1238,11 @@ var exposableWorkloadExtraArgs = [
1187
1238
  ];
1188
1239
  function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1189
1240
  const labels = isForPatch ? void 0 : { "app.kubernetes.io/name": name };
1190
- const containers = output(args).apply((args2) => normalize(args2.container, args2.containers));
1191
- const initContainers = output(args).apply(
1241
+ const containers = output$1(args).apply((args2) => normalize(args2.container, args2.containers));
1242
+ const initContainers = output$1(args).apply(
1192
1243
  (args2) => normalize(args2.initContainer, args2.initContainers)
1193
1244
  );
1194
- const rawVolumes = output({ containers, initContainers }).apply(
1245
+ const rawVolumes = output$1({ containers, initContainers }).apply(
1195
1246
  ({ containers: containers2, initContainers: initContainers2 }) => {
1196
1247
  const containerVolumes = [...containers2, ...initContainers2].flatMap(
1197
1248
  (container) => normalize(container.volume, container.volumes)
@@ -1201,14 +1252,14 @@ function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1201
1252
  return "volume" in volumeMount ? volumeMount.volume : void 0;
1202
1253
  }).filter(Boolean);
1203
1254
  });
1204
- return output([...containerVolumes, ...containerVolumeMounts]);
1255
+ return output$1([...containerVolumes, ...containerVolumeMounts]);
1205
1256
  }
1206
1257
  );
1207
1258
  const volumes = rawVolumes.apply((rawVolumes2) => {
1208
- return output(rawVolumes2.map(mapWorkloadVolume)).apply(uniqueBy((volume) => volume.name));
1259
+ return output$1(rawVolumes2.map(mapWorkloadVolume)).apply(uniqueBy((volume) => volume.name));
1209
1260
  });
1210
- const podSpec = output({
1211
- cluster: output(args.namespace).cluster,
1261
+ const podSpec = output$1({
1262
+ cluster: output$1(args.namespace).cluster,
1212
1263
  containers,
1213
1264
  initContainers,
1214
1265
  volumes
@@ -1224,7 +1275,7 @@ function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1224
1275
  ...podSpecDefaults
1225
1276
  };
1226
1277
  if (containers2.some((container) => container.enableTun) && cluster.quirks?.tunDevicePolicy?.type !== "plugin") {
1227
- spec.volumes = output(spec.volumes).apply((volumes3) => [
1278
+ spec.volumes = output$1(spec.volumes).apply((volumes3) => [
1228
1279
  ...volumes3 ?? [],
1229
1280
  {
1230
1281
  name: "tun-device",
@@ -1237,9 +1288,9 @@ function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1237
1288
  return spec;
1238
1289
  });
1239
1290
  const dependencyHash = rawVolumes.apply((rawVolumes2) => {
1240
- return output(rawVolumes2.map(getWorkloadVolumeResourceUuid)).apply(filter(isNonNullish)).apply(unique()).apply((ids) => sha256(ids.join(",")));
1291
+ return output$1(rawVolumes2.map(getWorkloadVolumeResourceUuid)).apply(filter(isNonNullish)).apply(unique()).apply((ids) => sha256(ids.join(",")));
1241
1292
  });
1242
- const podTemplate = output({ podSpec, dependencyHash }).apply(({ podSpec: podSpec2, dependencyHash: dependencyHash2 }) => {
1293
+ const podTemplate = output$1({ podSpec, dependencyHash }).apply(({ podSpec: podSpec2, dependencyHash: dependencyHash2 }) => {
1243
1294
  return {
1244
1295
  metadata: {
1245
1296
  labels,
@@ -1252,15 +1303,15 @@ function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1252
1303
  spec: podSpec2
1253
1304
  };
1254
1305
  });
1255
- const networkPolicy = output({ containers }).apply(({ containers: containers2 }) => {
1306
+ const networkPolicy = output$1({ containers }).apply(({ containers: containers2 }) => {
1256
1307
  if (isForPatch) {
1257
- return output(void 0);
1308
+ return output$1(void 0);
1258
1309
  }
1259
1310
  const allowedEndpoints = containers2.flatMap((container) => container.allowedEndpoints ?? []);
1260
1311
  if (allowedEndpoints.length === 0 && !args.networkPolicy) {
1261
- return output(void 0);
1312
+ return output$1(void 0);
1262
1313
  }
1263
- return output(
1314
+ return output$1(
1264
1315
  new NetworkPolicy(
1265
1316
  name,
1266
1317
  {
@@ -1268,7 +1319,7 @@ function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1268
1319
  selector: labels,
1269
1320
  description: `Network policy for "${name}"`,
1270
1321
  ...args.networkPolicy,
1271
- egressRules: output(args.networkPolicy?.egressRules).apply((egressRules) => [
1322
+ egressRules: output$1(args.networkPolicy?.egressRules).apply((egressRules) => [
1272
1323
  ...egressRules ?? [],
1273
1324
  ...allowedEndpoints.length > 0 ? [{ toEndpoints: allowedEndpoints }] : []
1274
1325
  ])
@@ -1279,9 +1330,9 @@ function getWorkloadComponents(name, args, parent, opts, isForPatch) {
1279
1330
  });
1280
1331
  return { labels, containers, volumes, podSpec, podTemplate, networkPolicy };
1281
1332
  }
1282
- function getExposableWorkloadComponents(name, args, parent, opts, isForPatch) {
1333
+ function getWorkloadServiceComponents(name, args, parent, opts, isForPatch) {
1283
1334
  const { labels, containers, volumes, podSpec, podTemplate, networkPolicy } = getWorkloadComponents(name, args, parent, opts, isForPatch);
1284
- const service = output({
1335
+ const service = output$1({
1285
1336
  existing: args.existing,
1286
1337
  serviceArgs: args.service,
1287
1338
  containers
@@ -1290,7 +1341,7 @@ function getExposableWorkloadComponents(name, args, parent, opts, isForPatch) {
1290
1341
  return void 0;
1291
1342
  }
1292
1343
  if (existing?.service) {
1293
- return Service.for(existing.service, output(args.namespace).cluster);
1344
+ return Service.for(existing.service, output$1(args.namespace).cluster);
1294
1345
  }
1295
1346
  if (existing) {
1296
1347
  return void 0;
@@ -1306,41 +1357,160 @@ function getExposableWorkloadComponents(name, args, parent, opts, isForPatch) {
1306
1357
  )
1307
1358
  });
1308
1359
  });
1309
- const routes = output({
1360
+ const routes = output$1({
1310
1361
  routesArgs: normalizeInputs(args.route, args.routes),
1311
1362
  service,
1312
- namespace: output(args.namespace)
1313
- }).apply(({ routesArgs, service: service2, namespace }) => {
1363
+ namespace: output$1(args.namespace)
1364
+ }).apply(async ({ routesArgs, service: service2, namespace }) => {
1314
1365
  if (!routesArgs.length || !service2) {
1315
1366
  return [];
1316
1367
  }
1317
1368
  if (args.existing) {
1318
1369
  return [];
1319
1370
  }
1320
- return routesArgs.map((routeArgs, index) => {
1321
- return new AccessPointRoute(`${name}.${index}`, {
1322
- ...routeArgs,
1323
- endpoints: service2.endpoints,
1324
- // pass the native data to the route to allow implementation to use it
1325
- gatewayNativeData: service2,
1326
- tlsCertificateNativeData: namespace
1327
- });
1328
- });
1371
+ const serviceEndpoints = await toPromise(service2.endpoints);
1372
+ const servicePorts = await toPromise(service2.spec.ports);
1373
+ const resolveServiceEndpoints = async (servicePort, routeName) => {
1374
+ if (serviceEndpoints.length === 0) {
1375
+ throw new Error(`No endpoints found for workload service in route "${routeName}"`);
1376
+ }
1377
+ let resolvedServicePort;
1378
+ if (servicePort != null) {
1379
+ const requestedServicePort = await toPromise(servicePort);
1380
+ if (typeof requestedServicePort === "string") {
1381
+ const namedPort = servicePorts?.find((port) => port.name === requestedServicePort);
1382
+ if (!namedPort) {
1383
+ throw new Error(
1384
+ `Named port "${requestedServicePort}" not found for workload service in route "${routeName}"`
1385
+ );
1386
+ }
1387
+ resolvedServicePort = namedPort.port;
1388
+ } else {
1389
+ resolvedServicePort = requestedServicePort;
1390
+ }
1391
+ } else {
1392
+ resolvedServicePort = serviceEndpoints[0]?.port;
1393
+ }
1394
+ if (resolvedServicePort == null) {
1395
+ throw new Error(
1396
+ `Unable to resolve service port for workload service in route "${routeName}"`
1397
+ );
1398
+ }
1399
+ const filteredEndpoints = serviceEndpoints.filter(
1400
+ (endpoint) => endpoint.port === resolvedServicePort
1401
+ );
1402
+ if (filteredEndpoints.length === 0) {
1403
+ throw new Error(
1404
+ `No endpoints with port ${resolvedServicePort} found for workload service in route "${routeName}"`
1405
+ );
1406
+ }
1407
+ return filteredEndpoints;
1408
+ };
1409
+ return await Promise.all(
1410
+ routesArgs.map(async (routeArgs, index) => {
1411
+ const routeName = `${name}.${index}`;
1412
+ const routeRules = await toPromise(routeArgs.rules);
1413
+ const routeRuleValues = Object.values(routeRules ?? {});
1414
+ const needsDefaultBackend = routeRuleValues.length === 0 || routeRuleValues.some((rule) => rule.servicePort == null);
1415
+ const defaultServiceEndpoints = needsDefaultBackend ? await resolveServiceEndpoints(routeArgs.servicePort, routeName) : void 0;
1416
+ const resolvedRules = routeRules ? await Promise.all(
1417
+ Object.entries(routeRules).map(async ([ruleName, rule]) => {
1418
+ const ruleServiceEndpoints = await resolveServiceEndpoints(
1419
+ rule.servicePort ?? routeArgs.servicePort,
1420
+ `${routeName}:${ruleName}`
1421
+ );
1422
+ return [
1423
+ ruleName,
1424
+ {
1425
+ ...omit(rule, ["servicePort"]),
1426
+ backend: {
1427
+ endpoints: ruleServiceEndpoints
1428
+ }
1429
+ }
1430
+ ];
1431
+ })
1432
+ ) : void 0;
1433
+ const resolvedRulesInput = resolvedRules ? Object.fromEntries(resolvedRules) : void 0;
1434
+ return new AccessPointRoute(routeName, {
1435
+ ...omit(routeArgs, ["servicePort", "rules"]),
1436
+ ...defaultServiceEndpoints ? {
1437
+ backend: {
1438
+ endpoints: defaultServiceEndpoints
1439
+ }
1440
+ } : {},
1441
+ rules: resolvedRulesInput,
1442
+ metadata: {
1443
+ ...routeArgs.metadata ?? {},
1444
+ "k8s.namespace": namespace
1445
+ }
1446
+ });
1447
+ })
1448
+ );
1329
1449
  });
1330
1450
  return { labels, containers, volumes, podSpec, podTemplate, networkPolicy, service, routes };
1331
1451
  }
1332
1452
  var Workload = class extends NamespacedResource {
1333
- constructor(type, name, args, opts, metadata, namespace, terminalArgs, containers, podTemplate, networkPolicy) {
1453
+ constructor(type, name, args, opts, metadata, namespace, terminalArgs, containers, podTemplate, networkPolicy, _service = output$1(void 0), routes = output$1([])) {
1334
1454
  super(type, name, args, opts, metadata, namespace);
1335
1455
  this.name = name;
1336
1456
  this.terminalArgs = terminalArgs;
1337
1457
  this.containers = containers;
1338
1458
  this.podTemplate = podTemplate;
1339
1459
  this.networkPolicy = networkPolicy;
1460
+ this._service = _service;
1461
+ this.routes = routes;
1340
1462
  }
1341
- // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1342
1463
  set terminal(_value) {
1343
1464
  }
1465
+ set logsTerminal(_value) {
1466
+ }
1467
+ // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1468
+ set terminals(_value) {
1469
+ }
1470
+ // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1471
+ set optionalService(_value) {
1472
+ }
1473
+ // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1474
+ set service(_value) {
1475
+ }
1476
+ // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1477
+ set selector(_value) {
1478
+ }
1479
+ /**
1480
+ * The service associated with the workload.
1481
+ */
1482
+ get optionalService() {
1483
+ return this._service;
1484
+ }
1485
+ /**
1486
+ * The service associated with the workload.
1487
+ *
1488
+ * Will throw an error if the service is not available.
1489
+ */
1490
+ get service() {
1491
+ return this._service.apply((service) => {
1492
+ if (!service) {
1493
+ throw new Error(`The service of the workload "${this.name}" is not available.`);
1494
+ }
1495
+ return service;
1496
+ });
1497
+ }
1498
+ /**
1499
+ * The merged and deduplicated L3 endpoints of all routes.
1500
+ */
1501
+ get endpoints() {
1502
+ return this.routes.apply(
1503
+ (routes) => output$1(routes.map((route) => route.route.endpoints)).apply((endpoints) => flat(endpoints)).apply(mergeEndpoints)
1504
+ );
1505
+ }
1506
+ /**
1507
+ * The selector matching pods created from this workload's template labels.
1508
+ */
1509
+ get selector() {
1510
+ return this.podTemplate.apply((template) => ({
1511
+ matchLabels: template.metadata?.labels
1512
+ }));
1513
+ }
1344
1514
  /**
1345
1515
  * The instance terminal to interact with the workload's pods.
1346
1516
  */
@@ -1350,17 +1520,21 @@ var Workload = class extends NamespacedResource {
1350
1520
  const podLabelSelector = this.templateMetadata.apply((meta) => meta.labels ?? {}).apply(
1351
1521
  (labels) => Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",")
1352
1522
  );
1353
- return output({
1523
+ return output$1({
1354
1524
  name: this.metadata.name,
1355
1525
  meta: this.getTerminalMeta(),
1356
1526
  spec: {
1357
1527
  image: images_exports["terminal-kubectl"].image,
1358
1528
  command: ["bash", "/welcome.sh"],
1359
1529
  files: {
1360
- "/kubeconfig": fileFromString("kubeconfig", this.cluster.kubeconfig, { isSecret: true }),
1361
- "/welcome.sh": fileFromString(
1362
- "welcome.sh",
1363
- interpolate`
1530
+ "/kubeconfig": makeFileOutput({
1531
+ name: "kubeconfig",
1532
+ content: getClusterKubeconfigContent(this.cluster),
1533
+ isSecret: true
1534
+ }),
1535
+ "/welcome.sh": makeFileOutput({
1536
+ name: "welcome.sh",
1537
+ content: interpolate$1`
1364
1538
  #!/bin/bash
1365
1539
  set -euo pipefail
1366
1540
 
@@ -1405,7 +1579,7 @@ var Workload = class extends NamespacedResource {
1405
1579
  # execute into the selected pod
1406
1580
  exec kubectl exec -it -n "$NAMESPACE" "$SELECTED_POD" -c "$CONTAINER_NAME" -- "$SHELL"
1407
1581
  `.apply(trimIndentation)
1408
- )
1582
+ })
1409
1583
  },
1410
1584
  env: {
1411
1585
  KUBECONFIG: "/kubeconfig"
@@ -1413,6 +1587,91 @@ var Workload = class extends NamespacedResource {
1413
1587
  }
1414
1588
  });
1415
1589
  }
1590
+ /**
1591
+ * The instance terminal to view the workload's logs.
1592
+ */
1593
+ get logsTerminal() {
1594
+ const containerName = this.podTemplate.spec.containers.apply((containers) => containers[0].name);
1595
+ const podLabelSelector = this.templateMetadata.apply((meta) => meta.labels ?? {}).apply(
1596
+ (labels) => Object.entries(labels).map(([key, value]) => `${key}=${value}`).join(",")
1597
+ );
1598
+ return output$1({
1599
+ name: interpolate$1`${this.metadata.name}.logs`,
1600
+ meta: output$1(this.getTerminalMeta()).apply((meta) => ({
1601
+ ...meta,
1602
+ title: `${meta.title} Logs`,
1603
+ globalTitle: `${meta.globalTitle} | Logs`,
1604
+ description: `The logs of ${meta.title.toLowerCase()}.`
1605
+ })),
1606
+ spec: {
1607
+ image: images_exports["terminal-kubectl"].image,
1608
+ command: ["bash", "/welcome.sh"],
1609
+ files: {
1610
+ "/kubeconfig": makeFileOutput({
1611
+ name: "kubeconfig",
1612
+ content: getClusterKubeconfigContent(this.cluster),
1613
+ isSecret: true
1614
+ }),
1615
+ "/welcome.sh": makeFileOutput({
1616
+ name: "welcome.sh",
1617
+ content: interpolate$1`
1618
+ #!/bin/bash
1619
+ set -euo pipefail
1620
+
1621
+ NAMESPACE="${this.metadata.namespace}"
1622
+ RESOURCE_TYPE="${this.kind.toLowerCase()}"
1623
+ RESOURCE_NAME="${this.metadata.name}"
1624
+ CONTAINER_NAME="${containerName}"
1625
+ LABEL_SELECTOR="${podLabelSelector}"
1626
+
1627
+ echo "Connecting to logs of $RESOURCE_TYPE \"$RESOURCE_NAME\" in namespace \"$NAMESPACE\""
1628
+
1629
+ # get all pods for this workload
1630
+ PODS=$(kubectl get pods -n "$NAMESPACE" -l "$LABEL_SELECTOR" -o jsonpath='{.items[*].metadata.name}' 2>/dev/null || echo "")
1631
+
1632
+ if [ -z "$PODS" ]; then
1633
+ echo "No pods found"
1634
+ exit 1
1635
+ fi
1636
+
1637
+ # convert space-separated string to array
1638
+ read -ra POD_ARRAY <<< "$PODS"
1639
+
1640
+ if [ \${#POD_ARRAY[@]} -eq 1 ]; then
1641
+ # single pod found, connect directly
1642
+ SELECTED_POD="\${POD_ARRAY[0]}"
1643
+ echo "Found single pod: $SELECTED_POD"
1644
+ else
1645
+ # multiple pods found, use fzf for selection
1646
+ echo "Found \${#POD_ARRAY[@]} pods. Please select one."
1647
+
1648
+ SELECTED_POD=$(printf '%s\n' "\${POD_ARRAY[@]}" | fzf --prompt="Select pod: " --height 10 --border --info=inline)
1649
+
1650
+ if [ -z "$SELECTED_POD" ]; then
1651
+ echo "No pod selected"
1652
+ exit 1
1653
+ fi
1654
+
1655
+ echo "Selected pod: $SELECTED_POD"
1656
+ fi
1657
+
1658
+ # stream logs for the selected pod
1659
+ exec kubectl logs -f -n "$NAMESPACE" "$SELECTED_POD" -c "$CONTAINER_NAME"
1660
+ `.apply(trimIndentation)
1661
+ })
1662
+ },
1663
+ env: {
1664
+ KUBECONFIG: "/kubeconfig"
1665
+ }
1666
+ }
1667
+ });
1668
+ }
1669
+ /**
1670
+ * The instance terminals to interact with the workload's pods and view its logs.
1671
+ */
1672
+ get terminals() {
1673
+ return [this.logsTerminal, this.terminal];
1674
+ }
1416
1675
  /**
1417
1676
  * Creates a terminal with a custom command.
1418
1677
  *
@@ -1421,32 +1680,34 @@ var Workload = class extends NamespacedResource {
1421
1680
  * @param spec Additional spec options for the terminal.
1422
1681
  */
1423
1682
  createTerminal(name, meta, command, spec) {
1424
- const containerName = output(this.containers).apply((containers) => {
1425
- return containers[0]?.name ?? this.name;
1426
- });
1427
- return output({
1683
+ const containerName = this.podTemplate.spec.containers.apply((containers) => containers[0].name);
1684
+ return output$1({
1428
1685
  name,
1429
- meta: output(this.getTerminalMeta()).apply((currentMeta) => ({
1686
+ meta: output$1(this.getTerminalMeta()).apply((currentMeta) => ({
1430
1687
  ...currentMeta,
1431
1688
  ...meta
1432
1689
  })),
1433
1690
  spec: {
1434
1691
  image: images_exports["terminal-kubectl"].image,
1435
- command: output(command).apply((command2) => [
1692
+ command: output$1(command).apply((command2) => [
1436
1693
  "exec",
1437
1694
  "kubectl",
1438
1695
  "exec",
1439
1696
  "-it",
1440
1697
  "-n",
1441
1698
  this.metadata.namespace,
1442
- `${this.kind.toLowerCase()}/${this.metadata.name}`,
1699
+ interpolate$1`${this.kind.toLowerCase()}/${this.metadata.name}`,
1443
1700
  "-c",
1444
1701
  containerName,
1445
1702
  "--",
1446
1703
  ...command2
1447
1704
  ]),
1448
1705
  files: {
1449
- "/kubeconfig": fileFromString("kubeconfig", this.cluster.kubeconfig, { isSecret: true }),
1706
+ "/kubeconfig": makeFileOutput({
1707
+ name: "kubeconfig",
1708
+ content: getClusterKubeconfigContent(this.cluster),
1709
+ isSecret: true
1710
+ }),
1450
1711
  ...spec?.files
1451
1712
  },
1452
1713
  env: {
@@ -1460,167 +1721,84 @@ var Workload = class extends NamespacedResource {
1460
1721
  * Creates a generic workload or patches the existing one.
1461
1722
  */
1462
1723
  static createOrPatchGeneric(name, args, opts) {
1463
- return output(args).apply(async (args2) => {
1724
+ return output$1(args).apply(async (args2) => {
1464
1725
  if (args2.existing?.kind === "Deployment") {
1465
- const { Deployment } = await import('./deployment-O2LJ5WR5.js');
1726
+ const { Deployment } = await import('./deployment-T35TUOL2.js');
1466
1727
  return Deployment.patch(
1467
1728
  name,
1468
1729
  {
1469
1730
  ...deepmerge(args2, args2.deployment),
1470
1731
  name: args2.existing.metadata.name,
1471
- namespace: Namespace.forResourceAsync(args2.existing, output(args2.namespace).cluster)
1732
+ namespace: Namespace.forResourceAsync(args2.existing, output$1(args2.namespace).cluster)
1472
1733
  },
1473
1734
  opts
1474
1735
  );
1475
1736
  }
1476
1737
  if (args2.existing?.kind === "StatefulSet") {
1477
- const { StatefulSet } = await import('./stateful-set-VJYKTQ72.js');
1738
+ const { StatefulSet } = await import('./stateful-set-LUIRHQJY.js');
1478
1739
  return StatefulSet.patch(
1479
1740
  name,
1480
1741
  {
1481
1742
  ...deepmerge(args2, args2.statefulSet),
1482
1743
  name: args2.existing.metadata.name,
1483
- namespace: Namespace.forResourceAsync(args2.existing, output(args2.namespace).cluster)
1744
+ namespace: Namespace.forResourceAsync(args2.existing, output$1(args2.namespace).cluster)
1484
1745
  },
1485
1746
  opts
1486
1747
  );
1487
1748
  }
1488
1749
  if (args2.existing?.kind === "Job") {
1489
- const { Job } = await import('./job-SYME6Y43.js');
1750
+ const { Job } = await import('./job-PE4AKOHB.js');
1490
1751
  return Job.patch(
1491
1752
  name,
1492
1753
  {
1493
1754
  ...deepmerge(args2, args2.job),
1494
1755
  name: args2.existing.metadata.name,
1495
- namespace: Namespace.forResourceAsync(args2.existing, output(args2.namespace).cluster)
1756
+ namespace: Namespace.forResourceAsync(args2.existing, output$1(args2.namespace).cluster)
1496
1757
  },
1497
1758
  opts
1498
1759
  );
1499
1760
  }
1500
1761
  if (args2.existing?.kind === "CronJob") {
1501
- const { CronJob } = await import('./cron-job-NX4HD4FI.js');
1762
+ const { CronJob } = await import('./cron-job-RKB2HYTO.js');
1502
1763
  return CronJob.patch(
1503
1764
  name,
1504
1765
  {
1505
1766
  ...deepmerge(args2, args2.cronJob),
1506
1767
  name: args2.existing.metadata.name,
1507
- namespace: Namespace.forResourceAsync(args2.existing, output(args2.namespace).cluster)
1768
+ namespace: Namespace.forResourceAsync(args2.existing, output$1(args2.namespace).cluster)
1508
1769
  },
1509
1770
  opts
1510
1771
  );
1511
1772
  }
1512
1773
  if (args2.defaultType === "Deployment") {
1513
- const { Deployment } = await import('./deployment-O2LJ5WR5.js');
1514
- return Deployment.create(name, deepmerge(args2, args2.deployment), opts);
1774
+ const { Deployment } = await import('./deployment-T35TUOL2.js');
1775
+ const deploymentArgs = deepmerge(
1776
+ omit(args2, ["defaultType", "existing", "deployment", "statefulSet", "job", "cronJob"]),
1777
+ args2.deployment ?? {}
1778
+ );
1779
+ return Deployment.create(name, deploymentArgs, opts);
1515
1780
  }
1516
1781
  if (args2.defaultType === "StatefulSet") {
1517
- const { StatefulSet } = await import('./stateful-set-VJYKTQ72.js');
1518
- return StatefulSet.create(name, deepmerge(args2, args2.statefulSet), opts);
1782
+ const { StatefulSet } = await import('./stateful-set-LUIRHQJY.js');
1783
+ const statefulSetArgs = deepmerge(
1784
+ omit(args2, ["defaultType", "existing", "deployment", "statefulSet", "job", "cronJob"]),
1785
+ args2.statefulSet ?? {}
1786
+ );
1787
+ return StatefulSet.create(name, statefulSetArgs, opts);
1519
1788
  }
1520
1789
  if (args2.defaultType === "Job") {
1521
- const { Job } = await import('./job-SYME6Y43.js');
1790
+ const { Job } = await import('./job-PE4AKOHB.js');
1522
1791
  return Job.create(name, deepmerge(args2, args2.job), opts);
1523
1792
  }
1524
1793
  if (args2.defaultType === "CronJob") {
1525
- const { CronJob } = await import('./cron-job-NX4HD4FI.js');
1794
+ const { CronJob } = await import('./cron-job-RKB2HYTO.js');
1526
1795
  return CronJob.create(name, deepmerge(args2, args2.cronJob), opts);
1527
1796
  }
1528
1797
  throw new Error(`Unknown workload type: ${args2.defaultType}`);
1529
1798
  });
1530
1799
  }
1531
1800
  };
1532
- var ExposableWorkload = class extends Workload {
1533
- constructor(type, name, args, opts, metadata, namespace, terminalArgs, containers, podTemplate, networkPolicy, _service, routes) {
1534
- super(
1535
- type,
1536
- name,
1537
- args,
1538
- opts,
1539
- metadata,
1540
- namespace,
1541
- terminalArgs,
1542
- containers,
1543
- podTemplate,
1544
- networkPolicy
1545
- );
1546
- this._service = _service;
1547
- this.routes = routes;
1548
- }
1549
- // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1550
- set optionalService(_value) {
1551
- }
1552
- // biome-ignore lint/correctness/noUnusedPrivateClassMembers: for pulumi which for some reason tries to copy all properties
1553
- set service(_value) {
1554
- }
1555
- /**
1556
- * The service associated with the workload.
1557
- */
1558
- get optionalService() {
1559
- return this._service;
1560
- }
1561
- /**
1562
- * The service associated with the workload.
1563
- *
1564
- * Will throw an error if the service is not available.
1565
- */
1566
- get service() {
1567
- return this._service.apply((service) => {
1568
- if (!service) {
1569
- throw new Error(`The service of the workload "${this.name}" is not available.`);
1570
- }
1571
- return service;
1572
- });
1573
- }
1574
- /**
1575
- * The merged and deduplicated L3 endpoints of all routes.
1576
- */
1577
- get endpoints() {
1578
- return this.routes.apply(
1579
- (routes) => output(routes.map((route) => route.route.endpoints)).apply((endpoints) => flat(endpoints)).apply(mergeEndpoints)
1580
- );
1581
- }
1582
- /**
1583
- * Creates a generic exposable workload or patches the existing one.
1584
- */
1585
- static createOrPatchGeneric(name, args, opts) {
1586
- return output(args).apply(async (args2) => {
1587
- if (args2.existing?.kind === "Deployment") {
1588
- const { Deployment } = await import('./deployment-O2LJ5WR5.js');
1589
- return Deployment.patch(
1590
- name,
1591
- {
1592
- ...deepmerge(args2, args2.deployment),
1593
- name: args2.existing.metadata.name,
1594
- namespace: Namespace.forResourceAsync(args2.existing, output(args2.namespace).cluster)
1595
- },
1596
- opts
1597
- );
1598
- }
1599
- if (args2.existing?.kind === "StatefulSet") {
1600
- const { StatefulSet } = await import('./stateful-set-VJYKTQ72.js');
1601
- return StatefulSet.patch(
1602
- name,
1603
- {
1604
- ...deepmerge(args2, args2.statefulSet),
1605
- name: args2.existing.metadata.name,
1606
- namespace: Namespace.forResourceAsync(args2.existing, output(args2.namespace).cluster)
1607
- },
1608
- opts
1609
- );
1610
- }
1611
- if (args2.defaultType === "Deployment") {
1612
- const { Deployment } = await import('./deployment-O2LJ5WR5.js');
1613
- return Deployment.create(name, deepmerge(args2, args2.deployment), opts);
1614
- }
1615
- if (args2.defaultType === "StatefulSet") {
1616
- const { StatefulSet } = await import('./stateful-set-VJYKTQ72.js');
1617
- return StatefulSet.create(name, deepmerge(args2, args2.statefulSet), opts);
1618
- }
1619
- throw new Error(`Unknown workload type: ${args2.defaultType}`);
1620
- });
1621
- }
1622
- };
1623
1801
 
1624
- export { ConfigMap, ExposableWorkload, NativeNetworkPolicy, NetworkPolicy, PersistentVolumeClaim, Workload, exposableWorkloadExtraArgs, getAutoVolumeName, getBestEndpoint, getExposableWorkloadComponents, getFallbackContainerName, getWorkloadComponents, getWorkloadVolumeResourceUuid, mapContainerEnvironment, mapContainerToRaw, mapEnvironmentSource, mapVolumeMount, mapWorkloadVolume, networkPolicyMediator, podSpecDefaults, requireBestEndpoint, workloadExtraArgs };
1625
- //# sourceMappingURL=chunk-P2VOUU7E.js.map
1626
- //# sourceMappingURL=chunk-P2VOUU7E.js.map
1802
+ export { ConfigMap, NativeNetworkPolicy, NetworkPolicy, PersistentVolumeClaim, Workload, filterPatchOwnedContainersInTemplate, getAutoVolumeName, getBestEndpoint, getFallbackContainerName, getWorkloadComponents, getWorkloadServiceComponents, getWorkloadVolumeResourceUuid, mapContainerEnvironment, mapContainerToRaw, mapEnvironmentSource, mapVolumeMount, mapWorkloadVolume, networkPolicyMediator, podSpecDefaults, requireBestEndpoint, workloadExtraArgs, workloadServiceExtraArgs };
1803
+ //# sourceMappingURL=chunk-SZKOAHNX.js.map
1804
+ //# sourceMappingURL=chunk-SZKOAHNX.js.map