diff --git a/inventory_provider/tasks/ims_worker.py b/inventory_provider/tasks/ims_worker.py index 87ee77be00dd9ebf6f6deb610da89c3968113296..1da774f6c1b48bc4c9d4f1ef430a9d7cea78721c 100644 --- a/inventory_provider/tasks/ims_worker.py +++ b/inventory_provider/tasks/ims_worker.py @@ -3,6 +3,7 @@ import json import logging import subprocess import tempfile +from collections import defaultdict from datetime import datetime from enum import IntFlag from pathlib import Path @@ -21,6 +22,41 @@ environment.setup_logging() logger = logging.getLogger(__name__) +@app.task( + base=InventoryTask, bind=True, name='update_interfaces_to_services_ims') +@log_task_entry_and_exit +def update_interfaces_to_services_ims(self, use_current=False): + interface_services = defaultdict(list) + + c = InventoryTask.config["ims"] + ds = IMS(c['api'], c['username'], c['password']) + + for service in ims_data.get_interface_services(ds): + equipment_interface = '%s:%s' % ( + service['equipment'], service['interface_name']) + interface_services[equipment_interface].append(service) + + + if use_current: + r = get_current_redis(InventoryTask.config) + # scan with bigger batches, to mitigate network latency effects + else: + r = get_next_redis(InventoryTask.config) + + rp = r.pipeline() + # scan with bigger batches, to mitigate network latency effects + for key in r.scan_iter('ims:interface_services:*', count=1000): + rp.delete(key) + rp.execute() + + rp = r.pipeline() + for equipment_interface, services in interface_services.items(): + rp.set( + f'ims:interface_services:{equipment_interface}', + json.dumps(services)) + rp.execute() + + @app.task(base=InventoryTask, bind=True, name='update_circuit_hierarchy_ims') @log_task_entry_and_exit def update_circuit_hierarchy_ims(self, use_current=False):