Skip to content
Snippets Groups Projects
Commit 3fe9e5e6 authored by Erik Reid's avatar Erik Reid
Browse files

Finished feature improve-classifier-route-names.

parents 2c593b1d 6a17e18a
No related branches found
No related tags found
No related merge requests found
......@@ -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.
......
......@@ -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')
......
# TODO: remove all of this, as well as config parameters,
# ... and from puppet
from inventory_provider.db import db
......
......@@ -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")
......@@ -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')))
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")
......@@ -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:
......
......@@ -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)
......@@ -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
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment