diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 0f271d713a450989f00a6178a543eed765fcaa68..5d476109adc4430f5e90dd13f4bb7c4eb458826d 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -132,8 +132,8 @@ def related_interfaces(hostname, interface): def get_related_services(source_equipment: str, interface: str, r) -> dict: """ - Finds the top-level-services for the given interface - and also gets the top-level-services for the related interfaces + Finds the related-services for the given interface + and also gets the related-services for the related interfaces e.g. ae20 will also find services on all logical units of ae20 (ae20.1 ...) :param source_equipment: equipment name :param interface: interface name @@ -146,14 +146,14 @@ def get_related_services(source_equipment: str, interface: str, r) -> dict: f'{ims_interface}') if if_services: for s in json.loads(if_services.decode('utf-8')): - yield from s['top-level-services'] + yield from s['related-services'] for related in related_interfaces(source_equipment, interface): ims_interface = get_ims_interface(related) rif_services = r.get( f'ims:interface_services:{ims_source_equipment}:{ims_interface}') if rif_services: for s in json.loads(rif_services.decode('utf-8')): - yield from s['top-level-services'] + yield from s['related-services'] def get_interface_services_and_loc(ims_source_equipment, ims_interface, redis): @@ -746,7 +746,7 @@ def get_fiberlink_trap_metadata(ne_name_str: str, object_name_str: str) \ for fr in c['fibre-routes']: fr_a_ids.add(fr['id']) all_frs[fr['id']] = fr - for fr in c['top-level-services']: + for fr in c['related-services']: tls_a_ids.add(fr['id']) all_tls[fr['id']] = fr if circuits_b: @@ -756,7 +756,7 @@ def get_fiberlink_trap_metadata(ne_name_str: str, object_name_str: str) \ for fr in c['fibre-routes']: fr_b_ids.add(fr['id']) all_frs[fr['id']] = fr - for fr in c['top-level-services']: + for fr in c['related-services']: tls_b_ids.add(fr['id']) all_tls[fr['id']] = fr diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py index 0c35263fbec2af831a8b04b0cc3750dccdd7235f..73681162903e04ee84751946535c6a05e1c1526d 100644 --- a/inventory_provider/routes/poller.py +++ b/inventory_provider/routes/poller.py @@ -166,8 +166,8 @@ def _load_interface_bundles(hostname=None): def _load_services(hostname=None): - if hostname: - hostname = get_ims_equipment_name(hostname) + # if hostname: + # hostname = get_ims_equipment_name(hostname) result = dict() key_pattern = f'ims:interface_services:{hostname}:*' \ @@ -272,6 +272,9 @@ def _add_circuits(interfaces, hostname=None): :param hostname: hostname or None for all :return: generator with 'circuits' populated in each element, if present """ + + if hostname: + hostname = get_ims_equipment_name(hostname) services = _load_services(hostname) for ifc in interfaces: router_services = services.get( diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index b694cb23e1d19ba7029b71aae4e7c60084314a0d..9ecc442f2ab461417c178145f7ba7fd317b16808 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -532,6 +532,30 @@ def internal_refresh_phase_2(self): raise +def populate_poller_cache(interface_services, r): + host_services = defaultdict(dict) + for v in interface_services.values(): + # logger.debug(v) + if v: + h = v[0]['equipment'] + i = v[0]['port'] + host_services[h][i] = [{ + 'id': s['id'], + 'name': s['name'], + 'type': s['service_type'], + 'status': s['status'] + } for s in v] + # todo - delete from redis + rp = r.pipeline() + for k in r.scan_iter('poller_cache:*', count=1000): + rp.delete(k) + rp.execute() + rp = r.pipeline() + for host, interface_services in host_services.items(): + rp.set(f'poller_cache:{host}', json.dumps(interface_services)) + rp.execute() + + @app.task( base=InventoryTask, bind=True, @@ -639,12 +663,12 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): # are the BGP services on top of it tls_names.remove('IP PEERING - NON R&E (PUBLIC)') - def get_top_level_services(circuit_id: str) -> List[dict]: - tls = {} + def _get_related_services(circuit_id: str) -> List[dict]: + rs = {} c = hierarchy.get(circuit_id, None) if c: - def _is_tls(candidate): + def _is_rs(candidate): if candidate['id'] in circuit_ids_not_to_monitor: return False if candidate['product'] in tls_names: @@ -653,8 +677,8 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): return True return False - if _is_tls(c): - tls[c['id']] = { + if _is_rs(c): + rs[c['id']] = { 'id': c['id'], 'name': c['name'], 'status': c['status'], @@ -662,12 +686,12 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): 'project': c['project'], 'contacts': sorted(list(c['contacts'])) } - elif c['sub-circuits']: + if c['sub-circuits']: for sub in c['sub-circuits']: temp_parents = \ - get_top_level_services(sub) - tls.update({t['id']: t for t in temp_parents}) - return list(tls.values()) + _get_related_services(sub) + rs.update({t['id']: t for t in temp_parents}) + return list(rs.values()) def _format_service(s): if s['id'] in circuit_ids_not_to_monitor: @@ -740,10 +764,10 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): c['monitored'] = True circ['fibre-routes'].append(c) - circ['top-level-services'] = \ - get_top_level_services(circ['id']) + circ['related-services'] = \ + _get_related_services(circ['id']) - for tlc in circ['top-level-services']: + for tlc in circ['related-services']: contacts.update(tlc.pop('contacts')) circ['contacts'] = sorted(list(contacts)) @@ -783,6 +807,8 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False): rp.execute() rp = r.pipeline() + populate_poller_cache(interface_services, r) + for v in access_services.values(): rp.set( f'ims:access_services:{v["name"]}', diff --git a/test/data/router-info.json b/test/data/router-info.json index 4f5cd377c493f890fc8ebb7f202ec8badae2049a..87d749d32930dd71e60cc2075f06f02ad72cd1eb 100644 Binary files a/test/data/router-info.json and b/test/data/router-info.json differ