diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 39a44c77c358c3366755fead15c37c3dc570b6b4..d5df0457af71fff462b9551913c3d031f55241f4 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -295,6 +295,35 @@ def _link_interface_info(r, hostname, interface): return ifc_info +def get_link_info_response_body( + source_equipment: str, + interface: str, + ims_source_equipment: str, + ims_interface: str, + r: Redis) -> dict: + result = { + 'interface': _link_interface_info(r, source_equipment, interface) + } + + bundle_members = r.get( + f'netconf-interface-bundles:{source_equipment}:{interface}') + if bundle_members: + result['interface']['bundle_members'] = \ + json.loads(bundle_members.decode('utf-8')) + else: + result['interface']['bundle_members'] = [] + + result.update( + get_interface_services_and_loc( + ims_source_equipment, + ims_interface, + r + ) + ) + + return result + + @routes.route("/link-info/<source_equipment>/<path:interface>", methods=['GET']) @routes.route("/nokia-link-info/<source_equipment>/<path:interface>", @@ -302,7 +331,7 @@ def _link_interface_info(r, hostname, interface): @routes.route("/juniper-link-info/<source_equipment>/<path:interface>", methods=['GET']) @common.require_accepts_json -def get_juniper_link_info(source_equipment: str, interface: str) -> Response: +def handle_link_info_request(source_equipment: str, interface: str) -> Response: """ Handler for /classifier/juniper-link-info that returns metadata about an IP interface. @@ -328,35 +357,50 @@ def get_juniper_link_info(source_equipment: str, interface: str) -> Response: result = _ignore_cache_or_retrieve(request, cache_key, r) if not result: - result = { - 'interface': _link_interface_info(r, source_equipment, interface) - } + result = get_link_info_response_body( + source_equipment, + interface, + ims_source_equipment, + ims_interface, r) - bundle_members = r.get( - f'netconf-interface-bundles:{source_equipment}:{interface}') - if bundle_members: - result['interface']['bundle_members'] = \ - json.loads(bundle_members.decode('utf-8')) - else: - result['interface']['bundle_members'] = [] + result = json.dumps(result) + # cache this data for the next call + r.set(cache_key, result.encode('utf-8')) + + return Response(result, mimetype="application/json") - result.update( - get_interface_services_and_loc( - ims_source_equipment, - ims_interface, - r - ) - ) - # don't want to report related services for bundle members, just the - # aggregate - # if result['interface']['bundle']: - # result['related-services'] = [] +@routes.route("/epipe-sap-info/<source_equipment>/<service_id>/<vpn_id>", methods=['GET']) +@common.require_accepts_json +def handle_epipe_sap_info_request(source_equipment: str, service_id: str, vpn_id: str) -> Response: + + r = common.get_current_redis() + + ims_source_equipment = get_ims_equipment_name(source_equipment, r) + + cache_key = \ + f'classifier-cache:epipe_sap:{source_equipment}:{service_id}:{vpn_id}' + + print(f'cache_key: {cache_key}') + + result = _ignore_cache_or_retrieve(request, cache_key, r) + + if not result: + info_to_interface_key = f'ims:epipe-sapid_mappings:{source_equipment}:{service_id}:{vpn_id}' + raw_interface = r.get(info_to_interface_key) + if raw_interface: + raw_interface = raw_interface.decode('utf-8') + ims_interface = get_ims_interface(raw_interface) + result = get_link_info_response_body( + source_equipment, + raw_interface, + ims_source_equipment, + ims_interface, r) result = json.dumps(result) # cache this data for the next call r.set(cache_key, result.encode('utf-8')) - + return Response(result, mimetype="application/json")