diff --git a/README.md b/README.md index ce5bae612ad114335184d67bb025824aea71cf29..c72e501aa07c52a1e6711c91f39c872eb9d2df6e 100644 --- a/README.md +++ b/README.md @@ -444,6 +444,19 @@ Any non-empty responses are JSON formatted messages. "required": [ "name", "interface address", "interface name", "router"], "additionalProperties": False + }, + "service-info": { + "type": "object" + }, + "interface-lookup-info": { + "type": "object", + "properties": { + "interface": {"$ref": "#/definitions/interface-info"}, + "services": { + "type": "array", + "items": {"$ref": "#/definitions/service-info"} + } + } } }, @@ -455,7 +468,7 @@ Any non-empty responses are JSON formatted messages. "vpn-rr-peer-info": {"$ref": "#/definitions/vpn-rr-peer"}, "interfaces": { "type": "array", - "items": {"$ref": "#/definitions/interface-info"} + "items": {"$ref": "#/definitions/interface-lookup-info"} } }, "additionalProperties": False diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index a39f7a0de0dc8ab1c1bdc5c109289a5568260509..5a0cf4d53c5063504966df0b799c6eb7430042fc 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -88,6 +88,30 @@ def find_interfaces(address): yield info +def find_interfaces_and_services(address): + """ + + :param address: an ipaddress object + :return: + """ + r = common.get_redis() + for interface in find_interfaces(address): + + services = r.get( + 'opsdb:interface_services:%s:%s' % ( + interface['router'], + interface['interface name'])) + if not services: + services = [] + else: + services = json.loads(services.decode('utf=8')) + + yield { + 'interface': interface, + 'services': services + } + + @routes.route("/peer-info/<address>", methods=['GET', 'POST']) @common.require_accepts_json def peer_info(address): @@ -124,7 +148,7 @@ def peer_info(address): info = info.decode('utf-8') result['vpn-rr-peer-info'] = json.loads(info) - interfaces = list(find_interfaces(address_obj)) + interfaces = list(find_interfaces_and_services(address_obj)) if interfaces: result['interfaces'] = interfaces diff --git a/test/test_classifier_routes.py b/test/test_classifier_routes.py index e4ec2b5d6e696bd9d130b5e87a0c3ed08cb34b8c..2382d76fc01e3c9f95ccbe9fad460a4665dbe1a4 100644 --- a/test/test_classifier_routes.py +++ b/test/test_classifier_routes.py @@ -101,6 +101,19 @@ def test_peer_info( "required": [ "name", "interface address", "interface name", "router"], "additionalProperties": False + }, + "service-info": { + "type": "object" + }, + "interface-lookup-info": { + "type": "object", + "properties": { + "interface": {"$ref": "#/definitions/interface-info"}, + "services": { + "type": "array", + "items": {"$ref": "#/definitions/service-info"} + } + } } }, @@ -112,7 +125,7 @@ def test_peer_info( "vpn-rr-peer-info": {"$ref": "#/definitions/vpn-rr-peer"}, "interfaces": { "type": "array", - "items": {"$ref": "#/definitions/interface-info"} + "items": {"$ref": "#/definitions/interface-lookup-info"} } }, "additionalProperties": False