import json import re from flask import Blueprint, jsonify, Response, current_app from inventory_provider.routes import common from inventory_provider.db import db from inventory_provider.db import opsdb routes = Blueprint("inventory-data-query-routes", __name__) @routes.route("/routers", methods=['GET', 'POST']) @common.require_accepts_json def routers(): r = common.get_redis() result = [] for k in r.keys('netconf:*'): m = re.match('^netconf:(.+)$', k.decode('utf-8')) assert m result.append(m.group(1)) return jsonify(result) @routes.route("/interfaces/<hostname>", methods=['GET', 'POST']) @common.require_accepts_json def router_interfaces(hostname): r = common.get_redis() interfaces = [] for k in r.keys('netconf-interfaces:%s:*' % hostname): ifc = r.get(k.decode('utf-8')) if ifc: interfaces.append(json.loads(ifc.decode('utf-8'))) if not interfaces: return Response( response="no available interface info for '%s'" % hostname, status=404, mimetype="text/html") return jsonify(interfaces) @routes.route("/pop/<equipment_name>", methods=['GET', 'POST']) @common.require_accepts_json def equipment_location(equipment_name): config = current_app.config['INVENTORY_PROVIDER_CONFIG'] with db.connection(config['ops-db']) as cx: result = opsdb.lookup_pop_info(cx, equipment_name) if not result: return Response( response="no available info for {}".format(equipment_name), status=404, mimetype="text/html") return jsonify(result)