diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index c98f7068e6c4c7b2e1c8f47f75bfe9c74f94b484..9f0f372ab10556e51cc87765d0900cfca2d29029 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -75,6 +75,24 @@ def ix_peering_group(ix_public_peer_info): yield peer['name'] +def find_interfaces(address_string): + """ + TODO: this is probably the least efficient way of doing this + (if it's a problem, pre-compute these lists) + + :param address: string representation of an address + :return: + """ + address = ipaddress.ip_address(address_string) + r = common.get_redis() + for k in r.keys('reverse_interface_addresses:*'): + info = r.get(k.decode('utf-8')).decode('utf-8') + info = json.loads(info) + interface = ipaddress.ip_interface(info['interface address']) + if address in interface.network: + yield info + + @routes.route("/peer-info/<address>", methods=['GET', 'POST']) @common.require_accepts_json def peer_info(address): @@ -96,6 +114,10 @@ def peer_info(address): info = info.decode('utf-8') result['vpn-rr-peer-info'] = json.loads(info) + interfaces = list(find_interfaces(address)) + if interfaces: + result['interfaces'] = interfaces + if not result: return Response( response='no peering info found for %s' % address,