diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index ad5b32fad5c7c41b7791fdf17a7cb2ea55ebf55b..20ac55849468dbf70f23808916800e9defe6d571 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -214,7 +214,7 @@ def get_interface_services_and_locs(ims_source_equipment, ims_interface, r): if not result['services']: result.pop('services', None) if result['related-services']: - for r in result['related-services']: + for r in result['related-services']: r.pop('id', None) else: result.pop('related-services', None) diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index 0fa39ede30adfc7965eb493e8925cc87e49499d1..de53146469ded6012069a53430d8e9517b4982e9 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -185,7 +185,7 @@ def netconf_refresh_config(self, hostname): self.log_info(f'netconf info loaded from {hostname}') -def _unmanaged_interfaces(self): +def _unmanaged_interfaces(): def _convert(d): # the config file keys are more readable than @@ -770,6 +770,10 @@ def _build_subnet_db(update_callback=lambda s: None): entry = subnets.setdefault(ifc['interface address'], []) entry.append(ifc) + for ifc in _unmanaged_interfaces(): + entry = subnets.setdefault(ifc['interface address'], []) + entry.append(ifc) + update_callback('saving {} subnets'.format(len(subnets))) rp = r.pipeline() diff --git a/test/conftest.py b/test/conftest.py index e3a892a3417e6fd40f2937fc36a807139d5d71eb..6f3129931452aae167a96ce3105f5bbd42d07956 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -54,6 +54,20 @@ def data_config_filename(): "password": "ims_password" }, "managed-routers": "bogus url", + "unmanaged-interfaces": [ + { + "address": "99.99.99.99", + "network": "99.99.99.0/24", + "interface": "ABC/0/0/0", + "router": "bogus.host.name" + }, + { + "address": "999.999.999.99", + "network": "999.999.999.0/24", + "interface": "ZZZ/9/a/x:0.123", + "router": "another.bogus.host.name" + } + ] } f.write(json.dumps(config).encode('utf-8')) diff --git a/test/test_classifier_routes.py b/test/test_classifier_routes.py index 4a3883ce554851dbe2a4c941f662112c6d31a7f6..8cd01b94734b3dd6e05c7ad1f9d8293a347e8b58 100644 --- a/test/test_classifier_routes.py +++ b/test/test_classifier_routes.py @@ -4,8 +4,7 @@ import pytest from inventory_provider.routes.classifier_schema \ import JUNIPER_LINK_RESPONSE_SCHEMA, PEER_INFO_RESPONSE_SCHEMA, \ - INFINERA_LAMBDA_INFO_RESPONSE_SCHEMA, CORIANT_INFO_RESPONSE_SCHEMA, \ - INFINERA_FIBERLINK_INFO_RESPONSE_SCHEMA + INFINERA_LAMBDA_INFO_RESPONSE_SCHEMA, CORIANT_INFO_RESPONSE_SCHEMA DEFAULT_REQUEST_HEADERS = { "Content-type": "application/json", @@ -175,7 +174,8 @@ def test_infinera_fiberlink_not_found(client): # assert rv.status_code == 200 # assert rv.is_json # response_data = json.loads(rv.data.decode('utf-8')) -# jsonschema.validate(response_data, INFINERA_FIBERLINK_INFO_RESPONSE_SCHEMA) +# jsonschema.validate( +# response_data, INFINERA_FIBERLINK_INFO_RESPONSE_SCHEMA) def test_infinera_lambda(client): diff --git a/test/test_msr_routes.py b/test/test_msr_routes.py index 0dc461311a461e59ab881a6e88dd14f0db1af81b..d328b847d0e54ca44e6e37b62e5ea443bdb51da5 100644 --- a/test/test_msr_routes.py +++ b/test/test_msr_routes.py @@ -3,8 +3,8 @@ import jsonschema import pytest -from inventory_provider.routes.msr import ACCESS_SERVICES_LIST_SCHEMA, \ - PEERING_LIST_SCHEMA, PEERING_GROUP_LIST_SCHEMA +from inventory_provider.routes.msr import PEERING_LIST_SCHEMA, \ + PEERING_GROUP_LIST_SCHEMA DEFAULT_REQUEST_HEADERS = { "Content-type": "application/json", diff --git a/test/test_worker_utils.py b/test/test_worker_utils.py index f1354cb077068c5eb2a099cc132618977e817ebc..ed5a42256a5431e6a9002d01707f845a6db317ba 100644 --- a/test/test_worker_utils.py +++ b/test/test_worker_utils.py @@ -11,6 +11,7 @@ import jsonschema from inventory_provider.tasks import worker from inventory_provider.tasks import common from inventory_provider.routes import msr +from inventory_provider import config def backend_db(): @@ -23,7 +24,7 @@ def backend_db(): }).db -def test_build_subnet_db(mocked_worker_module): +def test_build_subnet_db(mocked_worker_module, data_config_filename): """ Verify that valid reverse subnet objects are created. @@ -52,6 +53,16 @@ def test_build_subnet_db(mocked_worker_module): 'items': {"$ref": "#/definitions/interface"}, } + all_subnet_interfaces = set() + unmanaged_interfaces = set() + with open(data_config_filename) as f: + params = config.load(f) + for ifc in params.get('unmanaged-interfaces', []): + ifc_key = (f'{ifc["router"].lower()}' + f':{ifc["interface"].lower()}' + f':{ifc["network"]}') + unmanaged_interfaces.add(ifc_key) + db = backend_db() # also forces initialization def _x(k): @@ -80,8 +91,16 @@ def test_build_subnet_db(mocked_worker_module): for ifc in value: assert ifc['interface address'] == address + ifc_key = (f'{ifc["router"]}' + f':{ifc["interface name"]}' + f':{ifc["interface address"]}') + + all_subnet_interfaces.add(ifc_key) + assert found_record + assert unmanaged_interfaces <= all_subnet_interfaces + def test_build_juniper_peering_db(mocked_worker_module): """