diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index 9590db91abfa7e0a2874e57db34d83cdd958067a..f84caf74e48ffe6cca6178d767ebf254dcd41579 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -1154,12 +1154,10 @@ def check_task_status(task_id, parent=None, forget=False): @app.task(base=InventoryTask, bind=True, name='update_entry_point') @log_task_entry_and_exit def update_entry_point(self): - - self.log_info('querying netdash for managed routers') - routers = list(juniper.load_routers_from_netdash( - InventoryTask.config['managed-routers'])) - self.log_info(f'found {len(routers)} routers') - + routers = retrieve_and_persist_neteng_managed_device_list( + info_callback=self.log_info, + warning_callback=self.log_warning + ) lab_routers = InventoryTask.config.get('lab-routers', []) _erase_next_db_chorded(InventoryTask.config) @@ -1195,6 +1193,44 @@ def empty_task(self, message): logger.warning(f'message from empty task: {message}') +def retrieve_and_persist_neteng_managed_device_list( + info_callback=lambda s: None, + warning_callback=lambda s: None): + netdash_equipment = None + try: + info_callback('querying netdash for managed routers') + netdash_equipment = list(juniper.load_routers_from_netdash( + InventoryTask.config['managed-routers'])) + except Exception as e: + warning_callback(f'Error retrieving device list: {e}') + + if netdash_equipment: + info_callback(f'found {len(netdash_equipment)} routers') + else: + warning_callback('No devices retrieved, using previous list') + try: + current_r = get_current_redis(InventoryTask.config) + netdash_equipment = current_r.get('netdash') + netdash_equipment = json.loads(netdash_equipment.decode('utf-8')) + if not netdash_equipment: + raise InventoryTaskError( + 'No equipment retrieved from previous list') + except Exception as e: + warning_callback(str(e)) + update_latch_status(pending=False, failure=True) + raise e + + try: + next_r = get_next_redis(InventoryTask.config) + next_r.set('netdash', json.dumps(netdash_equipment)) + info_callback(f'saved {len(netdash_equipment)} managed routers') + except Exception as e: + warning_callback(str(e)) + update_latch_status(pending=False, failure=True) + raise e + return netdash_equipment + + # updated with transaction def _erase_next_db_chorded(config): """ diff --git a/test/test_worker.py b/test/test_worker.py index 2952b9ccaf5248aa9e0835995d1db3585a4150a7..3a4190eb99c83906263c6316fcd847119b71ca5f 100644 --- a/test/test_worker.py +++ b/test/test_worker.py @@ -1,6 +1,9 @@ +import json + from inventory_provider.tasks import common from inventory_provider.tasks.worker import transform_ims_data, \ - extract_ims_data, persist_ims_data + extract_ims_data, persist_ims_data, \ + retrieve_and_persist_neteng_managed_device_list def test_extract_ims_data(mocker): @@ -301,3 +304,23 @@ def test_persist_ims_data(mocker, data_config, mocked_redis): assert [k.decode("utf-8") for k in r.keys("poller_cache:*")] == \ ["poller_cache:eq1", "poller_cache:eq2"] + + +def test_retrieve_and_persist_neteng_managed_device_list( + mocker, data_config, mocked_redis): + device_list = ['abc', 'def'] + r = common._get_redis(data_config) + + mocker.patch( + 'inventory_provider.tasks.worker.InventoryTask.config' + ) + mocker.patch('inventory_provider.tasks.worker.get_next_redis', + return_value=r) + r.delete('netdash') + mocked_j = mocker.patch( + 'inventory_provider.tasks.worker.juniper.load_routers_from_netdash' + ) + mocked_j.return_value = device_list + result = retrieve_and_persist_neteng_managed_device_list() + assert result == device_list + assert json.loads(r.get('netdash')) == device_list