From 87697597fb50cecdcb1c4e56f381e0a23c23dd3a Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Mon, 3 Aug 2026 08:35:44 -0400 Subject: [PATCH] =?UTF-8?q?devis=20switch=20:=20la=20partie=20B=20d=C3=A9c?= =?UTF-8?q?larait=20encore=20les=20VLAN=20tenants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le filtre `routage_tenants` n'avait été posé que sur la partie A et les trunks. La partie B a sa propre boucle et sortait toujours les douze VLAN tenants : aucun trunk ne les portait, aucun SVI ne les utilisait, mais leur présence suggérait que les switches d'accès devaient les connaître — ce qui contredit la décision. Vérifié dans les deux sens : zéro VLAN tenant en mode `sdn`, les vingt-quatre déclarations de retour en mode `switch`. Corrigé aussi l'en-tête, qui annonçait les VLAN tenants « uniques globalement sur le trunk » — ils ne sont plus sur aucun trunk en SDN. Preuves : 24 OK, 0 échec. Co-Authored-By: Claude Opus 5 --- CHANGELOG.md | 9 +++++++++ scripts/devis_reseau.py | 13 ++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 341f531..70437cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,15 @@ VXLAN ajoute 50 octets. `make underlay` **refuse** un réseau de transport sous échouent — la panne la plus coûteuse à diagnostiquer. Les deux réseaux de la fabric principale passent à 9000. +### Corrigé — la partie B déclarait encore les VLAN tenants +Le filtre `routage_tenants` n'avait été posé que sur la partie A et les trunks : la partie B a +sa propre boucle de déclaration, et sortait toujours les douze VLAN tenants. Aucun trunk ne +les portait, aucun SVI ne les utilisait — mais leur présence suggérait que les switches +d'accès devaient les connaître, ce qui contredit la décision. + +Vérifié dans les deux sens : zéro VLAN tenant en mode `sdn`, les vingt-quatre déclarations +(douze par partie) de retour en mode `switch`. + ### Le partage des responsabilités, écrit Une table dans `docs/sdn-evpn.md` dit qui route et qui filtre pour chaque nature de trafic. Deux conséquences y sont nommées : **l'inter-tenant ne peut plus être oublié** — il doit sortir diff --git a/scripts/devis_reseau.py b/scripts/devis_reseau.py index 628c7f2..e35d8c2 100644 --- a/scripts/devis_reseau.py +++ b/scripts/devis_reseau.py @@ -263,10 +263,13 @@ def partie_acces(underlay: dict | None, tenants: list, vlans: str, 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"]): - out += [f"vlan {vlan_de(n['index'], zone)}", - f" name {pfx}{n['index']}-{n['categories'][zone]['libelle']}"] + if underlay_mod.routage_tenants(underlay) == "sdn": + out.append("! Aucun VLAN de tenant : ils vivent dans le SDN, pas sur le fil.") + else: + for nom, pfx, n in tenants: + for zone in sorted(n["categories"]): + out += [f"vlan {vlan_de(n['index'], zone)}", + f" name {pfx}{n['index']}-{n['categories'][zone]['libelle']}"] bord = bool(underlay_mod.stp(underlay)) out += ["!", "! ----- B2. Configuration par switch -----", "! /!\\ UN SEUL de ces blocs par machine : celui qui porte son nom. Adresse de", @@ -447,7 +450,7 @@ def generer(tenants: list[tuple[str, str, dict]], dialecte: str | None = None) - "! ============================================================", "! DEVIS SWITCH — reseau converge multi-tenant (Set-OPS)", "! Genere par scripts/devis_reseau.py depuis les nomenclatures.", - "! VLAN = 1000 + index*10 + zone (unique globalement sur le trunk).", + "! VLAN = 1000 + index*10 + zone (unique globalement dans la federation).", "! Underlay (VLAN < 1000) = fabric physique, cluster-global.", ] if r_nom: