Goal
Preserve Cluster API worker-user group semantics in generated Butane configs.
Required behavior
Supplementary groups
- Convert the comma-separated cloud-config string into Butane's list representation.
- Split on commas and trim surrounding whitespace.
- Preserve source order.
- Reject empty or duplicate group names rather than silently cleaning the input.
primary_group
- Ensure the named primary group exists by emitting the corresponding
passwd.groups entry.
- Reference that group from the generated Butane user.
- Deduplicate group declarations shared by multiple users.
Context
Cloud-init creates missing supplementary and primary groups. Butane's user fields only reference groups, so direct field mapping is not semantically complete. This work is deferred from the first users-stanza PR and must preserve all-or-nothing transpilation: unsupported or invalid group input fails conversion instead of being dropped.
Goal
Preserve Cluster API worker-user group semantics in generated Butane configs.
Required behavior
Supplementary
groupsprimary_grouppasswd.groupsentry.Context
Cloud-init creates missing supplementary and primary groups. Butane's user fields only reference groups, so direct field mapping is not semantically complete. This work is deferred from the first users-stanza PR and must preserve all-or-nothing transpilation: unsupported or invalid group input fails conversion instead of being dropped.