@highstate/k8s 0.9.18 → 0.9.20

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 (93) hide show
  1. package/dist/chunk-2EEHJZPD.js +13 -0
  2. package/dist/chunk-2EEHJZPD.js.map +1 -0
  3. package/dist/{chunk-OFFSHGC6.js → chunk-4JGXGN2L.js} +66 -48
  4. package/dist/chunk-4JGXGN2L.js.map +1 -0
  5. package/dist/chunk-A3XGSDIW.js +306 -0
  6. package/dist/chunk-A3XGSDIW.js.map +1 -0
  7. package/dist/chunk-IMTXUK2U.js +244 -0
  8. package/dist/chunk-IMTXUK2U.js.map +1 -0
  9. package/dist/chunk-JYNXQ3I3.js +287 -0
  10. package/dist/chunk-JYNXQ3I3.js.map +1 -0
  11. package/dist/{chunk-5C2BJGES.js → chunk-KDD6XUWM.js} +30 -23
  12. package/dist/chunk-KDD6XUWM.js.map +1 -0
  13. package/dist/chunk-NOFJC3EM.js +236 -0
  14. package/dist/chunk-NOFJC3EM.js.map +1 -0
  15. package/dist/chunk-NXSYCA3V.js +337 -0
  16. package/dist/chunk-NXSYCA3V.js.map +1 -0
  17. package/dist/chunk-SBC3TUIN.js +1513 -0
  18. package/dist/chunk-SBC3TUIN.js.map +1 -0
  19. package/dist/chunk-SI7X6N46.js +338 -0
  20. package/dist/chunk-SI7X6N46.js.map +1 -0
  21. package/dist/chunk-WGMJCZSK.js +360 -0
  22. package/dist/chunk-WGMJCZSK.js.map +1 -0
  23. package/dist/deployment-752P6JIT.js +8 -0
  24. package/dist/{deployment-XK3CDJOE.js.map → deployment-752P6JIT.js.map} +1 -1
  25. package/dist/highstate.manifest.json +8 -7
  26. package/dist/impl/gateway-route.js +123 -0
  27. package/dist/impl/gateway-route.js.map +1 -0
  28. package/dist/impl/tls-certificate.js +32 -0
  29. package/dist/impl/tls-certificate.js.map +1 -0
  30. package/dist/index.js +736 -208
  31. package/dist/index.js.map +1 -1
  32. package/dist/stateful-set-N64YVKR7.js +8 -0
  33. package/dist/{stateful-set-7CAQWTV2.js.map → stateful-set-N64YVKR7.js.map} +1 -1
  34. package/dist/units/cert-manager/index.js +11 -10
  35. package/dist/units/cert-manager/index.js.map +1 -1
  36. package/dist/units/dns01-issuer/index.js +27 -23
  37. package/dist/units/dns01-issuer/index.js.map +1 -1
  38. package/dist/units/existing-cluster/index.js +11 -8
  39. package/dist/units/existing-cluster/index.js.map +1 -1
  40. package/dist/units/gateway-api/index.js +2 -2
  41. package/dist/units/gateway-api/index.js.map +1 -1
  42. package/package.json +39 -13
  43. package/src/cluster.ts +30 -22
  44. package/src/config-map.ts +195 -57
  45. package/src/container.ts +5 -5
  46. package/src/cron-job.ts +403 -31
  47. package/src/deployment.ts +260 -120
  48. package/src/dns01-solver.ts +10 -0
  49. package/src/gateway/backend.ts +2 -2
  50. package/src/gateway/gateway.ts +383 -0
  51. package/src/gateway/http-route.ts +17 -24
  52. package/src/gateway/index.ts +1 -0
  53. package/src/helm.ts +83 -53
  54. package/src/impl/gateway-route.ts +155 -0
  55. package/src/impl/tls-certificate.ts +33 -0
  56. package/src/index.ts +22 -67
  57. package/src/job.ts +393 -28
  58. package/src/namespace.ts +236 -99
  59. package/src/network-policy.ts +216 -165
  60. package/src/network.ts +2 -2
  61. package/src/pvc.ts +266 -65
  62. package/src/rbac.ts +218 -0
  63. package/src/scripting/bundle.ts +9 -20
  64. package/src/scripting/container.ts +1 -1
  65. package/src/scripting/environment.ts +5 -5
  66. package/src/secret.ts +200 -62
  67. package/src/service.ts +288 -158
  68. package/src/shared.ts +94 -67
  69. package/src/stateful-set.ts +270 -117
  70. package/src/tls.ts +344 -0
  71. package/src/units/cert-manager/index.ts +2 -3
  72. package/src/units/dns01-issuer/index.ts +30 -14
  73. package/src/units/existing-cluster/index.ts +10 -7
  74. package/src/units/gateway-api/index.ts +2 -2
  75. package/src/worker.ts +26 -0
  76. package/src/workload.ts +275 -171
  77. package/dist/chunk-5C2BJGES.js.map +0 -1
  78. package/dist/chunk-5TLC5BXR.js +0 -256
  79. package/dist/chunk-5TLC5BXR.js.map +0 -1
  80. package/dist/chunk-BBIY3KUN.js +0 -1557
  81. package/dist/chunk-BBIY3KUN.js.map +0 -1
  82. package/dist/chunk-OFFSHGC6.js.map +0 -1
  83. package/dist/chunk-TZHOUJRC.js +0 -202
  84. package/dist/chunk-TZHOUJRC.js.map +0 -1
  85. package/dist/chunk-YWRJ4EZM.js +0 -192
  86. package/dist/chunk-YWRJ4EZM.js.map +0 -1
  87. package/dist/deployment-XK3CDJOE.js +0 -6
  88. package/dist/stateful-set-7CAQWTV2.js +0 -6
  89. package/dist/units/access-point/index.js +0 -21
  90. package/dist/units/access-point/index.js.map +0 -1
  91. package/src/access-point.ts +0 -191
  92. package/src/units/access-point/index.ts +0 -19
  93. package/src/units/dns01-issuer/solver.ts +0 -23
