From 0ebdb508a5086034810100e550e2b55d844ba543 Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Thu, 31 Mar 2022 10:25:55 +0000
Subject: [PATCH] Restricted multiple customers to L2 Circuits. RE DBOARD3-524

Updated tests
---
 inventory_provider/db/ims_data.py   |  7 +++++-
 inventory_provider/routes/poller.py | 34 ++++++++++++++++++++---------
 test/test_general_poller_routes.py  |  4 +++-
 test/test_ims_data.py               | 18 ++++++++++-----
 4 files changed, 45 insertions(+), 18 deletions(-)

diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py
index ec9717ff..f6e15153 100644
--- a/inventory_provider/db/ims_data.py
+++ b/inventory_provider/db/ims_data.py
@@ -219,16 +219,20 @@ def get_port_id_services(ds: IMS):
             'customerid': circuit['customerid']
         }
         ports = []
+        cd['port_type'] = 'unknowm'
         if circuit['internalports']:
             ports = sorted(
                 circuit['internalports'], key=lambda x: x['sequencenumber'])
             ports = [p['id'] for p in ports]
+            cd['port_type'] = 'internal'
         elif circuit['ports']:
             ports = sorted(
                 circuit['ports'], key=lambda x: x['sequencenumber'])
             ports = [p['id'] for p in ports]
+            cd['port_type'] = 'ports'
         elif circuit['portaid'] or circuit['portbid']:
             ports = [circuit['portaid'], circuit['portbid']]
+            cd['port_type'] = 'ab'
         yield from _populate_end_info(cd, ports)
 
     ignore_status_str = ''.join([
@@ -265,7 +269,8 @@ def get_port_id_services(ds: IMS):
                 'customerid': circuit['customerid'],
                 'port_a_id': portrelate.get(
                     'portid',
-                    portrelate.get('internalportid', ''))
+                    portrelate.get('internalportid', '')),
+                'port_type': 'port relate'
             }
 
 
diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py
index 47f457b0..2742531a 100644
--- a/inventory_provider/routes/poller.py
+++ b/inventory_provider/routes/poller.py
@@ -475,7 +475,7 @@ def _get_dashboards(interface):
         yield BRIAN_DASHBOARDS.NREN
 
 
-def _get_dashboard_data(ifc, names):
+def _get_dashboard_data(ifc, possible_names):
 
     def _get_interface_type(description):
         if re.match(r'^PHY', description):
@@ -516,14 +516,17 @@ def _get_dashboard_data(ifc, names):
 
     if BRIAN_DASHBOARDS.INFRASTRUCTURE_BACKBONE.name in dashboards:
         name = _get_backbone_name(description)
-        names = {name}
+        names = [name]
     elif BRIAN_DASHBOARDS.GWS_PHY_UPSTREAM.name in dashboards:
-        name = _get_customer_name(description)
         host = ifc['router']
         location = host.split('.')[1].upper()
-        name = f'{name} - {location}'
+        name = f'{_get_customer_name(description)} - {location}'
+        names = [name]
     else:
         name = _get_customer_name(description)
+        names = [name]
+        if BRIAN_DASHBOARDS.L2_CIRCUIT.name in dashboards:
+            names = names + possible_names
 
     return {
         **ifc,
@@ -531,10 +534,19 @@ def _get_dashboard_data(ifc, names):
             'name': name,
             'interface_type': interface_type.name
         },
+        # DBOARD3-524
+        # Uncomment this section if they want all customers from IMS
         'dashboards_info': [{
             'name': name,
             'interface_type': interface_type.name
-        } for name in names]
+        } for name in set(names)]
+
+        # Uncomment this section if they only want customers from IMS that
+        # appear in the interface description
+        # 'dashboards_info': [{
+        #     'name': name,
+        #     'interface_type': interface_type.name
+        # } for name in set(names) if name in description.upper().split(' ')]
     }
 
 
@@ -572,7 +584,6 @@ def _get_services_and_customers(config, hostname=None, use_next_redis=False):
         hostname = get_ims_equipment_name(hostname)
 
     result = defaultdict(dict)
