@highstate/k8s 0.19.1 → 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.
- package/dist/{chunk-FE4SHRAJ.js → chunk-23X5SXQG.js} +22 -7
- package/dist/chunk-23X5SXQG.js.map +1 -0
- package/dist/{chunk-LGHFSXNT.js → chunk-ADHZK6V2.js} +14 -10
- package/dist/chunk-ADHZK6V2.js.map +1 -0
- package/dist/{chunk-VCXWCZ43.js → chunk-BTAEFJ5N.js} +27 -15
- package/dist/chunk-BTAEFJ5N.js.map +1 -0
- package/dist/{chunk-BR2CLUUD.js → chunk-IXE3OKB4.js} +27 -8
- package/dist/chunk-IXE3OKB4.js.map +1 -0
- package/dist/{chunk-TWBMG6TD.js → chunk-OG2OPX7B.js} +30 -12
- package/dist/chunk-OG2OPX7B.js.map +1 -0
- package/dist/{chunk-DCUMJSO6.js → chunk-P26SQ2ZB.js} +17 -51
- package/dist/chunk-P26SQ2ZB.js.map +1 -0
- package/dist/{chunk-MIC2BHGS.js → chunk-PG27ZY2H.js} +25 -7
- package/dist/chunk-PG27ZY2H.js.map +1 -0
- package/dist/chunk-PZYGZSN5.js +54 -0
- package/dist/{chunk-PZ5AY32C.js.map → chunk-PZYGZSN5.js.map} +1 -1
- package/dist/{chunk-YIJUVPU2.js → chunk-S77TE7UC.js} +27 -15
- package/dist/chunk-S77TE7UC.js.map +1 -0
- package/dist/{chunk-P2VOUU7E.js → chunk-SZKOAHNX.js} +383 -205
- package/dist/chunk-SZKOAHNX.js.map +1 -0
- package/dist/chunk-TOLFVF4S.js +889 -0
- package/dist/chunk-TOLFVF4S.js.map +1 -0
- package/dist/{chunk-RVB4WWZZ.js → chunk-TVKT3ZYX.js} +174 -18
- package/dist/chunk-TVKT3ZYX.js.map +1 -0
- package/dist/cron-job-RKB2HYTO.js +7 -0
- package/dist/{cron-job-NX4HD4FI.js.map → cron-job-RKB2HYTO.js.map} +1 -1
- package/dist/deployment-T35TUOL2.js +7 -0
- package/dist/{deployment-O2LJ5WR5.js.map → deployment-T35TUOL2.js.map} +1 -1
- package/dist/highstate.manifest.json +3 -2
- package/dist/impl/dynamic-endpoint-resolver.js +90 -0
- package/dist/impl/dynamic-endpoint-resolver.js.map +1 -0
- package/dist/impl/gateway-route.js +159 -62
- package/dist/impl/gateway-route.js.map +1 -1
- package/dist/impl/tls-certificate.js +6 -5
- package/dist/impl/tls-certificate.js.map +1 -1
- package/dist/index.js +106 -23
- package/dist/index.js.map +1 -1
- package/dist/job-PE4AKOHB.js +7 -0
- package/dist/job-PE4AKOHB.js.map +1 -0
- package/dist/stateful-set-LUIRHQJY.js +7 -0
- package/dist/{stateful-set-VJYKTQ72.js.map → stateful-set-LUIRHQJY.js.map} +1 -1
- package/dist/units/cert-manager/index.js +7 -8
- package/dist/units/cert-manager/index.js.map +1 -1
- package/dist/units/cluster-patch/index.js +6 -6
- package/dist/units/cluster-patch/index.js.map +1 -1
- package/dist/units/dns01-issuer/index.js +52 -15
- package/dist/units/dns01-issuer/index.js.map +1 -1
- package/dist/units/existing-cluster/index.js +39 -18
- package/dist/units/existing-cluster/index.js.map +1 -1
- package/dist/units/gateway-api/index.js +2 -2
- package/dist/units/reduced-access-cluster/index.js +8 -8
- package/dist/units/reduced-access-cluster/index.js.map +1 -1
- package/package.json +9 -7
- package/src/cluster.ts +12 -8
- package/src/config-map.ts +15 -5
- package/src/container.ts +4 -2
- package/src/cron-job.ts +25 -4
- package/src/deployment.ts +32 -17
- package/src/gateway/backend.ts +3 -3
- package/src/gateway/gateway.ts +12 -56
- package/src/helm.ts +354 -22
- package/src/impl/dynamic-endpoint-resolver.ts +109 -0
- package/src/impl/gateway-route.ts +231 -57
- package/src/impl/tls-certificate.ts +8 -3
- package/src/index.ts +1 -0
- package/src/job.ts +23 -5
- package/src/kubectl.ts +166 -0
- package/src/namespace.ts +47 -3
- package/src/network-policy.ts +1 -1
- package/src/pvc.ts +12 -2
- package/src/rbac.ts +28 -5
- package/src/scripting/environment.ts +3 -2
- package/src/secret.ts +15 -5
- package/src/service.ts +28 -6
- package/src/shared.ts +30 -2
- package/src/stateful-set.ts +32 -17
- package/src/tls.ts +31 -5
- package/src/units/cluster-patch/index.ts +5 -5
- package/src/units/dns01-issuer/index.ts +56 -12
- package/src/units/existing-cluster/index.ts +36 -15
- package/src/units/reduced-access-cluster/index.ts +6 -3
- package/src/worker.ts +4 -2
- package/src/workload.ts +453 -213
- package/dist/chunk-4G6LLC2X.js +0 -240
- package/dist/chunk-4G6LLC2X.js.map +0 -1
- package/dist/chunk-BR2CLUUD.js.map +0 -1
- package/dist/chunk-DCUMJSO6.js.map +0 -1
- package/dist/chunk-FE4SHRAJ.js.map +0 -1
- package/dist/chunk-KMLRI5UZ.js +0 -155
- package/dist/chunk-KMLRI5UZ.js.map +0 -1
- package/dist/chunk-LGHFSXNT.js.map +0 -1
- package/dist/chunk-MIC2BHGS.js.map +0 -1
- package/dist/chunk-OBDQONMV.js +0 -401
- package/dist/chunk-OBDQONMV.js.map +0 -1
- package/dist/chunk-P2VOUU7E.js.map +0 -1
- package/dist/chunk-PZ5AY32C.js +0 -9
- package/dist/chunk-RVB4WWZZ.js.map +0 -1
- package/dist/chunk-TWBMG6TD.js.map +0 -1
- package/dist/chunk-VCXWCZ43.js.map +0 -1
- package/dist/chunk-YIJUVPU2.js.map +0 -1
- package/dist/cron-job-NX4HD4FI.js +0 -8
- package/dist/deployment-O2LJ5WR5.js +0 -8
- package/dist/job-SYME6Y43.js +0 -8
- package/dist/job-SYME6Y43.js.map +0 -1
- package/dist/stateful-set-VJYKTQ72.js +0 -8
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { isEndpointFromCluster, mapServiceToLabelSelector, Service, mapContainerPortToServicePort } from './chunk-
|
|
2
|
-
import { Secret } from './chunk-
|
|
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 {
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
418
|
-
output
|
|
419
|
-
output
|
|
420
|
-
output
|
|
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
|
|
444
|
+
const pvc = output(args.namespace).cluster.apply((cluster) => {
|
|
427
445
|
return core.v1.PersistentVolumeClaim.get(
|
|
428
446
|
name,
|
|
429
|
-
interpolate
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
831
|
-
const cluster = await toPromise(output
|
|
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
|
|
853
|
-
const cluster = await toPromise(output
|
|
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
|
|
875
|
-
const cluster = await toPromise(output
|
|
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
|
|
896
|
-
const cluster = await toPromise(output
|
|
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
|
|
917
|
-
const cluster = await toPromise(output
|
|
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
|
|
938
|
-
const cluster = await toPromise(output
|
|
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
|
|
962
|
-
const cluster = await toPromise(output
|
|
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
|
|
984
|
-
const resolvedEndpoints = await toPromise(output
|
|
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
|
|
1004
|
-
const cluster = await toPromise(output
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
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":
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
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 =
|
|
1425
|
-
|
|
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":
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1514
|
-
|
|
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-
|
|
1518
|
-
|
|
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-
|
|
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-
|
|
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,
|
|
1625
|
-
//# sourceMappingURL=chunk-
|
|
1626
|
-
//# sourceMappingURL=chunk-
|
|
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
|