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]:
return {
"interface": iface[:128],
"admin": "",
"port_status": "",
"ifindex": "",
"description": "",
"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()
# Guard against FSM greedily eating ", ifindex:"
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:
continue
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(
{
"interface": iface[:128],
"admin": _normalize_admin(admin_raw)[:32],
"port_status": _normalize_port_status(status_raw)[:32],
"ifindex": row_get(r, "IFINDEX", "ifindex")[:32],
"description": row_get(r, "DESCRIPTION", "description")[:256],
"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:
_flush()
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]
in_rates = False
saw_input = False

View file

@ -216,7 +216,7 @@ _IFACE_BRIEF_FIELDS: list[FieldDef] = [
_IFACE_DETAIL_FIELDS: list[FieldDef] = [
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.
FieldDef("input_bps", length=32, role="counter", display_name="Input 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("lldp_neighbor", ids)
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"])
optical = next(s for s in sheets if sheet_key(s) == "optical_brief")
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",
)
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]["out_util"], "2")
self.assertEqual(rows[0]["ip_mtu"], "1500")
self.assertEqual(rows[0]["mtu"], "1600")
self.assertEqual(rows[0]["mpls_mtu"], "1550")
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]["mtu"], "9000")
self.assertEqual(rows[1]["ipv6_mtu"], "8978")