From 73692ced5c7a8a7e3e49b5333433145e0df7617d Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Sun, 14 Feb 2021 12:30:09 +0100
Subject: [PATCH] added additional tests for logical-system & group peerings

---
 inventory_provider/routes/msr.py | 66 ++++++++++++++++++++++++++++++++
 test/test_worker_utils.py        | 16 ++++++++
 2 files changed, 82 insertions(+)

diff --git a/inventory_provider/routes/msr.py b/inventory_provider/routes/msr.py
index ce17ae63..e8018baf 100644
--- a/inventory_provider/routes/msr.py
+++ b/inventory_provider/routes/msr.py
@@ -38,6 +38,30 @@ ACCESS_SERVICES_LIST_SCHEMA = {
 }
 
 
+LOGICAL_SYSTEM_PEERING_LIST_SCHEMA = {
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "definitions": {
+        "peering-instance": {
+            "type": "object",
+            "properties": {
+                "address": {"type": "string"},
+                "description": {"type": "string"},
+                "logical-system": {"type": "string"},
+                "group": {"type": "string"},
+                "hostname": {"type": "string"},
+                "remote-asn": {"type": "integer"}
+            },
+            # only vrr peerings have remote-asn
+            "required": [
+                "address", "description", "logical-system", "group", "hostname"],
+            "additionalProperties": False
+        }
+    },
+    "type": "array",
+    "items": {"$ref": "#/definitions/peering-instance"}
+}
+
+
 @routes.after_request
 def after_request(resp):
     return common.after_request(resp)
@@ -82,3 +106,45 @@ def access_services():
             mimetype="text/html")
 
     return jsonify(result)
+
+
+@routes.route("/logical-system-peerings", methods=['GET', 'POST'])
+@routes.route("/logical-system-peerings/<name>", methods=['GET', 'POST'])
+@common.require_accepts_json
+def access_services():
+    """
+    Handler for `/msr/access-services`.
+
+    This method is in development, not yet used.
+
+    The response will be formatted according to the following schema:
+
+    .. asjson::
+       inventory_provider.routes.msr.ACCESS_SERVICES_LIST_SCHEMA
+
+    :return:
+    """
+    redis = common.get_current_redis()
+
+    def _services():
+        for k in redis.scan_iter('opsdb:access_services:*'):
+            service = redis.get(k.decode('utf-8')).decode('utf-8')
+            yield json.loads(service)
+
+    cache_key = 'classifier-cache:msr:access-services'
+    result = redis.get(cache_key)
+
+    if result:
+        result = json.loads(result.decode('utf-8'))
+    else:
+        result = list(_services())
+        # cache this data for the next call
+        redis.set(cache_key, json.dumps(result).encode('utf-8'))
+
+    if not result:
+        return Response(
+            response='no access services found',
+            status=404,
+            mimetype="text/html")
+
+    return jsonify(result)
diff --git a/test/test_worker_utils.py b/test/test_worker_utils.py
index ab7e87f9..1d49ffed 100644
--- a/test/test_worker_utils.py
+++ b/test/test_worker_utils.py
@@ -9,6 +9,7 @@ import jsonschema
 
 from inventory_provider.tasks import worker
 from inventory_provider.tasks import common
+from inventory_provider.routes.msr import LOGICAL_SYSTEM_PEERING_LIST_SCHEMA
 
 
 def backend_db():
@@ -175,6 +176,8 @@ def test_build_juniper_peering_db(mocked_worker_module):
     worker._build_juniper_peering_db()
 
     found_record = False
+    found_logical_system = False
+    found_group = False
     for key, value in db.items():
 
         if not _x(key):
@@ -193,7 +196,20 @@ def test_build_juniper_peering_db(mocked_worker_module):
 
         jsonschema.validate(value, PEERING_LIST_SCHEMA)
 
+        if 'logical-system:' in key:
+            jsonschema.validate(value, LOGICAL_SYSTEM_PEERING_LIST_SCHEMA)
+            m = re.match(r'.*logical-system:(.+)$', key)
+            assert all(p['logical-system'] == m.group(1) for p in value)
+            found_logical_system = True
+
+        if 'group:' in key:
+            m = re.match(r'.*group:(.+)$', key)
+            assert all(p['group'] == m.group(1) for p in value)
+            found_group = True
+
     assert found_record
+    assert found_logical_system
+    assert found_group
 
 
 def test_build_snmp_peering_db(mocked_worker_module):
-- 
GitLab