From 4562c9744d58db00a599b9ef44cbc839f560f77c Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Mon, 8 Mar 2021 10:42:14 +0000
Subject: [PATCH] added vmport and vminternalport details; loaded service types
 from IMS

---
 inventory_provider/db/ims_data.py | 67 ++++++++++++++++++++++++++-----
 1 file changed, 57 insertions(+), 10 deletions(-)

diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py
index c0fcc045..384c97ac 100644
--- a/inventory_provider/db/ims_data.py
+++ b/inventory_provider/db/ims_data.py
@@ -2,11 +2,12 @@ import logging
 import re
 from collections import OrderedDict, defaultdict
 from copy import copy
+from functools import lru_cache
 from itertools import chain
 
 from inventory_provider import environment
 from inventory_provider.db import ims
-from inventory_provider.db.ims import InventoryStatus, IMS, IMS_SERVICE_NAMES
+from inventory_provider.db.ims import InventoryStatus, IMS
 
 environment.setup_logging()
 logger = logging.getLogger(__name__)
@@ -23,6 +24,14 @@ IMS_OPSDB_STATUS_MAP = {
 }
 
 
+@lru_cache(64, typed=False)
+def get_service_types(ds: IMS):
+    for d in ds.get_filtered_entities(
+            'ComboBoxData',
+            'name == "PW_INFORM_PRODUCTCODE"'):
+        yield d['selection']
+
+
 def get_fibre_info(ds: IMS):
     # get all the wdm ots circuits where each node is in a different location
 
@@ -74,12 +83,18 @@ def get_fibre_info(ds: IMS):
 
 def get_port_id_services(ds: IMS):
     circuit_nav_props = [
-        ims.CIRCUIT_PROPERTIES['Customer'],
-        ims.CIRCUIT_PROPERTIES['Speed'],
-        ims.CIRCUIT_PROPERTIES['Product'],
         ims.CIRCUIT_PROPERTIES['Ports'],
         ims.CIRCUIT_PROPERTIES['InternalPorts'],
     ]
+    ims_service_names = list(get_service_types(ds))
+    customers = {c['id']: c['name'] for c in ds.get_all_entities('customer')}
+    products = {p['id']: p['name'] for p in ds.get_all_entities('product')}
+
+    def _get_circuit_type(c):
+        if products[c['productid']] in ims_service_names:
+            return 'service'
+        else:
+            return 'circuit'
 
     def _get_circuits():
 
@@ -87,10 +102,7 @@ def get_port_id_services(ds: IMS):
                 'Circuit',
                 circuit_nav_props,
                 step_count=2000):
-            if c['product']['name'] in IMS_SERVICE_NAMES:
-                c['circuit_type'] = 'service'
-            else:
-                c['circuit_type'] = 'circuit'
+            c['circuit_type'] = _get_circuit_type(c)
             yield c
 
     circuits = _get_circuits()
@@ -135,8 +147,8 @@ def get_port_id_services(ds: IMS):
             'status': IMS_OPSDB_STATUS_MAP.get(
                     InventoryStatus(circuit['inventorystatusid']), 'unknown'),
             'circuit_type': circuit['circuit_type'],
-            'service_type': circuit['product']['name'],
-            'project': circuit['customer']['name']
+            'service_type': products[circuit['productid']],
+            'project': customers[circuit['customerid']]
         }
         ports = []
         if circuit['internalports']:
@@ -151,6 +163,34 @@ def get_port_id_services(ds: IMS):
             ports = [circuit['portaid'], circuit['portbid']]
         yield from _populate_end_info(cd, ports)
 
+    for portrelate in chain(
+            ds.get_all_entities(
+                'vmportrelate',
+                ims.VM_PORT_RELATE_PROPERTIES['Circuit'],
+                step_count=2000
+            ),
+            ds.get_all_entities(
+                'vminternalportrelate',
+                ims.VM_INTERNAL_PORT_RELATE_PROPERTIES['Circuit'],
+                step_count=2000
+            )
+    ):
+        circuit = portrelate['circuit']
+        if circuit:
+            yield {
+                'id': circuit['id'],
+                'name': circuit['name'],
+                'status': IMS_OPSDB_STATUS_MAP.get(
+                    InventoryStatus(circuit['inventorystatusid']),
+                    'unknown'),
+                'circuit_type': _get_circuit_type(circuit),
+                'service_type': products[circuit['productid']],
+                'project': customers[circuit['customerid']],
+                'port_a_id': portrelate.get(
+                    'portid',
+                    portrelate.get('internalportid', ''))
+            }
+
 
 def get_port_details(ds: IMS):
     port_nav_props = [
@@ -199,7 +239,13 @@ def get_circuit_hierarchy(ds: IMS):
     ]
     circuits = ds.get_all_entities(
         'Circuit', circuit_nav_props, step_count=1000)
+    service_types = list(get_service_types(ds))
     for circuit in circuits:
+        if circuit['product']['name'] in service_types:
+            circuit_type = 'service'
+        else:
+            circuit_type = 'circuit'
+
         sub_circuits = [c['subcircuitid'] for c in circuit['subcircuits']]
         carrier_circuits = \
             [c['carriercircuitid'] for c in circuit['carriercircuits']]
@@ -211,6 +257,7 @@ def get_circuit_hierarchy(ds: IMS):
             'product': circuit['product']['name'],
             'speed': circuit['speed']['name'],
             'project': circuit['customer']['name'],
+            'circuit-type': circuit_type,
             'sub-circuits': sub_circuits,
             'carrier-circuits': carrier_circuits
         }
-- 
GitLab