From b3570f719485783736cfcdf9d5471d55809f7af7 Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Mon, 7 Feb 2022 10:40:44 +0000
Subject: [PATCH] added base transormation of SID info with tests

---
 inventory_provider/db/ims_data.py  |  2 +
 inventory_provider/tasks/worker.py | 27 ++++++++-
 test/test_ims_data.py              |  6 ++
 test/test_worker.py                | 94 +++++++++++++++++++++++++++++-
 4 files changed, 124 insertions(+), 5 deletions(-)

diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py
index 271faaf0..7d6aa5c1 100644
--- a/inventory_provider/db/ims_data.py
+++ b/inventory_provider/db/ims_data.py
@@ -203,6 +203,7 @@ def get_port_id_services(ds: IMS):
             'circuit_type': circuit['circuit_type'],
             'service_type': products[circuit['productid']],
             'project': customers[circuit['customerid']],
+            'customer': customers[circuit['customerid']],
             'customerid': circuit['customerid']
         }
         ports = []
@@ -248,6 +249,7 @@ def get_port_id_services(ds: IMS):
                 'circuit_type': _get_circuit_type(circuit),
                 'service_type': products[circuit['productid']],
                 'project': customers[circuit['customerid']],
+                'customer': customers[circuit['customerid']],
                 'customerid': circuit['customerid'],
                 'port_a_id': portrelate.get(
                     'portid',
diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py
index f841b942..7f5b4094 100644
--- a/inventory_provider/tasks/worker.py
+++ b/inventory_provider/tasks/worker.py
@@ -827,6 +827,9 @@ def transform_ims_data(data):
     hierarchy = data['hierarchy']
     port_id_details = data['port_id_details']
     port_id_services = data['port_id_services']
+    circuit_ids_and_sids = data['circuit_ids_sids']
+
+    sid_circuits = defaultdict(list)
 
     def _get_circuit_contacts(c):
         customer_ids = {c['customerid']}
@@ -982,20 +985,40 @@ def transform_ims_data(data):
                 _format_service(circ)
 
                 type_services = services_by_type.setdefault(
-                    ims_sorted_service_type_key(circ['service_type']), dict())
+                    ims_sorted_service_type_key(circ['service_type']), dict())  # comment
                 type_services[circ['id']] = circ
                 if circ['other_end_equipment']:
                     node_pair_services[
                         f"{circ['equipment']}/{circ['other_end_equipment']}"
                     ][circ['id']] = circ
 
+                if circ['id'] in circuit_ids_and_sids:
+                    sid = circuit_ids_and_sids[circ['id']]
+                    if circ['circuit_type'] == 'circuit':
+                        logger.info(f'SID ({sid}) Circuit ({circ["id"]})'
+                                    f' not a service. IMS')
+                    else:
+                        sid_circuits[sid].append(
+                            {
+                                'circuit_id': circ['id'],
+                                'sid': sid,
+                                'name': circ['name'],
+                                'speed': circ['calculated-speed'],
+                                'service_type': circ['service_type'],
+                                'project': circ['project'],
+                                'customer': circ['customer'],
+                                'equipment': circ['equipment'],
+                                'port': circ['port']
+                            })
+
         interface_services[k].extend(circuits)
 
     return {
         'hierarchy': hierarchy,
         'interface_services': interface_services,
         'services_by_type': services_by_type,
-        'node_pair_services': node_pair_services
+        'node_pair_services': node_pair_services,
+        'sid_circuits': sid_circuits
     }
 
 
diff --git a/test/test_ims_data.py b/test/test_ims_data.py
index eb0adb43..ae2a2e8c 100644
--- a/test/test_ims_data.py
+++ b/test/test_ims_data.py
@@ -162,6 +162,7 @@ def test_get_port_id_services(mocker):
             'circuit_type': 'service',
             'service_type': 'GEANT IP',
             'project': 'ORG A',
+            'customer': 'ORG A',
             'port_a_id': 224507,
             'customerid': 57658
         },
@@ -172,6 +173,7 @@ def test_get_port_id_services(mocker):
             'circuit_type': 'service',
             'service_type': 'GEANT PEERING',
             'project': 'ORG B',
