UI-created deckies (api_decky_crud, api_create_blank_topology) write decky_config as sent by the client — typically just archetype flags, without the name/ips_by_lan fields compose.py requires. The generator path populates them at persist() time, so compose worked for generated topologies but KeyError'd on UI-created ones. Normalise in hydrate() so every write path feeds the same shape downstream: mirror decky.name into decky_config.name, and allocate per-LAN IPs deterministically (reserving the primary decky.ip where it falls in-subnet, then filling remaining edges with next_free).
7.0 KiB
7.0 KiB