0046. Argo CD health checks ship as an opt-in ConfigMap shaped like argocd-cm keys
Status: Superseded by ADR 0101 · Date: 2026-10-26 · Design section: GitOps and Argo CD
Decided: Ship Lua health checks for TalosCluster and TalosMachine only, as a chart ConfigMap (argocdHealth.enabled, default false) whose keys are exactly argocd-cm's resource.customizations.health.<group>_<kind> keys, tested by running the Lua under lua 5.1
Context
Argo CD cannot judge the health of a kind it does not know, so the moment
ichor gitops export (ADR 0028) puts Ichor CRs in Git, every one shows as
healthy-by-default or stuck Progressing. The design requires the chart to ship
the checks; none existed.
Decision
Which kinds. ADR 0028's allow-list is TalosCluster, TalosMachine, TalosConfigPatch, TalosStorage. Only the first two get a script:
TalosOperationis never exported, so it needs none.TalosConfigPatchhas astatustype but no controller writes it; a check would report on fields that are always empty.TalosStoragehas no dedicated controller, so its status is never updated. Write its check when that controller lands (and its conditions exist to read). Without a script Argo CD's default (Healthy once it exists) applies.
What each reads (only what internal/controller writes):
- TalosMachine:
status.conditions[Ready]andstatus.observedGeneration. Deleting, no Ready yet, or a stale generation is Progressing. Ready=True is Healthy. Ready=False with reasonClusterLockHeldorClusterTransitioningis a wait (Progressing); any other reason (ApplyFailed, RebootRequired, NodeDrifted, ...) is Degraded. - TalosCluster: no Ready condition exists.
Transitioning=True(an even control-plane count) is Progressing; everything else is Healthy.CNIHandover=Falseis a normal state (Disabled, ManualPending) and is ignored. Per-node health lives on the TalosMachines.
Delivery path. Argo CD reads custom health from argocd-cm keys
resource.customizations.health.<group>_<kind> (Argo CD operator manual,
"Resource Health" > "Custom Health Checks"; the value is Lua reading global
obj and returning status/message). Ichor does not install or edit Argo CD
(the user owns argocd-cm), so the chart cannot write that ConfigMap. The
alternative, a PR to Argo CD's bundled resource_customizations, is upstream
work outside this repo. So the chart renders a separate ConfigMap
ichor-argocd-health with exactly those keys as its data; the user merges
them into their own argocd-cm (kustomize patch, Helm values of the Argo CD
chart, or kubectl get -o jsonpath). Same opt-in shape as metricsCert.enabled:
default false, renders nothing.
Verification
dist/chart/argocd_health_test.go loads each .lua with lua (5.1, added to
flake.nix as lua5_1; Argo CD embeds gopher-lua, a 5.1 dialect) against a
table of status samples and expected verdicts, and checks the option renders
nothing when off and the two keys, byte-identical to the files, when on.
The scripts use only the base language (no standard libraries beyond what Argo
CD enables by default).
Consequences
- The test needs
luaon PATH (provided bynix develop). - gopher-lua is close to but not identical with PUC Lua 5.1; the scripts stay
to tables,
ipairsand string concatenation to avoid the differences.