diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py index a6967032cd7b72f37078e70c8b8886f39f809cc0..89256f0e787910b924f9d13151b38568b5f1e948 100644 --- a/inventory_provider/db/ims_data.py +++ b/inventory_provider/db/ims_data.py @@ -635,17 +635,20 @@ def lookup_geant_nodes(ds: IMS): @log_entry_and_exit -def get_router_vendors(ds: IMS): +def get_equipment_details(ds: IMS): ed_nav_properties = [ ims.EQUIP_DEF_PROPERTIES['Nodes'], ims.EQUIP_DEF_PROPERTIES['Vendor'] ] - for ed in ds.get_filtered_entities( - 'equipmentdefinition', - 'equipmentkind == ROUTER', - ed_nav_properties): - for r in ed.get('nodes', []): - yield r['name'], ed.get('vendor', {}).get('name', None) + for ed in ds.get_all_entities('equipmentdefinition', ed_nav_properties): + vendor = ed.get('vendor', {}) + vendor_name = vendor.get('name', 'UNKNOWN') if vendor else 'UNKNOWN' + for node in ed.get('nodes', []): + yield { + 'name': node['name'], + 'model': ed.get('name', 'UNKNOWN'), + 'vendor': vendor_name + } @log_entry_and_exit diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index e11bf16e3f42708a492c15f390e32125c3c2fa6d..843f805a0e3a8cfff0cb602d4a7e193c28317457 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -509,7 +509,6 @@ def update_entry_point(self): ), final_task.si().on_error(task_error_handler.s()) )() - return self.request.id except (RedisError, KombuError): update_latch_status(InventoryTask.config, pending=False, failure=True) @@ -1116,6 +1115,7 @@ def _extract_ims_data( flexils_data = {} customers = {} customer_regions = {} + equipment_details = [] hierarchy = {} port_id_details = defaultdict(list) @@ -1240,6 +1240,11 @@ def _extract_ims_data( d['id']: d for d in ims_data.get_circuit_hierarchy(ds=_ds())} logger.debug("hierarchy complete") + @log_task_entry_and_exit + def _populate_equipment_details(): + nonlocal equipment_details + equipment_details = list(ims_data.get_equipment_details(ds=_ds())) + @log_task_entry_and_exit def _populate_port_id_details(): nonlocal port_id_details @@ -1261,7 +1266,8 @@ def _extract_ims_data( executor.submit(_populate_circuit_info): 'circuit_info', executor.submit(_populate_flexils_data): 'flexils_data', executor.submit(_populate_customers): 'customers', - executor.submit(_populate_customer_regions): 'customer_regions' + executor.submit(_populate_customer_regions): 'customer_regions', + executor.submit(_populate_equipment_details): 'equipment_details' } for future in concurrent.futures.as_completed(futures): @@ -1287,7 +1293,8 @@ def _extract_ims_data( 'geant_nodes': geant_nodes, 'flexils_data': flexils_data, 'customers': customers, - 'customer_regions': customer_regions + 'customer_regions': customer_regions, + 'equipment_details': equipment_details } @@ -1968,6 +1975,23 @@ def populate_mic_cache(interface_services, r): r.set(cache_key, result.encode('utf-8')) +def _populate_equipment_vendors(): + r = get_next_redis(InventoryTask.config) + populate_equipment_vendors(r) + + +def populate_equipment_vendors(r): + equipment_details = json.loads(r.get('ims:cache:equipment_details').decode('utf-8')) + router_vendors = json.loads(r.get('netdash').decode('utf-8')) + equipment_details.extend({ + 'name': r, + 'model': 'UNKNOWN', + 'vendor': v} for r, v in router_vendors.items()) + # equipment_vendors.update(router_vendors) + for ed in equipment_details: + r.set(f'state-checker:equipment-vendors:{ed["name"]}', json.dumps(ed)) + + @app.task(base=InventoryTask, bind=True, name='final_task') @log_task_entry_and_exit def final_task(self): @@ -1976,6 +2000,7 @@ def final_task(self): if latch['failure']: raise InventoryTaskError('Sub-task failed - check logs for details') + _populate_equipment_vendors() _build_subnet_db(update_callback=self.log_info) _build_snmp_peering_db(update_callback=self.log_info) _build_router_peering_db(update_callback=self.log_info) diff --git a/test/test_ims_data.py b/test/test_ims_data.py index 436be65d8d956a2d936e4b7be86e08422dba0e67..6698e6f5dd40a3f9b9f4d0f4c5e28e9f5e6f131c 100644 --- a/test/test_ims_data.py +++ b/test/test_ims_data.py @@ -9,7 +9,8 @@ from inventory_provider.db.ims_data import lookup_lg_routers, \ get_node_locations, IMS_OPSDB_STATUS_MAP, \ get_port_id_services, get_port_details, \ get_circuit_hierarchy, get_ids_and_sids, NODE_LOCATION_SCHEMA, \ - get_flexils_by_circuitid, SITE_LOCATION_SCHEMA, get_site_locations + get_flexils_by_circuitid, SITE_LOCATION_SCHEMA, get_site_locations, \ + get_equipment_details def _json_test_data(filename): @@ -464,3 +465,84 @@ def test_get_flexils_by_circuit_id(mocker): 'dummy_base', 'dummy_username', 'dummy_password') res = get_flexils_by_circuitid(ds) assert res == expected_result + + +def test_get_equipment_details(mocker): + ims_data = [ + { + 'id': 1001, + 'name': 'Dummy ED 1', + 'vendorId': 9001, + 'vendor': { + 'id': 9001, + 'name': 'Dummy Vendor 1', + 'typeId': 1, + 'slaOnSiteId': None, + 'slaMainTimeToRepairId': None, + }, + 'nodes': [ + { + 'id': 7001, + 'name': 'Dummy Node 1', + 'equipmentDefinitionId': 1001, + 'inventoryStatusId': 3, + 'siteId': 6001, + 'ringId': 5001, + }, + { + 'id': 7002, + 'name': 'Dummy Node 2', + 'equipmentDefinitionId': 1001, + 'inventoryStatusId': 2, + 'siteId': 6001, + 'ringId': 5002, + } + ] + }, + { + 'id': 1002, + 'name': 'Dummy ED 2', + 'vendorId': 9002, + 'vendor': { + 'id': 9002, + 'name': 'Dummy Vendor 2', + 'typeId': 1, + 'slaOnSiteId': None, + 'slaMainTimeToRepairId': None, + }, + 'nodes': [ + { + 'id': 7003, + 'name': 'Dummy Node 3', + 'equipmentDefinitionId': 1002, + 'inventoryStatusId': 3, + 'siteId': 6001, + 'ringId': 5001, + } + ] + }, + { + 'id': 1003, + 'name': 'Dummy ED 3', + 'vendorId': 9002, + 'vendor': { + 'id': 9002, + 'name': 'Dummy Vendor 2', + 'typeId': 1, + 'slaOnSiteId': None, + 'slaMainTimeToRepairId': None, + }, + 'nodes': [] + } + ] + ims = mocker.patch('inventory_provider.db.ims.IMS') + ims.return_value.get_all_entities.return_value = ims_data + + ds = inventory_provider.db.ims.IMS('xxx', 'xxx', 'xxx') + equipment_details = list(get_equipment_details(ds)) + expected_result = [ + {'name': 'Dummy Node 1', 'model': 'Dummy ED 1', 'vendor': 'Dummy Vendor 1'}, + {'name': 'Dummy Node 2', 'model': 'Dummy ED 1', 'vendor': 'Dummy Vendor 1'}, + {'name': 'Dummy Node 3', 'model': 'Dummy ED 2', 'vendor': 'Dummy Vendor 2'} + ] + assert equipment_details == expected_result