Skip to content
Snippets Groups Projects
ims_lg.py 1.49 KiB
import json

from flask import Blueprint, jsonify, Response

from inventory_provider.routes import common

routes = Blueprint("ims-lg-query-routes", __name__)

ACCESS_PUBLIC = 'public'
ACCESS_INTERNAL = 'all'


@routes.after_request
def after_request(resp):
    return common.after_request(resp)


@routes.route("/routers/<string:access>", methods=['GET', 'POST'])
@common.require_accepts_json
def routers(access):

    if access not in {ACCESS_INTERNAL, ACCESS_PUBLIC}:
        return Response(
            response='unknown access level',
            status=404,
            mimetype='text/html')

    redis = common.get_current_redis()

    def _visible(router):
        if access == ACCESS_INTERNAL:
            return True
        return router['type'] == 'CORE'

    def _routers():
        i = 0
        for k in redis.scan_iter('ims:lg:*'):
            rtr = redis.get(k.decode('utf-8')).decode('utf-8')
            rtr = json.loads(rtr)
            i += 1
            if _visible(rtr):
                yield rtr

    cache_key = f'classifier-cache:ims-lg:{access}'
    result = redis.get(cache_key)

    if result:
        result = json.loads(result.decode('utf-8'))
    else:
        result = list(_routers())
        # cache this data for the next call
        redis.set(cache_key, json.dumps(result).encode('utf-8'))

    if not result:
        return Response(
            response=f'no routers found for access level {access}',
            status=404,
            mimetype="text/html")

    return jsonify(result)