@@ -1,23 +1,30 @@
1
+ import type { AccessPointRoute } from "@highstate/common"
1
2
  import type { k8s } from "@highstate/library"
2
- import type { HttpRoute } from "./gateway"
3
- import type { Service } from "./service"
3
+ import type { Container } from "./container"
4
4
  import type { NetworkPolicy } from "./network-policy"
5
- import { output, type ComponentResourceOptions, Output, type Input } from "@highstate/pulumi"
6
- import { apps, types } from "@pulumi/kubernetes"
7
- import { omit } from "remeda"
8
- import { deepmerge } from "deepmerge-ts"
5
+ import type { Service } from "./service"
6
+ import { getOrCreate, type UnitTerminal } from "@highstate/contract"
9
7
  import {
10
- getProvider,
11
- mapMetadata,
12
- resourceIdToString,
13
- withPatchName,
14
- type ResourceId,
15
- } from "./shared"
8
+ type ComponentResourceOptions,
9
+ type Input,
10
+ type Inputs,
11
+ interpolate,
12
+ type Output,
13
+ output,
14
+ toPromise,
15
+ type Unwrap,
16
+ } from "@highstate/pulumi"
17
+ import { apps, type types } from "@pulumi/kubernetes"
18
+ import { deepmerge } from "deepmerge-ts"
19
+ import { omit } from "remeda"
20
+ import { Namespace } from "./namespace"
21
+ import { getProvider, mapMetadata } from "./shared"
16
22
  import {
17
- exposableWorkloadExtraArgs,
18
23
  ExposableWorkload,
19
24
  type ExposableWorkloadArgs,
25
+ exposableWorkloadExtraArgs,
20
26
  getExposableWorkloadComponents,
27
+ type WorkloadTerminalArgs,
21
28
  } from "./workload"
22
29
 
23
30
  export type StatefulSetArgs = Omit<ExposableWorkloadArgs, "existing"> &
