From 5a24f5f1630ba013b952193a43520d7299abc36d Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Fri, 1 Mar 2019 16:21:06 +0100
Subject: [PATCH] added service info to bgp peer info response

---
 inventory_provider/routes/classifier.py | 26 ++++++++++++++++++++++++-
 test/test_classifier_routes.py          | 15 +++++++++++++-
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index a39f7a0d..5a0cf4d5 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 e4ec2b5d..2382d76f 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
-- 
GitLab