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