@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.
Files changed (81) hide show
  1. package/dist/chunk-23vn2rdc.js +11 -0
  2. package/dist/chunk-2pfx13ay.js +11 -0
  3. package/dist/chunk-46ntav0c.js +299 -0
  4. package/dist/chunk-556pc9e6.js +155 -0
  5. package/dist/chunk-7kgjgcft.js +170 -0
  6. package/dist/{chunk-ADHZK6V2.js → chunk-9hs97f1q.js} +13 -11
  7. package/dist/chunk-aame3x1b.js +11 -0
  8. package/dist/chunk-b05q6fm2.js +37 -0
  9. package/dist/chunk-bmvc9d2d.js +11 -0
  10. package/dist/chunk-de82bbp2.js +7 -0
  11. package/dist/chunk-facs31cb.js +624 -0
  12. package/dist/chunk-h1b79v66.js +1425 -0
  13. package/dist/chunk-k4w9zpn5.js +215 -0
  14. package/dist/chunk-pqc6w52f.js +352 -0
  15. package/dist/chunk-qyshvz32.js +176 -0
  16. package/dist/chunk-tpfyj6fe.js +199 -0
  17. package/dist/chunk-z6bmpnm7.js +180 -0
  18. package/dist/highstate.manifest.json +3 -3
  19. package/dist/impl/dynamic-endpoint-resolver.js +82 -81
  20. package/dist/impl/gateway-route.js +131 -168
  21. package/dist/impl/tls-certificate.js +31 -32
  22. package/dist/index.js +245 -201
  23. package/dist/units/cert-manager/index.js +19 -13
  24. package/dist/units/cluster-patch/index.js +9 -8
  25. package/dist/units/dns01-issuer/index.js +44 -41
  26. package/dist/units/existing-cluster/index.js +25 -13
  27. package/dist/units/gateway-api/index.js +15 -16
  28. package/dist/units/reduced-access-cluster/index.js +28 -32
  29. package/package.json +21 -21
  30. package/src/cron-job.ts +26 -1
  31. package/src/deployment.ts +17 -1
  32. package/src/job.ts +15 -1
  33. package/src/scripting/bundle.ts +21 -98
  34. package/src/scripting/environment.ts +2 -9
  35. package/src/shared.ts +1 -1
  36. package/src/stateful-set.ts +17 -1
  37. package/src/workload.ts +31 -14
  38. package/LICENSE +0 -21
  39. package/dist/chunk-23X5SXQG.js +0 -301
  40. package/dist/chunk-23X5SXQG.js.map +0 -1
  41. package/dist/chunk-ADHZK6V2.js.map +0 -1
  42. package/dist/chunk-BTAEFJ5N.js +0 -291
  43. package/dist/chunk-BTAEFJ5N.js.map +0 -1
  44. package/dist/chunk-HH2JJELM.js +0 -13
  45. package/dist/chunk-HH2JJELM.js.map +0 -1
  46. package/dist/chunk-IXE3OKB4.js +0 -249
  47. package/dist/chunk-IXE3OKB4.js.map +0 -1
  48. package/dist/chunk-OG2OPX7B.js +0 -333
  49. package/dist/chunk-OG2OPX7B.js.map +0 -1
  50. package/dist/chunk-P26SQ2ZB.js +0 -393
  51. package/dist/chunk-P26SQ2ZB.js.map +0 -1
  52. package/dist/chunk-PG27ZY2H.js +0 -319
  53. package/dist/chunk-PG27ZY2H.js.map +0 -1
  54. package/dist/chunk-PZYGZSN5.js +0 -54
  55. package/dist/chunk-PZYGZSN5.js.map +0 -1
  56. package/dist/chunk-S77TE7UC.js +0 -309
  57. package/dist/chunk-S77TE7UC.js.map +0 -1
  58. package/dist/chunk-SZKOAHNX.js +0 -1804
  59. package/dist/chunk-SZKOAHNX.js.map +0 -1
  60. package/dist/chunk-TOLFVF4S.js +0 -889
  61. package/dist/chunk-TOLFVF4S.js.map +0 -1
  62. package/dist/chunk-TVKT3ZYX.js +0 -423
  63. package/dist/chunk-TVKT3ZYX.js.map +0 -1
  64. package/dist/cron-job-RKB2HYTO.js +0 -7
  65. package/dist/cron-job-RKB2HYTO.js.map +0 -1
  66. package/dist/deployment-T35TUOL2.js +0 -7
  67. package/dist/deployment-T35TUOL2.js.map +0 -1
  68. package/dist/impl/dynamic-endpoint-resolver.js.map +0 -1
  69. package/dist/impl/gateway-route.js.map +0 -1
  70. package/dist/impl/tls-certificate.js.map +0 -1
  71. package/dist/index.js.map +0 -1
  72. package/dist/job-PE4AKOHB.js +0 -7
  73. package/dist/job-PE4AKOHB.js.map +0 -1
  74. package/dist/stateful-set-LUIRHQJY.js +0 -7
  75. package/dist/stateful-set-LUIRHQJY.js.map +0 -1
  76. package/dist/units/cert-manager/index.js.map +0 -1
  77. package/dist/units/cluster-patch/index.js.map +0 -1
  78. package/dist/units/dns01-issuer/index.js.map +0 -1
  79. package/dist/units/existing-cluster/index.js.map +0 -1
  80. package/dist/units/gateway-api/index.js.map +0 -1
  81. package/dist/units/reduced-access-cluster/index.js.map +0 -1
@@ -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
- statefulSet.spec,
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
- ...deepmerge(args, args.deployment),
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
- ...deepmerge(args, args.statefulSet),
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
- ...deepmerge(args, args.job),
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
- ...deepmerge(args, args.cronJob),
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
- return Job.create(name, deepmerge(args, args.job), opts)
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
- return CronJob.create(name, deepmerge(args, args.cronJob), opts)
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.
@@ -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"]}