+            'customer': 'ORG B',
             'port_a_id': 224464,
             'customerid': 57664
         },
@@ -182,6 +184,7 @@ def test_get_port_id_services(mocker):
             'circuit_type': 'circuit',
             'service_type': 'ETHERNET',
             'project': 'ETH',
+            'customer': 'ETH',
             'port_a_id': 6423107,
             'port_b_id': 6419340,
             'customerid': 57744
@@ -193,6 +196,7 @@ def test_get_port_id_services(mocker):
             'circuit_type': 'circuit',
             'service_type': 'ETHERNET',
             'project': 'ETH',
+            'customer': 'ETH',
             'port_a_id': 6419340,
             'port_b_id': 6423107,
             'customerid': 57744
@@ -204,6 +208,7 @@ def test_get_port_id_services(mocker):
             'circuit_type': 'circuit',
             'service_type': 'ETHERNET',
             'project': 'ETH',
+            'customer': 'ETH',
             'port_a_id': 6423111,
             'customerid': 57744
         },
@@ -214,6 +219,7 @@ def test_get_port_id_services(mocker):
             'circuit_type': 'service',
             'service_type': 'PRODUCT A',
             'project': 'ORG C',
+            'customer': 'ORG C',
             'port_a_id': 6419453,
             'customerid': 57640
         }
diff --git a/test/test_worker.py b/test/test_worker.py
index 2dbce473..7774c3f2 100644
--- a/test/test_worker.py
+++ b/test/test_worker.py
@@ -137,6 +137,16 @@ def test_transform_ims_data():
             "equipment_name": "eq_b",
             "interface_name": "if_b",
             "port_id": "port_id_2"
+        }],
+        "port_id_3": [{
+            "equipment_name": "eq_a",
+            "interface_name": "if_c",
+            "port_id": "port_id_3"
+        }],
+        "port_id_4": [{
+            "equipment_name": "eq_b",
+            "interface_name": "if_c",
+            "port_id": "port_id_4"
         }]
     }
 
@@ -144,7 +154,10 @@ def test_transform_ims_data():
         "port_id_1": [
             {
                 "id": "circ_id_1",
+                "name": "circ_name_1",
                 "customerid": "cu_1",
+                "customer": "customer_1",
+                "project": "customer_1",
                 "circuit_type": "circuit",
                 "service_type": "ETHERNET",
                 "status": "operational",
@@ -156,7 +169,10 @@ def test_transform_ims_data():
         "port_id_2": [
             {
                 "id": "circ_id_1",
+                "name": "circ_name_1",
                 "customerid": "cu_1",
+                "customer": "customer_1",
+                "project": "customer_1",
                 "circuit_type": "circuit",
                 "service_type": "ETHERNET",
                 "status": "operational",
@@ -164,6 +180,34 @@ def test_transform_ims_data():
                 "port_b_id": "port_id_1",
 
             }
+        ],
+        "port_id_3": [
+            {
+                "id": "sub_circuit_2",
+                "name": "sub_circuit_2",
+                "customerid": "cu_1",
+                "customer": "customer_1",
+                "project": "customer_1",
+                "circuit_type": "service",
+                "service_type": "PEERING R & E",
+                "status": "operational",
+                "port_a_id": "port_id_3",
+                "port_b_id": "port_id_4",
+                }
+        ],
+        "port_id_4": [
+            {
+                "id": "sub_circuit_2",
+                "name": "sub_circuit_2",
+                "customerid": "cu_1",
+                "customer": "customer_1",
+                "project": "customer_1",
+                "circuit_type": "service",
+                "service_type": "PEERING R & E",
+                "status": "operational",
+                "port_a_id": "port_id_4",
+                "port_b_id": "port_id_3",
+            },
         ]
     }
 
@@ -173,8 +217,10 @@ def test_transform_ims_data():
             "name": "circ_name_1",
             "status": "operational",
             "circuit-type": "circuit",
+            "service_type": "ETHERNET",
             "product": "ethernet",
             "speed": "not fibre_route",
+            "project": "customer_1",
             "carrier-circuits": ["carrier_id_1"],
             "sub-circuits": ["sub_circuit_1"],
             "customerid": "cu_1",
@@ -186,6 +232,7 @@ def test_transform_ims_data():
             "circuit-type": "circuit",
             "product": "ethernet",
             "speed": "10G",
+            "project": "customer_1",
             "carrier-circuits": ["carrier_id_2"],
             "sub-circuits": ["circ_id_1"],
             "customerid": "cu_1",
@@ -197,6 +244,7 @@ def test_transform_ims_data():
             "circuit-type": "circuit",
             "product": "ethernet",
             "speed": "not fibre_route",
+            "project": "customer_1",
             "carrier-circuits": ["carrier_id_3"],
             "sub-circuits": ["carrier_id_1"],
             "customerid": "cu_1",
@@ -208,6 +256,7 @@ def test_transform_ims_data():
             "circuit-type": "circuit",
             "product": "OCG4",
             "speed": "fibre_route",
+            "project": "customer_1",
             "carrier-circuits": [],
             "sub-circuits": ["carrier_id_2"],
             "customerid": "cu_1",
@@ -219,6 +268,7 @@ def test_transform_ims_data():
             "circuit-type": "circuit",
             "product": "ethernet",
             "speed": "not fibre_route",
+            "project": "customer_1",
             "carrier-circuits": ["circ_id_1"],
             "sub-circuits": ["sub_circuit_2"],
             "customerid": "cu_1",
@@ -230,12 +280,18 @@ def test_transform_ims_data():
             "circuit-type": "service",
             "product": "PEERING R & E",
             "speed": "not fiber route",
-            "project": "Project A",
+            "project": "customer_1",
             "carrier-circuits": ["sub_circuit_1"],
             "sub-circuits": [],
             "customerid": "cu_1",
         }
     }
