diff --git a/netx_api/biz_state/parsers/zte/interface_detail.py b/netx_api/biz_state/parsers/zte/interface_detail.py index e81af9b..0ca1649 100644 --- a/netx_api/biz_state/parsers/zte/interface_detail.py +++ b/netx_api/biz_state/parsers/zte/interface_detail.py @@ -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 diff --git a/netx_api/biz_state/profiles.py b/netx_api/biz_state/profiles.py index 53d2ac6..4cfa076 100644 --- a/netx_api/biz_state/profiles.py +++ b/netx_api/biz_state/profiles.py @@ -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"), diff --git a/tests/test_biz_state_compare.py b/tests/test_biz_state_compare.py index d5f0197..77df995 100644 --- a/tests/test_biz_state_compare.py +++ b/tests/test_biz_state_compare.py @@ -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"]) diff --git a/tests/test_zte_extended_parsers.py b/tests/test_zte_extended_parsers.py index 894fef6..1430ff1 100644 --- a/tests/test_zte_extended_parsers.py +++ b/tests/test_zte_extended_parsers.py @@ -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")