diff --git a/CHANGELOG.md b/CHANGELOG.md index a92cf42..d88a07d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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` diff --git a/scripts/devis_reseau.py b/scripts/devis_reseau.py index a3efb83..928fdfe 100644 --- a/scripts/devis_reseau.py +++ b/scripts/devis_reseau.py @@ -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"]): diff --git a/scripts/underlay.py b/scripts/underlay.py index a63349a..dac3105 100644 --- a/scripts/underlay.py +++ b/scripts/underlay.py @@ -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): diff --git a/underlay.yml.example b/underlay.yml.example index 1818064..54313ed 100644 --- a/underlay.yml.example +++ b/underlay.yml.example @@ -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 }