template-chart + README: values.schema.json, gate and null-safe helpers
Closes out the schema programme (#68) by moving what the 18 charts taught into the reference implementation and the binding guidelines. template-chart: - values.schema.json as the reference schema: additionalProperties false on every chart-owned level, pod-spec passthrough left open, and the reasoning inline in the descriptions so a copy carries it along. - defaultedDict and subBlock plus the per-block fallbacks for both security contexts, the three probes and resources, wired into both the Deployment and the StatefulSet. - the reference itself violated guideline 1: its env block reads ingress.domain, so with the Ingress gated off it rendered an empty value. That read is now required(), and the comment says why - the template is what people copy, so it has to teach the guard, not the hole. README, new section "Values that must not lie" with the five rules: 1. a value read outside its obvious template needs its own guard (matrix-synapse published '{"m.server": ":443"}' to federation without it, rendering cleanly and reporting healthy) 2. probes, contexts and resources through the null-safe helper, never behind an "if" - a guard removes the probe instead of showing a null 3. no liveness on an external dependency where a dependency-free path exists, otherwise document why on the helper 4. a fallback reproduces THIS chart's defaults, not the repo standard - calibre's readOnlyRootFilesystem: false is what keeps the runtime uid at 1000 instead of 911 and existing volume data readable 5. a probe default carries its context - port name, Host header, exec command - or the probe vanishes (teamspeak) or gets 403 (patchmon) Plus the two mechanics that are easiest to lose: null reaches schema validation only for keys WITHOUT a chart default (which is why the helper and the ["object","null"] types each cover a case the other cannot), and schemas must be validated against real bundle values - that step caught a draft of mine that would have broken three live paperless releases. CLAUDE.md: the new-chart checklist now names the schema and the adaptation step, since the copied file is chart-specific and wrong until it is adapted. freesailarr is not covered: it is not on main yet (#59).
This commit is contained in:
8 files changed
+424
-18
No files matched your search
@@ -63,8 +63,13 @@ xxx:
|
||||
protocol: TCP
|
||||
name: http
|
||||
env:
|
||||
# Reference for guideline 1: ingress.domain is read HERE, outside the
|
||||
# Ingress template, so it needs its own required(). Without it, switching
|
||||
# the Ingress off via ingress.enabled would render an empty value and the
|
||||
# workload would start with a broken address - silently. Copy this shape
|
||||
# whenever a chart uses the domain for anything but the Ingress host.
|
||||
- name: NORMAL_ENV
|
||||
value: "{{ .Values.ingress.domain }}"
|
||||
value: '{{ required "A Domain/Host must be provided (ingress.domain)" .Values.ingress.domain }}'
|
||||
- name: ENV_FROM_SECRET
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
@@ -81,6 +86,10 @@ storage:
|
||||
storageClass: null
|
||||
|
||||
ingress:
|
||||
# Gates the whole Ingress template. Note that ingress.domain is ALSO read by
|
||||
# the env block above, so it stays required even with the Ingress switched
|
||||
# off; only clusterIssuer becomes unnecessary. Check this per chart instead
|
||||
# of assuming either way (guideline 1).
|
||||
enabled: true
|
||||
clusterIssuer: null
|
||||
domain: null
|
||||
|
||||
Reference in new issue
Block a user