Retirer dnsmasq, une fois tous les hyperviseurs passés au serveur DHCP intégré #49

Open
opened 2026-09-10 19:39:06 +00:00 by nicolas.boufideline · 0 comments

Contexte

#46 a livré le serveur DHCP intégré en coexistence avec dnsmasq : la clé dhcp.backend choisit
lequel sert les subnets créés par l'agent, et le défaut est resté dnsmasq pour qu'un
agent.yml de 0.1.0 se comporte à l'identique. C'était le chemin de migration, pas la cible.

Ce ticket retire dnsmasq une fois la migration terminée.

Préalable — ne pas démarrer avant

  • Tous les hyperviseurs sont passés en dhcp.backend: two, et aucun ne peut avoir besoin
    de revenir en arrière. C'est la condition bloquante : le retour arrière est aujourd'hui la
    porte de sortie en cas de problème, et ce ticket la supprime.
  • Le second client DHCP est éprouvé (P999 de todo.md — systemd-networkd, la validation lab
    restante de #46).

Ce qui part

Fichiers entiers

  • scripts/run-dnsmasq-in-netns.sh
  • systemd/dnsmasq@.service
  • internal/dhcpbackend/dnsmasq.go et dnsmasq_test.go

Dans internal/dhcp — le paquet ne disparaît pas

À retirer : GenerateConfig, WriteReservations, WriteVMOptions, RemoveVMOptions,
RemoveReservations, RemoveSubnetDirs, RemoveConfig, HostsDir, OptsDir, UnitName,
classlessRoutes, le type Reservation, le type Config et la constante DefaultConfDir.
HostsDir et OptsDir n'ont déjà plus aucun appelant.

À conserver, ce sont les seules choses du paquet qui ne concernent pas dnsmasq :

Fonction Appelée par
Entries internal/subnet/create.go
StoreDHCPEntries internal/subnet/create.go
GetMACForIP internal/vm/data.go, internal/watchdog/check_dhcp.go

Le plan d'adressage subnet/<n>/dhcp/<ip> → mac reste la source d'autorité, indépendamment du
serveur qui distribue les adresses. Renommer le paquet mérite d'être posé : internal/dhcp ne
contiendra plus que le plan d'adressage, alors que le serveur vit dans internal/dhcpd.

Configuration

  • la clé dhcp.backend, son défaut dans internal/config/agent/struct.go
  • internal/config/agent/dhcp.go en entier : BackendDnsmasq, BackendTwo, ValidBackend
  • le bloc dhcp: de conf/agent/config.exemple.yml

Abstractions devenues inutiles

  • l'interface dhcpbackend.Backend et dhcpbackend.New : avec une seule implémentation elles ne
    servent plus. internal/subnet et internal/vm peuvent appeler Two directement — à moins de
    garder l'interface pour les tests, ce qui est à trancher plutôt qu'à supposer.
  • configFileReporter dans internal/watchdog/check_dhcp.go, avec checkDHCPConfigFile et
    Dnsmasq.ConfigPath : plus aucun backend n'a de fichier de configuration.
  • le champ Reservation.Tag de internal/dhcp et le helper tag() de dnsmasq.go : le mécanisme
    de tags était propre à dnsmasq, Reservation.DefaultRoute l'a remplacé. Vérifier si
    Reservation.Index garde un usage — il ne servait qu'à construire le tag.

Déploiement

  • scripts/deploy.sh : dnsmasq@.service et run-dnsmasq-in-netns.sh des listes du profil kvm
  • .forgejo/workflows/release-pipeline.yml : les deux assets dnsmasq
  • scripts/bootstrap_kvm.sh : le paquet dnsmasq de KVM_PACKAGES, et le
    systemctl disable --now / mask de dnsmasq.service qui n'a plus de raison d'être

Documentation

  • docs/exploitation/services.rst : la section dnsmasq et sa ligne du tableau des units
  • docs/exploitation/diagnostic.rst : le bloc « backend dnsmasq », et retirer la distinction des
    deux backends qui n'a plus lieu d'être
  • docs/exploitation/configuration.rst : la section « Backend DHCP » et la procédure de bascule
  • docs/demarrage/installation.rst : dnsmasq des paquets et la note sur le retour arrière
  • docs/exploitation/observabilite.rst, docs/concepts/vpc-subnet-vm.rst,
    docs/architecture/vue-densemble.rst, README.md : mentions ponctuelles

Analyse de risque

Ce ticket supprime le retour arrière. C'est son seul risque réel, et il n'est pas technique :
une fois dnsmasq retiré du dépôt, du déploiement et de bootstrap_kvm.sh, un hyperviseur en
difficulté avec le serveur intégré n'a plus de repli. D'où la condition bloquante en tête.

Le paquet Debian retiré de bootstrap_kvm.sh ne l'est pas des hosts déjà provisionnés — la
racine est en tmpfs et le bootstrap est rejoué à chaque démarrage, donc il disparaîtra au prochain
redémarrage. Un host non redémarré gardera dnsmasq installé mais masqué, sans effet.

Aucune donnée n'est concernée : le plan d'adressage reste en base, les fichiers /etc/dnsmasq.d
d'un ancien subnet sont déjà supprimés par TeardownSubnet. Prévoir malgré tout de vérifier que
/etc/dnsmasq.d est vide sur chaque host avant de conclure.

Surface d'attaque : inchangée à la baisse. Le serveur intégré est déjà le seul en écoute sur
UDP/67 après la bascule ; ce ticket retire du code mort, il n'ouvre rien.

Vérification attendue

  • grep -ri dnsmasq ne rend plus rien hors historique et notes de version
  • go build ./..., go vet ./..., go test ./... propres
  • la doc construit avec sphinx-build -W
  • un cycle create/delete de subnet et de VM sur lab, pour confirmer qu'aucun chemin ne dépendait
    d'un reliquat
## Contexte #46 a livré le serveur DHCP intégré **en coexistence** avec dnsmasq : la clé `dhcp.backend` choisit lequel sert les subnets créés par l'agent, et le défaut est resté `dnsmasq` pour qu'un `agent.yml` de 0.1.0 se comporte à l'identique. C'était le chemin de migration, pas la cible. Ce ticket retire dnsmasq une fois la migration terminée. ## Préalable — ne pas démarrer avant - [ ] **Tous les hyperviseurs sont passés en `dhcp.backend: two`**, et aucun ne peut avoir besoin de revenir en arrière. C'est la condition bloquante : le retour arrière est aujourd'hui la porte de sortie en cas de problème, et ce ticket la supprime. - [ ] Le second client DHCP est éprouvé (P999 de `todo.md` — systemd-networkd, la validation lab restante de #46). ## Ce qui part **Fichiers entiers** - `scripts/run-dnsmasq-in-netns.sh` - `systemd/dnsmasq@.service` - `internal/dhcpbackend/dnsmasq.go` et `dnsmasq_test.go` **Dans `internal/dhcp` — le paquet ne disparaît pas** À retirer : `GenerateConfig`, `WriteReservations`, `WriteVMOptions`, `RemoveVMOptions`, `RemoveReservations`, `RemoveSubnetDirs`, `RemoveConfig`, `HostsDir`, `OptsDir`, `UnitName`, `classlessRoutes`, le type `Reservation`, le type `Config` et la constante `DefaultConfDir`. `HostsDir` et `OptsDir` n'ont déjà plus aucun appelant. **À conserver**, ce sont les seules choses du paquet qui ne concernent pas dnsmasq : | Fonction | Appelée par | |---|---| | `Entries` | `internal/subnet/create.go` | | `StoreDHCPEntries` | `internal/subnet/create.go` | | `GetMACForIP` | `internal/vm/data.go`, `internal/watchdog/check_dhcp.go` | Le plan d'adressage `subnet/<n>/dhcp/<ip> → mac` reste la source d'autorité, indépendamment du serveur qui distribue les adresses. Renommer le paquet mérite d'être posé : `internal/dhcp` ne contiendra plus que le plan d'adressage, alors que le serveur vit dans `internal/dhcpd`. **Configuration** - la clé `dhcp.backend`, son défaut dans `internal/config/agent/struct.go` - `internal/config/agent/dhcp.go` en entier : `BackendDnsmasq`, `BackendTwo`, `ValidBackend` - le bloc `dhcp:` de `conf/agent/config.exemple.yml` **Abstractions devenues inutiles** - l'interface `dhcpbackend.Backend` et `dhcpbackend.New` : avec une seule implémentation elles ne servent plus. `internal/subnet` et `internal/vm` peuvent appeler `Two` directement — à moins de garder l'interface pour les tests, ce qui est à trancher plutôt qu'à supposer. - `configFileReporter` dans `internal/watchdog/check_dhcp.go`, avec `checkDHCPConfigFile` et `Dnsmasq.ConfigPath` : plus aucun backend n'a de fichier de configuration. - le champ `Reservation.Tag` de `internal/dhcp` et le helper `tag()` de `dnsmasq.go` : le mécanisme de tags était propre à dnsmasq, `Reservation.DefaultRoute` l'a remplacé. Vérifier si `Reservation.Index` garde un usage — il ne servait qu'à construire le tag. **Déploiement** - `scripts/deploy.sh` : `dnsmasq@.service` et `run-dnsmasq-in-netns.sh` des listes du profil `kvm` - `.forgejo/workflows/release-pipeline.yml` : les deux assets dnsmasq - `scripts/bootstrap_kvm.sh` : le paquet `dnsmasq` de `KVM_PACKAGES`, **et** le `systemctl disable --now` / `mask` de `dnsmasq.service` qui n'a plus de raison d'être **Documentation** - `docs/exploitation/services.rst` : la section dnsmasq et sa ligne du tableau des units - `docs/exploitation/diagnostic.rst` : le bloc « backend dnsmasq », et retirer la distinction des deux backends qui n'a plus lieu d'être - `docs/exploitation/configuration.rst` : la section « Backend DHCP » et la procédure de bascule - `docs/demarrage/installation.rst` : `dnsmasq` des paquets et la note sur le retour arrière - `docs/exploitation/observabilite.rst`, `docs/concepts/vpc-subnet-vm.rst`, `docs/architecture/vue-densemble.rst`, `README.md` : mentions ponctuelles ## Analyse de risque **Ce ticket supprime le retour arrière.** C'est son seul risque réel, et il n'est pas technique : une fois dnsmasq retiré du dépôt, du déploiement et de `bootstrap_kvm.sh`, un hyperviseur en difficulté avec le serveur intégré n'a plus de repli. D'où la condition bloquante en tête. **Le paquet Debian retiré de `bootstrap_kvm.sh` ne l'est pas des hosts déjà provisionnés** — la racine est en tmpfs et le bootstrap est rejoué à chaque démarrage, donc il disparaîtra au prochain redémarrage. Un host non redémarré gardera dnsmasq installé mais masqué, sans effet. **Aucune donnée n'est concernée** : le plan d'adressage reste en base, les fichiers `/etc/dnsmasq.d` d'un ancien subnet sont déjà supprimés par `TeardownSubnet`. Prévoir malgré tout de vérifier que `/etc/dnsmasq.d` est vide sur chaque host avant de conclure. **Surface d'attaque** : inchangée à la baisse. Le serveur intégré est déjà le seul en écoute sur UDP/67 après la bascule ; ce ticket retire du code mort, il n'ouvre rien. ## Vérification attendue - `grep -ri dnsmasq` ne rend plus rien hors historique et notes de version - `go build ./...`, `go vet ./...`, `go test ./...` propres - la doc construit avec `sphinx-build -W` - un cycle create/delete de subnet et de VM sur lab, pour confirmer qu'aucun chemin ne dépendait d'un reliquat
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
syonad/two#49
No description provided.