@@ -39,11 +46,19 @@ export abstract class StatefulSet extends ExposableWorkload {
39
46
  protected constructor(
40
47
  type: string,
41
48
  name: string,
42
- args: ExposableWorkloadArgs,
49
+ args: Inputs,
43
50
  opts: ComponentResourceOptions | undefined,
44
51
 
45
- cluster: Output<k8s.Cluster>,
52
+ apiVersion: Output<string>,
53
+ kind: Output<string>,
54
+ terminalArgs: Output<Unwrap<WorkloadTerminalArgs>>,
55
+ containers: Output<Container[]>,
56
+ namespace: Output<Namespace>,
46
57
  metadata: Output<types.output.meta.v1.ObjectMeta>,
58
+ networkPolicy: Output<NetworkPolicy | undefined>,
59
+
60
+ service: Output<Service | undefined>,
61
+ routes: Output<AccessPointRoute[]>,
47
62
 
48
63
  /**
49
64
  * The spec of the underlying Kubernetes stateful set.
@@ -54,23 +69,21 @@ export abstract class StatefulSet extends ExposableWorkload {
54
69
  * The status of the underlying Kubernetes stateful set.
55
70
  */
56
71
  readonly status: Output<types.output.apps.v1.StatefulSetStatus>,
57
-
58
- networkPolicy: Output<NetworkPolicy | undefined>,
59
-
60
- service: Output<Service | undefined>,
61
- httpRoute: Output<HttpRoute | undefined>,
62
72
  ) {
63
73
  super(
64
74
  type,
65
75
  name,
66
76
  args,
67
77
  opts,
68
- "statefulset",
69
- cluster,
78
+ apiVersion,
79
+ kind,
80
+ terminalArgs,
81
+ containers,
82
+ namespace,
70
83
  metadata,
71
84
  networkPolicy,
72
85
  service,
73
- httpRoute,
86
+ routes,
74
87
  )
75
88
  }
76
89
 
@@ -79,66 +92,162 @@ export abstract class StatefulSet extends ExposableWorkload {
79
92
  */
80
93
  get entity(): Output<k8s.StatefulSet> {
81
94
  return output({
82
- type: "k8s.stateful-set",
95
+ type: "stateful-set",
83
96
  clusterId: this.cluster.id,
97
+ clusterName: this.cluster.name,
84
98
  metadata: this.metadata,
85
99
  service: this.service.entity,
86
100
  })
87
101
  }
88
102
 
103
+ /**
104
+ * Creates a new stateful set.
105
+ */
89
106
  static create(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions): StatefulSet {
90
107
  return new CreatedStatefulSet(name, args, opts)
91
108
  }
92
109
 
110
+ /**
111
+ * Creates a new stateful set or patches an existing one.
112
+ *
113
+ * @param name The name of the resource. May not be the same as the stateful set name.
114
+ * @param args The arguments to create or patch the stateful set with.
115
+ * @param opts Optional resource options.
116
+ */
93
117
  static createOrPatch(
94
118
  name: string,
95
119
  args: CreateOrGetStatefulSetArgs,
96
120
  opts?: ComponentResourceOptions,
97
121
  ): StatefulSet {
98
- if (!args.existing) {
99
- return new CreatedStatefulSet(name, args, opts)
122
+ if (args.existing) {
123
+ return new StatefulSetPatch(name, {
124
+ ...args,
125
+ name: output(args.existing).metadata.name,
126
+ namespace: Namespace.forResourceAsync(args.existing, output(args.namespace).cluster),
127
+ })
100
128
  }
101
129
 
102
- return new StatefulSetPatch(
103
- name,
104
- {
105
- ...args,
106
- name: withPatchName("stateful set", args.existing, args.cluster),
107
- namespace: output(args.existing).metadata.namespace,
108
- },
109
- opts,
110
- )
130
+ return new CreatedStatefulSet(name, args, opts)
131
+ }
132
+
133
+ /**
134
+ * Creates a new stateful set or gets an existing one.
135
+ *
136
+ * @param name The name of the resource. May not be the same as the stateful set name. Will not be used when existing stateful set is retrieved.
137
+ * @param args The arguments to create or get the stateful set with.
138
+ * @param opts Optional resource options.
139
+ */
140
+ static async createOrGet(
141
+ name: string,
142
+ args: CreateOrGetStatefulSetArgs,
143
+ opts?: ComponentResourceOptions,
144
+ ): Promise<StatefulSet> {
145
+ if (args.existing) {
146
+ return await StatefulSet.forAsync(args.existing, output(args.namespace).cluster)
147
+ }
148
+
149
+ return new CreatedStatefulSet(name, args, opts)
111
150
  }
112
151
 
152
+ /**
153
+ * Patches an existing stateful set.
154
+ *
155
+ * Will throw an error if the stateful set does not exist.
156
+ *
157
+ * @param name The name of the resource. May not be the same as the stateful set name.
158
+ * @param args The arguments to patch the stateful set with.
159
+ * @param opts Optional resource options.
160
+ */
113
161
  static patch(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions): StatefulSet {
114
162
  return new StatefulSetPatch(name, args, opts)
115
163
  }
116
164
 
117
- static createOrGet(
165
+ /**
166
+ * Wraps an existing Kubernetes stateful set.
167
+ */
168
+ static wrap(
118
169
  name: string,
119
- args: CreateOrGetStatefulSetArgs,
170
+ args: WrappedStatefulSetArgs,
120
171
  opts?: ComponentResourceOptions,
121
172
  ): StatefulSet {
122
- if (!args.existing) {
123
- return new CreatedStatefulSet(name, args, opts)
124
- }
125
-
126
- return new ExternalStatefulSet(name, output(args.existing).metadata, args.cluster, opts)
173
+ return new WrappedStatefulSet(name, args, opts)
127
174
  }
128
175
 
129
- static wrap(
176
+ /**
177
+ * Gets an existing stateful set.
178
+ *
179
+ * Will throw an error if the stateful set does not exist.
180
+ */
181
+ static get(
130
182
  name: string,
131
- statefulSet: Input<apps.v1.StatefulSet>,
132
- cluster: Input<k8s.Cluster>,
183
+ args: ExternalStatefulSetArgs,
133
184
  opts?: ComponentResourceOptions,
134
185
  ): StatefulSet {
135
- return new WrappedStatefulSet(name, statefulSet, cluster, opts)
186
+ return new ExternalStatefulSet(name, args, opts)
187
+ }
188
+
189
+ private static readonly statefulSetCache = new Map<string, StatefulSet>()
190
+
191
+ /**
192
+ * Gets an existing stateful set for a given entity.
193
+ * Prefer this method over `get` when possible.
194
+ *
195
+ * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.
196
+ *
197
+ * This method is idempotent and will return the same instance for the same entity.
198
+ *
199
+ * @param entity The entity to get the stateful set for.
200
+ * @param cluster The cluster where the stateful set is located.
201
+ */
202
+ static for(entity: k8s.StatefulSet, cluster: Input<k8s.Cluster>): StatefulSet {
203
+ return getOrCreate(
204
+ StatefulSet.statefulSetCache,
205
+ `${entity.clusterName}.${entity.metadata.namespace}.${entity.metadata.name}.${entity.clusterId}`,
206
+ name => {
207
+ return StatefulSet.get(name, {
208
+ name: entity.metadata.name,
209
+ namespace: Namespace.forResource(entity, cluster),
210
+ })
211
+ },
212
+ )
213
+ }
214
+
215
+ /**
216
+ * Gets an existing stateful set for a given entity.
217
+ * Prefer this method over `get` when possible.
218
+ *
219
+ * It automatically names the resource with the following format: `{clusterName}.{namespace}.{name}.{clusterId}`.
220
+ *
221
+ * This method is idempotent and will return the same instance for the same entity.
222
+ *
223
+ * @param entity The entity to get the stateful set for.
224
+ * @param cluster The cluster where the stateful set is located.
225
+ */
226
+ static async forAsync(
227
+ entity: Input<k8s.StatefulSet>,
228
+ cluster: Input<k8s.Cluster>,
229
+ ): Promise<StatefulSet> {
230
+ const resolvedEntity = await toPromise(entity)
231
+ return StatefulSet.for(resolvedEntity, cluster)
232
+ }
233
+
234
+ protected getTerminalMeta(): Output<UnitTerminal["meta"]> {
235
+ return output({
236
+ title: "StatefulSet",
237
+ globalTitle: interpolate`StatefulSet | ${this.metadata.name}`,
238
+ description: "The shell inside the stateful set.",
239
+ icon: "devicon:kubernetes",
240
+ })
241
+ }
242
+
243
+ protected get resourceType(): string {
244
+ return "statefulset"
136
245
  }
137
246
  }
138
247
 
139
248
  class CreatedStatefulSet extends StatefulSet {
140
249
  constructor(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions) {
141
- const { labels, podTemplate, networkPolicy, service, httpRoute } =
250
+ const { labels, podTemplate, networkPolicy, containers, service, routes } =
142
251
  getExposableWorkloadComponents(
143
252
  name,
144
253
  {
@@ -151,24 +260,28 @@ class CreatedStatefulSet extends StatefulSet {
151
260
  opts,
152
261
  )
153
262
 
154
- const statefulSet = output({ args, podTemplate }).apply(async ({ args, podTemplate }) => {
263
+ const statefulSet = output(args.namespace).cluster.apply(cluster => {
155
264
  return new apps.v1.StatefulSet(
156
265
  name,
157
266
  {
158
267
  metadata: mapMetadata(args, name),
159
- spec: deepmerge(
160
- {
161
- serviceName: service.apply(service => service!.metadata.name),
162
- template: podTemplate,
163
- selector: { matchLabels: labels },
268
+ spec: output({ args, podTemplate, labels, service }).apply(
269
+ ({ args, podTemplate, labels, service }) => {
270
+ return deepmerge(
271
+ {
272
+ serviceName: service?.metadata.name,
273
+ template: podTemplate,
274
+ selector: { matchLabels: labels },
275
+ },
276
+ omit(args, exposableWorkloadExtraArgs),
277
+ ) as types.input.apps.v1.StatefulSetSpec
164
278
  },
165
- omit(args, exposableWorkloadExtraArgs),
166
- ) as types.input.apps.v1.StatefulSetSpec,
279
+ ),
167
280
  },
168
281
  {
169
282
  ...opts,
170
283
  parent: this,
171
- provider: await getProvider(args.cluster),
284
+ provider: getProvider(cluster),
172
285
  },
173
286
  )
174
287
  })
@@ -179,45 +292,47 @@ class CreatedStatefulSet extends StatefulSet {
179
292
  args,
180
293
  opts,
181
294
 
182
- output(args.cluster),
295
+ statefulSet.apiVersion,
296
+ statefulSet.kind,
297
+ output(args.terminal ?? {}),
298
+ containers,
299
+ output(args.namespace),
183
300
  statefulSet.metadata,
184
- statefulSet.spec,
185
- statefulSet.status,
186
-
187
301
  networkPolicy,
302
+
188
303
  service,
189
- httpRoute,
304
+ routes,
305
+
306
+ statefulSet.spec,
307
+ statefulSet.status,
190
308
  )
191
309
  }
192
310
  }
193
311
 
194
312
  class StatefulSetPatch extends StatefulSet {
195
313
  constructor(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions) {
196
- const { podSpec, networkPolicy, service, httpRoute } = getExposableWorkloadComponents(
197
- name,
198
- args,
199
- () => this,
200
- opts,
201
- )
314
+ const { labels, podTemplate, networkPolicy, containers, service, routes } =
315
+ getExposableWorkloadComponents(name, args, () => this, opts)
202
316
 
203
- const statefulSet = output({ args, podSpec }).apply(async ({ args, podSpec }) => {
317
+ const statefulSet = output(args.namespace).cluster.apply(cluster => {
204
318
  return new apps.v1.StatefulSetPatch(
205
319
  name,
206
320
  {
207
321
  metadata: mapMetadata(args, name),
208
- spec: deepmerge(
209
- {
210
- template: {
211
- spec: podSpec,
322
+ spec: output({ args, podTemplate, labels }).apply(({ args, podTemplate, labels }) => {
323
+ return deepmerge(
324
+ {
325
+ template: podTemplate,
326
+ selector: { matchLabels: labels },
212
327
  },
213
- },
214
- omit(args, exposableWorkloadExtraArgs),
215
- ) as types.input.apps.v1.StatefulSetSpec,
328
+ omit(args, exposableWorkloadExtraArgs),
329
+ ) as types.input.apps.v1.StatefulSetSpec
330
+ }),
216
331
  },
217
332
  {
218
333
  ...opts,
219
334
  parent: this,
220
- provider: await getProvider(args.cluster),
335
+ provider: getProvider(cluster),
221
336
  },
222
337
  )
223
338
  })
@@ -228,71 +343,109 @@ class StatefulSetPatch extends StatefulSet {
228
343
  args,
229
344
  opts,
230
345
 
231
- output(args.cluster),
346
+ statefulSet.apiVersion,
347
+ statefulSet.kind,
348
+ output(args.terminal ?? {}),
349
+ containers,
350
+ output(args.namespace),
232
351
  statefulSet.metadata,
233
- statefulSet.spec,
234
- statefulSet.status,
235
-
236
352
  networkPolicy,
353
+
237
354
  service,
238
- httpRoute,
355
+ routes,
356
+
357
+ statefulSet.spec,
358
+ statefulSet.status,
239
359
  )
240
360
  }
241
361
  }
242
362
 
243
- class ExternalStatefulSet extends StatefulSet {
244
- constructor(
245
- name: string,
246
- id: Input<ResourceId>,
247
- cluster: Input<k8s.Cluster>,
248
- opts?: ComponentResourceOptions,
249
- ) {
250
- const statefulSet = output(id).apply(async id => {
251
- return apps.v1.StatefulSet.get(name, resourceIdToString(id), {
252
- ...opts,
253
- parent: this,
254
- provider: await getProvider(cluster),
255
- })
256
- })
363
+ export type WrappedStatefulSetArgs = {
364
+ /**
365
+ * The underlying Kubernetes stateful set to wrap.
366
+ */
367
+ statefulSet: Input<apps.v1.StatefulSet>
257
368
 
369
+ // TODO: remove
370
+ service?: Input<Service>
371
+
372
+ /**
373
+ * The namespace where the stateful set is located.
374
+ */
375
+ namespace: Input<Namespace>
376
+
377
+ /**
378
+ * The args for the terminal to use.
379
+ */
380
+ terminal?: Input<WorkloadTerminalArgs>
381
+ }
382
+
383
+ class WrappedStatefulSet extends StatefulSet {
384
+ constructor(name: string, args: WrappedStatefulSetArgs, opts?: ComponentResourceOptions) {
258
385
  super(
259
- "highstate:k8s:ExternalStatefulSet",
386
+ "highstate:k8s:WrappedStatefulSet",
260
387
  name,
261
- { namespace: output(id).namespace, cluster },
388
+ args,
262
389
  opts,
263
- output(cluster),
264
- statefulSet.metadata,
265
- statefulSet.spec,
266
- statefulSet.status,
390
+
391
+ output(args.statefulSet).apiVersion,
392
+ output(args.statefulSet).kind,
393
+ output(args.terminal ?? {}),
394
+ output([]),
395
+ output(args.namespace),
396
+ output(args.statefulSet).metadata,
267
397
 
268
398
  output(undefined),
269
- output(undefined),
270
- output(undefined),
399
+ output(args.service),
400
+ output([]),
401
+
402
+ output(args.statefulSet).spec,
403
+ output(args.statefulSet).status,
271
404
  )
272
405
  }
273
406
  }
274
407
 
275
- class WrappedStatefulSet extends StatefulSet {
276
- constructor(
277
- name: string,
278
- statefulSet: Input<apps.v1.StatefulSet>,
279
- cluster: Input<k8s.Cluster>,
280
- opts?: ComponentResourceOptions,
281
- ) {
408
+ export type ExternalStatefulSetArgs = {
409
+ /**
410
+ * The name of the stateful set to get.
411
+ */
412
+ name: Input<string>
413
+
414
+ /**
415
+ * The namespace where the stateful set is located.
416
+ */
417
+ namespace: Input<Namespace>
418
+ }
419
+
420
+ class ExternalStatefulSet extends StatefulSet {
421
+ constructor(name: string, args: ExternalStatefulSetArgs, opts?: ComponentResourceOptions) {
422
+ const statefulSet = output(args.namespace).cluster.apply(cluster => {
423
+ return apps.v1.StatefulSet.get(
424
+ name,
425
+ interpolate`${output(args.namespace).metadata.name}/${args.name}`,
426
+ { ...opts, parent: this, provider: getProvider(cluster) },
427
+ )
428
+ })
429
+
282
430
  super(
283
- "highstate:k8s:WrappedStatefulSet",
431
+ "highstate:k8s:ExternalStatefulSet",
284
432
  name,
285
- { namespace: output(statefulSet).metadata.namespace, cluster },
433
+ args,
286
434
  opts,
287
435
 
288
- output(cluster),
289
- output(statefulSet).metadata,
290
- output(statefulSet).spec,
291
- output(statefulSet).status,
436
+ statefulSet.apiVersion,
437
+ statefulSet.kind,
438
+ output({}),
439
+ output([]),
440
+ output(args.namespace),
441
+ statefulSet.metadata,
292
442
 
293
443
  output(undefined),
294
444
  output(undefined),
295
- output(undefined),
445
+ output([]),
446
+
447
+ statefulSet.spec,
448
+ statefulSet.status,
296
449
  )
297
450
  }
298
451
  }