diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 61e6bdacdf9dfc13e758eba86a98816c51f526c1..2fc5c641379433fc378ff1af013aba05ec035fda 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -336,7 +336,7 @@ def _asn_group_info(redis, address): raise ClassifierProcessingError( f'unable to parse {address} as an ip address') - all_peerings = redis.get(f'juniper-peerings:remote:{address}') + all_peerings = redis.get(f'router-peerings:remote:{address}') if not all_peerings: return None @@ -351,7 +351,7 @@ def _asn_group_info(redis, address): f'found multiple asn''s for {address}, ' f'using {peer_asn} and ignoring {all_asn}') - peerings_this_asn = redis.get(f'juniper-peerings:peer-asn:{peer_asn}') + peerings_this_asn = redis.get(f'router-peerings:peer-asn:{peer_asn}') if not peerings_this_asn: logger.error( f'internal data corruption, no peerings found for asn {peer_asn}') @@ -397,7 +397,7 @@ def _vpn_rr_peering_info(redis, address): raise ClassifierProcessingError( f'unable to parse {address} as an ip address') - all_peerings = redis.get(f'juniper-peerings:remote:{address}') + all_peerings = redis.get(f'router-peerings:remote:{address}') if not all_peerings: return None @@ -448,7 +448,7 @@ def _ix_peering_info(redis, address): raise ClassifierProcessingError( f'unable to parse {address} as an ip address') - all_peerings = redis.get(f'juniper-peerings:remote:{address}') + all_peerings = redis.get(f'router-peerings:remote:{address}') if not all_peerings: return None @@ -481,7 +481,7 @@ def _ix_peering_info(redis, address): # regex needed??? (e.g. tabs???) peering_group_name = peer_info['description'].split(' ')[0] peering_group = redis.get( - f'juniper-peerings:ix-groups:{peering_group_name}') + f'router-peerings:ix-groups:{peering_group_name}') if peering_group: peering_group = peering_group.decode('utf-8') return_value['group'] = sorted(json.loads(peering_group)) diff --git a/inventory_provider/routes/msr.py b/inventory_provider/routes/msr.py index b65692acea4d28f4797327ccc28d4a0c0704fc8f..ac2aa9b98afff35c6ea537e8f8ccad1853769573 100644 --- a/inventory_provider/routes/msr.py +++ b/inventory_provider/routes/msr.py @@ -539,7 +539,7 @@ def logical_system_peerings(name=None): return _handle_peering_group_request( name=name, cache_key='classifier-cache:msr:logical-system-peerings', - group_key_base='juniper-peerings:logical-system') + group_key_base='router-peerings:logical-system') @routes.route('/bgp/group-peerings', methods=['GET']) @@ -558,7 +558,7 @@ def bgp_group_peerings(name=None): return _handle_peering_group_request( name=name, cache_key='classifier-cache:msr:group-peerings', - group_key_base='juniper-peerings:group') + group_key_base='router-peerings:group') @routes.route('/bgp/routing-instance-peerings', methods=['GET']) @@ -577,7 +577,7 @@ def bgp_routing_instance_peerings(name=None): return _handle_peering_group_request( name=name, cache_key='classifier-cache:msr:routing-instance-peerings', - group_key_base='juniper-peerings:routing-instance') + group_key_base='router-peerings:routing-instance') def _handle_peering_group_list_request(cache_key, group_key_base): @@ -635,7 +635,7 @@ def get_logical_systems(): """ # noqa: E501 return _handle_peering_group_list_request( cache_key='classifier-cache:msr:logical-systems', - group_key_base='juniper-peerings:logical-system') + group_key_base='router-peerings:logical-system') @routes.route('/bgp/groups', methods=['GET']) @@ -651,7 +651,7 @@ def get_peering_groups(): """ # noqa: E501 return _handle_peering_group_list_request( cache_key='classifier-cache:msr:peering-groups', - group_key_base='juniper-peerings:group') + group_key_base='router-peerings:group') @routes.route('/bgp/routing-instances', methods=['GET']) @@ -667,7 +667,7 @@ def get_peering_routing_instances(): """ # noqa: E501 return _handle_peering_group_list_request( cache_key='classifier-cache:msr:routing-instances', - group_key_base='juniper-peerings:routing-instance') + group_key_base='router-peerings:routing-instance') @routes.route('/access-services', methods=['GET']) @@ -986,7 +986,7 @@ def _load_redundant_access_peers(): # but this can be expanded here in future redundant_access_groups = ['eGEANT'] for g in redundant_access_groups: - doc = r.get(f'juniper-peerings:group:{g}') + doc = r.get(f'router-peerings:group:{g}') for peer in json.loads(doc.decode('utf-8')): result[peer['address']] = peer['remote-asn'] @@ -1163,7 +1163,7 @@ def bgp_all_peerings(): """ r = common.get_current_redis() - response = r.get('juniper-peerings:all') + response = r.get('router-peerings:all') return Response(response.decode('utf-8'), mimetype="application/json") @@ -1261,9 +1261,9 @@ def mdvpn(): response = _ignore_cache_or_retrieve(request, cache_key, r) if not response: bgplu = json.loads( - r.get('juniper-peerings:group:BGPLU').decode('utf-8')) + r.get('router-peerings:group:BGPLU').decode('utf-8')) vpnrr = json.loads( - r.get('juniper-peerings:group:VPN-RR').decode('utf-8')) + r.get('router-peerings:group:VPN-RR').decode('utf-8')) bgplu_index = _make_group_index(bgplu, 'remote-asn') vpnrr_index = _make_group_index(vpnrr, 'remote-asn') config = current_app.config['INVENTORY_PROVIDER_CONFIG'] @@ -1359,7 +1359,7 @@ def vpn_proxy(): response = _ignore_cache_or_retrieve(request, cache_key, r) if not response: vpnproxy = json.loads( - r.get('juniper-peerings:logical-system:VPN-PROXY').decode('utf-8')) + r.get('router-peerings:logical-system:VPN-PROXY').decode('utf-8')) peerings = list(_format_peerings(vpnproxy)) response = json.dumps(peerings) return Response(response, mimetype='application/json') @@ -1398,7 +1398,7 @@ def _asn_peers(asn, group, instance): r = common.get_current_redis() def _get_filtered_peers_for_asn(asn, nren, group, instance): - peers = json.loads(r.get(f'juniper-peerings:peer-asn:{asn}')) + peers = json.loads(r.get(f'router-peerings:peer-asn:{asn}')) def _attribute_filter(peer, name, value): if value is None: @@ -1538,7 +1538,7 @@ def _load_ip_services(): # pre-compute remote ipaddress objects, and group to avoid duplicates r = common.get_current_redis() all_peerings = {} - for _remote in json.loads(r.get('juniper-peerings:all').decode('utf-8')): + for _remote in json.loads(r.get('router-peerings:all').decode('utf-8')): remote_info = all_peerings.setdefault(_remote['address'], { 'address': ipaddress.ip_address(_remote['address']), 'info': [] diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index bf95aab9a08fdce57ad68606b3eaa58d64028a21..90b1271f23238f764ca8aac6270e9f8da9ac03d4 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -280,7 +280,7 @@ def _build_subnet_db(update_callback=lambda s: None): rp.execute() -def _build_juniper_peering_db(update_callback=lambda s: None): +def _build_router_peering_db(update_callback=lambda s: None): def _is_ix(peering_info): if peering_info.get('instance', '') != 'IAS': return False @@ -305,33 +305,37 @@ def _build_juniper_peering_db(update_callback=lambda s: None): peerings_per_routing_instance = {} all_peerings = [] - # scan with bigger batches, to mitigate network latency effects - key_prefix = 'juniper-peerings:hosts:' - for k in r.scan_iter(f'{key_prefix}*', count=1000): - key_name = k.decode('utf-8') - hostname = key_name[len(key_prefix):] - host_peerings = r.get(key_name).decode('utf-8') - host_peerings = json.loads(host_peerings) - for p in host_peerings: - p['hostname'] = hostname - peerings_per_address.setdefault(p['address'], []).append(p) - if _is_ix(p): - ix_peerings.append(p) - asn = p.get('remote-asn', None) - if asn: - peerings_per_asn.setdefault(asn, []).append(p) - logical_system = p.get('logical-system', None) - if logical_system: - peerings_per_logical_system.setdefault( - logical_system, []).append(p) - group = p.get('group', None) - if group: - peerings_per_group.setdefault(group, []).append(p) - routing_instance = p.get('instance', None) - if routing_instance: - peerings_per_routing_instance.setdefault( - routing_instance, []).append(p) - all_peerings.append(p) + def _build_peering_details(key_prefix): + # scan with bigger batches, to mitigate network latency effects + for _k in r.scan_iter(f'{key_prefix}*', count=1000): + key_name = _k.decode('utf-8') + hostname = key_name[len(key_prefix):] + host_peerings = r.get(key_name).decode('utf-8') + host_peerings = json.loads(host_peerings) + for _p in host_peerings: + _p['hostname'] = hostname + peerings_per_address.setdefault(_p['address'], []).append(_p) + if _is_ix(_p): + ix_peerings.append(_p) + asn = _p.get('remote-asn', None) + if asn: + peerings_per_asn.setdefault(asn, []).append(_p) + logical_system = _p.get('logical-system', None) + if logical_system: + peerings_per_logical_system.setdefault( + logical_system, []).append(_p) + group = _p.get('group', None) + if group: + peerings_per_group.setdefault(group, []).append(_p) + routing_instance = _p.get('instance', None) + if routing_instance: + peerings_per_routing_instance.setdefault( + routing_instance, []).append(_p) + all_peerings.append(_p) + + key_prefixes = ('juniper-peerings:hosts:', 'nokia-peerings:hosts:') + for k in key_prefixes: + _build_peering_details(k) # sort ix peerings by group ix_groups = {} @@ -343,42 +347,42 @@ def _build_juniper_peering_db(update_callback=lambda s: None): rp = r.pipeline() # for use with /msr/bgp - rp.set('juniper-peerings:all', json.dumps(all_peerings)) + rp.set('router-peerings:all', json.dumps(all_peerings)) # create peering entries, keyed by remote addresses update_callback(f'saving {len(peerings_per_address)} remote peers') for k, v in peerings_per_address.items(): - rp.set(f'juniper-peerings:remote:{k}', json.dumps(v)) + rp.set(f'router-peerings:remote:{k}', json.dumps(v)) # create pivoted ix group name lists update_callback(f'saving {len(ix_groups)} remote ix peering groups') for k, v in ix_groups.items(): group_addresses = list(v) - rp.set(f'juniper-peerings:ix-groups:{k}', json.dumps(group_addresses)) + rp.set(f'router-peerings:ix-groups:{k}', json.dumps(group_addresses)) # create pivoted asn peering lists update_callback(f'saving {len(peerings_per_asn)} asn peering lists') for k, v in peerings_per_asn.items(): - rp.set(f'juniper-peerings:peer-asn:{k}', json.dumps(v)) + rp.set(f'router-peerings:peer-asn:{k}', json.dumps(v)) # create pivoted logical-systems peering lists update_callback( f'saving {len(peerings_per_logical_system)}' ' logical-system peering lists') for k, v in peerings_per_logical_system.items(): - rp.set(f'juniper-peerings:logical-system:{k}', json.dumps(v)) + rp.set(f'router-peerings:logical-system:{k}', json.dumps(v)) # create pivoted group peering lists update_callback( f'saving {len(peerings_per_group)} group peering lists') for k, v in peerings_per_group.items(): - rp.set(f'juniper-peerings:group:{k}', json.dumps(v)) + rp.set(f'router-peerings:group:{k}', json.dumps(v)) # create pivoted routing instance peering lists update_callback( f'saving {len(peerings_per_routing_instance)} group peering lists') for k, v in peerings_per_routing_instance.items(): - rp.set(f'juniper-peerings:routing-instance:{k}', json.dumps(v)) + rp.set(f'router-peerings:routing-instance:{k}', json.dumps(v)) rp.execute() @@ -613,6 +617,7 @@ def _reload_router_config_nokia( refresh_nokia_interface_list(hostname, netconf_doc, r, lab) communities = _nokia_community_strings(InventoryTask.config) snmp_refresh_interfaces_nokia(hostname, state_doc, communities, r, info_callback) + refresh_nokia_bgp_peers(hostname, netconf_doc) def retrieve_and_persist_config_nokia( @@ -796,6 +801,13 @@ def refresh_nokia_interface_list(hostname, netconf_config, redis, lab=False): rp.execute() +@log_task_entry_and_exit +def refresh_nokia_bgp_peers(hostname, netconf): + host_peerings = list(nokia.get_all_bgp_peers(netconf)) + r = get_next_redis(InventoryTask.config) + r.set(f'nokia-peerings:hosts:{hostname}', json.dumps(host_peerings)) + + @app.task(base=InventoryTask, bind=True, name='reload_lab_router_juniper') @log_task_entry_and_exit def reload_lab_router_config_juniper(self, hostname): @@ -1934,7 +1946,7 @@ def final_task(self): _build_subnet_db(update_callback=self.log_info) _build_snmp_peering_db(update_callback=self.log_info) - _build_juniper_peering_db(update_callback=self.log_info) + _build_router_peering_db(update_callback=self.log_info) populate_poller_interfaces_cache(warning_callback=self.log_warning) populate_error_report_interfaces_cache(warning_callback=self.log_warning) collate_netconf_interfaces_all_cache(warning_callback=self.log_warning) diff --git a/test/data/router-info.json b/test/data/router-info.json index 5352029a65d23d054d1e445be633de72732417e2..7e9f541c2c1114275c43ad48b98d4b4a70e46651 100644 Binary files a/test/data/router-info.json and b/test/data/router-info.json differ diff --git a/test/test_worker_utils.py b/test/test_worker_utils.py index ed5a42256a5431e6a9002d01707f845a6db317ba..b3604d00887bd0ccad7405991afb29e1e0cc7f77 100644 --- a/test/test_worker_utils.py +++ b/test/test_worker_utils.py @@ -102,7 +102,7 @@ def test_build_subnet_db(mocked_worker_module, data_config_filename): assert unmanaged_interfaces <= all_subnet_interfaces -def test_build_juniper_peering_db(mocked_worker_module): +def test_build_router_peering_db(mocked_worker_module): """ Verify that valid juniper peering db objects are created. @@ -114,19 +114,17 @@ def test_build_juniper_peering_db(mocked_worker_module): db = backend_db() # also forces initialization - # remove the juniper-peerings:* items that + # remove the router-peerings:* items that # will be created by _build_juniper_peering_db def _x(k): - if not k.startswith('juniper-peerings'): - return False - if k.startswith('juniper-peerings:hosts:'): + if not k.startswith('router-peerings'): return False return True for k in list(filter(_x, db.keys())): del db[k] - worker._build_juniper_peering_db() + worker._build_router_peering_db() found_record = False found_logical_system = False @@ -141,7 +139,7 @@ def test_build_juniper_peering_db(mocked_worker_module): found_record = True - if key.startswith('juniper-peerings:ix-groups:'): + if key.startswith('router-peerings:ix-groups:'): for address in value: canonical = ipaddress.ip_interface(address).ip.exploded assert address == canonical