+
+    circuit_ids_and_sids = {
+        "sub_circuit_2": 'SID-01',
+        "circ_id_2": 'SID-02',
+        "circ_id_3": 'SID-03'
+    }
     data = {
         "locations": locations,
         "customer_contacts": customer_contacts,
@@ -243,11 +299,13 @@ def test_transform_ims_data():
         "additional_circuit_customer_ids": additional_circuit_customer_ids,
         "hierarchy": hierarchy,
         "port_id_details": port_id_details,
-        "port_id_services": port_id_services
+        "port_id_services": port_id_services,
+        "circuit_ids_sids": circuit_ids_and_sids
     }
     res = transform_ims_data(data)
     ifs = res["interface_services"]
-    assert list(ifs.keys()) == ["eq_a:if_a", "eq_b:if_b"]
+    assert list(ifs.keys()) == [
+        "eq_a:if_a", "eq_b:if_b", "eq_a:if_c", "eq_b:if_c"]
     for v in ifs.values():
         assert len(v) == 1
         assert len(v[0]["related-services"]) == 1
@@ -267,6 +325,36 @@ def test_transform_ims_data():
     assert len(v[0]["fibre-routes"]) == 1
     assert v[0]["fibre-routes"][0]["id"] == "carrier_id_3"
 
+    assert len(res["sid_circuits"]['SID-01']) == 2
+
+    for x in [
+        {
+            'circuit_id': "sub_circuit_2",
+            'sid': "SID-01",
+            'name': "sub_circuit_2",
+            'speed': 10 << 30,
+            'service_type': "PEERING R & E",
+            'project': "customer_1",
+            'customer': "customer_1",
+            'equipment': "eq_a",
+            'port': "if_c"
+        },
+        {
+            'circuit_id': "sub_circuit_2",
+            'sid': "SID-01",
+            'name': "sub_circuit_2",
+            'speed': 10 << 30,
+            'service_type': "PEERING R & E",
+            'project': "customer_1",
+            'customer': "customer_1",
+            'equipment': "eq_b",
+            'port': "if_c"
+        }
+    ]:
+        assert json.dumps(x, sort_keys=True) in [
+            json.dumps(
+                y, sort_keys=True) for y in res["sid_circuits"]['SID-01']]
+
 
 def test_persist_ims_data(mocker, data_config, mocked_redis):
 
-- 
GitLab