chart2kro

Limitations

Which Helm template constructs chart2kro cannot turn into kro inputs, what it does instead, and why.

What chart2kro cannot translate, and what it does instead. Values affected by these rows are listed by chart2kro inspect.

ConstructWhat happensWhy
A value that adds or removes fields inside an object ({{ if .Values.x }}foo: bar{{ end }}, {{- with .Values.annotations }})Frozen (changes-structure / toggles-fields)kro cannot omit a field conditionally without its alpha omit() feature
A value transformed by a template function (upper, trunc, printf with several values, arithmetic)Frozen (transformed)CEL has no faithful equivalent for every sprig function; guessing would deploy something different
A range loop that emits one or more objects per list entryBecomes a kro collection (forEach): the list is an input, entries are typed and unique by nameLoops over maps, nested loops, conditional loop bodies and loop files with other documents stay frozen with a reason
A range loop that emits fields inside an object (env vars, ports)Frozen (changes-structure)kro cannot vary the number of fields; set the list with -f
A value that adds or removes objects but is not a booleanFrozen (adds-or-removes-objects)Only booleans are enumerated exhaustively
Values that matter only together with another non-default valueClassified relative to the defaultsEach value is probed with the others at their defaults
Release names that contain the chart nameInstances are always named <instance>-<chart>The fullname helper's short form depends on the name; the result is deterministic and unique
Keys that start with a digit (1st)Frozen (key-not-addressable)CEL cannot address them
Custom resources whose CRDs are not availableThe flag that enables them is frozen (unknown-kind); in the defaults they fail validation (exit 7)kro needs the schema of every kind. Pass --crd
Helm hooksTest hooks are dropped; other hooks are dropped unless --include-hooks, which warns for each kept hookkro has no hooks; included hooks are created once per instance and never re-run
CRDs and cluster-scoped objects with fixed namesMoved to prerequisites.yaml (with a warning for cluster-scoped objects)They cannot belong to one instance; apply them once before the RGD
Generated secrets (randAlphaNum and friends)Become required inputs (chart2kroGenerated.*)kro's random.seededString is derived from the instance UID, which is not secret
Changing a field to immutable on an existing APITakes effect only when kro next updates the CRDkro v0.9.4 skips CRD updates that change only validation rules; diff reports it
lookupRenders empty, as with helm templateNo cluster access
Control characters in rendered strings (e.g. \x7f)kro rejects the RGD (exit 7)kro's template parser accepts only YAML's printable characters
JobsReconciled by kro, not run once. A warning is printed for Jobs with ttlSecondsAfterFinishedkro recreates a Job that Kubernetes deleted, so it runs again
Kubernetes versionsRendering and validation use the embedded catalogs for 1.35, 1.36 and 1.37 (--kube-version)Validation is offline; newer versions need a chart2kro release
Very large chartsExit 5 above 1 MiB, naming the largest resourcesThe API server limits object size; use --exclude, --exclude-subchart or a smaller --expose
kro versionsOutput needs kro ≥ v0.9.2It uses kro's hash, json and random CEL libraries, and list-type schema markers for collections