Skip to content
Snippets Groups Projects
opsdb.py 2.78 KiB
import collections
import json
import re

from flask import Blueprint, Response, jsonify
from inventory_provider.routes import common

routes = Blueprint("inventory-opsdb-query-routes", __name__)

interfaces_key = "interface_services"
equipment_locations_key = "equipment_locations"
service_child_to_parents_key = "child_to_parent_circuit_relations"
service_parent_to_children_key = "parent_to_children_circuit_relations"
interface_status_key = "interface_statuses"


# def _decode_utf8_dict(d):
#     return {k.decode('utf8'): json.loads(v) for k, v in d.items()}
#
#
@routes.route("/interfaces")
def get_all_interface_details():
    r = common.get_redis()
    result = collections.defaultdict(list)
    for k in r.keys('opsdb:interface_services:*'):
        m = re.match(
            r'^opsdb:interface_services:([^:]+):(.*)$',
            k.decode('utf-8'))
        assert m
        result[m.group(1)].append(m.group(2))
    return jsonify(result)


@routes.route("/interfaces/<equipment_name>")
def get_interface_details_for_equipment(equipment_name):
    r = common.get_redis()
    result = []
    for k in r.keys('opsdb:interface_services:%s:*' % equipment_name):
        m = re.match(
            r'^opsdb:interface_services:%s:(.*)$' % equipment_name,
            k.decode('utf-8'))
        assert m
        result.append(m.group(1))
    return jsonify(result)


@routes.route("/interfaces/<equipment_name>/<path:interface>")
def get_interface_details(equipment_name, interface):
    r = common.get_redis()
    key = 'opsdb:interface_services:%s:%s' % (equipment_name, interface)
    # TODO: handle None (return 404)
    return jsonify(json.loads(r.get(key).decode('utf-8')))


@routes.route("/equipment-location")
def get_all_equipment_locations():
    r = common.get_redis()
    result = {}
    for k in r.keys('opsdb:location:*'):
        k = k.decode('utf-8')
        m = re.match(r'^opsdb:location:(.*)$', k)
        assert m
        result[m.group(1)] = json.loads(r.get(k).decode('utf-8'))
    return jsonify(result)


@routes.route("/equipment-location/<path:equipment_name>")
def get_equipment_location(equipment_name):
    r = common.get_redis()
    result = r.get('opsdb:location:' + equipment_name)
    # TODO: handle None (return 404)
    return jsonify(json.loads(result.decode('utf-8')))


@routes.route("/circuit-hierarchy/children/<int:parent_id>")
def get_children(parent_id):
    r = common.get_redis()
    result = r.get('opsdb:services:children:%d' % parent_id)
    # TODO: handle None (return 404)
    return jsonify(json.loads(result.decode('utf-8')))


@routes.route("/circuit-hierarchy/parents/<int:child_id>")
def get_parents(child_id):
    r = common.get_redis()
    result = r.get('opsdb:services:parents:%d' % child_id)
    # TODO: handle None (return 404)
    return jsonify(json.loads(result.decode('utf-8')))