@leverege/build-tools 2.97.1 → 2.98.0

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.
@@ -1,35 +1,50 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "title": "Leverege Base Helm Chart Values",
4
+ "description": "Leverege base Helm chart values schema. Ordering is for readability only; JSON Schema does not require ordering.",
4
5
  "type": "object",
5
6
  "additionalProperties": true,
6
7
 
7
8
  "properties": {
8
9
  "nameOverride": {
9
10
  "type": "string",
10
- "description": "Optional release name override."
11
+ "description": "Identity: Optional release name override."
11
12
  },
13
+
12
14
  "fullnameOverride": {
13
15
  "type": "string",
14
- "description": "Optional full name override."
16
+ "description": "Identity: Optional full name override."
17
+ },
18
+
19
+ "partOf": {
20
+ "type": ["string", "null"],
21
+ "description": "Identity: Optional app.kubernetes.io/part-of label."
15
22
  },
16
23
 
17
24
  "image": {
18
25
  "type": "object",
19
- "description": "Image configuration for the primary workload container.",
26
+ "description": "Runtime: Image configuration for the primary workload container.",
20
27
  "additionalProperties": true,
21
28
  "properties": {
22
- "registry": { "type": "string" },
23
- "repository": { "type": "string" },
24
- "tag": { "type": "string" },
25
- "pullPolicy": { "type": "string", "enum": ["Always", "IfNotPresent", "Never"] },
26
- "pullSecrets": { "type": "array", "items": { "type": "string" } }
29
+ "registry": { "type": "string", "description": "Runtime: Image registry (e.g., Artifact Registry host/path)." },
30
+ "repository": { "type": "string", "description": "Runtime: Image repository/name (optional depending on chart usage)." },
31
+ "tag": { "type": "string", "description": "Runtime: Image tag. Typically defaults to Chart.AppVersion in templates." },
32
+ "pullPolicy": {
33
+ "type": "string",
34
+ "enum": ["Always", "IfNotPresent", "Never"],
35
+ "description": "Runtime: Kubernetes imagePullPolicy."
36
+ },
37
+ "pullSecrets": {
38
+ "type": "array",
39
+ "description": "Runtime: Optional imagePullSecrets list.",
40
+ "items": { "type": "string" }
41
+ }
27
42
  }
28
43
  },
29
44
 
30
45
  "config": {
31
46
  "type": "object",
32
- "description": "Application configuration passed via ConfigMap. All values are treated as strings.",
47
+ "description": "Runtime: Application configuration rendered into a ConfigMap. All values are treated as strings; additional keys are allowed.",
33
48
  "additionalProperties": { "type": "string" },
34
49
  "properties": {
35
50
  "NODE_OPTIONS": { "type": "string" },
@@ -42,51 +57,42 @@
42
57
 
43
58
  "container": {
44
59
  "type": "object",
45
- "description": "Primary container configuration. Safe-walked in templates, so fully optional.",
60
+ "description": "Pod: Primary container knobs. Safe-walked in templates (optional block).",
46
61
  "additionalProperties": true,
47
62
  "properties": {
48
63
  "image": {
49
64
  "type": "string",
50
- "description": "Full image reference to override the default <registry>/<chartName>:<tag>."
65
+ "description": "Pod: Full image reference to override the default <registry>/<chartName>:<tag>."
51
66
  },
52
67
  "command": {
53
68
  "type": "array",
69
+ "description": "Pod: Override container entrypoint (command).",
54
70
  "items": { "type": "string" }
55
71
  },
56
72
  "args": {
57
73
  "type": "array",
74
+ "description": "Pod: Override container args.",
58
75
  "items": { "type": "string" }
59
76
  },
60
77
  "env": {
61
78
  "type": "array",
79
+ "description": "Pod: Extra env vars for the main container.",
62
80
  "items": { "$ref": "#/definitions/envVar" }
63
81
  },
64
82
  "envFromExtra": {
65
83
  "type": "array",
66
- "description": "Additional envFrom entries, merged after default-configs and <fullname>-configs.",
84
+ "description": "Pod: Additional envFrom entries appended after default-configs and <fullname>-configs.",
67
85
  "items": { "$ref": "#/definitions/envFromSource" }
68
86
  },
69
87
  "extraPorts": {
70
88
  "type": "array",
71
- "description": "Additional container ports appended after base deploymentPorts helper.",
72
- "items": {
73
- "type": "object",
74
- "additionalProperties": true,
75
- "properties": {
76
- "name": { "type": "string" },
77
- "containerPort": { "type": "integer", "minimum": 1, "maximum": 65535 },
78
- "protocol": {
79
- "type": "string",
80
- "enum": ["TCP", "UDP", "SCTP"],
81
- "default": "TCP"
82
- }
83
- }
84
- },
89
+ "description": "Pod: Additional container ports appended after the base deploymentPorts helper. Uses containerPort objects (NOT service ports).",
90
+ "items": { "$ref": "#/definitions/containerPortObject" },
85
91
  "default": []
86
92
  },
87
93
  "extraVolumeMounts": {
88
94
  "type": "array",
89
- "description": "Additional volume mounts for the primary container (paired with extraVolumes).",
95
+ "description": "Pod: Additional volume mounts for the primary container (paired with extraVolumes).",
90
96
  "items": { "type": "object", "additionalProperties": true },
91
97
  "default": []
92
98
  }
@@ -95,13 +101,13 @@
95
101
 
96
102
  "extraVolumes": {
97
103
  "type": "array",
98
- "description": "Additional pod volumes shared by main container and sidecars.",
104
+ "description": "Pod: Extra pod volumes shared by main container and sidecars. Objects are passed through to spec.volumes.",
99
105
  "items": {
100
106
  "type": "object",
101
107
  "additionalProperties": true,
102
108
  "required": ["name"],
103
109
  "properties": {
104
- "name": { "type": "string" }
110
+ "name": { "type": "string", "description": "Pod: Volume name." }
105
111
  }
106
112
  },
107
113
  "default": []
@@ -109,7 +115,7 @@
109
115
 
110
116
  "sidecars": {
111
117
  "type": "array",
112
- "description": "Additional containers (e.g., sidecars) appended after the primary container.",
118
+ "description": "Pod: Additional containers appended after the primary container.",
113
119
  "items": {
114
120
  "type": "object",
115
121
  "additionalProperties": true,
@@ -131,33 +137,15 @@
131
137
  },
132
138
  "ports": {
133
139
  "type": "array",
134
- "items": {
135
- "type": "object",
136
- "additionalProperties": true,
137
- "properties": {
138
- "name": { "type": "string" },
139
- "containerPort": {
140
- "type": "integer",
141
- "minimum": 1,
142
- "maximum": 65535
143
- },
144
- "protocol": {
145
- "type": "string",
146
- "enum": ["TCP", "UDP", "SCTP"],
147
- "default": "TCP"
148
- }
149
- }
150
- }
140
+ "description": "Pod: Sidecar container ports (containerPort objects).",
141
+ "items": { "$ref": "#/definitions/containerPortObject" }
151
142
  },
152
143
  "resources": {
153
144
  "$ref": "#/definitions/resourceRequirements"
154
145
  },
155
146
  "volumeMounts": {
156
147
  "type": "array",
157
- "items": {
158
- "type": "object",
159
- "additionalProperties": true
160
- }
148
+ "items": { "type": "object", "additionalProperties": true }
161
149
  }
162
150
  }
163
151
  },
@@ -166,60 +154,71 @@
166
154
 
167
155
  "modelInit": {
168
156
  "type": "object",
169
- "description": "Optional model init container stanza (legacy charts may omit).",
157
+ "description": "Pod: Optional model init container stanza. enabled is required so templates can treat bools as authoritative (no implicit defaulting).",
170
158
  "additionalProperties": true,
159
+ "required": ["enabled"],
171
160
  "properties": {
172
161
  "enabled": { "type": "boolean" },
173
162
  "image": {
174
163
  "type": "string",
175
164
  "description": "Init container image in repo:tag form."
176
165
  },
177
- "command": {
178
- "type": "array",
179
- "items": { "type": "string" }
180
- },
181
- "args": {
182
- "type": "array",
183
- "items": { "type": "string" }
184
- },
185
- "env": {
186
- "type": "array",
187
- "items": { "$ref": "#/definitions/envVar" }
188
- },
189
- "resources": {
190
- "type": "object",
191
- "additionalProperties": true
192
- }
166
+ "command": { "type": "array", "items": { "type": "string" } },
167
+ "args": { "type": "array", "items": { "type": "string" } },
168
+ "env": { "type": "array", "items": { "$ref": "#/definitions/envVar" } },
169
+ "resources": { "type": "object", "additionalProperties": true }
193
170
  }
194
171
  },
195
172
 
196
- "metrics": {
173
+ "securityContext": {
197
174
  "type": "object",
198
- "description": "Metrics port naming.",
175
+ "description": "Pod: Security context options. readOnlyRootFs required so authoritative values.yaml works for booleans.",
199
176
  "additionalProperties": true,
177
+ "required": ["readOnlyRootFs"],
200
178
  "properties": {
201
- "portName": { "type": "string" }
179
+ "readOnlyRootFs": { "type": "boolean" }
202
180
  }
203
181
  },
204
182
 
205
- "partOf": {
206
- "type": ["string", "null"],
207
- "description": "Optional app.kubernetes.io/part-of label."
183
+ "probes": {
184
+ "type": "object",
185
+ "description": "Pod: Liveness/readiness probe configuration. enabled required so authoritative values.yaml works for booleans.",
186
+ "additionalProperties": true,
187
+ "required": ["enabled"],
188
+ "properties": {
189
+ "enabled": { "type": "boolean" },
190
+ "livenessProbe": { "type": "object", "additionalProperties": true },
191
+ "readinessProbe": { "type": "object", "additionalProperties": true }
192
+ }
193
+ },
194
+
195
+ "resources": {
196
+ "$ref": "#/definitions/resourceRequirements",
197
+ "description": "Runtime: Resource requests/limits for the main container."
198
+ },
199
+
200
+ "metrics": {
201
+ "type": "object",
202
+ "description": "Networking: Metrics naming (used by helpers).",
203
+ "additionalProperties": true,
204
+ "properties": {
205
+ "portName": { "type": "string" }
206
+ }
208
207
  },
209
208
 
210
209
  "deploymentPorts": {
211
210
  "type": "object",
212
- "description": "Ports exposed by the Deployment/Pod. Overrides replace defaults when non-empty.",
211
+ "description": "Networking: Deployment/Pod container ports. IMPORTANT: uses containerPort objects (name + containerPort), not Service port objects.\n- override: if non-empty, replaces base defaults.\n- extra: appended to base defaults when override is empty.",
213
212
  "additionalProperties": false,
214
213
  "properties": {
215
214
  "override": {
216
215
  "type": "array",
217
- "items": { "$ref": "#/definitions/portObject" },
216
+ "items": { "$ref": "#/definitions/containerPortObject" },
218
217
  "default": []
219
218
  },
220
219
  "extra": {
221
220
  "type": "array",
222
- "items": { "$ref": "#/definitions/portObject" },
221
+ "items": { "$ref": "#/definitions/containerPortObject" },
223
222
  "default": []
224
223
  }
225
224
  }
@@ -227,7 +226,7 @@
227
226
 
228
227
  "servicePorts": {
229
228
  "type": "object",
230
- "description": "Ports exposed by the Service. Overrides replace defaults when non-empty.",
229
+ "description": "Networking: Service ports. IMPORTANT: uses Service port objects (name + port + optional targetPort).",
231
230
  "additionalProperties": false,
232
231
  "properties": {
233
232
  "override": {
@@ -245,8 +244,9 @@
245
244
 
246
245
  "service": {
247
246
  "type": "object",
248
- "description": "Service configuration.",
247
+ "description": "Networking: Service configuration. preemptible required so it never implicitly defaults to true.",
249
248
  "additionalProperties": true,
249
+ "required": ["preemptible"],
250
250
  "properties": {
251
251
  "type": {
252
252
  "type": "string",
@@ -264,65 +264,77 @@
264
264
  }
265
265
  },
266
266
 
267
- "loadbalancer": {
267
+ "serviceAccount": {
268
268
  "type": "object",
269
- "description": "LoadBalancer-specific options, safe-walked.",
269
+ "description": "RBAC: ServiceAccount options (safe-walked).",
270
270
  "additionalProperties": true,
271
271
  "properties": {
272
- "ip": {
273
- "type": "string",
274
- "description": "Static IP address for LoadBalancer. Use empty string to unset."
272
+ "create": { "type": "boolean" },
273
+ "name": { "type": "string" },
274
+ "annotations": {
275
+ "type": "object",
276
+ "additionalProperties": { "type": "string" }
275
277
  }
276
278
  }
277
279
  },
278
280
 
279
- "serviceAccount": {
281
+ "loadbalancer": {
280
282
  "type": "object",
281
- "description": "ServiceAccount options, safe-walked.",
283
+ "description": "Networking: LoadBalancer-specific options, safe-walked.",
282
284
  "additionalProperties": true,
283
285
  "properties": {
284
- "create": { "type": "boolean" },
285
- "name": { "type": "string" },
286
- "annotations": {
287
- "type": "object",
288
- "additionalProperties": { "type": "string" }
286
+ "ip": {
287
+ "type": "string",
288
+ "description": "Static IP address for LoadBalancer. Use empty string to unset."
289
289
  }
290
290
  }
291
291
  },
292
292
 
293
- "securityContext": {
293
+ "udploadbalancer": {
294
294
  "type": "object",
295
- "description": "Pod/container security context options.",
295
+ "description": "Networking: UDP LoadBalancer options for legacy leaves.",
296
296
  "additionalProperties": true,
297
297
  "properties": {
298
- "readOnlyRootFs": { "type": "boolean" }
298
+ "ip": {
299
+ "type": "string",
300
+ "description": "Static IP address for UDP LoadBalancer. Use empty string to unset."
301
+ }
299
302
  }
300
303
  },
301
304
 
302
- "probes": {
305
+ "ingressRoute": {
303
306
  "type": "object",
304
- "description": "Liveness/readiness probe configuration. Templates guard on enabled.",
307
+ "description": "Networking: Traefik IngressRoute options (if used).",
305
308
  "additionalProperties": true,
306
309
  "properties": {
307
- "enabled": { "type": "boolean" },
308
- "livenessProbe": { "type": "object", "additionalProperties": true },
309
- "readinessProbe": { "type": "object", "additionalProperties": true }
310
+ "host": { "type": "string" }
310
311
  }
311
312
  },
312
313
 
313
- "staticscaling": {
314
+ "serviceMonitor": {
314
315
  "type": "object",
315
- "description": "Static replica scaling block. Used when autoscaling.enabled=false.",
316
+ "description": "Observability: Prometheus ServiceMonitor options.",
316
317
  "additionalProperties": true,
317
318
  "properties": {
318
- "replicas": { "type": "integer", "minimum": 0 }
319
+ "enabled": { "type": "boolean" },
320
+ "interval": { "type": "string", "description": "Scrape interval (e.g., 60s)." },
321
+ "namespace": { "type": "string", "description": "Namespace Prometheus scrapes targets from." },
322
+ "labels": { "type": "object", "additionalProperties": { "type": "string" } },
323
+ "annotations": { "type": "object", "additionalProperties": { "type": "string" } },
324
+ "endpoints": {
325
+ "type": "array",
326
+ "description": "Full override for endpoints. Empty or missing port will be filled with metrics port name helper.",
327
+ "items": { "$ref": "#/definitions/endpointObject" },
328
+ "default": []
329
+ }
319
330
  }
320
331
  },
321
332
 
322
333
  "autoscaling": {
323
334
  "type": "object",
324
- "description": "HorizontalPodAutoscaler options. Should emit nothing when disabled.",
335
+ "description": "Scaling: HorizontalPodAutoscaler options. enabled required so bool is authoritative.",
325
336
  "additionalProperties": true,
337
+ "required": ["enabled"],
326
338
  "properties": {
327
339
  "enabled": { "type": "boolean" },
328
340
  "minReplicas": { "type": "integer", "minimum": 0 },
@@ -336,135 +348,152 @@
336
348
  }
337
349
  },
338
350
 
351
+ "staticscaling": {
352
+ "type": "object",
353
+ "description": "Scaling: Static replica scaling block (used when autoscaling.enabled=false).",
354
+ "additionalProperties": true,
355
+ "properties": {
356
+ "replicas": { "type": "integer", "minimum": 0 }
357
+ }
358
+ },
359
+
339
360
  "pdb": {
340
361
  "type": "object",
341
- "description": "PodDisruptionBudget options. Prefer enabled; create is deprecated.",
362
+ "description": "Availability: PodDisruptionBudget options. Prefer enabled; create is deprecated.",
342
363
  "additionalProperties": true,
343
364
  "properties": {
344
365
  "enabled": { "type": "boolean" },
345
366
  "create": { "type": "boolean", "deprecated": true },
346
367
  "minAvailable": {
347
- "anyOf": [
348
- { "type": "integer", "minimum": 0 },
349
- { "type": "string" }
350
- ]
368
+ "anyOf": [{ "type": "integer", "minimum": 0 }, { "type": "string" }]
351
369
  },
352
370
  "maxUnavailable": {
353
- "anyOf": [
354
- { "type": "integer", "minimum": 0 },
355
- { "type": "string" }
356
- ]
371
+ "anyOf": [{ "type": "integer", "minimum": 0 }, { "type": "string" }]
357
372
  }
358
373
  }
359
374
  },
360
375
 
361
- "serviceMonitor": {
376
+ "affinity": {
362
377
  "type": "object",
363
- "description": "Prometheus ServiceMonitor options.",
378
+ "description": "Scheduling: Pod affinity/anti-affinity.",
364
379
  "additionalProperties": true,
365
- "properties": {
366
- "enabled": { "type": "boolean" },
367
- "interval": { "type": "string", "description": "Scrape interval (e.g., 60s)." },
368
- "namespace": { "type": "string", "description": "Namespace Prometheus scrapes targets from." },
369
- "labels": { "type": "object", "additionalProperties": { "type": "string" } },
370
- "annotations": { "type": "object", "additionalProperties": { "type": "string" } },
371
- "endpoints": {
372
- "type": "array",
373
- "description": "Full override for endpoints. Empty or missing port will be filled with metrics port helper.",
374
- "items": { "$ref": "#/definitions/endpointObject" },
375
- "default": []
376
- }
377
- }
380
+ "default": {}
381
+ },
382
+
383
+ "nodeSelector": {
384
+ "type": "object",
385
+ "description": "Scheduling: Pod nodeSelector map.",
386
+ "additionalProperties": { "type": "string" },
387
+ "default": {}
388
+ },
389
+
390
+ "tolerations": {
391
+ "type": "array",
392
+ "description": "Scheduling: Pod tolerations.",
393
+ "items": { "$ref": "#/definitions/toleration" },
394
+ "default": []
378
395
  },
379
396
 
380
397
  "redis": {
381
398
  "type": "object",
382
- "description": "Optional redis block used by some legacy leaves.",
399
+ "description": "Optional: Redis integration toggle. enabled required so bool is authoritative.",
383
400
  "additionalProperties": true,
401
+ "required": ["enabled"],
384
402
  "properties": {
385
403
  "enabled": { "type": "boolean" }
386
404
  }
387
405
  },
388
406
 
407
+ "canary": {
408
+ "type": "object",
409
+ "description": "Optional: Canary rollout config.",
410
+ "additionalProperties": true,
411
+ "default": {}
412
+ },
413
+
389
414
  "extraObjects": {
390
415
  "type": "array",
391
- "description": "Arbitrary Kubernetes objects emitted verbatim. Empty list must render nothing.",
416
+ "description": "Escape hatch: Arbitrary Kubernetes objects emitted verbatim. Empty list must render nothing.",
392
417
  "items": { "$ref": "#/definitions/k8sObject" },
393
418
  "default": []
394
419
  },
395
420
 
396
421
  "global": {
397
422
  "type": "object",
398
- "description": "Global values used across charts (if present).",
423
+ "description": "Global values passed through from umbrella charts (if present).",
399
424
  "additionalProperties": true
400
- },
401
-
402
- "resources": {
403
- "$ref": "#/definitions/resourceRequirements",
404
- "description": "Top-level resources for the main workload container."
405
- },
406
-
407
- "tolerations": {
408
- "type": "array",
409
- "description": "Pod tolerations.",
410
- "items": { "$ref": "#/definitions/toleration" },
411
- "default": []
412
- },
425
+ }
426
+ },
413
427
 
414
- "affinity": {
428
+ "definitions": {
429
+ "containerPortObject": {
415
430
  "type": "object",
416
- "description": "Pod affinity/anti-affinity.",
431
+ "description": "Kubernetes container port object (Deployment/Pod). Use this for deploymentPorts.* and container.extraPorts.",
417
432
  "additionalProperties": true,
418
- "default": {}
419
- },
420
-
421
- "nodeSelector": {
422
- "type": "object",
423
- "description": "Pod nodeSelector map.",
424
- "additionalProperties": { "type": "string" },
425
- "default": {}
433
+ "required": ["name", "containerPort"],
434
+ "properties": {
435
+ "name": { "type": "string" },
436
+ "containerPort": { "type": "integer", "minimum": 1, "maximum": 65535 },
437
+ "protocol": { "type": "string", "enum": ["TCP", "UDP", "SCTP"], "default": "TCP" }
438
+ }
426
439
  },
427
440
 
428
- "ingressRoute": {
441
+ "portObject": {
429
442
  "type": "object",
430
- "description": "Traefik IngressRoute options (if used).",
443
+ "description": "Kubernetes Service port object. Use this for servicePorts.* (port/targetPort).",
431
444
  "additionalProperties": true,
445
+ "required": ["name", "port"],
432
446
  "properties": {
433
- "host": { "type": "string" }
447
+ "name": {
448
+ "type": "string",
449
+ "description": "Port name. metrics port name helper defaults to 'metrics' if not overridden."
450
+ },
451
+ "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
452
+ "targetPort": {
453
+ "anyOf": [{ "type": "integer", "minimum": 1, "maximum": 65535 }, { "type": "string" }]
454
+ },
455
+ "protocol": { "type": "string", "enum": ["TCP", "UDP", "SCTP"], "default": "TCP" }
434
456
  }
435
457
  },
436
458
 
437
- "canary": {
459
+ "envVar": {
438
460
  "type": "object",
439
- "description": "Canary rollout config.",
461
+ "description": "Kubernetes env var entry.",
462
+ "required": ["name"],
440
463
  "additionalProperties": true,
441
- "default": {}
464
+ "properties": {
465
+ "name": { "type": "string" },
466
+ "value": { "type": "string" },
467
+ "valueFrom": { "type": "object", "additionalProperties": true }
468
+ }
442
469
  },
443
470
 
444
- "udploadbalancer": {
471
+ "envFromSource": {
445
472
  "type": "object",
446
- "description": "UDP LoadBalancer options for legacy leaves.",
473
+ "description": "Kubernetes envFrom entry (ConfigMapRef / SecretRef).",
447
474
  "additionalProperties": true,
448
475
  "properties": {
449
- "ip": {
450
- "type": "string",
451
- "description": "Static IP address for UDP LoadBalancer. Use empty string to unset."
452
- }
476
+ "configMapRef": { "type": "object", "additionalProperties": true },
477
+ "secretRef": { "type": "object", "additionalProperties": true }
453
478
  }
454
- }
455
- },
479
+ },
456
480
 
457
- "definitions": {
458
- "imageRef": {
481
+ "endpointObject": {
459
482
  "type": "object",
483
+ "description": "Prometheus ServiceMonitor endpoint object.",
460
484
  "additionalProperties": true,
461
485
  "properties": {
462
- "repository": { "type": "string" },
463
- "tag": { "type": "string" },
464
- "pullPolicy": {
486
+ "port": {
465
487
  "type": "string",
466
- "enum": ["Always", "IfNotPresent", "Never"]
467
- }
488
+ "description": "May be empty string; base will fill with metrics port name helper."
489
+ },
490
+ "path": { "type": "string", "default": "/metrics" },
491
+ "interval": { "type": "string" },
492
+ "scrapeTimeout": { "type": "string" },
493
+ "scheme": { "type": "string", "enum": ["http", "https"] },
494
+ "tlsConfig": { "type": "object", "additionalProperties": true },
495
+ "relabelings": { "type": "array", "items": { "type": "object", "additionalProperties": true } },
496
+ "metricRelabelings": { "type": "array", "items": { "type": "object", "additionalProperties": true } }
468
497
  }
469
498
  },
470
499
 
@@ -510,90 +539,27 @@
510
539
  "additionalProperties": true,
511
540
  "properties": {
512
541
  "key": { "type": "string" },
513
- "operator": {
514
- "type": "string",
515
- "enum": ["Exists", "Equal"]
516
- },
542
+ "operator": { "type": "string", "enum": ["Exists", "Equal"] },
517
543
  "value": { "type": "string" },
518
- "effect": {
519
- "type": "string",
520
- "enum": ["NoSchedule", "PreferNoSchedule", "NoExecute"]
521
- },
544
+ "effect": { "type": "string", "enum": ["NoSchedule", "PreferNoSchedule", "NoExecute"] },
522
545
  "tolerationSeconds": { "type": "integer", "minimum": 0 }
523
546
  }
524
547
  },
525
548
 
526
- "portObject": {
527
- "type": "object",
528
- "additionalProperties": true,
529
- "required": ["name", "port"],
530
- "properties": {
531
- "name": {
532
- "type": "string",
533
- "description": "Port name. metrics port name helper defaults to 'metrics' if not overridden."
534
- },
535
- "port": { "type": "integer", "minimum": 1, "maximum": 65535 },
536
- "targetPort": {
537
- "anyOf": [
538
- { "type": "integer", "minimum": 1, "maximum": 65535 },
539
- { "type": "string" }
540
- ]
541
- },
542
- "protocol": {
543
- "type": "string",
544
- "enum": ["TCP", "UDP", "SCTP"],
545
- "default": "TCP"
546
- }
547
- }
548
- },
549
-
550
- "endpointObject": {
551
- "type": "object",
552
- "additionalProperties": true,
553
- "properties": {
554
- "port": {
555
- "type": "string",
556
- "description": "May be empty string; base will fill with metrics port name."
557
- },
558
- "path": { "type": "string", "default": "/metrics" },
559
- "interval": { "type": "string" },
560
- "scrapeTimeout": { "type": "string" },
561
- "scheme": { "type": "string", "enum": ["http", "https"] },
562
- "tlsConfig": { "type": "object", "additionalProperties": true },
563
- "relabelings": {
564
- "type": "array",
565
- "items": { "type": "object", "additionalProperties": true }
566
- },
567
- "metricRelabelings": {
568
- "type": "array",
569
- "items": { "type": "object", "additionalProperties": true }
570
- }
571
- }
572
- },
573
-
574
- "envVar": {
575
- "type": "object",
576
- "required": ["name"],
577
- "additionalProperties": true,
578
- "properties": {
579
- "name": { "type": "string" },
580
- "value": { "type": "string" },
581
- "valueFrom": { "type": "object", "additionalProperties": true }
582
- }
583
- },
584
-
585
- "envFromSource": {
549
+ "imageRef": {
586
550
  "type": "object",
551
+ "description": "Reusable image reference (not currently used by top-level image block).",
587
552
  "additionalProperties": true,
588
553
  "properties": {
589
- "configMapRef": { "type": "object", "additionalProperties": true },
590
- "secretRef": { "type": "object", "additionalProperties": true }
554
+ "repository": { "type": "string" },
555
+ "tag": { "type": "string" },
556
+ "pullPolicy": { "type": "string", "enum": ["Always", "IfNotPresent", "Never"] }
591
557
  }
592
558
  },
593
559
 
594
560
  "k8sObject": {
595
561
  "type": "object",
596
- "description": "Loose schema for arbitrary Kubernetes objects.",
562
+ "description": "Loose schema for arbitrary Kubernetes objects (escape hatch).",
597
563
  "required": ["apiVersion", "kind", "metadata"],
598
564
  "additionalProperties": true,
599
565
  "properties": {
@@ -606,18 +572,11 @@
606
572
  "properties": {
607
573
  "name": { "type": "string" },
608
574
  "namespace": { "type": "string" },
609
- "labels": {
610
- "type": "object",
611
- "additionalProperties": { "type": "string" }
612
- },
613
- "annotations": {
614
- "type": "object",
615
- "additionalProperties": { "type": "string" }
616
- }
575
+ "labels": { "type": "object", "additionalProperties": { "type": "string" } },
576
+ "annotations": { "type": "object", "additionalProperties": { "type": "string" } }
617
577
  }
618
578
  }
619
579
  }
620
580
  }
621
581
  }
622
582
  }
623
-