underlay : monté par symlink depuis le dépôt de l'hébergeur

Il vivait gitignoré à la racine du moteur : consommé par deux générateurs,
validé par P23, versionné nulle part. La dizaine de modifications de la
journée n'était récupérable d'aucune façon, et un clone frais repartait du
gabarit.

Il appartient à l'hébergeur — ses switches, ses câbles — pas au moteur, qui
est générique, ni à un tenant, qui n'en possède pas. Chezlepro est ici
hébergeur ET tenant, d'où la confusion initiale.

Le moteur le monte par symlink comme il monte le plan par `instance/`. Ce
lien NE SUIT PAS `make instance-utiliser` : la fabric reste celle de
l'hébergeur quel que soit le tenant actif.

Vérifié : les deux devis sortent identiques octet pour octet avant et après,
P23 verte, 24 preuves. Symlink brisé (clone sans dépôt frère) : dégrade
proprement, sections omises au lieu d'échouer. Cas exercé.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-02 17:05:12 -04:00
parent 91bbad0cdf
commit 0eae97c6ec
5 changed files with 51 additions and 9 deletions

View file

@ -1,5 +1,32 @@
# CHANGELOG — Set-OPS
## 2026-08-02 (suite 5) — l'underlay rejoint le dépôt de l'hébergeur
`underlay.yml` vivait **gitignoré** à la racine du moteur : consommé par deux générateurs,
validé par la preuve P23, et versionné nulle part. La dizaine de modifications de la journée
— transit, renumérotage du `/29`, séparation des fabrics, spanning-tree, dialecte, ports —
n'était récupérable d'aucune façon, et un clone frais repartait du gabarit.
Il appartient à l'**hébergeur** : ce sont ses switches, ses câbles, ses VLAN. Pas au moteur,
qui est générique, ni à un tenant, qui n'en possède pas. Chezlepro est ici hébergeur *et*
tenant, d'où la confusion : un tenant qui s'hébergerait sur son propre matériel aurait son
propre underlay, dans son dépôt.
Le moteur le monte par symlink, comme il monte le plan par `instance/` :
```
Set-OPS-public/underlay.yml -> ../OPS-Chezlepro/underlay.yml
```
**Ce lien ne suit pas `make instance-utiliser`.** Basculer l'instance active sur un autre
tenant ne change pas la fabric : elle reste celle de l'hébergeur. Deux symlinks, deux durées
de vie — c'est la conséquence directe de la distinction hébergeur/tenant.
Vérifié : les deux devis sortent **identiques octet pour octet** avant et après, P23 reste
verte, 24 preuves. Et un symlink **brisé** — le cas d'un clone du moteur sans le dépôt de
l'hébergeur — dégrade proprement : `exists()` suit le lien, l'underlay est vu comme absent,
et les devis omettent leurs sections au lieu d'échouer. Cas exercé.
## 2026-08-02 (suite 4) — deux devis qui se contredisaient, et une case à cocher
### Corrigé — le devis frontière certifiait des routes inexistantes

View file

