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