Vue d’ensemble#
Cycle d’une requête#
HTTP → internal/api/agent → Dispatcher.Prepare() → Dispatcher.Dispatch() → worker.Queue → Command.Execute()
- Prepare (synchrone, dans le handler HTTP)
valide l’état, écrit l’état initial (
creating/deleting) en base, et retourne 202 ou une erreur.- Dispatch (asynchrone)
place la commande sur un canal bufferisé ; une goroutine worker appelle
Execute. C’estDispatch, et lui seul, qui marque la ressource enerrorsiExecuteéchoue.- Execute
effectue le travail réseau (netns, netif, VXLAN, veth, bridge, DHCP), puis met l’état à
running/deleted.
Paquets#
Chemin |
Rôle |
|---|---|
|
handlers HTTP de |
|
interface |
|
énumération des états, |
|
migrations idempotentes jouées au démarrage de l’agent |
|
création et suppression bas niveau (netns + netif) |
|
network namespaces : create/enter/delete/call |
|
netlink : bridge, veth, vxlan, tap, routes, adresses |
|
wrappers dédiés ; ne pas appeler ces binaires ailleurs |
|
lancement de QEMU et client QMP sur socket Unix |
|
cycle de vie d’une VM : tap, iptables, metadata, qemu |
|
plan d’adressage ip → mac, et configurations dnsmasq du backend historique |
|
serveur de metadata cloud-init et ses templates |
|
vérification périodique en lecture seule |
|
chargement par viper — tags |
|
collector des métriques |
|
wrapper Badger ; toutes les valeurs sont des chaînes plates |
|
pool de goroutines sur canal |
|
client D-Bus systemd |
|
journalisation |
Ajouter un type de ressource#
ajouter les helpers KV dans
pkg/db/kvsi nécessaire ;définir
Create<X>/Delete<X>dans un nouveau paquetinternal/<x>/;ajouter
Create<X>Command/Delete<X>Commanddansinternal/dispatcher/agent/, dontKey()qui retourne<x>/<name>et le contrôlestate.CanDeletedansDelete<X>Command.Prepare;ajouter les handlers HTTP dans
internal/api/agent/et les routes dansserver.go.
Stubs de plateforme#
Les fichiers _linux.go portent l’implémentation netlink/netns réelle ; les _other.go
correspondants retournent une erreur « not supported on this platform ». Tous les paquets
compilent sur macOS, ce qui permet d’y tester la logique qui ne touche ni netlink ni netns.
Deux exceptions à connaître : les stubs de netns exécutent fn sans changer de
namespace — netns.Call réussit donc hors Linux — et netif compile partout parce que
netlink fournit une implémentation « unspecified ».