@highstate/k8s 0.9.4 → 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.
- package/dist/chunk-DQSCJM5S.js +183 -0
- package/dist/chunk-DQSCJM5S.js.map +1 -0
- package/dist/chunk-FKNHHKOL.js +260 -0
- package/dist/chunk-FKNHHKOL.js.map +1 -0
- package/dist/chunk-HW3NS3MC.js +347 -0
- package/dist/chunk-HW3NS3MC.js.map +1 -0
- package/dist/chunk-OQ7UXASD.js +193 -0
- package/dist/chunk-OQ7UXASD.js.map +1 -0
- package/dist/chunk-QGHMLKTW.js +1123 -0
- package/dist/chunk-QGHMLKTW.js.map +1 -0
- package/dist/chunk-UNVSWG6D.js +214 -0
- package/dist/chunk-UNVSWG6D.js.map +1 -0
- package/dist/deployment-ZP3ASKPT.js +10 -0
- package/dist/deployment-ZP3ASKPT.js.map +1 -0
- package/dist/highstate.manifest.json +8 -6
- package/dist/index.js +291 -954
- package/dist/index.js.map +1 -1
- package/dist/stateful-set-2AH7RAF7.js +10 -0
- package/dist/stateful-set-2AH7RAF7.js.map +1 -0
- package/dist/units/access-point/index.js +6 -1
- package/dist/units/access-point/index.js.map +1 -1
- package/dist/units/cert-manager/index.js +19 -24
- package/dist/units/cert-manager/index.js.map +1 -1
- package/dist/units/cluster-dns/index.js +36 -0
- package/dist/units/cluster-dns/index.js.map +1 -0
- package/dist/units/cluster-patch/index.js +34 -0
- package/dist/units/cluster-patch/index.js.map +1 -0
- package/dist/units/dns01-issuer/index.js +2 -2
- package/dist/units/dns01-issuer/index.js.map +1 -1
- package/dist/units/existing-cluster/index.js +22 -14
- package/dist/units/existing-cluster/index.js.map +1 -1
- package/dist/units/gateway-api/index.js +1 -1
- package/package.json +12 -10
- package/src/access-point.ts +44 -39
- package/src/container.ts +54 -5
- package/src/cron-job.ts +14 -30
- package/src/deployment.ts +170 -127
- package/src/gateway/http-route.ts +7 -5
- package/src/helm.ts +57 -8
- package/src/index.ts +11 -4
- package/src/job.ts +14 -32
- package/src/namespace.ts +241 -0
- package/src/network-policy.ts +371 -87
- package/src/network.ts +41 -0
- package/src/pvc.ts +43 -25
- package/src/scripting/bundle.ts +125 -22
- package/src/scripting/container.ts +16 -11
- package/src/scripting/environment.ts +56 -6
- package/src/secret.ts +195 -0
- package/src/service.ts +209 -89
- package/src/shared.ts +42 -51
- package/src/stateful-set.ts +193 -88
- package/src/units/access-point/index.ts +8 -1
- package/src/units/cert-manager/index.ts +15 -20
- package/src/units/cluster-dns/index.ts +37 -0
- package/src/units/cluster-patch/index.ts +35 -0
- package/src/units/dns01-issuer/index.ts +1 -1
- package/src/units/existing-cluster/index.ts +24 -14
- package/src/workload.ts +342 -44
- package/dist/chunk-K4WKJ4L5.js +0 -455
- package/dist/chunk-K4WKJ4L5.js.map +0 -1
- package/dist/chunk-T5Z2M4JE.js +0 -103
- 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 {
|
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.
|
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.
|
17
|
-
|
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
|
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
|
-
|
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(
|
131
|
-
return output(
|
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
|
+
}
|
package/src/stateful-set.ts
CHANGED
@@ -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
|
-
|
6
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
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<
|
24
|
-
|
25
|
-
|
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
|
38
|
+
export abstract class StatefulSet extends ExposableWorkload {
|
28
39
|
protected constructor(
|
29
40
|
type: string,
|
30
41
|
name: string,
|
31
|
-
args:
|
32
|
-
opts: ComponentResourceOptions,
|
42
|
+
args: ExposableWorkloadArgs,
|
43
|
+
opts: ComponentResourceOptions | undefined,
|
33
44
|
|
34
|
-
|
35
|
-
|
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
|
-
|
55
|
-
|
58
|
+
networkPolicy: Output<NetworkPolicy | undefined>,
|
59
|
+
|
60
|
+
service: Output<Service | undefined>,
|
61
|
+
httpRoute: Output<HttpRoute | undefined>,
|
56
62
|
) {
|
57
|
-
super(
|
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
|
-
|
83
|
+
clusterId: this.cluster.id,
|
67
84
|
metadata: this.metadata,
|
68
85
|
service: this.service.entity,
|
69
86
|
})
|
70
87
|
}
|
71
88
|
|
72
|
-
|
73
|
-
return
|
89
|
+
static create(name: string, args: StatefulSetArgs, opts?: ComponentResourceOptions): StatefulSet {
|
90
|
+
return new CreatedStatefulSet(name, args, opts)
|
74
91
|
}
|
75
92
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
-
|
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
|
-
|
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
|
103
|
-
|
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
|
109
|
-
const {
|
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,
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
-
|
137
|
-
),
|
138
|
-
|
139
|
-
|
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:
|
217
|
+
"highstate:k8s:StatefulSetPatch",
|
146
218
|
name,
|
147
219
|
args,
|
148
220
|
opts,
|
149
221
|
|
150
|
-
output(args.cluster)
|
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 =
|
9
|
+
const namespace = Namespace.create("cert-manager", { cluster: inputs.k8sCluster })
|
11
10
|
|
12
|
-
new Chart(
|
13
|
-
|
14
|
-
|
15
|
-
namespace: namespace.metadata.name,
|
16
|
-
cluster: inputs.k8sCluster,
|
11
|
+
new Chart("cert-manager", {
|
12
|
+
cluster: inputs.k8sCluster,
|
13
|
+
namespace,
|
17
14
|
|
18
|
-
|
15
|
+
chart: charts["cert-manager"],
|
19
16
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
values: {
|
18
|
+
crds: {
|
19
|
+
enabled: true,
|
20
|
+
},
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
},
|
22
|
+
config: {
|
23
|
+
apiVersion: "controller.config.cert-manager.io/v1alpha1",
|
24
|
+
kind: "ControllerConfiguration",
|
25
|
+
enableGatewayAPI: true,
|
30
26
|
},
|
31
27
|
},
|
32
|
-
|
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
|
+
})
|