-    included_service_ids = set()
     key_pattern = f'ims:interface_services:{hostname}:*' \
         if hostname else 'ims:interface_services:*'
 
@@ -583,16 +594,19 @@ def _get_services_and_customers(config, hostname=None, use_next_redis=False):
             use_next_redis=use_next_redis):
         cs = {
             'services': [],
-            'customers': set()
+            'customers': []
         }
+        included_service_ids = set()
         for s in doc['value']:
             if s['id'] in included_service_ids:
                 continue
+            if s.get('port_type', '') == 'ab':
+                continue
             included_service_ids.add(s['id'])
 
-            cs['customers'].add(s['customer'])
+            cs['customers'].append(s['customer'])
             for c in s.get('additional_customers', []):
-                cs['customers'].add(c['name'])
+                cs['customers'].append(c['name'])
             if s['circuit_type'] == 'service':
                 cs['services'].append({
                     'id': s['id'],
@@ -728,7 +742,7 @@ def load_interfaces_to_poll(
                 dashboards = _get_dashboards(ifc)
                 ifc['dashboards'] = sorted([d.name for d in dashboards])
                 yield _get_dashboard_data(
-                    ifc, ifc_services_and_customers.get('customers', set()))
+                    ifc, ifc_services_and_customers.get('customers', []))
             else:
                 continue
     return _get_populated_interfaces(basic_interfaces)
diff --git a/test/test_general_poller_routes.py b/test/test_general_poller_routes.py
index e863657f..36770de2 100644
--- a/test/test_general_poller_routes.py
+++ b/test/test_general_poller_routes.py
@@ -395,9 +395,11 @@ def test_interface_dashboard_mapping(description, expected_dashboards):
 ])
 def test_description_dashboard_parsing(interface, dashboard_info):
 
-    updated = poller._get_dashboard_data(interface, set())
+    updated = poller._get_dashboard_data(interface, [])
     info = updated['dashboard_info']
     assert info == dashboard_info
+    dashboards_info = updated['dashboards_info']
+    assert dashboards_info == [dashboard_info]
 
 
 def test_gws_config_json(client):
diff --git a/test/test_ims_data.py b/test/test_ims_data.py
index ae2a2e8c..69d0737a 100644
--- a/test/test_ims_data.py
+++ b/test/test_ims_data.py
@@ -164,7 +164,8 @@ def test_get_port_id_services(mocker):
             'project': 'ORG A',
             'customer': 'ORG A',
             'port_a_id': 224507,
-            'customerid': 57658
+            'customerid': 57658,
+            'port_type': 'internal'
         },
         {
             'id': 663104,
@@ -175,7 +176,8 @@ def test_get_port_id_services(mocker):
             'project': 'ORG B',
             'customer': 'ORG B',
             'port_a_id': 224464,
-            'customerid': 57664
+            'customerid': 57664,
+            'port_type': 'internal'
         },
         {
             'id': 679324,
@@ -187,7 +189,8 @@ def test_get_port_id_services(mocker):
             'customer': 'ETH',
             'port_a_id': 6423107,
             'port_b_id': 6419340,
-            'customerid': 57744
+            'customerid': 57744,
+            'port_type': 'ports'
         },
         {
             'id': 679324,
@@ -199,7 +202,8 @@ def test_get_port_id_services(mocker):
             'customer': 'ETH',
             'port_a_id': 6419340,
             'port_b_id': 6423107,
-            'customerid': 57744
+            'customerid': 57744,
+            'port_type': 'ports'
         },
         {
             'id': 679324,
@@ -210,7 +214,8 @@ def test_get_port_id_services(mocker):
             'project': 'ETH',
             'customer': 'ETH',
             'port_a_id': 6423111,
-            'customerid': 57744
+            'customerid': 57744,
+            'port_type': 'ports'
         },
         {
             'id': 702560,
@@ -221,7 +226,8 @@ def test_get_port_id_services(mocker):
             'project': 'ORG C',
             'customer': 'ORG C',
             'port_a_id': 6419453,
-            'customerid': 57640
+            'customerid': 57640,
+            'port_type': 'port relate'
         }
     ]
     assert res == predicted
-- 
GitLab