From 7f41dc10a68677c1734db10f2585f4e2a8fd9a07 Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Thu, 4 Apr 2019 17:57:17 +0100
Subject: [PATCH] Added route for Infinera classification

---
 inventory_provider/__init__.py                |  4 ++
 .../routes/infinera_classifier.py             | 68 +++++++++++++++++++
 2 files changed, 72 insertions(+)
 create mode 100644 inventory_provider/routes/infinera_classifier.py

diff --git a/inventory_provider/__init__.py b/inventory_provider/__init__.py
index 024fac84..a4eadc4c 100644
--- a/inventory_provider/__init__.py
+++ b/inventory_provider/__init__.py
@@ -33,6 +33,10 @@ def create_app():
     from inventory_provider.routes import classifier
     app.register_blueprint(classifier.routes, url_prefix='/classifier')
 
+    from inventory_provider.routes import infinera_classifier
+    app.register_blueprint(
+        infinera_classifier.routes, url_prefix='/infinera-classifier')
+
     from inventory_provider.routes import poller
     app.register_blueprint(poller.routes, url_prefix='/poller')
 
diff --git a/inventory_provider/routes/infinera_classifier.py b/inventory_provider/routes/infinera_classifier.py
new file mode 100644
index 00000000..aea06b56
--- /dev/null
+++ b/inventory_provider/routes/infinera_classifier.py
@@ -0,0 +1,68 @@
+import json
+
+from inventory_provider.routes import common
+
+from flask import Blueprint, Response
+
+
+routes = Blueprint("inventory-data-inf-classifier-support-routes", __name__)
+
+
+@routes.errorhandler(500)
+def handle_request_error(error):
+    return Response(
+       response=str(error),
+       status=500)
+
+
+@routes.errorhandler(422)
+def handle_request_error(error):
+    return Response(
+       response=str(error),
+       status=422)
+
+
+@routes.route("/trap-metadata/<source_equipment>/<path:interface>",
+              methods=['GET', 'POST'])
+@common.require_accepts_json
+def get_trap_metadata(source_equipment, interface):
+    r = common.get_redis()
+
+    cache_key = 'classifier:infinera:cache:%s:%s' % (source_equipment, interface)
+    result = r.get(cache_key)
+
+    if result:
+        result = result.decode('utf-8')
+    else:
+        result = {}
+
+        services = r.get(
+            'opsdb:interface_services:%s:%s' % (source_equipment, interface))
+        if services:
+            result['services'] = json.loads(services.decode('utf=8'))
+            geant_lambdas = []
+            for s in result['services']:
+                gl = r.get('opsdb:geant_lambdas:%s' % s['name'])
+                if gl:
+                    geant_lambdas.append(json.loads(gl.decode('utf=8')))
+
+            if geant_lambdas:
+                result['geant_lambdas'] = geant_lambdas
+
+        ifc_info = r.get(
+            'netconf-interfaces:%s:%s' % (source_equipment, interface))
+        if ifc_info:
+            result['interface'] = json.loads(ifc_info.decode('utf-8'))
+
+        if not result:
+            return Response(
+                response="no available info for {} {}".format(
+                    source_equipment, interface),
+                status=404,
+                mimetype="text/html")
+
+        result = json.dumps(result)
+        # cache this data for the next call
+        r.set(cache_key, result.encode('utf-8'))
+
+    return Response(result, mimetype="application/json")
-- 
GitLab