@intentius/chant-lexicon-helm 0.0.18 → 0.0.24
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/integrity.json +5 -5
- package/dist/manifest.json +1 -1
- package/dist/skills/chant-helm.md +447 -0
- package/package.json +21 -3
- package/src/codegen/docs.test.ts +14 -0
- package/src/codegen/generate.test.ts +71 -0
- package/src/codegen/package.test.ts +36 -0
- package/src/composites/composites.test.ts +116 -110
- package/src/composites/helm-batch-job.ts +33 -19
- package/src/composites/helm-crd-lifecycle.ts +37 -24
- package/src/composites/helm-cron-job.ts +25 -13
- package/src/composites/helm-daemon-set.ts +26 -14
- package/src/composites/helm-external-secret.ts +21 -12
- package/src/composites/helm-library.ts +21 -7
- package/src/composites/helm-microservice.ts +46 -29
- package/src/composites/helm-monitored-service.ts +75 -51
- package/src/composites/helm-namespace-env.ts +80 -52
- package/src/composites/helm-secure-ingress.ts +66 -50
- package/src/composites/helm-stateful-service.ts +29 -16
- package/src/composites/helm-web-app.ts +37 -22
- package/src/composites/helm-worker.ts +34 -20
- package/src/import/roundtrip.test.ts +144 -0
- package/src/lint/post-synth/whm101.test.ts +69 -0
- package/src/lint/post-synth/whm102.test.ts +57 -0
- package/src/lint/post-synth/whm103.test.ts +58 -0
- package/src/lint/post-synth/whm104.test.ts +57 -0
- package/src/lint/post-synth/whm105.test.ts +41 -0
- package/src/lint/post-synth/whm201.test.ts +59 -0
- package/src/lint/post-synth/whm202.test.ts +62 -0
- package/src/lint/post-synth/whm203.test.ts +58 -0
- package/src/lint/post-synth/whm204.test.ts +56 -0
- package/src/lint/post-synth/whm301.test.ts +49 -0
- package/src/lint/post-synth/whm302.test.ts +58 -0
- package/src/lint/post-synth/whm401.test.ts +59 -0
- package/src/lint/post-synth/whm402.test.ts +58 -0
- package/src/lint/post-synth/whm403.test.ts +50 -0
- package/src/lint/post-synth/whm404.test.ts +50 -0
- package/src/lint/post-synth/whm405.test.ts +60 -0
- package/src/lint/post-synth/whm406.test.ts +43 -0
- package/src/lint/post-synth/whm407.test.ts +60 -0
- package/src/lint/post-synth/whm501.test.ts +70 -0
- package/src/lint/post-synth/whm502.test.ts +72 -0
- package/src/lint/rules/chart-metadata.test.ts +45 -0
- package/src/lint/rules/no-hardcoded-image.test.ts +41 -0
- package/src/lint/rules/values-no-secrets.test.ts +48 -0
- package/src/plugin.test.ts +3 -3
- package/src/plugin.ts +190 -19
- package/src/resources.ts +29 -0
- package/src/skills/chant-helm.md +447 -0
- package/dist/skills/chant-helm-create-chart.md +0 -211
- package/src/skills/create-chart.md +0 -211
- /package/dist/skills/{chant-helm-chart-patterns.md → chant-helm-patterns.md} +0 -0
- /package/dist/skills/{chant-helm-chart-security-patterns.md → chant-helm-security.md} +0 -0
- /package/src/skills/{chart-patterns.md → chant-helm-patterns.md} +0 -0
- /package/src/skills/{chart-security-patterns.md → chant-helm-security.md} +0 -0
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Full microservice pattern with all common production resources.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
8
|
+
import { Chart, Values, Deployment, Service, ServiceAccount, ConfigMap, Ingress, HPA, PDB } from "../resources";
|
|
7
9
|
import { values, include, printf, toYaml, If, With } from "../intrinsics";
|
|
8
10
|
|
|
9
11
|
export interface HelmMicroserviceProps {
|
|
@@ -43,21 +45,33 @@ export interface HelmMicroserviceProps {
|
|
|
43
45
|
podAnnotations?: Record<string, string>;
|
|
44
46
|
/** Deployment strategy defaults. */
|
|
45
47
|
strategy?: Record<string, unknown>;
|
|
48
|
+
/** Per-member defaults. */
|
|
49
|
+
defaults?: {
|
|
50
|
+
chart?: Partial<Record<string, unknown>>;
|
|
51
|
+
values?: Partial<Record<string, unknown>>;
|
|
52
|
+
deployment?: Partial<Record<string, unknown>>;
|
|
53
|
+
service?: Partial<Record<string, unknown>>;
|
|
54
|
+
serviceAccount?: Partial<Record<string, unknown>>;
|
|
55
|
+
configMap?: Partial<Record<string, unknown>>;
|
|
56
|
+
ingress?: Partial<Record<string, unknown>>;
|
|
57
|
+
hpa?: Partial<Record<string, unknown>>;
|
|
58
|
+
pdb?: Partial<Record<string, unknown>>;
|
|
59
|
+
};
|
|
46
60
|
}
|
|
47
61
|
|
|
48
62
|
export interface HelmMicroserviceResult {
|
|
49
|
-
chart:
|
|
50
|
-
values:
|
|
51
|
-
deployment:
|
|
52
|
-
service:
|
|
53
|
-
serviceAccount:
|
|
54
|
-
configMap?:
|
|
55
|
-
ingress?:
|
|
56
|
-
hpa?:
|
|
57
|
-
pdb?:
|
|
63
|
+
chart: InstanceType<typeof Chart>;
|
|
64
|
+
values: InstanceType<typeof Values>;
|
|
65
|
+
deployment: InstanceType<typeof Deployment>;
|
|
66
|
+
service: InstanceType<typeof Service>;
|
|
67
|
+
serviceAccount: InstanceType<typeof ServiceAccount>;
|
|
68
|
+
configMap?: InstanceType<typeof ConfigMap>;
|
|
69
|
+
ingress?: InstanceType<typeof Ingress>;
|
|
70
|
+
hpa?: InstanceType<typeof HPA>;
|
|
71
|
+
pdb?: InstanceType<typeof PDB>;
|
|
58
72
|
}
|
|
59
73
|
|
|
60
|
-
export
|
|
74
|
+
export const HelmMicroservice = Composite<HelmMicroserviceProps>((props) => {
|
|
61
75
|
const {
|
|
62
76
|
name,
|
|
63
77
|
imageRepository = "nginx",
|
|
@@ -70,16 +84,17 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
70
84
|
pdb = true,
|
|
71
85
|
configMap = true,
|
|
72
86
|
appVersion = "1.0.0",
|
|
87
|
+
defaults: defs,
|
|
73
88
|
} = props;
|
|
74
89
|
|
|
75
|
-
const chart = {
|
|
90
|
+
const chart = new Chart(mergeDefaults({
|
|
76
91
|
apiVersion: "v2",
|
|
77
92
|
name,
|
|
78
93
|
version: "0.1.0",
|
|
79
94
|
appVersion,
|
|
80
95
|
type: "application",
|
|
81
96
|
description: `A Helm chart for ${name} microservice`,
|
|
82
|
-
};
|
|
97
|
+
}, defs?.chart));
|
|
83
98
|
|
|
84
99
|
const valuesObj: Record<string, unknown> = {
|
|
85
100
|
replicaCount: replicas,
|
|
@@ -152,6 +167,8 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
152
167
|
};
|
|
153
168
|
}
|
|
154
169
|
|
|
170
|
+
const valuesRes = new Values(mergeDefaults(valuesObj, defs?.values));
|
|
171
|
+
|
|
155
172
|
const containerSpec: Record<string, unknown> = {
|
|
156
173
|
name,
|
|
157
174
|
image: printf("%s:%s", values.image.repository, values.image.tag),
|
|
@@ -192,7 +209,7 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
192
209
|
|
|
193
210
|
if (props.strategy) deploymentSpec.strategy = toYaml(values.strategy);
|
|
194
211
|
|
|
195
|
-
const deployment = {
|
|
212
|
+
const deployment = new Deployment(mergeDefaults({
|
|
196
213
|
apiVersion: "apps/v1",
|
|
197
214
|
kind: "Deployment",
|
|
198
215
|
metadata: {
|
|
@@ -200,9 +217,9 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
200
217
|
labels: include(`${name}.labels`),
|
|
201
218
|
},
|
|
202
219
|
spec: deploymentSpec,
|
|
203
|
-
};
|
|
220
|
+
}, defs?.deployment));
|
|
204
221
|
|
|
205
|
-
const service = {
|
|
222
|
+
const service = new Service(mergeDefaults({
|
|
206
223
|
apiVersion: "v1",
|
|
207
224
|
kind: "Service",
|
|
208
225
|
metadata: {
|
|
@@ -219,9 +236,9 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
219
236
|
}],
|
|
220
237
|
selector: include(`${name}.selectorLabels`),
|
|
221
238
|
},
|
|
222
|
-
};
|
|
239
|
+
}, defs?.service));
|
|
223
240
|
|
|
224
|
-
const serviceAccount = {
|
|
241
|
+
const serviceAccount = new ServiceAccount(mergeDefaults({
|
|
225
242
|
apiVersion: "v1",
|
|
226
243
|
kind: "ServiceAccount",
|
|
227
244
|
metadata: {
|
|
@@ -229,18 +246,18 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
229
246
|
labels: include(`${name}.labels`),
|
|
230
247
|
annotations: toYaml(values.serviceAccount.annotations),
|
|
231
248
|
},
|
|
232
|
-
};
|
|
249
|
+
}, defs?.serviceAccount));
|
|
233
250
|
|
|
234
|
-
const result:
|
|
251
|
+
const result: Record<string, any> = {
|
|
235
252
|
chart,
|
|
236
|
-
values:
|
|
253
|
+
values: valuesRes,
|
|
237
254
|
deployment,
|
|
238
255
|
service,
|
|
239
256
|
serviceAccount,
|
|
240
257
|
};
|
|
241
258
|
|
|
242
259
|
if (configMap) {
|
|
243
|
-
result.configMap = {
|
|
260
|
+
result.configMap = new ConfigMap(mergeDefaults({
|
|
244
261
|
apiVersion: "v1",
|
|
245
262
|
kind: "ConfigMap",
|
|
246
263
|
metadata: {
|
|
@@ -248,11 +265,11 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
248
265
|
labels: include(`${name}.labels`),
|
|
249
266
|
},
|
|
250
267
|
data: values.config,
|
|
251
|
-
};
|
|
268
|
+
}, defs?.configMap));
|
|
252
269
|
}
|
|
253
270
|
|
|
254
271
|
if (ingress) {
|
|
255
|
-
result.ingress = {
|
|
272
|
+
result.ingress = new Ingress(mergeDefaults({
|
|
256
273
|
apiVersion: "networking.k8s.io/v1",
|
|
257
274
|
kind: "Ingress",
|
|
258
275
|
metadata: {
|
|
@@ -265,11 +282,11 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
265
282
|
rules: values.ingress.hosts,
|
|
266
283
|
tls: values.ingress.tls,
|
|
267
284
|
},
|
|
268
|
-
};
|
|
285
|
+
}, defs?.ingress));
|
|
269
286
|
}
|
|
270
287
|
|
|
271
288
|
if (autoscaling) {
|
|
272
|
-
result.hpa = {
|
|
289
|
+
result.hpa = new HPA(mergeDefaults({
|
|
273
290
|
apiVersion: "autoscaling/v2",
|
|
274
291
|
kind: "HorizontalPodAutoscaler",
|
|
275
292
|
metadata: {
|
|
@@ -307,11 +324,11 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
307
324
|
},
|
|
308
325
|
],
|
|
309
326
|
},
|
|
310
|
-
};
|
|
327
|
+
}, defs?.hpa));
|
|
311
328
|
}
|
|
312
329
|
|
|
313
330
|
if (pdb) {
|
|
314
|
-
result.pdb = {
|
|
331
|
+
result.pdb = new PDB(mergeDefaults({
|
|
315
332
|
apiVersion: "policy/v1",
|
|
316
333
|
kind: "PodDisruptionBudget",
|
|
317
334
|
metadata: {
|
|
@@ -324,8 +341,8 @@ export function HelmMicroservice(props: HelmMicroserviceProps): HelmMicroservice
|
|
|
324
341
|
matchLabels: include(`${name}.selectorLabels`),
|
|
325
342
|
},
|
|
326
343
|
},
|
|
327
|
-
};
|
|
344
|
+
}, defs?.pdb));
|
|
328
345
|
}
|
|
329
346
|
|
|
330
347
|
return result;
|
|
331
|
-
}
|
|
348
|
+
}, "HelmMicroservice");
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* Uses fallback GVK for CRD resources (ServiceMonitor, PrometheusRule).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import {
|
|
10
|
+
Chart, Values, Deployment, Service, ServiceAccount,
|
|
11
|
+
ServiceMonitor as ServiceMonitorRes, PrometheusRule as PrometheusRuleRes,
|
|
12
|
+
} from "../resources";
|
|
8
13
|
import { values, include, printf, toYaml, If, With, Capabilities } from "../intrinsics";
|
|
9
14
|
|
|
10
15
|
export interface HelmMonitoredServiceProps {
|
|
@@ -42,19 +47,29 @@ export interface HelmMonitoredServiceProps {
|
|
|
42
47
|
affinity?: Record<string, unknown>;
|
|
43
48
|
/** Chart appVersion. */
|
|
44
49
|
appVersion?: string;
|
|
50
|
+
/** Per-member defaults. */
|
|
51
|
+
defaults?: {
|
|
52
|
+
chart?: Partial<Record<string, unknown>>;
|
|
53
|
+
values?: Partial<Record<string, unknown>>;
|
|
54
|
+
deployment?: Partial<Record<string, unknown>>;
|
|
55
|
+
service?: Partial<Record<string, unknown>>;
|
|
56
|
+
serviceAccount?: Partial<Record<string, unknown>>;
|
|
57
|
+
serviceMonitor?: Partial<Record<string, unknown>>;
|
|
58
|
+
prometheusRule?: Partial<Record<string, unknown>>;
|
|
59
|
+
};
|
|
45
60
|
}
|
|
46
61
|
|
|
47
62
|
export interface HelmMonitoredServiceResult {
|
|
48
|
-
chart:
|
|
49
|
-
values:
|
|
50
|
-
deployment:
|
|
51
|
-
service:
|
|
52
|
-
serviceAccount?:
|
|
53
|
-
serviceMonitor:
|
|
54
|
-
prometheusRule?:
|
|
63
|
+
chart: InstanceType<typeof Chart>;
|
|
64
|
+
values: InstanceType<typeof Values>;
|
|
65
|
+
deployment: InstanceType<typeof Deployment>;
|
|
66
|
+
service: InstanceType<typeof Service>;
|
|
67
|
+
serviceAccount?: InstanceType<typeof ServiceAccount>;
|
|
68
|
+
serviceMonitor: InstanceType<typeof ServiceMonitorRes>;
|
|
69
|
+
prometheusRule?: InstanceType<typeof PrometheusRuleRes>;
|
|
55
70
|
}
|
|
56
71
|
|
|
57
|
-
export
|
|
72
|
+
export const HelmMonitoredService = Composite<HelmMonitoredServiceProps>((props) => {
|
|
58
73
|
const {
|
|
59
74
|
name,
|
|
60
75
|
imageRepository = "nginx",
|
|
@@ -68,16 +83,17 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
|
|
|
68
83
|
serviceAccount = true,
|
|
69
84
|
alertRules = false,
|
|
70
85
|
appVersion = "1.0.0",
|
|
86
|
+
defaults: defs,
|
|
71
87
|
} = props;
|
|
72
88
|
|
|
73
|
-
const chart = {
|
|
89
|
+
const chart = new Chart(mergeDefaults({
|
|
74
90
|
apiVersion: "v2",
|
|
75
91
|
name,
|
|
76
92
|
version: "0.1.0",
|
|
77
93
|
appVersion,
|
|
78
94
|
type: "application",
|
|
79
95
|
description: `A Helm chart for ${name} with monitoring`,
|
|
80
|
-
};
|
|
96
|
+
}, defs?.chart));
|
|
81
97
|
|
|
82
98
|
const valuesObj: Record<string, unknown> = {
|
|
83
99
|
replicaCount: replicas,
|
|
@@ -120,6 +136,8 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
|
|
|
120
136
|
};
|
|
121
137
|
}
|
|
122
138
|
|
|
139
|
+
const valuesRes = new Values(mergeDefaults(valuesObj, defs?.values));
|
|
140
|
+
|
|
123
141
|
const containerSpec: Record<string, unknown> = {
|
|
124
142
|
name,
|
|
125
143
|
image: printf("%s:%s", values.image.repository, values.image.tag),
|
|
@@ -143,7 +161,7 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
|
|
|
143
161
|
if (props.affinity) podSpec.affinity = With(values.affinity, toYaml(values.affinity));
|
|
144
162
|
if (serviceAccount) podSpec.serviceAccountName = include(`${name}.serviceAccountName`);
|
|
145
163
|
|
|
146
|
-
const deployment = {
|
|
164
|
+
const deployment = new Deployment(mergeDefaults({
|
|
147
165
|
apiVersion: "apps/v1",
|
|
148
166
|
kind: "Deployment",
|
|
149
167
|
metadata: {
|
|
@@ -162,9 +180,9 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
|
|
|
162
180
|
spec: podSpec,
|
|
163
181
|
},
|
|
164
182
|
},
|
|
165
|
-
};
|
|
183
|
+
}, defs?.deployment));
|
|
166
184
|
|
|
167
|
-
const service = {
|
|
185
|
+
const service = new Service(mergeDefaults({
|
|
168
186
|
apiVersion: "v1",
|
|
169
187
|
kind: "Service",
|
|
170
188
|
metadata: {
|
|
@@ -189,38 +207,41 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
|
|
|
189
207
|
],
|
|
190
208
|
selector: include(`${name}.selectorLabels`),
|
|
191
209
|
},
|
|
192
|
-
};
|
|
210
|
+
}, defs?.service));
|
|
193
211
|
|
|
194
212
|
// ServiceMonitor CRD (monitoring.coreos.com/v1) — gated on Capabilities check
|
|
195
|
-
const serviceMonitor =
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
spec: {
|
|
203
|
-
selector: {
|
|
204
|
-
matchLabels: include(`${name}.selectorLabels`),
|
|
213
|
+
const serviceMonitor = new ServiceMonitorRes(mergeDefaults(
|
|
214
|
+
If(`and .Values.monitoring.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1")`, {
|
|
215
|
+
apiVersion: "monitoring.coreos.com/v1",
|
|
216
|
+
kind: "ServiceMonitor",
|
|
217
|
+
metadata: {
|
|
218
|
+
name: include(`${name}.fullname`),
|
|
219
|
+
labels: include(`${name}.labels`),
|
|
205
220
|
},
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
221
|
+
spec: {
|
|
222
|
+
selector: {
|
|
223
|
+
matchLabels: include(`${name}.selectorLabels`),
|
|
224
|
+
},
|
|
225
|
+
endpoints: [{
|
|
226
|
+
port: "metrics",
|
|
227
|
+
path: values.monitoring.metricsPath,
|
|
228
|
+
interval: values.monitoring.scrapeInterval,
|
|
229
|
+
}],
|
|
230
|
+
},
|
|
231
|
+
}) as Record<string, unknown>,
|
|
232
|
+
defs?.serviceMonitor,
|
|
233
|
+
));
|
|
213
234
|
|
|
214
|
-
const result:
|
|
235
|
+
const result: Record<string, any> = {
|
|
215
236
|
chart,
|
|
216
|
-
values:
|
|
237
|
+
values: valuesRes,
|
|
217
238
|
deployment,
|
|
218
239
|
service,
|
|
219
|
-
serviceMonitor
|
|
240
|
+
serviceMonitor,
|
|
220
241
|
};
|
|
221
242
|
|
|
222
243
|
if (serviceAccount) {
|
|
223
|
-
result.serviceAccount = {
|
|
244
|
+
result.serviceAccount = new ServiceAccount(mergeDefaults({
|
|
224
245
|
apiVersion: "v1",
|
|
225
246
|
kind: "ServiceAccount",
|
|
226
247
|
metadata: {
|
|
@@ -228,25 +249,28 @@ export function HelmMonitoredService(props: HelmMonitoredServiceProps): HelmMoni
|
|
|
228
249
|
labels: include(`${name}.labels`),
|
|
229
250
|
annotations: toYaml(values.serviceAccount.annotations),
|
|
230
251
|
},
|
|
231
|
-
};
|
|
252
|
+
}, defs?.serviceAccount));
|
|
232
253
|
}
|
|
233
254
|
|
|
234
255
|
if (alertRules) {
|
|
235
|
-
result.prometheusRule =
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
256
|
+
result.prometheusRule = new PrometheusRuleRes(mergeDefaults(
|
|
257
|
+
If(`and .Values.alerting.enabled (.Capabilities.APIVersions.Has "monitoring.coreos.com/v1")`, {
|
|
258
|
+
apiVersion: "monitoring.coreos.com/v1",
|
|
259
|
+
kind: "PrometheusRule",
|
|
260
|
+
metadata: {
|
|
261
|
+
name: include(`${name}.fullname`),
|
|
262
|
+
labels: include(`${name}.labels`),
|
|
263
|
+
},
|
|
264
|
+
spec: {
|
|
265
|
+
groups: [{
|
|
266
|
+
name: printf("%s.rules", name),
|
|
267
|
+
rules: toYaml(values.alerting.rules),
|
|
268
|
+
}],
|
|
269
|
+
},
|
|
270
|
+
}) as Record<string, unknown>,
|
|
271
|
+
defs?.prometheusRule,
|
|
272
|
+
));
|
|
249
273
|
}
|
|
250
274
|
|
|
251
275
|
return result;
|
|
252
|
-
}
|
|
276
|
+
}, "HelmMonitoredService");
|
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
* network isolation.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Composite, mergeDefaults } from "@intentius/chant";
|
|
9
|
+
import {
|
|
10
|
+
Chart, Values, Namespace,
|
|
11
|
+
ResourceQuota as ResourceQuotaRes,
|
|
12
|
+
LimitRange as LimitRangeRes,
|
|
13
|
+
NetworkPolicy as NetworkPolicyRes,
|
|
14
|
+
} from "../resources";
|
|
8
15
|
import { values, include, toYaml, If } from "../intrinsics";
|
|
9
16
|
|
|
10
17
|
export interface HelmNamespaceEnvProps {
|
|
@@ -18,34 +25,44 @@ export interface HelmNamespaceEnvProps {
|
|
|
18
25
|
networkPolicy?: boolean;
|
|
19
26
|
/** Chart appVersion. */
|
|
20
27
|
appVersion?: string;
|
|
28
|
+
/** Per-member defaults. */
|
|
29
|
+
defaults?: {
|
|
30
|
+
chart?: Partial<Record<string, unknown>>;
|
|
31
|
+
values?: Partial<Record<string, unknown>>;
|
|
32
|
+
namespace?: Partial<Record<string, unknown>>;
|
|
33
|
+
resourceQuota?: Partial<Record<string, unknown>>;
|
|
34
|
+
limitRange?: Partial<Record<string, unknown>>;
|
|
35
|
+
networkPolicy?: Partial<Record<string, unknown>>;
|
|
36
|
+
};
|
|
21
37
|
}
|
|
22
38
|
|
|
23
39
|
export interface HelmNamespaceEnvResult {
|
|
24
|
-
chart:
|
|
25
|
-
values:
|
|
26
|
-
namespace:
|
|
27
|
-
resourceQuota?:
|
|
28
|
-
limitRange?:
|
|
29
|
-
networkPolicy?:
|
|
40
|
+
chart: InstanceType<typeof Chart>;
|
|
41
|
+
values: InstanceType<typeof Values>;
|
|
42
|
+
namespace: InstanceType<typeof Namespace>;
|
|
43
|
+
resourceQuota?: InstanceType<typeof ResourceQuotaRes>;
|
|
44
|
+
limitRange?: InstanceType<typeof LimitRangeRes>;
|
|
45
|
+
networkPolicy?: InstanceType<typeof NetworkPolicyRes>;
|
|
30
46
|
}
|
|
31
47
|
|
|
32
|
-
export
|
|
48
|
+
export const HelmNamespaceEnv = Composite<HelmNamespaceEnvProps>((props) => {
|
|
33
49
|
const {
|
|
34
50
|
name,
|
|
35
51
|
resourceQuota = true,
|
|
36
52
|
limitRange = true,
|
|
37
53
|
networkPolicy = true,
|
|
38
54
|
appVersion = "1.0.0",
|
|
55
|
+
defaults: defs,
|
|
39
56
|
} = props;
|
|
40
57
|
|
|
41
|
-
const chart = {
|
|
58
|
+
const chart = new Chart(mergeDefaults({
|
|
42
59
|
apiVersion: "v2",
|
|
43
60
|
name,
|
|
44
61
|
version: "0.1.0",
|
|
45
62
|
appVersion,
|
|
46
63
|
type: "application",
|
|
47
64
|
description: `A Helm chart for ${name} namespace environment`,
|
|
48
|
-
};
|
|
65
|
+
}, defs?.chart));
|
|
49
66
|
|
|
50
67
|
const valuesObj: Record<string, unknown> = {
|
|
51
68
|
namespace: {
|
|
@@ -87,7 +104,9 @@ export function HelmNamespaceEnv(props: HelmNamespaceEnvProps): HelmNamespaceEnv
|
|
|
87
104
|
};
|
|
88
105
|
}
|
|
89
106
|
|
|
90
|
-
const
|
|
107
|
+
const valuesRes = new Values(mergeDefaults(valuesObj, defs?.values));
|
|
108
|
+
|
|
109
|
+
const ns = new Namespace(mergeDefaults({
|
|
91
110
|
apiVersion: "v1",
|
|
92
111
|
kind: "Namespace",
|
|
93
112
|
metadata: {
|
|
@@ -95,60 +114,69 @@ export function HelmNamespaceEnv(props: HelmNamespaceEnvProps): HelmNamespaceEnv
|
|
|
95
114
|
labels: toYaml(values.namespace.labels),
|
|
96
115
|
annotations: toYaml(values.namespace.annotations),
|
|
97
116
|
},
|
|
98
|
-
};
|
|
117
|
+
}, defs?.namespace));
|
|
99
118
|
|
|
100
|
-
const result:
|
|
119
|
+
const result: Record<string, any> = {
|
|
101
120
|
chart,
|
|
102
|
-
values:
|
|
121
|
+
values: valuesRes,
|
|
103
122
|
namespace: ns,
|
|
104
123
|
};
|
|
105
124
|
|
|
106
125
|
if (resourceQuota) {
|
|
107
|
-
result.resourceQuota =
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
126
|
+
result.resourceQuota = new ResourceQuotaRes(mergeDefaults(
|
|
127
|
+
If(values.resourceQuota.enabled, {
|
|
128
|
+
apiVersion: "v1",
|
|
129
|
+
kind: "ResourceQuota",
|
|
130
|
+
metadata: {
|
|
131
|
+
name: include(`${name}.fullname`),
|
|
132
|
+
labels: include(`${name}.labels`),
|
|
133
|
+
},
|
|
134
|
+
spec: {
|
|
135
|
+
hard: toYaml(values.resourceQuota.hard),
|
|
136
|
+
},
|
|
137
|
+
}) as Record<string, unknown>,
|
|
138
|
+
defs?.resourceQuota,
|
|
139
|
+
));
|
|
118
140
|
}
|
|
119
141
|
|
|
120
142
|
if (limitRange) {
|
|
121
|
-
result.limitRange =
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
143
|
+
result.limitRange = new LimitRangeRes(mergeDefaults(
|
|
144
|
+
If(values.limitRange.enabled, {
|
|
145
|
+
apiVersion: "v1",
|
|
146
|
+
kind: "LimitRange",
|
|
147
|
+
metadata: {
|
|
148
|
+
name: include(`${name}.fullname`),
|
|
149
|
+
labels: include(`${name}.labels`),
|
|
150
|
+
},
|
|
151
|
+
spec: {
|
|
152
|
+
limits: [{
|
|
153
|
+
type: "Container",
|
|
154
|
+
default: toYaml(values.limitRange.default),
|
|
155
|
+
defaultRequest: toYaml(values.limitRange.defaultRequest),
|
|
156
|
+
}],
|
|
157
|
+
},
|
|
158
|
+
}) as Record<string, unknown>,
|
|
159
|
+
defs?.limitRange,
|
|
160
|
+
));
|
|
136
161
|
}
|
|
137
162
|
|
|
138
163
|
if (networkPolicy) {
|
|
139
|
-
result.networkPolicy =
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
164
|
+
result.networkPolicy = new NetworkPolicyRes(mergeDefaults(
|
|
165
|
+
If(values.networkPolicy.enabled, {
|
|
166
|
+
apiVersion: "networking.k8s.io/v1",
|
|
167
|
+
kind: "NetworkPolicy",
|
|
168
|
+
metadata: {
|
|
169
|
+
name: include(`${name}.fullname`),
|
|
170
|
+
labels: include(`${name}.labels`),
|
|
171
|
+
},
|
|
172
|
+
spec: {
|
|
173
|
+
podSelector: {},
|
|
174
|
+
policyTypes: ["Ingress", "Egress"],
|
|
175
|
+
},
|
|
176
|
+
}) as Record<string, unknown>,
|
|
177
|
+
defs?.networkPolicy,
|
|
178
|
+
));
|
|
151
179
|
}
|
|
152
180
|
|
|
153
181
|
return result;
|
|
154
|
-
}
|
|
182
|
+
}, "HelmNamespaceEnv");
|