@highstate/k8s 0.20.0 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-23vn2rdc.js +11 -0
- package/dist/chunk-2pfx13ay.js +11 -0
- package/dist/chunk-46ntav0c.js +299 -0
- package/dist/chunk-556pc9e6.js +155 -0
- package/dist/chunk-7kgjgcft.js +170 -0
- package/dist/{chunk-ADHZK6V2.js → chunk-9hs97f1q.js} +13 -11
- package/dist/chunk-aame3x1b.js +11 -0
- package/dist/chunk-b05q6fm2.js +37 -0
- package/dist/chunk-bmvc9d2d.js +11 -0
- package/dist/chunk-de82bbp2.js +7 -0
- package/dist/chunk-facs31cb.js +624 -0
- package/dist/chunk-h1b79v66.js +1425 -0
- package/dist/chunk-k4w9zpn5.js +215 -0
- package/dist/chunk-pqc6w52f.js +352 -0
- package/dist/chunk-qyshvz32.js +176 -0
- package/dist/chunk-tpfyj6fe.js +199 -0
- package/dist/chunk-z6bmpnm7.js +180 -0
- package/dist/highstate.manifest.json +3 -3
- package/dist/impl/dynamic-endpoint-resolver.js +82 -81
- package/dist/impl/gateway-route.js +131 -168
- package/dist/impl/tls-certificate.js +31 -32
- package/dist/index.js +245 -201
- package/dist/units/cert-manager/index.js +19 -13
- package/dist/units/cluster-patch/index.js +9 -8
- package/dist/units/dns01-issuer/index.js +44 -41
- package/dist/units/existing-cluster/index.js +25 -13
- package/dist/units/gateway-api/index.js +15 -16
- package/dist/units/reduced-access-cluster/index.js +28 -32
- package/package.json +21 -21
- package/src/cron-job.ts +26 -1
- package/src/deployment.ts +17 -1
- package/src/job.ts +15 -1
- package/src/scripting/bundle.ts +21 -98
- package/src/scripting/environment.ts +2 -9
- package/src/shared.ts +1 -1
- package/src/stateful-set.ts +17 -1
- package/src/workload.ts +31 -14
- package/LICENSE +0 -21
- package/dist/chunk-23X5SXQG.js +0 -301
- package/dist/chunk-23X5SXQG.js.map +0 -1
- package/dist/chunk-ADHZK6V2.js.map +0 -1
- package/dist/chunk-BTAEFJ5N.js +0 -291
- package/dist/chunk-BTAEFJ5N.js.map +0 -1
- package/dist/chunk-HH2JJELM.js +0 -13
- package/dist/chunk-HH2JJELM.js.map +0 -1
- package/dist/chunk-IXE3OKB4.js +0 -249
- package/dist/chunk-IXE3OKB4.js.map +0 -1
- package/dist/chunk-OG2OPX7B.js +0 -333
- package/dist/chunk-OG2OPX7B.js.map +0 -1
- package/dist/chunk-P26SQ2ZB.js +0 -393
- package/dist/chunk-P26SQ2ZB.js.map +0 -1
- package/dist/chunk-PG27ZY2H.js +0 -319
- package/dist/chunk-PG27ZY2H.js.map +0 -1
- package/dist/chunk-PZYGZSN5.js +0 -54
- package/dist/chunk-PZYGZSN5.js.map +0 -1
- package/dist/chunk-S77TE7UC.js +0 -309
- package/dist/chunk-S77TE7UC.js.map +0 -1
- package/dist/chunk-SZKOAHNX.js +0 -1804
- package/dist/chunk-SZKOAHNX.js.map +0 -1
- package/dist/chunk-TOLFVF4S.js +0 -889
- package/dist/chunk-TOLFVF4S.js.map +0 -1
- package/dist/chunk-TVKT3ZYX.js +0 -423
- package/dist/chunk-TVKT3ZYX.js.map +0 -1
- package/dist/cron-job-RKB2HYTO.js +0 -7
- package/dist/cron-job-RKB2HYTO.js.map +0 -1
- package/dist/deployment-T35TUOL2.js +0 -7
- package/dist/deployment-T35TUOL2.js.map +0 -1
- package/dist/impl/dynamic-endpoint-resolver.js.map +0 -1
- package/dist/impl/gateway-route.js.map +0 -1
- package/dist/impl/tls-certificate.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/job-PE4AKOHB.js +0 -7
- package/dist/job-PE4AKOHB.js.map +0 -1
- package/dist/stateful-set-LUIRHQJY.js +0 -7
- package/dist/stateful-set-LUIRHQJY.js.map +0 -1
- package/dist/units/cert-manager/index.js.map +0 -1
- package/dist/units/cluster-patch/index.js.map +0 -1
- package/dist/units/dns01-issuer/index.js.map +0 -1
- package/dist/units/existing-cluster/index.js.map +0 -1
- package/dist/units/gateway-api/index.js.map +0 -1
- package/dist/units/reduced-access-cluster/index.js.map +0 -1
package/src/stateful-set.ts
CHANGED
|
@@ -349,6 +349,22 @@ class StatefulSetPatch extends StatefulSet {
|
|
|
349
349
|
)
|
|
350
350
|
})
|
|
351
351
|
|
|
352
|
+
const filteredSpec = output({ spec: statefulSet.spec, podTemplate }).apply(
|
|
353
|
+
({ spec, podTemplate }) => {
|
|
354
|
+
if (!spec.template) {
|
|
355
|
+
return spec
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return {
|
|
359
|
+
...spec,
|
|
360
|
+
template: filterPatchOwnedContainersInTemplate(
|
|
361
|
+
spec.template as Unwrap<types.input.core.v1.PodTemplateSpec>,
|
|
362
|
+
podTemplate,
|
|
363
|
+
) as types.output.core.v1.PodTemplateSpec,
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
) as Output<types.output.apps.v1.StatefulSetSpec>
|
|
367
|
+
|
|
352
368
|
super(
|
|
353
369
|
"highstate:k8s:StatefulSetPatch",
|
|
354
370
|
name,
|
|
@@ -364,7 +380,7 @@ class StatefulSetPatch extends StatefulSet {
|
|
|
364
380
|
service,
|
|
365
381
|
routes,
|
|
366
382
|
|
|
367
|
-
|
|
383
|
+
filteredSpec,
|
|
368
384
|
statefulSet.status,
|
|
369
385
|
)
|
|
370
386
|
}
|
package/src/workload.ts
CHANGED
|
@@ -293,6 +293,15 @@ export type GenericWorkloadArgs = Omit<WorkloadServiceArgs, "existing"> & {
|
|
|
293
293
|
cronJob?: Input<JobArgs>
|
|
294
294
|
}
|
|
295
295
|
|
|
296
|
+
const genericWorkloadExtraArgs = [
|
|
297
|
+
"defaultType",
|
|
298
|
+
"existing",
|
|
299
|
+
"deployment",
|
|
300
|
+
"statefulSet",
|
|
301
|
+
"job",
|
|
302
|
+
"cronJob",
|
|
303
|
+
] as const
|
|
304
|
+
|
|
296
305
|
export function getWorkloadComponents(
|
|
297
306
|
name: string,
|
|
298
307
|
args: WorkloadArgs,
|
|
@@ -939,13 +948,17 @@ export abstract class Workload extends NamespacedResource {
|
|
|
939
948
|
opts?: CustomResourceOptions,
|
|
940
949
|
): Output<Workload> {
|
|
941
950
|
return output(args).apply(async args => {
|
|
951
|
+
const baseArgs = omit(args, genericWorkloadExtraArgs)
|
|
952
|
+
|
|
942
953
|
if (args.existing?.kind === "Deployment") {
|
|
943
954
|
const { Deployment } = await import("./deployment")
|
|
944
955
|
|
|
956
|
+
const deploymentArgs = deepmerge(baseArgs, args.deployment ?? {}) as DeploymentArgs
|
|
957
|
+
|
|
945
958
|
return Deployment.patch(
|
|
946
959
|
name,
|
|
947
960
|
{
|
|
948
|
-
...
|
|
961
|
+
...deploymentArgs,
|
|
949
962
|
name: args.existing.metadata.name,
|
|
950
963
|
namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),
|
|
951
964
|
},
|
|
@@ -956,10 +969,12 @@ export abstract class Workload extends NamespacedResource {
|
|
|
956
969
|
if (args.existing?.kind === "StatefulSet") {
|
|
957
970
|
const { StatefulSet } = await import("./stateful-set")
|
|
958
971
|
|
|
972
|
+
const statefulSetArgs = deepmerge(baseArgs, args.statefulSet ?? {}) as StatefulSetArgs
|
|
973
|
+
|
|
959
974
|
return StatefulSet.patch(
|
|
960
975
|
name,
|
|
961
976
|
{
|
|
962
|
-
...
|
|
977
|
+
...statefulSetArgs,
|
|
963
978
|
name: args.existing.metadata.name,
|
|
964
979
|
namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),
|
|
965
980
|
},
|
|
@@ -970,10 +985,12 @@ export abstract class Workload extends NamespacedResource {
|
|
|
970
985
|
if (args.existing?.kind === "Job") {
|
|
971
986
|
const { Job } = await import("./job")
|
|
972
987
|
|
|
988
|
+
const jobArgs = deepmerge(baseArgs, args.job ?? {}) as JobArgs
|
|
989
|
+
|
|
973
990
|
return Job.patch(
|
|
974
991
|
name,
|
|
975
992
|
{
|
|
976
|
-
...
|
|
993
|
+
...jobArgs,
|
|
977
994
|
name: args.existing.metadata.name,
|
|
978
995
|
namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),
|
|
979
996
|
},
|
|
@@ -984,10 +1001,12 @@ export abstract class Workload extends NamespacedResource {
|
|
|
984
1001
|
if (args.existing?.kind === "CronJob") {
|
|
985
1002
|
const { CronJob } = await import("./cron-job")
|
|
986
1003
|
|
|
1004
|
+
const cronJobArgs = deepmerge(baseArgs, args.cronJob ?? {}) as JobArgs
|
|
1005
|
+
|
|
987
1006
|
return CronJob.patch(
|
|
988
1007
|
name,
|
|
989
1008
|
{
|
|
990
|
-
...
|
|
1009
|
+
...cronJobArgs,
|
|
991
1010
|
name: args.existing.metadata.name,
|
|
992
1011
|
namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),
|
|
993
1012
|
},
|
|
@@ -998,10 +1017,7 @@ export abstract class Workload extends NamespacedResource {
|
|
|
998
1017
|
if (args.defaultType === "Deployment") {
|
|
999
1018
|
const { Deployment } = await import("./deployment")
|
|
1000
1019
|
|
|
1001
|
-
const deploymentArgs = deepmerge(
|
|
1002
|
-
omit(args, ["defaultType", "existing", "deployment", "statefulSet", "job", "cronJob"]),
|
|
1003
|
-
args.deployment ?? {},
|
|
1004
|
-
) as DeploymentArgs
|
|
1020
|
+
const deploymentArgs = deepmerge(baseArgs, args.deployment ?? {}) as DeploymentArgs
|
|
1005
1021
|
|
|
1006
1022
|
return Deployment.create(name, deploymentArgs, opts)
|
|
1007
1023
|
}
|
|
@@ -1009,10 +1025,7 @@ export abstract class Workload extends NamespacedResource {
|
|
|
1009
1025
|
if (args.defaultType === "StatefulSet") {
|
|
1010
1026
|
const { StatefulSet } = await import("./stateful-set")
|
|
1011
1027
|
|
|
1012
|
-
const statefulSetArgs = deepmerge(
|
|
1013
|
-
omit(args, ["defaultType", "existing", "deployment", "statefulSet", "job", "cronJob"]),
|
|
1014
|
-
args.statefulSet ?? {},
|
|
1015
|
-
) as StatefulSetArgs
|
|
1028
|
+
const statefulSetArgs = deepmerge(baseArgs, args.statefulSet ?? {}) as StatefulSetArgs
|
|
1016
1029
|
|
|
1017
1030
|
return StatefulSet.create(name, statefulSetArgs, opts)
|
|
1018
1031
|
}
|
|
@@ -1020,13 +1033,17 @@ export abstract class Workload extends NamespacedResource {
|
|
|
1020
1033
|
if (args.defaultType === "Job") {
|
|
1021
1034
|
const { Job } = await import("./job")
|
|
1022
1035
|
|
|
1023
|
-
|
|
1036
|
+
const jobArgs = deepmerge(baseArgs, args.job ?? {}) as JobArgs
|
|
1037
|
+
|
|
1038
|
+
return Job.create(name, jobArgs, opts)
|
|
1024
1039
|
}
|
|
1025
1040
|
|
|
1026
1041
|
if (args.defaultType === "CronJob") {
|
|
1027
1042
|
const { CronJob } = await import("./cron-job")
|
|
1028
1043
|
|
|
1029
|
-
|
|
1044
|
+
const cronJobArgs = deepmerge(baseArgs, args.cronJob ?? {}) as JobArgs
|
|
1045
|
+
|
|
1046
|
+
return CronJob.create(name, cronJobArgs, opts)
|
|
1030
1047
|
}
|
|
1031
1048
|
|
|
1032
1049
|
throw new Error(`Unknown workload type: ${args.defaultType as string}`)
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Exeteres
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
package/dist/chunk-23X5SXQG.js
DELETED
|
@@ -1,301 +0,0 @@
|
|
|
1
|
-
import { Workload, getWorkloadComponents, filterPatchOwnedContainersInTemplate } from './chunk-SZKOAHNX.js';
|
|
2
|
-
import { commonExtraArgs, Namespace, mapMetadata, getProvider } from './chunk-TOLFVF4S.js';
|
|
3
|
-
import { getOrCreate } from '@highstate/contract';
|
|
4
|
-
import { k8s } from '@highstate/library';
|
|
5
|
-
import { makeEntityOutput, output, interpolate, toPromise } from '@highstate/pulumi';
|
|
6
|
-
import { batch } from '@pulumi/kubernetes';
|
|
7
|
-
import { deepmerge } from 'deepmerge-ts';
|
|
8
|
-
import { omit } from 'remeda';
|
|
9
|
-
|
|
10
|
-
var Job = class _Job extends Workload {
|
|
11
|
-
constructor(type, name, args, opts, metadata, namespace, terminalArgs, containers, networkPolicy, spec, status) {
|
|
12
|
-
super(
|
|
13
|
-
type,
|
|
14
|
-
name,
|
|
15
|
-
args,
|
|
16
|
-
opts,
|
|
17
|
-
metadata,
|
|
18
|
-
namespace,
|
|
19
|
-
terminalArgs,
|
|
20
|
-
containers,
|
|
21
|
-
spec.template,
|
|
22
|
-
networkPolicy
|
|
23
|
-
);
|
|
24
|
-
this.spec = spec;
|
|
25
|
-
this.status = status;
|
|
26
|
-
}
|
|
27
|
-
static apiVersion = "batch/v1";
|
|
28
|
-
static kind = "Job";
|
|
29
|
-
get templateMetadata() {
|
|
30
|
-
return this.spec.template.metadata;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* The Highstate job entity.
|
|
34
|
-
*/
|
|
35
|
-
get entity() {
|
|
36
|
-
return makeEntityOutput({
|
|
37
|
-
entity: k8s.jobEntity,
|
|
38
|
-
identity: this.metadata.uid,
|
|
39
|
-
meta: {
|
|
40
|
-
title: this.metadata.name
|
|
41
|
-
},
|
|
42
|
-
value: {
|
|
43
|
-
...this.entityBase,
|
|
44
|
-
spec: this.spec
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
getTerminalMeta() {
|
|
49
|
-
return output({
|
|
50
|
-
title: "Job",
|
|
51
|
-
globalTitle: interpolate`Job | ${this.metadata.name}`,
|
|
52
|
-
description: "The shell inside the job.",
|
|
53
|
-
icon: "devicon:kubernetes"
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
get resourceType() {
|
|
57
|
-
return "job";
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Creates a new job.
|
|
61
|
-
*/
|
|
62
|
-
static create(name, args, opts) {
|
|
63
|
-
return new CreatedJob(name, args, opts);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Creates a new job or patches an existing one.
|
|
67
|
-
*
|
|
68
|
-
* @param name The name of the resource. May not be the same as the job name.
|
|
69
|
-
* @param args The arguments to create or patch the job with.
|
|
70
|
-
* @param opts Optional resource options.
|
|
71
|
-
*/
|
|
72
|
-
static createOrPatch(name, args, opts) {
|
|
73
|
-
if (args.existing) {
|
|
74
|
-
return new JobPatch(name, {
|
|
75
|
-
...args,
|
|
76
|
-
name: output(args.existing).metadata.name,
|
|
77
|
-
namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster)
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
return new CreatedJob(name, args, opts);
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Creates a new job or gets an existing one.
|
|
84
|
-
*
|
|
85
|
-
* @param name The name of the resource. May not be the same as the job name. Will not be used when existing job is retrieved.
|
|
86
|
-
* @param args The arguments to create or get the job with.
|
|
87
|
-
* @param opts Optional resource options.
|
|
88
|
-
*/
|
|
89
|
-
static async createOrGet(name, args, opts) {
|
|
90
|
-
if (args.existing) {
|
|
91
|
-
return await _Job.forAsync(args.existing, output(args.namespace).cluster);
|
|
92
|
-
}
|
|
93
|
-
return new CreatedJob(name, args, opts);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Patches an existing job.
|
|
97
|
-
*
|
|
98
|
-
* Will throw an error if the job does not exist.
|
|
99
|
-
*
|
|
100
|
-
* @param name The name of the resource. May not be the same as the job name.
|
|
101
|
-
* @param args The arguments to patch the job with.
|
|
102
|
-
* @param opts Optional resource options.
|
|
103
|
-
*/
|
|
104
|
-
static patch(name, args, opts) {
|
|
105
|
-
return new JobPatch(name, args, opts);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Wraps an existing Kubernetes job.
|
|
109
|
-
*/
|
|
110
|
-
static wrap(name, args, opts) {
|
|
111
|
-
return new WrappedJob(name, args, opts);
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Gets an existing job.
|
|
115
|
-
*
|
|
116
|
-
* Will throw an error if the job does not exist.
|
|
117
|
-
*/
|
|
118
|
-
static get(name, args, opts) {
|
|
119
|
-
return new ExternalJob(name, args, opts);
|
|
120
|
-
}
|
|
121
|
-
static jobCache = /* @__PURE__ */ new Map();
|
|
122
|
-
/**
|
|
123
|
-
* Gets an existing job for a given entity.
|
|
124
|
-
* Prefer this method over `get` when possible.
|
|
125
|
-
*
|
|
126
|
-
* It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.
|
|
127
|
-
*
|
|
128
|
-
* This method is idempotent and will return the same instance for the same entity.
|
|
129
|
-
*
|
|
130
|
-
* @param entity The entity to get the job for.
|
|
131
|
-
* @param cluster The cluster where the job is located.
|
|
132
|
-
*/
|
|
133
|
-
static for(entity, cluster) {
|
|
134
|
-
return getOrCreate(
|
|
135
|
-
_Job.jobCache,
|
|
136
|
-
`${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,
|
|
137
|
-
(name) => {
|
|
138
|
-
return _Job.get(name, {
|
|
139
|
-
name: entity.metadata.name,
|
|
140
|
-
namespace: Namespace.forResource(entity, cluster)
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Gets an existing job for a given entity.
|
|
147
|
-
* Prefer this method over `get` when possible.
|
|
148
|
-
*
|
|
149
|
-
* It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.
|
|
150
|
-
*
|
|
151
|
-
* This method is idempotent and will return the same instance for the same entity.
|
|
152
|
-
*
|
|
153
|
-
* @param entity The entity to get the job for.
|
|
154
|
-
* @param cluster The cluster where the job is located.
|
|
155
|
-
*/
|
|
156
|
-
static async forAsync(entity, cluster) {
|
|
157
|
-
const resolvedEntity = await toPromise(entity);
|
|
158
|
-
return _Job.for(resolvedEntity, cluster);
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
var jobExtraArgs = [...commonExtraArgs, "container", "containers"];
|
|
162
|
-
var CreatedJob = class extends Job {
|
|
163
|
-
constructor(name, args, opts) {
|
|
164
|
-
const { podTemplate, containers, networkPolicy } = getWorkloadComponents(
|
|
165
|
-
name,
|
|
166
|
-
args,
|
|
167
|
-
() => this,
|
|
168
|
-
opts
|
|
169
|
-
);
|
|
170
|
-
const job = output(args.namespace).cluster.apply((cluster) => {
|
|
171
|
-
return new batch.v1.Job(
|
|
172
|
-
name,
|
|
173
|
-
{
|
|
174
|
-
metadata: mapMetadata(args, name),
|
|
175
|
-
spec: output({ args, podTemplate }).apply(({ args: args2, podTemplate: podTemplate2 }) => {
|
|
176
|
-
return deepmerge(
|
|
177
|
-
{
|
|
178
|
-
template: deepmerge(
|
|
179
|
-
{
|
|
180
|
-
spec: {
|
|
181
|
-
restartPolicy: "Never"
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
podTemplate2
|
|
185
|
-
)
|
|
186
|
-
},
|
|
187
|
-
omit(args2, jobExtraArgs)
|
|
188
|
-
);
|
|
189
|
-
})
|
|
190
|
-
},
|
|
191
|
-
{ ...opts, parent: this, provider: getProvider(cluster) }
|
|
192
|
-
);
|
|
193
|
-
});
|
|
194
|
-
super(
|
|
195
|
-
"highstate:k8s:Job",
|
|
196
|
-
name,
|
|
197
|
-
args,
|
|
198
|
-
opts,
|
|
199
|
-
job.metadata,
|
|
200
|
-
output(args.namespace),
|
|
201
|
-
output(args.terminal ?? {}),
|
|
202
|
-
containers,
|
|
203
|
-
networkPolicy,
|
|
204
|
-
job.spec,
|
|
205
|
-
job.status
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
};
|
|
209
|
-
var JobPatch = class extends Job {
|
|
210
|
-
constructor(name, args, opts) {
|
|
211
|
-
const { podTemplate, containers, networkPolicy } = getWorkloadComponents(
|
|
212
|
-
name,
|
|
213
|
-
args,
|
|
214
|
-
() => this,
|
|
215
|
-
opts,
|
|
216
|
-
true
|
|
217
|
-
);
|
|
218
|
-
const job = output(args.namespace).cluster.apply((cluster) => {
|
|
219
|
-
return new batch.v1.JobPatch(
|
|
220
|
-
name,
|
|
221
|
-
{
|
|
222
|
-
metadata: mapMetadata(args, name),
|
|
223
|
-
spec: output({ args, podTemplate }).apply(({ args: args2, podTemplate: podTemplate2 }) => {
|
|
224
|
-
const spec = deepmerge(
|
|
225
|
-
{ template: podTemplate2 },
|
|
226
|
-
omit(args2, jobExtraArgs)
|
|
227
|
-
);
|
|
228
|
-
if (spec.template) {
|
|
229
|
-
spec.template = filterPatchOwnedContainersInTemplate(spec.template, podTemplate2);
|
|
230
|
-
}
|
|
231
|
-
return spec;
|
|
232
|
-
})
|
|
233
|
-
},
|
|
234
|
-
{ ...opts, parent: this, provider: getProvider(cluster) }
|
|
235
|
-
);
|
|
236
|
-
});
|
|
237
|
-
super(
|
|
238
|
-
"highstate:k8s:JobPatch",
|
|
239
|
-
name,
|
|
240
|
-
args,
|
|
241
|
-
opts,
|
|
242
|
-
job.metadata,
|
|
243
|
-
output(args.namespace),
|
|
244
|
-
output(args.terminal ?? {}),
|
|
245
|
-
containers,
|
|
246
|
-
networkPolicy,
|
|
247
|
-
job.spec,
|
|
248
|
-
job.status
|
|
249
|
-
);
|
|
250
|
-
this.registerOutputs({
|
|
251
|
-
metadata: this.metadata,
|
|
252
|
-
spec: this.spec,
|
|
253
|
-
status: this.status
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
};
|
|
257
|
-
var WrappedJob = class extends Job {
|
|
258
|
-
constructor(name, args, opts) {
|
|
259
|
-
super(
|
|
260
|
-
"highstate:k8s:WrappedJob",
|
|
261
|
-
name,
|
|
262
|
-
args,
|
|
263
|
-
opts,
|
|
264
|
-
output(args.job).metadata,
|
|
265
|
-
output(args.namespace),
|
|
266
|
-
output(args.terminal ?? {}),
|
|
267
|
-
output([]),
|
|
268
|
-
output(void 0),
|
|
269
|
-
output(args.job).spec,
|
|
270
|
-
output(args.job).status
|
|
271
|
-
);
|
|
272
|
-
}
|
|
273
|
-
};
|
|
274
|
-
var ExternalJob = class extends Job {
|
|
275
|
-
constructor(name, args, opts) {
|
|
276
|
-
const job = output(args.namespace).cluster.apply((cluster) => {
|
|
277
|
-
return batch.v1.Job.get(
|
|
278
|
-
name,
|
|
279
|
-
interpolate`${output(args.namespace).metadata.name}/${args.name}`,
|
|
280
|
-
{ ...opts, parent: this, provider: getProvider(cluster) }
|
|
281
|
-
);
|
|
282
|
-
});
|
|
283
|
-
super(
|
|
284
|
-
"highstate:k8s:ExternalJob",
|
|
285
|
-
name,
|
|
286
|
-
args,
|
|
287
|
-
opts,
|
|
288
|
-
job.metadata,
|
|
289
|
-
output(args.namespace),
|
|
290
|
-
output({}),
|
|
291
|
-
output([]),
|
|
292
|
-
output(void 0),
|
|
293
|
-
job.spec,
|
|
294
|
-
job.status
|
|
295
|
-
);
|
|
296
|
-
}
|
|
297
|
-
};
|
|
298
|
-
|
|
299
|
-
export { Job };
|
|
300
|
-
//# sourceMappingURL=chunk-23X5SXQG.js.map
|
|
301
|
-
//# sourceMappingURL=chunk-23X5SXQG.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/job.ts"],"names":["args","podTemplate"],"mappings":"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","file":"chunk-23X5SXQG.js","sourcesContent":["import type { Container } from \"./container\"\nimport type { NetworkPolicy } from \"./network-policy\"\nimport { getOrCreate, type UnitTerminal } from \"@highstate/contract\"\nimport { k8s } from \"@highstate/library\"\nimport {\n type ComponentResourceOptions,\n type Input,\n type Inputs,\n interpolate,\n makeEntityOutput,\n type Output,\n output,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { batch, type types } from \"@pulumi/kubernetes\"\nimport { deepmerge } from \"deepmerge-ts\"\nimport { omit } from \"remeda\"\nimport { Namespace } from \"./namespace\"\nimport { commonExtraArgs, getProvider, mapMetadata, type ScopedResourceArgs } from \"./shared\"\nimport {\n filterPatchOwnedContainersInTemplate,\n getWorkloadComponents,\n Workload,\n type WorkloadArgs,\n type WorkloadTerminalArgs,\n} from \"./workload\"\n\nexport type JobArgs = ScopedResourceArgs &\n Omit<Partial<types.input.batch.v1.JobSpec>, \"template\"> & {\n template?: {\n metadata?: types.input.meta.v1.ObjectMeta\n spec?: Partial<types.input.core.v1.PodSpec>\n }\n } & WorkloadArgs\n\nexport type CreateOrGetJobArgs = JobArgs & {\n /**\n * The job entity to patch/retrieve.\n */\n existing: Input<k8s.NamespacedResource> | undefined\n}\n\n/**\n * Represents a Kubernetes Job resource with metadata and spec.\n */\nexport abstract class Job extends Workload {\n static apiVersion = \"batch/v1\"\n static kind = \"Job\"\n\n protected constructor(\n type: string,\n name: string,\n args: Inputs,\n opts: ComponentResourceOptions | undefined,\n\n metadata: Output<types.output.meta.v1.ObjectMeta>,\n namespace: Output<Namespace>,\n terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,\n containers: Output<Container[]>,\n networkPolicy: Output<NetworkPolicy | undefined>,\n\n /**\n * The spec of the underlying Kubernetes job.\n */\n readonly spec: Output<types.output.batch.v1.JobSpec>,\n\n /**\n * The status of the underlying Kubernetes job.\n */\n readonly status: Output<types.output.batch.v1.JobStatus>,\n ) {\n super(\n type,\n name,\n args,\n opts,\n metadata,\n namespace,\n terminalArgs,\n containers,\n spec.template,\n networkPolicy,\n )\n }\n\n protected override get templateMetadata(): Output<types.output.meta.v1.ObjectMeta> {\n return this.spec.template.metadata\n }\n\n /**\n * The Highstate job entity.\n */\n get entity(): Output<k8s.Job> {\n return makeEntityOutput({\n entity: k8s.jobEntity,\n identity: this.metadata.uid,\n meta: {\n title: this.metadata.name,\n },\n value: {\n ...this.entityBase,\n spec: this.spec,\n },\n })\n }\n\n protected getTerminalMeta(): Output<UnitTerminal[\"meta\"]> {\n return output({\n title: \"Job\",\n globalTitle: interpolate`Job | ${this.metadata.name}`,\n description: \"The shell inside the job.\",\n icon: \"devicon:kubernetes\",\n })\n }\n\n protected get resourceType(): string {\n return \"job\"\n }\n\n /**\n * Creates a new job.\n */\n static create(name: string, args: JobArgs, opts?: ComponentResourceOptions): Job {\n return new CreatedJob(name, args, opts)\n }\n\n /**\n * Creates a new job or patches an existing one.\n *\n * @param name The name of the resource. May not be the same as the job name.\n * @param args The arguments to create or patch the job with.\n * @param opts Optional resource options.\n */\n static createOrPatch(\n name: string,\n args: CreateOrGetJobArgs,\n opts?: ComponentResourceOptions,\n ): Job {\n if (args.existing) {\n return new JobPatch(name, {\n ...args,\n name: output(args.existing).metadata.name,\n namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),\n })\n }\n\n return new CreatedJob(name, args, opts)\n }\n\n /**\n * Creates a new job or gets an existing one.\n *\n * @param name The name of the resource. May not be the same as the job name. Will not be used when existing job is retrieved.\n * @param args The arguments to create or get the job with.\n * @param opts Optional resource options.\n */\n static async createOrGet(\n name: string,\n args: CreateOrGetJobArgs,\n opts?: ComponentResourceOptions,\n ): Promise<Job> {\n if (args.existing) {\n return await Job.forAsync(args.existing, output(args.namespace).cluster)\n }\n\n return new CreatedJob(name, args, opts)\n }\n\n /**\n * Patches an existing job.\n *\n * Will throw an error if the job does not exist.\n *\n * @param name The name of the resource. May not be the same as the job name.\n * @param args The arguments to patch the job with.\n * @param opts Optional resource options.\n */\n static patch(name: string, args: JobArgs, opts?: ComponentResourceOptions): Job {\n return new JobPatch(name, args, opts)\n }\n\n /**\n * Wraps an existing Kubernetes job.\n */\n static wrap(name: string, args: WrappedJobArgs, opts?: ComponentResourceOptions): Job {\n return new WrappedJob(name, args, opts)\n }\n\n /**\n * Gets an existing job.\n *\n * Will throw an error if the job does not exist.\n */\n static get(name: string, args: ExternalJobArgs, opts?: ComponentResourceOptions): Job {\n return new ExternalJob(name, args, opts)\n }\n\n private static readonly jobCache = new Map<string, Job>()\n\n /**\n * Gets an existing job for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the job for.\n * @param cluster The cluster where the job is located.\n */\n static for(entity: k8s.NamespacedResource, cluster: Input<k8s.Cluster>): Job {\n return getOrCreate(\n Job.jobCache,\n `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,\n name => {\n return Job.get(name, {\n name: entity.metadata.name,\n namespace: Namespace.forResource(entity, cluster),\n })\n },\n )\n }\n\n /**\n * Gets an existing job for a given entity.\n * Prefer this method over `get` when possible.\n *\n * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.\n *\n * This method is idempotent and will return the same instance for the same entity.\n *\n * @param entity The entity to get the job for.\n * @param cluster The cluster where the job is located.\n */\n static async forAsync(\n entity: Input<k8s.NamespacedResource>,\n cluster: Input<k8s.Cluster>,\n ): Promise<Job> {\n const resolvedEntity = await toPromise(entity)\n return Job.for(resolvedEntity, cluster)\n }\n}\n\nconst jobExtraArgs = [...commonExtraArgs, \"container\", \"containers\"] as const\n\nclass CreatedJob extends Job {\n constructor(name: string, args: JobArgs, opts?: ComponentResourceOptions) {\n const { podTemplate, containers, networkPolicy } = getWorkloadComponents(\n name,\n args,\n () => this,\n opts,\n )\n\n const job = output(args.namespace).cluster.apply(cluster => {\n return new batch.v1.Job(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate }).apply(({ args, podTemplate }) => {\n return deepmerge(\n {\n template: deepmerge(\n {\n spec: {\n restartPolicy: \"Never\",\n },\n },\n podTemplate,\n ),\n },\n omit(args, jobExtraArgs) as types.input.batch.v1.JobSpec,\n )\n }),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:Job\",\n name,\n args,\n opts,\n job.metadata,\n output(args.namespace),\n output(args.terminal ?? {}),\n containers,\n networkPolicy,\n job.spec,\n job.status,\n )\n }\n}\n\nclass JobPatch extends Job {\n constructor(name: string, args: JobArgs, opts?: ComponentResourceOptions) {\n const { podTemplate, containers, networkPolicy } = getWorkloadComponents(\n name,\n args,\n () => this,\n opts,\n true,\n )\n\n const job = output(args.namespace).cluster.apply(cluster => {\n return new batch.v1.JobPatch(\n name,\n {\n metadata: mapMetadata(args, name),\n spec: output({ args, podTemplate }).apply(({ args, podTemplate }) => {\n const spec = deepmerge(\n { template: podTemplate } satisfies types.input.batch.v1.JobSpec,\n omit(args, jobExtraArgs),\n ) as Unwrap<types.input.batch.v1.JobSpec>\n\n if (spec.template) {\n spec.template = filterPatchOwnedContainersInTemplate(spec.template, podTemplate)\n }\n\n return spec\n }),\n },\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:JobPatch\",\n name,\n args,\n opts,\n job.metadata,\n output(args.namespace),\n output(args.terminal ?? {}),\n containers,\n networkPolicy,\n job.spec,\n job.status,\n )\n\n this.registerOutputs({\n metadata: this.metadata,\n spec: this.spec,\n status: this.status,\n })\n }\n}\n\nexport type WrappedJobArgs = {\n /**\n * The underlying Kubernetes job to wrap.\n */\n job: Input<batch.v1.Job>\n\n /**\n * The namespace where the job is located.\n */\n namespace: Input<Namespace>\n\n /**\n * The args for the terminal to use.\n */\n terminal?: Input<WorkloadTerminalArgs>\n}\n\nclass WrappedJob extends Job {\n constructor(name: string, args: WrappedJobArgs, opts?: ComponentResourceOptions) {\n super(\n \"highstate:k8s:WrappedJob\",\n name,\n args,\n opts,\n\n output(args.job).metadata,\n output(args.namespace),\n output(args.terminal ?? {}),\n output([]),\n output(undefined),\n\n output(args.job).spec,\n output(args.job).status,\n )\n }\n}\n\nexport type ExternalJobArgs = {\n /**\n * The name of the job to get.\n */\n name: Input<string>\n\n /**\n * The namespace where the job is located.\n */\n namespace: Input<Namespace>\n}\n\nclass ExternalJob extends Job {\n constructor(name: string, args: ExternalJobArgs, opts?: ComponentResourceOptions) {\n const job = output(args.namespace).cluster.apply(cluster => {\n return batch.v1.Job.get(\n name,\n interpolate`${output(args.namespace).metadata.name}/${args.name}`,\n { ...opts, parent: this, provider: getProvider(cluster) },\n )\n })\n\n super(\n \"highstate:k8s:ExternalJob\",\n name,\n args,\n opts,\n\n job.metadata,\n output(args.namespace),\n output({}),\n output([]),\n output(undefined),\n\n job.spec,\n job.status,\n )\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cluster.ts"],"names":[],"mappings":";;;;;;AAOA,eAAsB,iBAAA,CACpB,YACA,iBAAA,EAC4B;AAC5B,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,aAAA,CAAc,SAAS,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,EAAS;AAErC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,CAAA,IAAA,KAAQ;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,EAAQ,SAAA,IAAa,EAAC;AAE7C,IAAA,MAAM,aAAa,SAAA,CAAU,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,YAAY,CAAA;AAC1E,IAAA,MAAM,aAAa,SAAA,CAAU,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,YAAY,CAAA;AAE1E,IAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,YAAA,CAAa,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA;AACxE,IAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,YAAA,CAAa,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA;AAExE,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,eAAA,IAAmB,sBAAsB,QAAA,EAAU;AACrD,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,mBAAmB,iBAAA,KAAsB,QAAA,IAAY,CAAC,gBAAA,CAAiB,eAAe,CAAA,EAAG;AAC3F,MAAA,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEO,SAAS,kBAAkB,UAAA,EAAiD;AACjF,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IAEN,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,2CAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAAA,IAEA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,cAAA,CAAO,kBAAkB,CAAA,CAAE,KAAA;AAAA,MAClC,OAAA,EAAS,CAAC,MAAA,EAAQ,aAAa,CAAA;AAAA,MAE/B,KAAA,EAAO;AAAA,QACL,eAAe,cAAA,CAAe;AAAA,UAC5B,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS,UAAA;AAAA,UACT,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,QAED,eAAe,cAAA,CAAe;AAAA,UAC5B,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS,IAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,UAAA;AAAA,SASV;AAAA,OACH;AAAA,MAEA,GAAA,EAAK;AAAA,QACH,UAAA,EAAY;AAAA;AACd;AACF,GACD,CAAA;AACH","file":"chunk-ADHZK6V2.js","sourcesContent":["import type { k8s, network } from \"@highstate/library\"\nimport { isPrivateAddress, parseAddress } from \"@highstate/common\"\nimport { text, type UnitTerminal } from \"@highstate/contract\"\nimport { type Input, makeFileOutput, type Output, output } from \"@highstate/pulumi\"\nimport { CoreV1Api, type KubeConfig } from \"@kubernetes/client-node\"\nimport { images } from \"./shared\"\n\nexport async function detectExternalIps(\n kubeConfig: KubeConfig,\n internalIpsPolicy: k8s.InternalIpsPolicy,\n): Promise<network.Address[]> {\n const nodeApi = kubeConfig.makeApiClient(CoreV1Api)\n const nodes = await nodeApi.listNode()\n\n return nodes.items.flatMap(node => {\n const addresses = node.status?.addresses ?? []\n\n const externalIp = addresses.find(address => address.type === \"ExternalIP\")\n const internalIp = addresses.find(address => address.type === \"InternalIP\")\n\n const externalAddress = externalIp ? parseAddress(externalIp.address) : undefined\n const internalAddress = internalIp ? parseAddress(internalIp.address) : undefined\n\n const result: network.Address[] = []\n\n if (externalAddress) {\n result.push(externalAddress)\n }\n\n if (internalAddress && internalIpsPolicy === \"always\") {\n result.push(internalAddress)\n }\n\n if (internalAddress && internalIpsPolicy === \"public\" && !isPrivateAddress(internalAddress)) {\n result.push(internalAddress)\n }\n\n return result\n })\n}\n\nexport function createK8sTerminal(kubeconfig: Input<string>): Output<UnitTerminal> {\n return output({\n name: \"management\",\n\n meta: {\n title: \"Cluster Management\",\n description: \"Manage the cluster using kubectl and helm\",\n icon: \"devicon:kubernetes\",\n },\n\n spec: {\n image: images[\"terminal-kubectl\"].image,\n command: [\"bash\", \"/welcome.sh\"],\n\n files: {\n \"/kubeconfig\": makeFileOutput({\n name: \"kubeconfig\",\n content: kubeconfig,\n isSecret: true,\n }),\n\n \"/welcome.sh\": makeFileOutput({\n name: \"welcome.sh\",\n content: text`\n echo \"Connecting to the cluster...\"\n kubectl cluster-info\n\n echo \"Use 'kubectl', 'helm' or 'k9s' to manage the cluster.\"\n echo\n\n exec bash\n `,\n }),\n },\n\n env: {\n KUBECONFIG: \"/kubeconfig\",\n },\n },\n })\n}\n"]}
|