diff --git a/README.md b/README.md index 43c2c71f5cef66797d45f307487eb946619ffc49..f8215567e6b9cd389fa3cc0ee52fd82728da27d3 100644 --- a/README.md +++ b/README.md @@ -355,7 +355,7 @@ Any non-empty responses are JSON formatted messages. alarms database -* /classifier/trap-metadata/*`source-equipment`*/*`source-interface`* +* /classifier/juniper-link-info/*`source-equipment`*/*`source-interface`* The source-equipment is the equipment that causes the trap, not the NMS that sends it. @@ -579,7 +579,7 @@ Any non-empty responses are JSON formatted messages. ``` -* /infinera-classifier/trap-metadata/*`source-equipment`*/*`source-interface`* +* /classifier/infinera-lambda-info/*`source-equipment`*/*`source-interface`* The source-equipment is the equipment that causes the trap, not the NMS that sends it. diff --git a/inventory_provider/__init__.py b/inventory_provider/__init__.py index a4eadc4c3bbbc55f13e7ba88ed0c633ec87c1aea..024fac841eb30cde1e859612856db2bc2b1e1293 100644 --- a/inventory_provider/__init__.py +++ b/inventory_provider/__init__.py @@ -33,10 +33,6 @@ 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/db/alarmsdb.py b/inventory_provider/db/alarmsdb.py index 23e1e9249c48cb4c6594aa52b3d5480c3dbf1f53..f638acda7b89d965922a70cccdaf812fad155ba9 100644 --- a/inventory_provider/db/alarmsdb.py +++ b/inventory_provider/db/alarmsdb.py @@ -1,3 +1,5 @@ +# TODO: remove all of this, as well as config parameters, +# ... and from puppet from inventory_provider.db import db diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 2c9f7f415224944f5df175290a8d941275de0540..5e6f2c9d906a95975af360e4d0fb155884070ea8 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -50,13 +50,14 @@ def related_interfaces(hostname, interface): yield k[len(prefix):] -@routes.route("/trap-metadata/<source_equipment>/<path:interface>", +@routes.route("/juniper-link-info/<source_equipment>/<path:interface>", methods=['GET', 'POST']) @common.require_accepts_json -def get_trap_metadata(source_equipment, interface): +def get_juniper_link_info(source_equipment, interface): r = common.get_redis() - cache_key = 'classifier:cache:%s:%s' % (source_equipment, interface) + cache_key = 'classifier-cache:juniper:%s:%s' % ( + source_equipment, interface) result = r.get(cache_key) if result: @@ -201,7 +202,7 @@ def peer_info(address): r = common.get_redis() - cache_key = 'classifier:peer-cache:%s' % address + cache_key = 'classifier-cache:peer:%s' % address result = r.get(cache_key) if result: @@ -235,3 +236,47 @@ def peer_info(address): r.set(cache_key, result.encode('utf-8')) return Response(result, mimetype="application/json") + + +@routes.route("/infinera-lambda-info/<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-cache:infinera:%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: + t_gl = json.loads(gl.decode('utf=8')) + t_gl['status'] = t_gl['status'].lower() + geant_lambdas.append(t_gl) + + if geant_lambdas: + result['geant-lambdas'] = geant_lambdas + + 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") diff --git a/inventory_provider/routes/data.py b/inventory_provider/routes/data.py index 2f893435ba9c7b88a657ad8bf37072a5f2d6fd73..3bbe8d02dd464a44cc5ddae84394286ec7faa4e2 100644 --- a/inventory_provider/routes/data.py +++ b/inventory_provider/routes/data.py @@ -88,33 +88,36 @@ def bgp_configs(hostname): return jsonify(routes) -@routes.route("/interfaces/status/<hostname>/<path:interface>", - methods=['GET', 'POST']) -@common.require_accepts_json -def interface_statuses(hostname, interface): - r = common.get_redis() - status = r.get( - 'alarmsdb:interface_status:%s:%s' - % (hostname, interface)) - if not status: - return Response( - response="no available info for {} {}".format(hostname, interface), - status=404, - mimetype="text/html") - return jsonify({"status": status.decode('utf-8')}) - - -@routes.route("/services/<hostname>/<path:interface>", - methods=['GET', 'POST']) -@common.require_accepts_json -def services_for_interface(hostname, interface): - r = common.get_redis() - services = r.get( - 'opsdb:interface_services:%s:%s' - % (hostname, interface)) - if not services: - return Response( - response="no available info for {} {}".format(hostname, interface), - status=404, - mimetype="text/html") - return jsonify(json.loads(services.decode('utf-8'))) +# TODO: remove all alarmsdb i/o, and then remove the following +# @routes.route("/interfaces/status/<hostname>/<path:interface>", +# methods=['GET', 'POST']) +# @common.require_accepts_json +# def interface_statuses(hostname, interface): +# r = common.get_redis() +# status = r.get( +# 'alarmsdb:interface_status:%s:%s' +# % (hostname, interface)) +# if not status: +# return Response( +# response="no available info for {} {}".format( +# hostname, interface), +# status=404, +# mimetype="text/html") +# return jsonify({"status": status.decode('utf-8')}) +# +# +# @routes.route("/services/<hostname>/<path:interface>", +# methods=['GET', 'POST']) +# @common.require_accepts_json +# def services_for_interface(hostname, interface): +# r = common.get_redis() +# services = r.get( +# 'opsdb:interface_services:%s:%s' +# % (hostname, interface)) +# if not services: +# return Response( +# response="no available info for {} {}".format( +# hostname, interface), +# status=404, +# mimetype="text/html") +# return jsonify(json.loads(services.decode('utf-8'))) diff --git a/inventory_provider/routes/infinera_classifier.py b/inventory_provider/routes/infinera_classifier.py deleted file mode 100644 index e522811f9b6a751a6d081e795dcb1831b1ae419a..0000000000000000000000000000000000000000 --- a/inventory_provider/routes/infinera_classifier.py +++ /dev/null @@ -1,66 +0,0 @@ -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_500_error(error): - return Response( - response=str(error), - status=500) - - -@routes.errorhandler(422) -def handle_422_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: - t_gl = json.loads(gl.decode('utf=8')) - t_gl['status'] = t_gl['status'].lower() - geant_lambdas.append(t_gl) - - if geant_lambdas: - result['geant-lambdas'] = geant_lambdas - - 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") diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index 19c94dbdd1508ffcb4125550868956774d8136c2..5a7a424c5fcb86431e0cd5fe5970ee4ba04bcd22 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -279,11 +279,11 @@ def clear_cached_classifier_responses(hostname=None): r = get_redis(InventoryTask.config) def _hostname_keys(): - for k in r.keys('classifier:cache:%s:*' % hostname): + for k in r.keys('classifier-cache:juniper:%s:*' % hostname): yield k # TODO: very inefficient ... but logically simplest at this point - for k in r.keys('classifier:peer-cache:*'): + for k in r.keys('classifier-cache:peer:*'): value = r.get(k.decode('utf-8')) if not value: # deleted in another thread @@ -294,7 +294,7 @@ def clear_cached_classifier_responses(hostname=None): yield k def _all_keys(): - return r.keys('classifier:*') + return r.keys('classifier-cache:*') keys_to_delete = _hostname_keys() if hostname else _all_keys() for k in keys_to_delete: diff --git a/test/per_router/test_classifier_data.py b/test/per_router/test_classifier_data.py index b0d7f5b099e130759a8e94b5c8a5c7de7b5b3729..74f26360e36ef00230a853539b07ce3085efc764 100644 --- a/test/per_router/test_classifier_data.py +++ b/test/per_router/test_classifier_data.py @@ -17,4 +17,4 @@ def test_clear_classifier_cache( backend_db().update(classifier_cache_test_entries) worker.clear_cached_classifier_responses(router) for k in backend_db(): - assert not k.startswith('classifier:cache:%s:' % router) + assert not k.startswith('classifier-cache:%s:' % router) diff --git a/test/test_classifier_routes.py b/test/test_classifier_routes.py index 50e434244edf62d023fbd46ce8777ab89857eb5e..2d8603417c7f93a220156064a88c5b7f98fa8ebe 100644 --- a/test/test_classifier_routes.py +++ b/test/test_classifier_routes.py @@ -117,9 +117,9 @@ JUNIPER_LINK_METADATA = { } -def test_trap_metadata(client_with_mocked_data): +def test_juniper_link_info(client_with_mocked_data): rv = client_with_mocked_data.get( - '/classifier/trap-metadata/mx1.ams.nl.geant.net/ae15.1500', + '/classifier/juniper-link-info/mx1.ams.nl.geant.net/ae15.1500', headers=DEFAULT_REQUEST_HEADERS) assert rv.status_code == 200 assert rv.is_json diff --git a/test/test_infinera_classifier.py b/test/test_infinera_classifier.py index 81d36d2329b02446e2ba0b0a14b87e3447e4abe4..591b2c0dbf9c3cffd0c70ee19654f644986a98e9 100644 --- a/test/test_infinera_classifier.py +++ b/test/test_infinera_classifier.py @@ -88,7 +88,7 @@ INFINERA_LINK_METADATA = { def test_trap_metadata(client_with_mocked_data): rv = client_with_mocked_data.get( - '/infinera-classifier/trap-metadata/LON01-DTNX10-1/1-B-2-1-3', + '/classifier/infinera-lambda-info/LON01-DTNX10-1/1-B-2-1-3', headers=DEFAULT_REQUEST_HEADERS) assert rv.status_code == 200 assert rv.is_json