@highstate/k8s 0.9.3 → 0.9.5

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 (63) hide show
  1. package/dist/chunk-DQSCJM5S.js +183 -0
  2. package/dist/chunk-DQSCJM5S.js.map +1 -0
  3. package/dist/chunk-FKNHHKOL.js +260 -0
  4. package/dist/chunk-FKNHHKOL.js.map +1 -0
  5. package/dist/chunk-HW3NS3MC.js +347 -0
  6. package/dist/chunk-HW3NS3MC.js.map +1 -0
  7. package/dist/chunk-OQ7UXASD.js +193 -0
  8. package/dist/chunk-OQ7UXASD.js.map +1 -0
  9. package/dist/chunk-QGHMLKTW.js +1123 -0
  10. package/dist/chunk-QGHMLKTW.js.map +1 -0
  11. package/dist/chunk-UNVSWG6D.js +214 -0
  12. package/dist/chunk-UNVSWG6D.js.map +1 -0
  13. package/dist/deployment-ZP3ASKPT.js +10 -0
  14. package/dist/deployment-ZP3ASKPT.js.map +1 -0
  15. package/dist/highstate.manifest.json +8 -6
  16. package/dist/index.js +291 -954
  17. package/dist/index.js.map +1 -1
  18. package/dist/stateful-set-2AH7RAF7.js +10 -0
  19. package/dist/stateful-set-2AH7RAF7.js.map +1 -0
  20. package/dist/units/access-point/index.js +6 -1
  21. package/dist/units/access-point/index.js.map +1 -1
  22. package/dist/units/cert-manager/index.js +19 -24
  23. package/dist/units/cert-manager/index.js.map +1 -1
  24. package/dist/units/cluster-dns/index.js +36 -0
  25. package/dist/units/cluster-dns/index.js.map +1 -0
  26. package/dist/units/cluster-patch/index.js +34 -0
  27. package/dist/units/cluster-patch/index.js.map +1 -0
  28. package/dist/units/dns01-issuer/index.js +2 -2
  29. package/dist/units/dns01-issuer/index.js.map +1 -1
  30. package/dist/units/existing-cluster/index.js +23 -15
  31. package/dist/units/existing-cluster/index.js.map +1 -1
  32. package/dist/units/gateway-api/index.js +1 -1
  33. package/package.json +12 -10
  34. package/src/access-point.ts +44 -39
  35. package/src/container.ts +54 -5
  36. package/src/cron-job.ts +14 -30
  37. package/src/deployment.ts +170 -127
  38. package/src/gateway/http-route.ts +7 -5
  39. package/src/helm.ts +57 -8
  40. package/src/index.ts +11 -4
  41. package/src/job.ts +14 -32
  42. package/src/namespace.ts +241 -0
  43. package/src/network-policy.ts +371 -87
  44. package/src/network.ts +41 -0
  45. package/src/pvc.ts +43 -25
  46. package/src/scripting/bundle.ts +125 -22
  47. package/src/scripting/container.ts +16 -11
  48. package/src/scripting/environment.ts +56 -6
  49. package/src/secret.ts +195 -0
  50. package/src/service.ts +209 -89
  51. package/src/shared.ts +42 -51
  52. package/src/stateful-set.ts +193 -88
  53. package/src/units/access-point/index.ts +8 -1
  54. package/src/units/cert-manager/index.ts +15 -20
  55. package/src/units/cluster-dns/index.ts +37 -0
  56. package/src/units/cluster-patch/index.ts +35 -0
  57. package/src/units/dns01-issuer/index.ts +1 -1
  58. package/src/units/existing-cluster/index.ts +26 -15
  59. package/src/workload.ts +342 -44
  60. package/dist/chunk-K4WKJ4L5.js +0 -455
  61. package/dist/chunk-K4WKJ4L5.js.map +0 -1
  62. package/dist/chunk-T5Z2M4JE.js +0 -103
  63. package/dist/chunk-T5Z2M4JE.js.map +0 -1
