Schéma des clés =============== Toutes les valeurs stockées dans Badger sont des **chaînes plates** : une clé, une valeur, pas de sérialisation structurée. .. code-block:: text vpc//state → creating | running | error | deleting | deleted vpc//cidr → subnet//state → creating | running | error | deleting | deleted subnet//vpc → subnet//mode → vxlan | bridge | public_ip subnet//vxlan_id → (mode vxlan uniquement) subnet//cidr → subnet//interface_ip → (gateway, portée par br-) subnet//local_iface → subnet//default_route → "true" | "false" subnet//gateway → (optionnel) subnet//dhcp/ → vm//state → creating | running | error | deleting | deleted vm//subnet → vm//tap_id → vm//ip → vm//metadata_port → vm//disk/ → (une clé par disque : sda, vda, …) vm//memory → (Mo) vm//cpus → vm//uefi → "true" (absent si SeaBIOS) vm//password → (optionnel — un hash, pas un mot de passe) vm//sshkey → (optionnel) vm//metadata/ → (optionnel : user-data, vendor-data, …) Règles ------ **Pas de duplication.** Une ressource ne stocke que ce qui lui est propre. Une VM garde le lien ``vm//subnet`` ; le VPC, le bridge et l'``interface_ip`` sont lus depuis le subnet, leur source canonique. **Les états passent par ``state``.** Toujours ``state.Set`` / ``state.Get`` : ``Set`` refuse une valeur hors énumération, ``Get`` refuse de retourner une valeur non reconnue. ``error`` n'est écrit que par ``Dispatcher.Dispatch``, via ``cmd.Key()``. **Tout entier lu depuis la base peut être corrompu.** Les erreurs de conversion sont retournées, jamais ignorées : une valeur absente ou illisible est un état d'erreur réel. **Un seul ouvreur.** L'agent est le seul processus à ouvrir la base. Le serveur de metadata lit des fichiers écrits par l'agent sous ``metadata.run_dir``, jamais Badger.