From ca13d19bd9c94a03276bb5fdbefd72bee682af59 Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Mon, 20 Mar 2023 18:27:47 +0100
Subject: [PATCH] filter non-eth physical interfaces

---
 resource_management/alembic.ini |  1 -
 resource_management/juniper.py  | 10 ++++++++++
 test/test_parse_router.py       |  2 +-
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/resource_management/alembic.ini b/resource_management/alembic.ini
index 0aad7a6..22d9b90 100644
--- a/resource_management/alembic.ini
+++ b/resource_management/alembic.ini
@@ -4,6 +4,5 @@
 # a migration for
 script_location = migrations
 sqlalchemy.url = sqlite:////absolute/path/to/foo.db
-sqlalchemy.url = sqlite:////Users/reid/workspace/nat/resource-management/resource_management/foo.db
 # or here is an example of a mysql dsn
 # sqlalchemy.url = mysql://dummy:dummy-pass@localhost/resources_db_name
diff --git a/resource_management/juniper.py b/resource_management/juniper.py
index 4c3eb4d..6eba0d7 100644
--- a/resource_management/juniper.py
+++ b/resource_management/juniper.py
@@ -77,6 +77,12 @@ LINE_CARDS_LIST_SCHEMA = {
 }
 
 
+def _is_physical_ifc_name(name):
+    # TODO: is there a better way to filter out lags?  other interfaces?
+    # cf. https://github.com/Juniper/py-junos-eznc/blob/master/lib/jnpr/junos/op/ethport.yml#L6  # noqa: E501
+    return re.match('[fgxe][et]-', name) is not None
+
+
 def _slot_number(name):
     """
     parses names like 'FPC 2', 'PIC 17' and returns
@@ -371,6 +377,8 @@ def load_logical_interfaces(router: 'jnpr.junos.Device'):
     interfaces = {}
     for lu in LogicalInterfacesTable(router).get():
         assert lu.logical.startswith(lu.physical)  # sanity
+        if not _is_physical_ifc_name(lu.physical):
+            continue
         interfaces.setdefault(lu.physical, set()).add(lu.logical)
 
     return interfaces
@@ -416,6 +424,8 @@ def load_installed_ethernet_ports(router: 'jnpr.junos.Device'):
 
     interfaces = {}
     for ifc in PhysicalInterfacesTable(router).get():
+        if not _is_physical_ifc_name(ifc.interface):
+            continue
         interfaces[ifc.interface] = {
             'admin': ifc.admin == 'up',
             'oper': ifc.admin == 'up'
diff --git a/test/test_parse_router.py b/test/test_parse_router.py
index dfe39da..1d0fb0e 100644
--- a/test/test_parse_router.py
+++ b/test/test_parse_router.py
@@ -94,7 +94,7 @@ def test_physical_no_lag(mocked_router):
             ssh_config=ssh) as dev:
 
         physical = juniper.load_installed_ethernet_ports(dev)
-        assert all(p['name'].startswith('ae') is False for p in physical)
+        assert all(p.startswith('ae') is False for p in physical.keys())
 
 
 
-- 
GitLab