package/src/shared.ts CHANGED
@@ -2,19 +2,21 @@ import type { PartialKeys } from "@highstate/contract"
2
2
  import type { k8s } from "@highstate/library"
3
3
  import { Output, output, toPromise, type Input, type Unwrap } from "@highstate/pulumi"
4
4
  import { core, Provider, types } from "@pulumi/kubernetes"
5
- import { mergeDeep } from "remeda"
5
+ import { Namespace } from "./namespace"
6
6
 
7
7
  const providers = new Map<string, Provider>()
8
8
 
9
9
  export function getProvider(cluster: Input<k8s.Cluster>): Promise<Provider> {
10
10
  const provider = output(cluster).apply(cluster => {
11
- const existingProvider = providers.get(cluster.info.id)
11
+ const existingProvider = providers.get(cluster.id)
12
12
  if (existingProvider) {
13
13
  return existingProvider
14
14
  }
15
15
 
16
- const provider = new Provider(cluster.info.id, { kubeconfig: cluster.kubeconfig })
17
- providers.set(cluster.info.id, provider)
16
+ const provider = new Provider(`${cluster.name}-${cluster.id}`, {
17
+ kubeconfig: cluster.kubeconfig,
18
+ })
19
+ providers.set(cluster.id, provider)
18
20
 
19
21
  return provider
20
22
  })
@@ -22,69 +24,34 @@ export function getProvider(cluster: Input<k8s.Cluster>): Promise<Provider> {
22
24
  return toPromise(provider)
23
25
  }
24
26
 
25
- export async function verifyProvider(
26
- provider: Provider | undefined,
27
- clusterInfo: Input<k8s.ClusterInfo>,
28
- ): Promise<void> {
29
- if (!provider) {
30
- throw new Error("The provider must be passed to the resource.")
31
- }
32
-
33
- const urn = await toPromise(provider.urn)
34
- const [, , , resouceName] = urn.split("::")
35
-
36
- const expectedId = await toPromise(output(clusterInfo).id)
37
-
38
- if (resouceName !== expectedId) {
39
- throw new Error(
40
- "The Kubernetes cluster of the provider is different from the one where the resource is deployed.",
41
- )
42
- }
43
- }
44
-
45
- export function createNamespace(
46
- name: string,
47
- provider: Provider,
48
- args: core.v1.NamespaceArgs = {},
49
- ): core.v1.Namespace {
50
- return new core.v1.Namespace(
51
- name,
52
- mergeDeep(args, {
53
- metadata: {
54
- name,
55
- },
56
- }),
57
- { provider },
58
- )
59
- }
60
-
61
- export function getNamespace(name = "default", provider: Provider): core.v1.Namespace {
62
- return core.v1.Namespace.get(name, name, { provider })
63
- }
64
-
65
- export type NamespaceLike = core.v1.Namespace | string
27
+ export type NamespaceLike = core.v1.Namespace | Namespace | string
66
28
 
67
29
  export type CommonArgs = {
68
30
  /**
69
31
  * The name of the resource.
70
32
  */
71
- name?: string
33
+ name?: Input<string>
72
34
 
73
35
  /**
74
36
  * The namespace to create the resource in.
75
37
  */
76
38
  namespace: Input<NamespaceLike | undefined>
77
39
 
40
+ /**
41
+ * The cluster to create the resource in.
42
+ */
43
+ cluster: Input<k8s.Cluster>
44
+
78
45
  /**
79
46
  * The metadata to apply to the resource.
80
47
  */
81
48
  metadata?: Input<types.input.meta.v1.ObjectMeta>
82
49
  }
83
50
 
84
- export const commonExtraArgs = ["name", "namespace", "metadata"] as const
51
+ export const commonExtraArgs = ["name", "namespace", "cluster", "metadata"] as const
85
52
 
86
53
  export function mapMetadata(
87
- args: PartialKeys<Unwrap<CommonArgs>, "namespace">,
54
+ args: PartialKeys<Unwrap<CommonArgs>, "namespace" | "cluster">,
88
55
  fallbackName?: string,
89
56
  ): types.input.meta.v1.ObjectMeta {
90
57
  return {
@@ -109,7 +76,15 @@ export function mapSelectorLikeToSelector(
109
76
  }
110
77
 
111
78
  export function mapNamespaceLikeToNamespaceName(namespace: NamespaceLike): Output<string> {
112
- return core.v1.Namespace.isInstance(namespace) ? namespace.metadata.name : output(namespace)
79
+ if (Namespace.isInstance(namespace)) {
80
+ return namespace.metadata.name
81
+ }
82
+
83
+ if (core.v1.Namespace.isInstance(namespace)) {
84
+ return namespace.metadata.name
85
+ }
86
+
87
+ return output(namespace)
113
88
  }
114
89
 
115
90
  export function mapNamespaceNameToSelector(
@@ -127,8 +102,8 @@ export type ResourceId = {
127
102
  namespace?: Input<string | undefined>
128
103
  }
129
104
 
130
- export function resourceIdToString(metadata: Input<ResourceId>): Output<string> {
131
- return output(metadata).apply(metadata => {
105
+ export function resourceIdToString(id: Input<ResourceId>): Output<string> {
106
+ return output(id).apply(metadata => {
132
107
  return metadata.namespace ? `${metadata.namespace}/${metadata.name}` : metadata.name
133
108
  })
134
109
  }
@@ -148,3 +123,19 @@ export function getAppDisplayName(resourceId: Unwrap<ResourceId>): string {
148
123
 
149
124
  return resourceId.name
150
125
  }
126
+
127
+ export function withPatchName(
128
+ resourceType: string,
129
+ resource: Input<k8s.Resource>,
130
+ cluster: Input<k8s.Cluster>,
131
+ ): Output<string> {
132
+ return output({ resource, cluster }).apply(({ resource, cluster }) => {
133
+ if (resource.clusterId !== cluster.id) {
134
+ throw new Error(
135
+ `Cluster mismatch when patching ${resourceType} "${resource.metadata.name}": "${resource.clusterId}" != "${cluster.id}"`,
136
+ )
137
+ }
138
+
139
+ return resource.metadata.name
140
+ })
141
+ }
@@ -1,45 +1,49 @@
1
1
  import type { k8s } from "@highstate/library"
2
2
  import type { HttpRoute } from "./gateway"
3
3
  import type { Service } from "./service"
4
- import {
5
- output,
6
- type ComponentResourceOptions,
7
- ComponentResource,
8
- Output,
9
- type Inputs,
10
- type Input,
11
- } from "@highstate/pulumi"
12
- import { apps, type types } from "@pulumi/kubernetes"
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"
13
7
  import { omit } from "remeda"
14
8
  import { deepmerge } from "deepmerge-ts"
15
9
  import {
16
- getPublicWorkloadComponents,
17
- publicWorkloadExtraArgs,
18
- type PublicWorkloadArgs,
10
+ getProvider,
11
+ mapMetadata,
12
+ resourceIdToString,
13
+ withPatchName,
14
+ type ResourceId,
15
+ } from "./shared"
16
+ import {
17
+ exposableWorkloadExtraArgs,
18
+ ExposableWorkload,
19
+ type ExposableWorkloadArgs,
20
+ getExposableWorkloadComponents,
19
21
  } from "./workload"
20
- import { mapMetadata, verifyProvider } from "./shared"
21
- import { mapContainerToRaw } from "./container"
22
22
 
23
- export type StatefulSetArgs = Omit<PublicWorkloadArgs, "patch"> & {
24
- patch?: Input<k8s.StatefulSet>
25
- } & Partial<types.input.apps.v1.StatefulSetSpec>
23
+ export type StatefulSetArgs = Omit<ExposableWorkloadArgs, "existing"> &
24
+ Omit<Partial<types.input.apps.v1.StatefulSetSpec>, "template"> & {
25
+ template?: {
26
+ metadata?: types.input.meta.v1.ObjectMeta
27
+ spec?: Partial<types.input.core.v1.PodSpec>
28
+ }
29
+ }
30
+
31
+ export type CreateOrGetStatefulSetArgs = StatefulSetArgs & {
32
+ /**
33
+ * The entity to use to determine the stateful set to patch.
34
+ */
35
+ existing: Input<k8s.StatefulSet> | undefined
36
+ }
26
37
 
27
- export abstract class StatefulSet extends ComponentResource {
38
+ export abstract class StatefulSet extends ExposableWorkload {
28
39
  protected constructor(
29
40
  type: string,
30
41
  name: string,
31
- args: Inputs,
32
- opts: ComponentResourceOptions,
42
+ args: ExposableWorkloadArgs,
43
+ opts: ComponentResourceOptions | undefined,
33
44
 
34
- /**
35
- * The cluster info associated with the stateful set.
36
- */
37
- readonly clusterInfo: Output<k8s.ClusterInfo>,
38
-
39
- /**
40
- * The metadata of the underlying Kubernetes stateful set.
41
- */
42
- readonly metadata: Output<types.output.meta.v1.ObjectMeta>,
45
+ cluster: Output<k8s.Cluster>,
46
+ metadata: Output<types.output.meta.v1.ObjectMeta>,
43
47
 
44
48
  /**
45
49
  * The spec of the underlying Kubernetes stateful set.
@@ -51,10 +55,23 @@ export abstract class StatefulSet extends ComponentResource {
51
55
  */
52
56
  readonly status: Output<types.output.apps.v1.StatefulSetStatus>,
53
57
 
54
- private readonly _service: Output<Service | undefined>,
55
- private readonly _httpRoute: Output<HttpRoute | undefined>,
58
+ networkPolicy: Output<NetworkPolicy | undefined>,
59
+
60
+ service: Output<Service | undefined>,
61
+ httpRoute: Output<HttpRoute | undefined>,
56
62
  ) {
57
- super(type, name, args, opts)
63
+ super(
64
+ type,
65
+ name,
66
+ args,
67
+ opts,
68
+ "statefulset",
69
+ cluster,
70
+ metadata,
71
+ networkPolicy,
72
+ service,
73
+ httpRoute,
74
+ )
58
75
  }
59
76
 
60
77
  /**
@@ -63,97 +80,185 @@ export abstract class StatefulSet extends ComponentResource {
63
80
  get entity(): Output<k8s.StatefulSet> {
64
81
  return output({
65
82
  type: "k8s.stateful-set",
66
- clusterInfo: this.clusterInfo,
83
+ clusterId: this.cluster.id,
67
84
  metadata: this.metadata,
68
85
  service: this.service.entity,
69
86
  })
70
87
  }
71
88
 
72
- get optionalService(): Output<Service | undefined> {
73
- return this._service
89
+ static create(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions): StatefulSet {
90
+ return new CreatedStatefulSet(name, args, opts)
74
91
  }
75
92
 
76
- /**
77
- * The service associated with the stateful set.
78
- */
79
- get service(): Output<Service> {
80
- return this._service.apply(service => {
81
- if (!service) {
82
- throw new Error("The service is not available.")
83
- }
93
+ static createOrPatch(
94
+ name: string,
95
+ args: CreateOrGetStatefulSetArgs,
96
+ opts?: ComponentResourceOptions,
97
+ ): StatefulSet {
98
+ if (!args.existing) {
99
+ return new CreatedStatefulSet(name, args, opts)
100
+ }
84
101
 
85
- return service
86
- })
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
+ )
87
111
  }
88
112
 
89
- /**
90
- * The HTTP route associated with the stateful set.
91
- */
92
- get httpRoute(): Output<HttpRoute> {
93
- return this._httpRoute.apply(httpRoute => {
94
- if (!httpRoute) {
95
- throw new Error("The HTTP route is not available.")
96
- }
97
-
98
- return httpRoute
99
- })
113
+ static patch(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions): StatefulSet {
114
+ return new StatefulSetPatch(name, args, opts)
100
115
  }
101
116
 
102
- static create(name: string, args: StatefulSetArgs, opts: ComponentResourceOptions): StatefulSet {
103
- return new CreatedStatefulSet(name, args, opts)
117
+ static createOrGet(
118
+ name: string,
119
+ args: CreateOrGetStatefulSetArgs,
120
+ opts?: ComponentResourceOptions,
121
+ ): 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)
104
127
  }
105
128
  }
106
129
 
107
130
  class CreatedStatefulSet extends StatefulSet {
108
- constructor(name: string, args: StatefulSetArgs, opts: ComponentResourceOptions) {
109
- const { containers, volumes, labels, service, httpRoute } = getPublicWorkloadComponents(
131
+ constructor(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions) {
132
+ const { labels, podTemplate, networkPolicy, service, httpRoute } =
133
+ getExposableWorkloadComponents(
134
+ name,
135
+ {
136
+ ...args,
137
+
138
+ // force create a service since it is required for stateful sets
139
+ service: output(args.service).apply(service => ({ ...service })),
140
+ },
141
+ () => this,
142
+ opts,
143
+ )
144
+
145
+ const statefulSet = output({ args, podTemplate }).apply(async ({ args, podTemplate }) => {
146
+ return new apps.v1.StatefulSet(
147
+ name,
148
+ {
149
+ metadata: mapMetadata(args, name),
150
+ spec: deepmerge(
151
+ {
152
+ serviceName: service.apply(service => service!.metadata.name),
153
+ template: podTemplate,
154
+ selector: { matchLabels: labels },
155
+ },
156
+ omit(args, exposableWorkloadExtraArgs),
157
+ ) as types.input.apps.v1.StatefulSetSpec,
158
+ },
159
+ {
160
+ ...opts,
161
+ parent: this,
162
+ provider: await getProvider(args.cluster),
163
+ },
164
+ )
165
+ })
166
+
167
+ super(
168
+ "highstate:k8s:StatefulSet",
169
+ name,
170
+ args,
171
+ opts,
172
+
173
+ output(args.cluster),
174
+ statefulSet.metadata,
175
+ statefulSet.spec,
176
+ statefulSet.status,
177
+
178
+ networkPolicy,
179
+ service,
180
+ httpRoute,
181
+ )
182
+ }
183
+ }
184
+
185
+ class StatefulSetPatch extends StatefulSet {
186
+ constructor(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions) {
187
+ const { podSpec, networkPolicy, service, httpRoute } = getExposableWorkloadComponents(
110
188
  name,
111
189
  args,
112
190
  () => this,
113
191
  opts,
114
192
  )
115
193
 
116
- const statefulSet = output({ args, containers, volumes, service }).apply(
117
- async ({ args, containers, volumes, service }) => {
118
- await verifyProvider(opts.provider, args.cluster?.info)
119
-
120
- return new (args.patch ? apps.v1.StatefulSetPatch : apps.v1.StatefulSet)(
121
- name,
122
- {
123
- metadata: mapMetadata(args.patch?.metadata ?? args, name),
124
- spec: deepmerge(
125
- {
126
- serviceName: service?.metadata.name || name,
127
- template: {
128
- metadata: !args.patch ? { labels } : undefined,
129
- spec: {
130
- containers: containers.map(container => mapContainerToRaw(container, name)),
131
- volumes,
132
- },
133
- },
134
- selector: !args.patch ? { matchLabels: labels } : undefined,
194
+ const statefulSet = output({ args, podSpec }).apply(async ({ args, podSpec }) => {
195
+ return new apps.v1.StatefulSetPatch(
196
+ name,
197
+ {
198
+ metadata: mapMetadata(args, name),
199
+ spec: deepmerge(
200
+ {
201
+ template: {
202
+ spec: podSpec,
135
203
  },
136
- omit(args, publicWorkloadExtraArgs),
137
- ),
138
- },
139
- { parent: this, ...opts },
140
- )
141
- },
142
- )
204
+ },
205
+ omit(args, exposableWorkloadExtraArgs),
206
+ ) as types.input.apps.v1.StatefulSetSpec,
207
+ },
208
+ {
209
+ ...opts,
210
+ parent: this,
211
+ provider: await getProvider(args.cluster),
212
+ },
213
+ )
214
+ })
143
215
 
144
216
  super(
145
- "highstate:k8s:StatefulSet",
217
+ "highstate:k8s:StatefulSetPatch",
146
218
  name,
147
219
  args,
148
220
  opts,
149
221
 
150
- output(args.cluster).info,
222
+ output(args.cluster),
151
223
  statefulSet.metadata,
152
224
  statefulSet.spec,
153
225
  statefulSet.status,
154
226
 
227
+ networkPolicy,
155
228
  service,
156
229
  httpRoute,
157
230
  )
158
231
  }
159
232
  }
233
+
234
+ class ExternalStatefulSet extends StatefulSet {
235
+ constructor(
236
+ name: string,
237
+ id: Input<ResourceId>,
238
+ cluster: Input<k8s.Cluster>,
239
+ opts?: ComponentResourceOptions,
240
+ ) {
241
+ const statefulSet = output(id).apply(async id => {
242
+ return apps.v1.StatefulSet.get(name, resourceIdToString(id), {
243
+ ...opts,
244
+ parent: this,
245
+ provider: await getProvider(cluster),
246
+ })
247
+ })
248
+
249
+ super(
250
+ "highstate:k8s:ExternalStatefulSet",
251
+ name,
252
+ { namespace: output(id).namespace, cluster },
253
+ opts,
254
+ output(cluster),
255
+ statefulSet.metadata,
256
+ statefulSet.spec,
257
+ statefulSet.status,
258
+
259
+ output(undefined),
260
+ output(undefined),
261
+ output(undefined),
262
+ )
263
+ }
264
+ }
@@ -1,10 +1,17 @@
1
1
  import { k8s } from "@highstate/library"
2
- import { forUnit } from "@highstate/pulumi"
2
+ import { forUnit, toPromise } from "@highstate/pulumi"
3
3
 
4
4
  const { inputs, outputs } = forUnit(k8s.accessPoint)
5
5
 
6
+ const { gateway, tlsIssuer } = await toPromise(inputs)
7
+
8
+ if (gateway.clusterId !== tlsIssuer.clusterId) {
9
+ throw new Error("Gateway and TLS issuer must be in the same cluster")
10
+ }
11
+
6
12
  export default outputs({
7
13
  accessPoint: {
14
+ clusterId: gateway.clusterId,
8
15
  dnsProviders: inputs.dnsProviders,
9
16
  gateway: inputs.gateway,
10
17
  tlsIssuer: inputs.tlsIssuer,
@@ -1,36 +1,31 @@
1
1
  import { k8s } from "@highstate/library"
2
2
  import { forUnit } from "@highstate/pulumi"
3
- import { createNamespace, getProvider } from "../../shared"
4
3
  import { Chart } from "../../helm"
5
4
  import charts from "../../../assets/charts.json"
5
+ import { Namespace } from "../../namespace"
6
6
 
7
7
  const { inputs, outputs } = forUnit(k8s.certManager)
8
- const provider = await getProvider(inputs.k8sCluster)
9
8
 
10
- const namespace = createNamespace("cert-manager", provider)
9
+ const namespace = Namespace.create("cert-manager", { cluster: inputs.k8sCluster })
11
10
 
12
- new Chart(
13
- "cert-manager",
14
- {
15
- namespace: namespace.metadata.name,
16
- cluster: inputs.k8sCluster,
11
+ new Chart("cert-manager", {
12
+ cluster: inputs.k8sCluster,
13
+ namespace,
17
14
 
18
- chart: charts["cert-manager"],
15
+ chart: charts["cert-manager"],
19
16
 
20
- values: {
21
- crds: {
22
- enabled: true,
23
- },
17
+ values: {
18
+ crds: {
19
+ enabled: true,
20
+ },
24
21
 
25
- config: {
26
- apiVersion: "controller.config.cert-manager.io/v1alpha1",
27
- kind: "ControllerConfiguration",
28
- enableGatewayAPI: true,
29
- },
22
+ config: {
23
+ apiVersion: "controller.config.cert-manager.io/v1alpha1",
24
+ kind: "ControllerConfiguration",
25
+ enableGatewayAPI: true,
30
26
  },
31
27
  },
32
- { provider },
33
- )
28
+ })
34
29
 
35
30
  export default outputs({
36
31
  k8sCluster: inputs.k8sCluster,
@@ -0,0 +1,37 @@
1
+ import { l3EndpointToString, l4EndpointToString, updateEndpointsWithFqdn } from "@highstate/common"
2
+ import { k8s } from "@highstate/library"
3
+ import { forUnit } from "@highstate/pulumi"
4
+
5
+ const { args, inputs, outputs } = forUnit(k8s.clusterDns)
6
+
7
+ const { endpoints } = await updateEndpointsWithFqdn(
8
+ inputs.k8sCluster.endpoints,
9
+ args.fqdn,
10
+ args.endpointFilter,
11
+ args.patchMode,
12
+ inputs.dnsProviders,
13
+ )
14
+
15
+ const { endpoints: apiEndpoints } = await updateEndpointsWithFqdn(
16
+ inputs.k8sCluster.apiEndpoints,
17
+ args.apiFqdn,
18
+ args.apiEndpointFilter,
19
+ args.apiPatchMode,
20
+ inputs.dnsProviders,
21
+ )
22
+
23
+ export default outputs({
24
+ k8sCluster: inputs.k8sCluster.apply(k8sCluster => ({
25
+ ...k8sCluster,
26
+ endpoints,
27
+ apiEndpoints,
28
+ })),
29
+
30
+ endpoints,
31
+ apiEndpoints,
32
+
33
+ $status: {
34
+ endpoints: endpoints.map(l3EndpointToString),
35
+ apiEndpoints: apiEndpoints.map(l4EndpointToString),
36
+ },
37
+ })
@@ -0,0 +1,35 @@
1
+ import { l3EndpointToString, l4EndpointToString, updateEndpoints } from "@highstate/common"
2
+ import { k8s } from "@highstate/library"
3
+ import { forUnit } from "@highstate/pulumi"
4
+
5
+ const { args, inputs, outputs } = forUnit(k8s.clusterPatch)
6
+
7
+ const endpoints = await updateEndpoints(
8
+ inputs.k8sCluster.endpoints,
9
+ args.endpoints,
10
+ inputs.endpoints,
11
+ args.endpointsPatchMode,
12
+ )
13
+
14
+ const apiEndpoints = await updateEndpoints(
15
+ inputs.k8sCluster.apiEndpoints,
16
+ args.apiEndpoints,
17
+ inputs.apiEndpoints,
18
+ args.apiEndpointsPatchMode,
19
+ )
20
+
21
+ export default outputs({
22
+ k8sCluster: inputs.k8sCluster.apply(k8sCluster => ({
23
+ ...k8sCluster,
24
+ endpoints,
25
+ apiEndpoints,
26
+ })),
27
+
28
+ endpoints,
29
+ apiEndpoints,
30
+
31
+ $status: {
32
+ endpoints: endpoints.map(l3EndpointToString),
33
+ apiEndpoints: apiEndpoints.map(l4EndpointToString),
34
+ },
35
+ })
@@ -36,7 +36,7 @@ new cert_manager.v1.ClusterIssuer(
36
36
 
37
37
  export default outputs({
38
38
  tlsIssuer: {
39
- clusterInfo: unsecret(inputs.k8sCluster.info),
39
+ clusterId: unsecret(inputs.k8sCluster.id),
40
40
  clusterIssuerName: name,
41
41
  },
42
42
  })