Add IOS-XR interface naming support to cisco-parse.py

- Add TenGigE, HundredGigE, FortyGigE, GigE, Bundle-Ether
  to the short-name expansion map
- Add cross-platform matching fallback: when remPortId expands
  to an IOS-XE name but the target is IOS-XR (or vice versa),
  try the alternate naming convention
- Handles NCS 5500 where ifDescr uses TenGigE0/0/0/5 format
  vs IOS-XE TenGigabitEthernet1/1/3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
sam 2026-03-06 11:06:23 -07:00
parent c64a80810f
commit 71eba349b8

View File

@ -27,19 +27,29 @@ from pathlib import Path
# ────────────────────────────────────────────────────────────────────────
CISCO_SHORT_TO_LONG = {
# IOS-XE naming
"Te": "TenGigabitEthernet",
"Gi": "GigabitEthernet",
"Fa": "FastEthernet",
"Hu": "HundredGigE",
"Tw": "TwentyFiveGigE",
"Fo": "FortyGigabitEthernet",
"Tw": "TwentyFiveGigE",
"Twe": "TwentyFiveGigE",
"Eth": "Ethernet",
"Po": "Port-channel",
"Vl": "Vlan",
# IOS-XR naming (NCS 5500, ASR 9000, etc.)
"TenGigE": "TenGigE",
"HundredGigE": "HundredGigE",
"TwentyFiveGigE": "TwentyFiveGigE",
"FortyGigE": "FortyGigE",
"GigE": "GigE", # rare but exists on some XR platforms
"Bundle-Ether": "Bundle-Ether",
"BE": "Bundle-Ether",
# Common to both
"Hu": "HundredGigE",
"BDI": "BDI",
"BVI": "BVI",
"Lo": "Loopback",
"Vl": "Vlan",
"Po": "Port-channel",
"Twe": "TwentyFiveGigE",
}
# Reverse map: long -> short (built from the canonical mapping)
@ -308,6 +318,29 @@ def match_rem_port_id(interfaces, rem_port_id):
_dbg(f"Matched remPortId '{rem_port_id}' via ifDescr direct -> ifIndex {ifindex}")
return ifindex
# 4. Cross-platform fallback: IOS-XE short name on IOS-XR device or vice versa
# e.g., remPortId "Te0/0/0/5" expands to "TenGigabitEthernet0/0/0/5" (IOS-XE)
# but the NCS ifDescr is "TenGigE0/0/0/5" (IOS-XR)
# Try alternate expansions by extracting the slot/port suffix and matching
xr_xe_pairs = {
"TenGigabitEthernet": "TenGigE",
"TenGigE": "TenGigabitEthernet",
"GigabitEthernet": "GigE",
"GigE": "GigabitEthernet",
"FortyGigabitEthernet": "FortyGigE",
"FortyGigE": "FortyGigabitEthernet",
"Port-channel": "Bundle-Ether",
"Bundle-Ether": "Port-channel",
}
if expanded != rem_port_id:
for xe_name, xr_name in xr_xe_pairs.items():
if expanded.startswith(xe_name):
alt = xr_name + expanded[len(xe_name):]
for ifindex, info in interfaces.items():
if info.get("ifDescr", "") == alt:
_dbg(f"Matched remPortId '{rem_port_id}' via cross-platform '{alt}' -> ifIndex {ifindex}")
return ifindex
_dbg(f"WARNING: Could not match remPortId '{rem_port_id}' to any interface")
return None