diff --git a/inventory_provider/routes/mic.py b/inventory_provider/routes/mic.py index 7315674b7c2e44fa5d5433bee42af94806165034..b4d669aee886924b84af25a1d133ea1b38ed4234 100644 --- a/inventory_provider/routes/mic.py +++ b/inventory_provider/routes/mic.py @@ -135,43 +135,61 @@ def get_interfaces(node): return Response(result, mimetype='application/json') -@routes.route('/impact/<site>') -@routes.route('/impact/<site>/<node>') +@routes.route('/impact/<site>', defaults={'node': None, 'interface_': None}) +@routes.route('/impact/<site>/<node>', defaults={'interface_': None}) @routes.route('/impact/<site>/<node>/<interface_>') -def get_impact(site, node=None, interface_=None): +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}" + logger.debug(cache_key) r = common.get_current_redis() result = _ignore_cache_or_retrieve(request, cache_key, r) if not result: + data = [] + config = current_app.config['INVENTORY_PROVIDER_CONFIG'] if interface_: key_pattern = f"ims:interface_services:{node}:{interface_}" - data = [r.get(key_pattern)] - elif node: - data = [] + raw_data = r.get(key_pattern) + if raw_data: + data = json.loads(raw_data.decode('utf-8')) else: - data = [] - data = (json.loads(all_data.decode('utf-8')) for all_data in data) - # convert list of lists to single dimensional list - data = itertools.chain(*data) - # extract all related services from each list element and join into a - # single list - data = itertools.chain(*(d.get('related-services', []) for d in data)) - data = filter( - lambda x: x['circuit_type'] == 'service' - and x['status'] == 'operational', - data) - unique_services = sorted({d['id']: d for d in data}.values(), - key=lambda x: x['name']) + 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'] + if node: + key_pattern = f"ims:interface_services:{node}:*" + else: + key_pattern = "ims:interface_services:*" + data = _get_data(key_pattern) + services_by_type = defaultdict(list) - for service in unique_services: - services_by_type[service['service_type']].append({ - 'id': service['id'], - 'sid': service['sid'], - 'name': service['name'], - 'service_type': service['service_type'], - 'contacts': service['contacts'] - }) + if data: + + rs = itertools.chain( + *(d.get('related-services', []) + for d in data if d['pop_name'] == site)) + + rs = filter( + lambda x: x['circuit_type'] == 'service' + and x['status'] == 'operational', + rs) + unique_services = sorted({d['id']: d for d in rs}.values(), + key=lambda x: x['name']) + try: + for service in unique_services: + services_by_type[service['service_type']].append({ + 'id': service['id'], + 'sid': service.get('sid', ''), + 'name': service['name'], + 'service_type': service['service_type'], + 'contacts': service['contacts'] + }) + except Exception as e: + logger.debug(json.dumps(service, indent=2)) + raise e result = json.dumps(services_by_type) r.set(cache_key, result.encode('utf-8')) diff --git a/test/test_mic_routes.py b/test/test_mic_routes.py index cb43ae49d7f69cbab5cbd2fdf3da175e987f9f85..e29b64702419cfdcc60d832e6d8fd91d234d0f10 100644 --- a/test/test_mic_routes.py +++ b/test/test_mic_routes.py @@ -1,6 +1,7 @@ import json import jsonschema +import pytest from inventory_provider.routes.mic import SITES_LIST_SCHEMA, \ NODES_LIST_SCHEMA, INTERFACES_LIST_SCHEMA, IMPACT_SCHEMA @@ -41,10 +42,12 @@ def test_get_interfaces(client, mocked_redis): jsonschema.validate(response_data, INTERFACES_LIST_SCHEMA) -def test_get_impact(client, mocked_redis): - rv = client.get( - '/mic/impact/AMSTERDAM/MX1.AMS.NL/AE21', - headers=DEFAULT_REQUEST_HEADERS) +@pytest.mark.parametrize('endpoint', [ + '/mic/impact/AMSTERDAM/MX1.AMS.NL/AE21', + '/mic/impact/LONDON/MX1.LON.UK', + '/mic/impact/GENEVA']) +def test_get_impact(endpoint, client, mocked_redis): + rv = client.get(endpoint, headers=DEFAULT_REQUEST_HEADERS) assert rv.status_code == 200 assert rv.is_json response_data = json.loads(rv.data.decode('utf-8'))