diff --git a/inventory_provider/routes/mic.py b/inventory_provider/routes/mic.py index b4d669aee886924b84af25a1d133ea1b38ed4234..78379c914b38948fdf54b3270d71fc23ededdd3c 100644 --- a/inventory_provider/routes/mic.py +++ b/inventory_provider/routes/mic.py @@ -137,7 +137,7 @@ def get_interfaces(node): @routes.route('/impact/<site>', defaults={'node': None, 'interface_': None}) @routes.route('/impact/<site>/<node>', defaults={'interface_': None}) -@routes.route('/impact/<site>/<node>/<interface_>') +@routes.route('/impact/<site>/<node>/<path:interface_>') def get_impact(site, node, interface_): cache_key_end = ':'.join(filter(None, (site, node, interface_))) cache_key = f"classifier-cache:mic:impact:{cache_key_end}" @@ -194,3 +194,36 @@ def get_impact(site, node, interface_): r.set(cache_key, result.encode('utf-8')) return Response(result, mimetype='application/json') + + +@routes.route("/all-data") +def get_everything(): + cache_key = "classifier-cache:mic:impact:all-data" + logger.debug(cache_key) + r = common.get_current_redis() + result = _ignore_cache_or_retrieve(request, cache_key, r) + if not result: + config = current_app.config['INVENTORY_PROVIDER_CONFIG'] + all_data = defaultdict(lambda: defaultdict(dict)) + + def _get_data(_key_pattern): + for doc in common.load_json_docs( + config_params=config, + key_pattern=_key_pattern, + num_threads=20,): + yield from doc['value'] + + key_pattern = "ims:interface_services:*" + data = _get_data(key_pattern) + if data: + + for d in data: + if d.get('related-services'): + site = f'{d["pop_name"]} ({d["pop_abbreviation"]})' + eq_name = d['equipment'] + if_name = d['port'] + all_data[site][eq_name][if_name] = d['related-services'] + result = json.dumps(all_data) + + r.set(cache_key, result.encode('utf-8')) + return Response(result, mimetype='application/json')