underlay : le routeur porte le SVI, et le transit sort de la partie B

Deux incohérences visibles à la relecture du devis complet.

`bifrost-01` portait le SVI Vlan10 -> 10.0.0.1 et était déclaré dans
`underlay.hotes` à 10.0.0.2. Une interface VLAN n'a qu'une adresse primaire :
les deux ne pouvaient pas être vraies. L'entrée datait d'avant la désignation
du routeur, quand 10.0.0.1 était une passerelle abstraite. Le routeur est
déclaré à l'adresse du SVI qu'il porte, et `make underlay` refuse désormais
la divergence.

La partie B créait `vlan 40` alors que son trunk ne le transporte pas — le
transit ne relie que le routeur à la frontière. VLAN exclu de la partie B,
comme il l'est déjà des trunks généraux.

Preuves : 24 OK, 0 échec ; garde de cohérence exercée.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-01 20:10:42 -04:00
parent 2d2c5c69fa
commit 7e852b5eef
4 changed files with 36 additions and 1 deletions

View file

@ -1,5 +1,22 @@
# CHANGELOG — Set-OPS
## 2026-08-01 (suite 5) — deux incohérences du devis switch
### Corrigé — le routeur avait deux adresses de gestion contradictoires
`bifrost-01` portait le SVI `Vlan10 → 10.0.0.1` **et** était déclaré dans `underlay.hotes`
à `10.0.0.2`. Une interface VLAN n'a qu'une adresse primaire : les deux ne pouvaient pas
être vraies. L'entrée datait d'avant la désignation du routeur, quand `10.0.0.1` était une
passerelle abstraite.
Le routeur est désormais déclaré à l'adresse du SVI qu'il porte, et `make underlay` **refuse**
la divergence : `ip 10.0.0.2 != passerelle 10.0.0.1 — le routeur porte ce SVI, les deux
doivent coïncider`. Le roster des trois switches reste complet.
### Corrigé — VLAN de transit déclaré sur les switches d'accès
La partie B créait `vlan 40` alors que le trunk B3 ne le transporte pas — le transit ne relie
que le routeur à la frontière. Un VLAN qui n'aurait jamais vu de trame. Il est exclu de la
partie B, comme il l'est déjà des trunks généraux.
## 2026-08-01 (suite 4) — un seul switch route, les autres en L2 pur
### Décidé — `underlay.routeur`

View file

@ -108,7 +108,12 @@ def partie_acces(underlay: dict | None, tenants: list, vlans: str) -> list[str]:
"!",
"! ----- B1. Memes VLANs (pour commuter les trames etiquetees) -----",
]
# Le transit ne relie que le routeur a la frontiere : aucune trame ne le traverse
# ici. Le declarer serait un VLAN qui ne verra jamais de trafic.
transit = underlay_mod.reseau_transit(underlay)
for r in underlay_mod.reseaux(underlay):
if transit and r["vlan"] == transit["vlan"]:
continue
out += [f"vlan {r['vlan']}", f" name {r['nom']}"]
for nom, pfx, n in tenants:
for zone in sorted(n["categories"]):

View file

@ -165,6 +165,17 @@ def valider(underlay: dict | None,
r_nom = routeur(underlay)
if r_nom and r_nom not in {h.get("nom") for h in hotes(underlay)}:
erreurs.append(f"routeur '{r_nom}': aucun hote de ce nom n'est declare")
# Le routeur PORTE le SVI : son adresse de gestion est la passerelle du reseau, pas
# une adresse d'hote a part. Deux valeurs differentes se contrediraient — une
# interface VLAN n'a qu'une adresse primaire.
for h in hotes(underlay):
if h.get("nom") != r_nom:
continue
r = {x.get("nom"): x for x in reseaux(underlay)}.get(h.get("reseau")) or {}
gw = r.get("passerelle")
if gw and str(h.get("ip")) != str(gw):
erreurs.append(f"routeur '{r_nom}': ip {h.get('ip')} != passerelle {gw} du reseau "
f"'{h.get('reseau')}' — le routeur porte ce SVI, les deux doivent coincider")
par_nom = {r.get("nom"): r for r in reseaux(underlay)}
for h in hotes(underlay):

View file

@ -60,6 +60,8 @@ underlay:
# Hotes fixes documentes (optionnel) : IP hors DHCP, verifiees dans leur reseau.
hotes:
- { nom: switch-01, reseau: management, ip: 10.0.0.2 }
# Le switch designe `routeur` porte le SVI de management : son adresse de gestion
# EST la passerelle du reseau. `make underlay` refuse les deux valeurs divergentes.
- { nom: switch-01, reseau: management, ip: 10.0.0.1 }
- { nom: switch-02, reseau: management, ip: 10.0.0.3 }
- { nom: switch-03, reseau: management, ip: 10.0.0.4 }