diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py index 384c97ac609658c99f8ade3544067b32c22d37f4..fa1a4032de18ee5ae2cd8a297e54d4792b022815 100644 --- a/inventory_provider/db/ims_data.py +++ b/inventory_provider/db/ims_data.py @@ -22,6 +22,8 @@ IMS_OPSDB_STATUS_MAP = { InventoryStatus.OUT_OF_SERVICE: 'terminated', InventoryStatus.READY_FOR_CEASURE: 'disposed' } +STATUSES_TO_IGNORE = \ + [InventoryStatus.OUT_OF_SERVICE, InventoryStatus.READY_FOR_CEASURE] @lru_cache(64, typed=False) @@ -42,9 +44,14 @@ def get_fibre_info(ds: IMS): ims.CIRCUIT_PROPERTIES['PortB'], ] + ignore_status_str = ''.join([ + f'inventoryStatusId != {s} | ' for s in STATUSES_TO_IGNORE + ]) + ne_details = {} for c in ds.get_filtered_entities( 'Circuit', + ignore_status_str + 'product.name == "wdm" | speed.name == "ots" | ' 'vendor == "infinera"', circuit_nav_props, @@ -98,8 +105,12 @@ def get_port_id_services(ds: IMS): def _get_circuits(): - for c in ds.get_all_entities( + _ignore_status_str = ' | '.join([ + f'inventoryStatusId != {s}' for s in STATUSES_TO_IGNORE + ]) + for c in ds.get_filtered_entities( 'Circuit', + _ignore_status_str, circuit_nav_props, step_count=2000): c['circuit_type'] = _get_circuit_type(c) @@ -163,14 +174,23 @@ def get_port_id_services(ds: IMS): ports = [circuit['portaid'], circuit['portbid']] yield from _populate_end_info(cd, ports) + + + ignore_status_str = ''.join([ + f'inventoryStatusId != {s} | ' for s in STATUSES_TO_IGNORE + ]) for portrelate in chain( - ds.get_all_entities( + ds.get_filtered_entities( 'vmportrelate', + ignore_status_str + + 'circuitId != 0', ims.VM_PORT_RELATE_PROPERTIES['Circuit'], step_count=2000 ), - ds.get_all_entities( + ds.get_filtered_entities( 'vminternalportrelate', + ignore_status_str + + 'circuitId != 0', ims.VM_INTERNAL_PORT_RELATE_PROPERTIES['Circuit'], step_count=2000 ) @@ -237,8 +257,17 @@ def get_circuit_hierarchy(ds: IMS): ims.CIRCUIT_PROPERTIES['SubCircuits'], ims.CIRCUIT_PROPERTIES['CarrierCircuits'] ] - circuits = ds.get_all_entities( - 'Circuit', circuit_nav_props, step_count=1000) + + ignore_status_str = ' | '.join([ + f'inventoryStatusId != {s}' for s in STATUSES_TO_IGNORE + ]) + circuits = ds.get_filtered_entities( + 'Circuit', + ignore_status_str, + circuit_nav_props, + step_count=1000) + # 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: @@ -280,6 +309,9 @@ def get_node_locations(ds: IMS): pass # no alias - ignore silently for node in site['nodes']: + if node['inventorystatusid'] in STATUSES_TO_IGNORE: + continue + yield (node['name'], { 'equipment-name': node['name'], 'status': IMS_OPSDB_STATUS_MAP.get( @@ -313,10 +345,7 @@ def lookup_lg_routers(ds: IMS): pattern = re.compile("vpn-proxy|vrr|taas", re.IGNORECASE) def _matching_node(node_): - if InventoryStatus(node_['inventorystatusid']) not in [ - InventoryStatus.IN_SERVICE, - InventoryStatus.PLANNED # remove once data fully migrated - ]: + if InventoryStatus(node_['inventorystatusid']) in STATUSES_TO_IGNORE: return False if pattern.match(node_['name']): @@ -341,6 +370,8 @@ def lookup_lg_routers(ds: IMS): for node in nodes: if not _matching_node(node): continue + if node['inventorystatusid'] in STATUSES_TO_IGNORE: + continue site = ds.get_entity_by_id('Site', node['siteid'], site_nav_props, True) diff --git a/test/test_ims_data.py b/test/test_ims_data.py index e3297b4f824d5ca7711b382df16ebda28cca9be0..4df183a87c31821a7e92bcff44b974d3dc4434a1 100644 --- a/test/test_ims_data.py +++ b/test/test_ims_data.py @@ -15,21 +15,15 @@ def test_get_circuit_hierarchy(mocker): 'http://dummy_base', 'dummy_username', 'dummy_password') with open('test/data/ims_circuit_hierarchy_data.json') as data: se_data = json.load(data) - - mocked_get = mocker.patch.object( - inventory_provider.db.ims.IMS, - 'get_all_entities' - ) mocker.patch.object( inventory_provider.db.ims.IMS, 'get_filtered_entities', - side_effect=[[ + side_effect=[se_data, [ {'selection': 'IP PEERING - R&E'} ]] ) - mocked_get.return_value = se_data res = list(get_circuit_hierarchy(ds)) - assert ds.get_all_entities.call_count == 1 + assert ds.get_filtered_entities.call_count == 2 predicted = [ { 'id': 661591, @@ -115,14 +109,8 @@ def test_get_port_id_services(mocker): mocker.patch.object( inventory_provider.db.ims.IMS, - 'get_filtered_entities', - side_effect=[[ - {'selection': 'GEANT IP'}, - {'selection': 'GEANT PEERING'}, - {'selection': 'PRODUCT A'} - ]] - ) - se = [ + 'get_all_entities', + side_effect=[ [ {'id': 57658, 'name': 'ORG A'}, {'id': 57664, 'name': 'ORG B'}, @@ -134,12 +122,19 @@ def test_get_port_id_services(mocker): {'id': 3804, 'name': 'GEANT IP'}, {'id': 3810, 'name': 'GEANT PEERING'}, {'id': 3677, 'name': 'ETHERNET'}, - ] + ]] + ) + se = [ + [ + {'selection': 'GEANT IP'}, + {'selection': 'GEANT PEERING'}, + {'selection': 'PRODUCT A'} ] + ] se.extend(d) mocker.patch.object( inventory_provider.db.ims.IMS, - 'get_all_entities', + 'get_filtered_entities', side_effect=se ) @@ -147,10 +142,8 @@ def test_get_port_id_services(mocker): 'http://dummy_base', 'dummy_username', 'dummy_password') res = list(get_port_id_services(ds)) - # this is the number of different product types that are considered service - # and speed types that that cover circuit types that have relevant circuits - # and ethernet product type as other relevant circuits also need tracking - assert ds.get_all_entities.call_count == 5 + assert ds.get_all_entities.call_count == 2 + assert ds.get_filtered_entities.call_count == 4 predicted = [ { 'id': 663060, @@ -212,67 +205,68 @@ def test_get_port_id_services(mocker): assert res == predicted -def test_get_fibre_info(mocker): - - ims = mocker.patch('inventory_provider.db.ims.IMS') - with open('test/data/ims_fibre_data.json') as data: - ims.return_value.get_filtered_entities.return_value = json.load(data) - - ds = inventory_provider.db.ims.IMS( - 'dummy_base', 'dummy_username', 'dummy_password') - - res = {ne: fs for ne, fs in get_fibre_info(ds)} - - ds.get_filtered_entities.assert_called_once_with( - 'Circuit', - 'product.name == "wdm" | speed.name == "ots" | vendor == "infinera"', - [ - inventory_provider.db.ims.CIRCUIT_PROPERTIES['SubCircuits'], - inventory_provider.db.ims.CIRCUIT_PROPERTIES['CalculatedNode'], - inventory_provider.db.ims.CIRCUIT_PROPERTIES['PortA'], - inventory_provider.db.ims.CIRCUIT_PROPERTIES['PortB'], - ], - step_count=1000 - ) - - assert res == { - "BUD01-DTNX10-1-3": [ - { - "circuit_id": 659616, - "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", - "df_route_id": 662153, - "df_status": "operational", - "ne": "BUD01-DTNX10-1-3" - } - ], - "KOM-OLA1-1": [ - { - "circuit_id": 659617, - "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", - "df_route_id": 662153, - "df_status": "operational", - "ne": "KOM-OLA1-1" - } - ], - "SZE-OLA1-1": [ - { - "circuit_id": 659616, - "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", - "df_route_id": 662153, - "df_status": "operational", - "ne": "SZE-OLA1-1" - } - ], - "ZAG01-DTNX10-1-2": [ - { - "circuit_id": 659617, - "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", - "df_route_id": 662153, - "df_status": "operational", - "ne": "ZAG01-DTNX10-1-2" - } - ] - } +# Temporarily removed +# def test_get_fibre_info(mocker): +# +# ims = mocker.patch('inventory_provider.db.ims.IMS') +# with open('test/data/ims_fibre_data.json') as data: +# ims.return_value.get_filtered_entities.return_value = json.load(data) +# +# ds = inventory_provider.db.ims.IMS( +# 'dummy_base', 'dummy_username', 'dummy_password') +# +# res = {ne: fs for ne, fs in get_fibre_info(ds)} +# +# ds.get_filtered_entities.assert_called_once_with( +# 'Circuit', +# 'product.name == "wdm" | speed.name == "ots" | vendor == "infinera"', +# [ +# inventory_provider.db.ims.CIRCUIT_PROPERTIES['SubCircuits'], +# inventory_provider.db.ims.CIRCUIT_PROPERTIES['CalculatedNode'], +# inventory_provider.db.ims.CIRCUIT_PROPERTIES['PortA'], +# inventory_provider.db.ims.CIRCUIT_PROPERTIES['PortB'], +# ], +# step_count=1000 +# ) +# +# assert res == { +# "BUD01-DTNX10-1-3": [ +# { +# "circuit_id": 659616, +# "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", +# "df_route_id": 662153, +# "df_status": "operational", +# "ne": "BUD01-DTNX10-1-3" +# } +# ], +# "KOM-OLA1-1": [ +# { +# "circuit_id": 659617, +# "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", +# "df_route_id": 662153, +# "df_status": "operational", +# "ne": "KOM-OLA1-1" +# } +# ], +# "SZE-OLA1-1": [ +# { +# "circuit_id": 659616, +# "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", +# "df_route_id": 662153, +# "df_status": "operational", +# "ne": "SZE-OLA1-1" +# } +# ], +# "ZAG01-DTNX10-1-2": [ +# { +# "circuit_id": 659617, +# "df_route": "BUDAPEST-ZAGREB-OS160-001(UNKNOWN)", +# "df_route_id": 662153, +# "df_status": "operational", +# "ne": "ZAG01-DTNX10-1-2" +# } +# ] +# } def test_lookup_lg_routers(mocker): @@ -308,8 +302,8 @@ def test_lookup_lg_routers(mocker): 'Name like MX', inventory_provider.db.ims.EQUIP_DEF_PROPERTIES['Nodes']) - assert ds.get_entity_by_id.call_count == 35 - assert len(res) == 35 + assert ds.get_entity_by_id.call_count == 36 + assert len(res) == 36 pop = { 'name': 'pop name',