Skip to content
Snippets Groups Projects
data.py 3.56 KiB
import json
import re

from flask import Blueprint, jsonify, Response
from lxml import etree

from inventory_provider import juniper
from inventory_provider.routes import common

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("/snmp/<hostname>", methods=['GET', 'POST'])
@common.require_accepts_json
def snmp_ids(hostname):
    r = common.get_redis()
    ifc_data_string = r.get('snmp-interfaces:' + hostname)
    if not ifc_data_string:
        return Response(
            response="no available info for '%s'" % hostname,
            status=404,
            mimetype="text/html")

    def _ifc_name(ifc):
        if 'v4InterfaceName' in ifc:
            return ifc['v4InterfaceName']
        if 'v6InterfaceName' in ifc:
            return ifc['v6InterfaceName']
        assert False, "sanity failure: no interface name found"

    ifc_data = json.loads(ifc_data_string.decode('utf-8'))
    result = [
        {'index': i['index'], 'name': _ifc_name(i)}
        for i in ifc_data]
    return jsonify(result)


@routes.route("/bgp/<hostname>", methods=['GET', 'POST'])
@common.require_accepts_json
def bgp_configs(hostname):
    r = common.get_redis()
    netconf_string = r.get('netconf:' + hostname)
    if not netconf_string:
        return Response(
            response="no available info for '%s'" % hostname,
            status=404,
            mimetype="text/html")

    routes = list(juniper.list_bgp_routes(
        etree.XML(netconf_string.decode('utf-8'))))
    if not routes:
        return Response(
            response="no interfaces found for '%s'" % hostname,
            status=404,
            mimetype="text/html")

    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')))