devis switch : le mode STP se dérive, et le devis dit son incertitude

`underlay.stp.mode` passe à `mstp` — le mode d'usine du commutateur, vérifié
par `show spanning-tree`. Sur une étoile sans lien redondant, l'instance 0 de
MSTP se comporte comme un RSTP : changer de mode aurait donné le même
résultat, au risque près de toucher à un protocole qui fonctionne déjà.

Le devis énonce son incertitude là où elle est : en MSTP la priorité se règle
souvent par instance, alors que la forme émise est globale. Il le dit plutôt
que de laisser croire à une syntaxe vérifiée — `show spanning-tree` donne
l'état du protocole, jamais la forme d'entrée des commandes.

Corrigé : le commentaire de la section 6 disait « RSTP » en dur alors que le
mode est déclaré. Il le dérive.

Preuves : 24 OK, 0 échec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-02 18:52:37 -04:00
parent 38965824d6
commit 0c55986e81
2 changed files with 29 additions and 4 deletions

View file

@ -1,5 +1,20 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-08-02 (suite 15) — `underlay.stp.mode` aligné sur le matériel
`mode: mstp`, parce que c'est le mode d'usine du commutateur (`show spanning-tree` :
IEEE 802.1s, *Force Version 3*). Sur une étoile sans lien redondant, l'instance 0 de MSTP se
comporte comme un RSTP : changer de mode aurait donné le même résultat, au risque près de
toucher à un protocole qui fonctionne déjà.
Le devis énonce désormais sa propre incertitude là où elle est : **en MSTP la priorité se
règle souvent par instance**, alors que la forme émise est globale. Le générateur le dit
plutôt que de laisser croire à une syntaxe vérifiée — `show spanning-tree` donne l'état du
protocole, jamais la forme d'entrée des commandes.
Corrigé au passage : le commentaire de la section 6 disait « RSTP » en dur alors que le mode
est déclaré. Il le dérive.
## 2026-08-02 (suite 14) — le spanning-tree du matériel : MSTP, actif, priorité par défaut ## 2026-08-02 (suite 14) — le spanning-tree du matériel : MSTP, actif, priorité par défaut
`show spanning-tree` sur le commutateur Binardat corrige une déduction fausse et en apporte `show spanning-tree` sur le commutateur Binardat corrige une déduction fausse et en apporte

View file

@ -174,13 +174,23 @@ def _stp_lignes(dialecte: str, mode: str, priorite: int) -> list[str]:
"""Mode + priorite de pont, dans la forme du dialecte. """Mode + priorite de pont, dans la forme du dialecte.
Cisco IOS parle `rapid-pvst` (RSTP par VLAN) ; les plateformes generiques parlent Cisco IOS parle `rapid-pvst` (RSTP par VLAN) ; les plateformes generiques parlent
`rstp` et une priorite globale. NON VERIFIE sur Binardat : a confronter au `rstp`/`mstp` et une priorite globale.
`show running-config` du materiel, comme les `ip route`.
FORME NON VERIFIEE : `show spanning-tree` donne l'ETAT du protocole, pas la syntaxe
d'entree. En MSTP notamment, la priorite se regle souvent PAR INSTANCE — la forme
globale ci-dessous pourrait etre refusee. A confronter a `spanning-tree ?` en mode
configuration.
""" """
if dialecte == "cisco": if dialecte == "cisco":
return [f"spanning-tree mode {'rapid-pvst' if mode == 'rstp' else mode}", return [f"spanning-tree mode {'rapid-pvst' if mode == 'rstp' else mode}",
f"spanning-tree vlan 1-4094 priority {priorite}"] f"spanning-tree vlan 1-4094 priority {priorite}"]
return [f"spanning-tree mode {mode}", f"spanning-tree priority {priorite}"] lignes = [f"spanning-tree mode {mode}", f"spanning-tree priority {priorite}"]
if mode == "mstp":
lignes.append(f"! ^ en MSTP, la priorite est souvent portee par une INSTANCE "
f"(ex. `spanning-tree mst 0 priority {priorite}`).")
lignes.append("! Forme a confirmer par `spanning-tree ?` ; celle-ci reprend la "
"syntaxe globale.")
return lignes
def section_stp(underlay: dict | None, dialecte: str) -> list[str]: def section_stp(underlay: dict | None, dialecte: str) -> list[str]:
@ -203,7 +213,7 @@ def section_stp(underlay: dict | None, dialecte: str) -> list[str]:
f"! {r_nom} est le CENTRE de l'etoile : tous les chemins passent par lui.", f"! {r_nom} est le CENTRE de l'etoile : tous les chemins passent par lui.",
"! On en fait le pont racine plutot que de laisser une election arbitraire", "! On en fait le pont racine plutot que de laisser une election arbitraire",
"! le decider — l'arbre logique suit alors le cablage physique.", "! le decider — l'arbre logique suit alors le cablage physique.",
"! Aucun lien redondant en etoile : RSTP est un filet, pas une necessite."] f"! Aucun lien redondant en etoile : {mode.upper()} est un filet, pas une necessite."]
out += _stp_lignes(dialecte, mode, underlay_mod.STP_PRIORITE_RACINE) out += _stp_lignes(dialecte, mode, underlay_mod.STP_PRIORITE_RACINE)
out += ["!", out += ["!",
"! Les ports de bord sont declares AVEC leur interface (sections 4 et 4b),", "! Les ports de bord sont declares AVEC leur interface (sections 4 et 4b),",