@ -88,9 +88,10 @@ INTRANTS_PROXMOX = INVENTAIRE_MODELE.parent / "group_vars/proxmox.yml"
# Frontiere nord/sud (OPNsense) : parametres NON sensibles du pare-feu de bordure.
# La cle/secret d'API n'y entrent JAMAIS — voute uniquement (cf. INTRANTS_CLES_INTERDITES).
INTRANTS_FRONTIERE = INVENTAIRE_DEFAUT.parent / "group_vars/opnsense.yml"
# Fabric physique : `underlay.yml` a la RACINE du moteur (pas dans l'instance) — il est
# cluster-global. Imbrique sous `underlay:` et riche en commentaires : on l'ecrit
# chirurgicalement, jamais par un safe_dump qui les effacerait.
# Fabric physique : `underlay.yml`, monte par symlink a la racine du moteur depuis le
# depot de l'HEBERGEUR (ses switches, ses cables). Distinct de l'instance : il ne suit
# pas `make instance-utiliser`. Imbrique sous `underlay:` et riche en commentaires :
# on l'ecrit chirurgicalement, jamais par un safe_dump qui les effacerait.
FICHIER_UNDERLAY = Path(os.environ.get("SETOPS_UNDERLAY") or (RACINE / "underlay.yml"))
FICHIERS_INTRANTS = {"identite": INTRANTS_IDENTITE, "proxmox": INTRANTS_PROXMOX,
"reseau": FICHIER_NOMENCLATURE, "frontiere": INTRANTS_FRONTIERE,

View file

@ -9,8 +9,14 @@ aucun tenant.
Convention : VLAN < 1000, franchement SOUS la plage tenant (VLAN = 1000+index*10+zone).
Les sous-reseaux ne doivent chevaucher aucun supernet tenant (10.(10+index).0.0/16).
Fichier : `underlay.yml` a la racine du moteur (gitignore ; voir `underlay.yml.example`),
surchargeable par `SETOPS_UNDERLAY`. Absent => le devis omet simplement la section underlay.
EMPLACEMENT : l'underlay appartient a l'HEBERGEUR ses switches, ses cables. Il vit
donc dans SON depot, et le moteur le monte par symlink :
Set-OPS-public/underlay.yml -> ../OPS-<hebergeur>/underlay.yml
Ce symlink NE SUIT PAS `make instance-utiliser` : la fabric reste celle de l'hebergeur,
quel que soit le tenant actif. Surchargeable par `SETOPS_UNDERLAY`. Absent (ou lien
brise, cas d'un clone sans depot frere) => le devis omet simplement la section.
CLI : `python3 scripts/underlay.py` (affiche + valide), `--verifier` (P23, code de sortie).
"""
@ -32,7 +38,11 @@ SEUIL_VLAN_TENANT = 1000
def chemin() -> Path | None:
"""Emplacement du underlay.yml : SETOPS_UNDERLAY, sinon racine du moteur. None si absent."""
"""Emplacement du underlay.yml : SETOPS_UNDERLAY, sinon le symlink a la racine.
`exists()` suit le lien : un symlink brise (clone sans le depot de l'hebergeur)
rend None, et tout degrade proprement au lieu d'echouer.
"""
env = os.environ.get("SETOPS_UNDERLAY")
if env:
p = Path(env).expanduser()

View file

@ -3,7 +3,9 @@
# Cluster-global : ces reseaux portent TOUTE la flotte, ils n'appartiennent a aucun
# tenant et ne derivent d'aucun `index`. Ils vivent dans le *sous-sol* du modele.
#
# Copier vers `underlay.yml` (a la racine du moteur ; gitignore) et adapter a ta fabric.
# Copier dans le depot de l'HEBERGEUR (celui qui possede les switches), puis le monter :
# ln -s ../OPS-<hebergeur>/underlay.yml underlay.yml
# Le moteur l'ignore (gitignore) : c'est une donnee de site, versionnee chez son proprietaire.
# Surchargeable par SETOPS_UNDERLAY=/chemin/underlay.yml. Absent => le devis switch
# omet simplement la section underlay (retro-compatible).
#

View file

@ -63,8 +63,10 @@ lecture seule) suit l'environnement. **Le dépôt public reste générique** (`c
**L'underlay — le sous-sol.** Les VLAN tenant (`1000+index×10+zone`) sont les *overlays*. En
dessous vit la **fabric physique** partagée par toute la flotte : management des switches et de
Proxmox/OOB, iSCSI, Ceph (public + cluster). Elle **n'appartient à aucun tenant** et ne dérive
d'aucun `index`. On la décrit dans `underlay.yml` (racine du moteur, gitignore comme le vault ;
gabarit `underlay.yml.example`) :
d'aucun `index`. On la décrit dans `underlay.yml`, qui vit dans le dépôt de **l'hébergeur**
(ses switches, ses câbles) et que le moteur monte par symlink à sa racine — comme il monte le
plan par `instance/`. Ce lien ne suit pas `make instance-utiliser` : la fabric reste celle de
l'hébergeur, quel que soit le tenant actif. Gabarit : `underlay.yml.example`.
| Underlay | VLAN | Sous-réseau |
|---|---|---|