Rename interface_detail admin field to port_status.

Header is/up/down is operational port state, not brief-style Admin.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-20 11:34:05 +08:00
parent b6eab3ed8f
commit 5ab08bb9b3
4 changed files with 9 additions and 9 deletions

View file

@ -36,7 +36,7 @@ _UTIL_RE = re.compile(
def _empty_row(iface: str) -> dict[str, Any]: def _empty_row(iface: str) -> dict[str, Any]:
return { return {
"interface": iface[:128], "interface": iface[:128],
"admin": "", "port_status": "",
"ifindex": "", "ifindex": "",
"description": "", "description": "",
"port_media": "", "port_media": "",
@ -54,7 +54,7 @@ def _empty_row(iface: str) -> dict[str, Any]:
} }
def _normalize_admin(state: str) -> str: def _normalize_port_status(state: str) -> str:
s = str(state or "").strip().lower() s = str(state or "").strip().lower()
# Guard against FSM greedily eating ", ifindex:" # Guard against FSM greedily eating ", ifindex:"
if "," in s: if "," in s:
@ -78,11 +78,11 @@ def _map_fsm_rows(rows: list[dict[str, Any]]) -> list[dict[str, Any]]:
if not iface or not in_util or iface in seen: if not iface or not in_util or iface in seen:
continue continue
seen.add(iface) seen.add(iface)
admin_raw = row_get(r, "ADMIN_STATE", "ADMIN_OPER", "admin") status_raw = row_get(r, "ADMIN_STATE", "ADMIN_OPER", "port_status", "admin")
out.append( out.append(
{ {
"interface": iface[:128], "interface": iface[:128],
"admin": _normalize_admin(admin_raw)[:32], "port_status": _normalize_port_status(status_raw)[:32],
"ifindex": row_get(r, "IFINDEX", "ifindex")[:32], "ifindex": row_get(r, "IFINDEX", "ifindex")[:32],
"description": row_get(r, "DESCRIPTION", "description")[:256], "description": row_get(r, "DESCRIPTION", "description")[:256],
"port_media": row_get(r, "PORT_MEDIA", "port_media")[:32], "port_media": row_get(r, "PORT_MEDIA", "port_media")[:32],
@ -122,7 +122,7 @@ def _hand_parse(*, raw_text: str, **_kw: Any) -> list[dict[str, Any]]:
if m: if m:
_flush() _flush()
cur = _empty_row(m.group("iface")) cur = _empty_row(m.group("iface"))
cur["admin"] = _normalize_admin(m.group("state")) cur["port_status"] = _normalize_port_status(m.group("state"))
cur["ifindex"] = (m.group("ifindex") or "")[:32] cur["ifindex"] = (m.group("ifindex") or "")[:32]
in_rates = False in_rates = False
saw_input = False saw_input = False

View file

@ -216,7 +216,7 @@ _IFACE_BRIEF_FIELDS: list[FieldDef] = [
_IFACE_DETAIL_FIELDS: list[FieldDef] = [ _IFACE_DETAIL_FIELDS: list[FieldDef] = [
FieldDef("interface", length=128, indexed=True, is_key=True, is_interface=True, display_name="接口"), FieldDef("interface", length=128, indexed=True, is_key=True, is_interface=True, display_name="接口"),
FieldDef("admin", length=32, role="state", display_name="Admin"), FieldDef("port_status", length=32, role="state", display_name="Port Status"),
# Rates churn between collects — display only, never default-compare. # Rates churn between collects — display only, never default-compare.
FieldDef("input_bps", length=32, role="counter", display_name="Input bps"), FieldDef("input_bps", length=32, role="counter", display_name="Input bps"),
FieldDef("output_bps", length=32, role="counter", display_name="Output bps"), FieldDef("output_bps", length=32, role="counter", display_name="Output bps"),

View file

@ -359,7 +359,7 @@ class CompareSheetDefaultsTests(unittest.TestCase):
self.assertIn("vrrp.ipv4", ids) self.assertIn("vrrp.ipv4", ids)
self.assertIn("lldp_neighbor", ids) self.assertIn("lldp_neighbor", ids)
detail = next(s for s in sheets if sheet_key(s) == "interface_detail") detail = next(s for s in sheets if sheet_key(s) == "interface_detail")
self.assertEqual(detail["compare_fields"], ["admin"]) self.assertEqual(detail["compare_fields"], ["port_status"])
self.assertIn("input_bps", detail["display_fields"]) self.assertIn("input_bps", detail["display_fields"])
optical = next(s for s in sheets if sheet_key(s) == "optical_brief") optical = next(s for s in sheets if sheet_key(s) == "optical_brief")
self.assertEqual(optical["compare_fields"], ["status"]) self.assertEqual(optical["compare_fields"], ["status"])

View file

@ -294,14 +294,14 @@ gei-0/0/0/2 is administratively down, ifindex: 101
command="show interface", command="show interface",
) )
self.assertEqual(len(rows), 2) self.assertEqual(len(rows), 2)
self.assertEqual(rows[0]["admin"], "up") self.assertEqual(rows[0]["port_status"], "up")
self.assertEqual(rows[0]["input_bps"], "100") self.assertEqual(rows[0]["input_bps"], "100")
self.assertEqual(rows[0]["out_util"], "2") self.assertEqual(rows[0]["out_util"], "2")
self.assertEqual(rows[0]["ip_mtu"], "1500") self.assertEqual(rows[0]["ip_mtu"], "1500")
self.assertEqual(rows[0]["mtu"], "1600") self.assertEqual(rows[0]["mtu"], "1600")
self.assertEqual(rows[0]["mpls_mtu"], "1550") self.assertEqual(rows[0]["mpls_mtu"], "1550")
self.assertEqual(rows[0]["ipv6_mtu"], "") self.assertEqual(rows[0]["ipv6_mtu"], "")
self.assertEqual(rows[1]["admin"], "admin-down") self.assertEqual(rows[1]["port_status"], "admin-down")
self.assertEqual(rows[1]["ip_mtu"], "8978") self.assertEqual(rows[1]["ip_mtu"], "8978")
self.assertEqual(rows[1]["mtu"], "9000") self.assertEqual(rows[1]["mtu"], "9000")
self.assertEqual(rows[1]["ipv6_mtu"], "8978") self.assertEqual(rows[1]["ipv6_mtu"], "8978")