diff --git a/inventory_provider/db/__init__.py b/inventory_provider/db/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/inventory_provider/alarmsdb.py b/inventory_provider/db/alarmsdb.py similarity index 98% rename from inventory_provider/alarmsdb.py rename to inventory_provider/db/alarmsdb.py index 7eb2cba54356fffcf55ae51151e9d0e78c03210d..597b47ff36fd1f70e566c158873ef9f9b8a273c1 100644 --- a/inventory_provider/alarmsdb.py +++ b/inventory_provider/db/alarmsdb.py @@ -1,4 +1,4 @@ -from inventory_provider import db +from inventory_provider.db import db def get_last_known_infinera_interface_status(crs, equipment, interface): diff --git a/inventory_provider/db.py b/inventory_provider/db/db.py similarity index 100% rename from inventory_provider/db.py rename to inventory_provider/db/db.py diff --git a/inventory_provider/opsdb.py b/inventory_provider/db/opsdb.py similarity index 99% rename from inventory_provider/opsdb.py rename to inventory_provider/db/opsdb.py index 7848f09de3407fd5c77a56f18b3ae0833e1bd6c1..60ed03c35d6a3f2386c975142c887096a0956407 100644 --- a/inventory_provider/opsdb.py +++ b/inventory_provider/db/opsdb.py @@ -1,4 +1,4 @@ -from inventory_provider import db +from inventory_provider.db import db equipment_location_query = """SELECT diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py index 9f3c35277e1e1f6478888593f0f9402153263f56..0069a77ed758a34560063c3bdbff0c048d48964d 100644 --- a/inventory_provider/routes/classifier.py +++ b/inventory_provider/routes/classifier.py @@ -1,7 +1,6 @@ -import functools - -from flask import Blueprint, request, Response, current_app, jsonify import json + +from flask import Blueprint, Response, current_app, jsonify import jsonschema from inventory_provider.routes import common @@ -9,27 +8,8 @@ from inventory_provider.routes import common routes = Blueprint("inventory-data-classifier-support-routes", __name__) -def require_accepts_json(f): - """ - used as a route handler decorator to return an error - unless the request allows responses with type "application/json" - :param f: the function to be decorated - :return: the decorated function - """ - @functools.wraps(f) - def decorated_function(*args, **kwargs): - # TODO: use best_match to disallow */* ...? - if not request.accept_mimetypes.accept_json: - return Response( - response="response will be json", - status=406, - mimetype="text/html") - return f(*args, **kwargs) - return decorated_function - - @routes.route("/infinera-dna-addresses", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def infinera_addresses(): infinera_config = current_app.config[ "INVENTORY_PROVIDER_CONFIG"]["infinera-dna"] @@ -37,7 +17,7 @@ def infinera_addresses(): @routes.route("/coriant-tnms-addresses", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def coriant_addresses(): coriant_config = current_app.config[ "INVENTORY_PROVIDER_CONFIG"]["coriant-tnms"] @@ -45,7 +25,7 @@ def coriant_addresses(): @routes.route("/juniper-server-addresses", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def juniper_addresses(): backend_data_schema = { "$schema": "http://json-schema.org/draft-07/schema#", @@ -73,7 +53,7 @@ def juniper_addresses(): @routes.route("/trap-metadata/<trap_type>/<source_equipment>/<path:interface>", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def get_trap_metadata(trap_type, source_equipment, interface): # todo - Move this to config interface_info_key = "interface_services" diff --git a/inventory_provider/routes/data.py b/inventory_provider/routes/data.py index ce73e476af52f131cdbf139a6f3c38d7bfebebfd..85fb5f010cdbf51324bcf02d068bb2c36214ac8b 100644 --- a/inventory_provider/routes/data.py +++ b/inventory_provider/routes/data.py @@ -1,8 +1,7 @@ -import functools import json import pkg_resources -from flask import Blueprint, jsonify, request, Response, current_app +from flask import Blueprint, jsonify, Response, current_app from lxml import etree import redis @@ -14,27 +13,8 @@ routes = Blueprint("inventory-data-query-routes", __name__) API_VERSION = '0.1' -def require_accepts_json(f): - """ - used as a route handler decorator to return an error - unless the request allows responses with type "application/json" - :param f: the function to be decorated - :return: the decorated function - """ - @functools.wraps(f) - def decorated_function(*args, **kwargs): - # TODO: use best_match to disallow */* ...? - if not request.accept_mimetypes.accept_json: - return Response( - response="response will be json", - status=406, - mimetype="text/html") - return f(*args, **kwargs) - return decorated_function - - @routes.route("/version", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def version(): return Response( json.dumps({ @@ -47,7 +27,7 @@ def version(): @routes.route("/routers", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def routers(): redis_config = current_app.config["INVENTORY_PROVIDER_CONFIG"]["redis"] r = redis.StrictRedis( @@ -59,7 +39,7 @@ def routers(): @routes.route("/interfaces/<hostname>", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def router_interfaces(hostname): redis_config = current_app.config["INVENTORY_PROVIDER_CONFIG"]["redis"] r = redis.StrictRedis( @@ -87,7 +67,7 @@ def router_interfaces(hostname): @routes.route("/snmp/<hostname>", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def snmp_ids(hostname): redis_config = current_app.config["INVENTORY_PROVIDER_CONFIG"]["redis"] r = redis.StrictRedis( @@ -117,7 +97,7 @@ def snmp_ids(hostname): @routes.route("/debug-dump/<hostname>", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def debug_dump_router_info(hostname): redis_config = current_app.config["INVENTORY_PROVIDER_CONFIG"]["redis"] r = redis.StrictRedis( @@ -138,7 +118,7 @@ def debug_dump_router_info(hostname): @routes.route("/bgp/<hostname>", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def bgp_configs(hostname): redis_config = current_app.config["INVENTORY_PROVIDER_CONFIG"]["redis"] r = redis.StrictRedis( @@ -167,7 +147,7 @@ def bgp_configs(hostname): @routes.route("/interfaces/status/<hostname>/<path:interface>", methods=['GET', 'POST']) -@require_accepts_json +@common.require_accepts_json def interface_statuses(hostname, interface): r = common.get_redis() result = r.hget("interface_statuses", @@ -182,6 +162,7 @@ def interface_statuses(hostname, interface): @routes.route("/services/<hostname>/<path:interface>", methods=['GET', 'POST']) +@common.require_accepts_json def services_for_interface(hostname, interface): r = common.get_redis() result = r.hget("interface_services", diff --git a/inventory_provider/routes/opsdb.py b/inventory_provider/routes/opsdb.py index 84faab3d11dafb639906079c4086949f56e320db..0cb54efb54d0b1a6f8e8959730f819e736cb4c3a 100644 --- a/inventory_provider/routes/opsdb.py +++ b/inventory_provider/routes/opsdb.py @@ -1,7 +1,6 @@ -import functools import json -from flask import Blueprint, request, Response +from flask import Blueprint, Response from inventory_provider.routes import common routes = Blueprint("inventory-opsdb-query-routes", __name__) @@ -13,25 +12,6 @@ service_parent_to_children_key = "parent_to_children_circuit_relations" interface_status_key = "interface_statuses" -def require_accepts_json(f): - """ - used as a route handler decorator to return an error - unless the request allows responses with type "application/json" - :param f: the function to be decorated - :return: the decorated function - """ - @functools.wraps(f) - def decorated_function(*args, **kwargs): - # TODO: use best_match to disallow */* ...? - if not request.accept_mimetypes.accept_json: - return Response( - response="response will be json", - status=406, - mimetype="text/html") - return f(*args, **kwargs) - return decorated_function - - def _decode_utf8_dict(d): return {k.decode('utf8'): json.loads(v) for k, v in d.items()} diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py index 2f48358a17bc2b5480ace087e8ab60391a4ea6af..9923dc9430196fb8141e5085d38c5750fd5d833e 100644 --- a/inventory_provider/tasks/worker.py +++ b/inventory_provider/tasks/worker.py @@ -7,12 +7,10 @@ import redis from lxml import etree from inventory_provider.tasks.app import app -from inventory_provider import alarmsdb from inventory_provider import config from inventory_provider import constants -from inventory_provider import db from inventory_provider import environment -from inventory_provider import opsdb +from inventory_provider.db import db, opsdb, alarmsdb from inventory_provider import snmp from inventory_provider import juniper diff --git a/test/test_alarmsdb.py b/test/test_alarmsdb.py index 7236721fc5f43d4931214a98a8d610049429c8a1..6e6b336956dad0d49c035d928682167a752ce0e5 100644 --- a/test/test_alarmsdb.py +++ b/test/test_alarmsdb.py @@ -1,4 +1,4 @@ -import inventory_provider.alarmsdb as alarmsdb +import inventory_provider.db.alarmsdb as alarmsdb def test_infinera_interface_status(mocker): @@ -77,13 +77,15 @@ def test_juniper_interface_status(mocker): def test_interface_status(mocker): mocked_infinera = mocker.patch( - 'inventory_provider.alarmsdb.get_last_known_infinera_interface_status') + 'inventory_provider.db.alarmsdb' + '.get_last_known_infinera_interface_status') mocked_infinera.return_value = "unknown" mocked_coriant = mocker.patch( - 'inventory_provider.alarmsdb.get_last_known_coriant_interface_status') + 'inventory_provider.db.alarmsdb' + '.get_last_known_coriant_interface_status') mocked_coriant.return_value = "unknown" mocked_juniper = mocker.patch( - 'inventory_provider.alarmsdb.' + 'inventory_provider.db.alarmsdb.' 'get_last_known_juniper_link_interface_status') mocked_juniper.return_value = "unknown" assert alarmsdb.get_last_known_interface_status(None, '', '') == "unknown" diff --git a/test/test_opsdb.py b/test/test_opsdb.py index 7e6c1848378c14f31ea6ede92b04a1bc2a65f2e2..2b0a299b3ebccff745cbe2108745711e01711d13 100644 --- a/test/test_opsdb.py +++ b/test/test_opsdb.py @@ -1,19 +1,23 @@ -import inventory_provider.opsdb +import inventory_provider.db.opsdb def test_update_fields(mocker): - mocker.patch("inventory_provider.opsdb._juniper_field_update") + mocker.patch("inventory_provider" + ".db.opsdb._juniper_field_update") t = {"manufacturer": "juniper"} - inventory_provider.opsdb._update_fields(t) - inventory_provider.opsdb._juniper_field_update.assert_called_once_with(t) + inventory_provider.db.opsdb._update_fields(t) + inventory_provider.db.opsdb \ + ._juniper_field_update.assert_called_once_with(t) - mocker.patch("inventory_provider.opsdb._infinera_field_update") + mocker.patch("inventory_provider" + ".db.opsdb._infinera_field_update") t = {"manufacturer": "infinera"} - inventory_provider.opsdb._update_fields(t) - inventory_provider.opsdb._infinera_field_update.assert_called_once_with(t) + inventory_provider.db.opsdb._update_fields(t) + inventory_provider.db.opsdb \ + ._infinera_field_update.assert_called_once_with(t) f = {"manufacturer": "non-existent"} - r = inventory_provider.opsdb._update_fields(f) + r = inventory_provider.db.opsdb._update_fields(f) assert f == r @@ -23,7 +27,7 @@ def test_infinera_field_update(): "card_id": "tim-b-5-7", "port": "1" } - r = inventory_provider.opsdb._infinera_field_update(i) + r = inventory_provider.db.opsdb._infinera_field_update(i) assert r["equipment"] == "AMS01-DTNX10-1" assert r["interface_name"] == "1-B-5-7-1" @@ -32,7 +36,7 @@ def test_infinera_field_update(): "card_id": "tim-1/2", "port": "1" } - r = inventory_provider.opsdb._infinera_field_update(i) + r = inventory_provider.db.opsdb._infinera_field_update(i) assert r["equipment"] == "BUD01_CX_01" assert r["interface_name"] == "1/2-1" @@ -41,7 +45,7 @@ def test_infinera_field_update(): "card_id": "tim_1/2", "port": "1" } - r = inventory_provider.opsdb._infinera_field_update(i) + r = inventory_provider.db.opsdb._infinera_field_update(i) assert r["interface_name"] == "TIM_1/2-1" @@ -50,50 +54,50 @@ def test_juniper_field_update(): "interface_name": "xe-1/2", "logical_unit": None } - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-1/2" i["interface_name"] = "xe-1/2" i["logical_unit"] = 101 - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-1/2.101" i["interface_name"] = "xe-1/2" i["logical_unit"] = 0 - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-1/2.0" i["interface_name"] = "xe-1/2" i["logical_unit"] = None i["port"] = 0 - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-1/2" i["interface_name"] = None i["card_id"] = "xe-2/0" i["logical_unit"] = None i["port"] = None - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-2/0" i["interface_name"] = None i["port"] = "0" - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-2/0/0" i["interface_name"] = None i["port"] = 0 - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-2/0/0" i["interface_name"] = None i["logical_unit"] = "123" - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-2/0/0.123" i["interface_name"] = None i["logical_unit"] = 123 - r = inventory_provider.opsdb._juniper_field_update(i) + r = inventory_provider.db.opsdb._juniper_field_update(i) assert r["interface_name"] == "xe-2/0/0.123" @@ -103,7 +107,7 @@ def test_coriant_update_fields(): "card_id": "2-3", "port": None } - r = inventory_provider.opsdb._coriant_field_update(i) + r = inventory_provider.db.opsdb._coriant_field_update(i) assert r["interface_name"] == "2-3" i = { @@ -111,24 +115,24 @@ def test_coriant_update_fields(): "card_id": "2-3", "port": "4" } - r = inventory_provider.opsdb._coriant_field_update(i) + r = inventory_provider.db.opsdb._coriant_field_update(i) assert r["interface_name"] == "2-3/4" def test_get_circuits(mocker): - mocker.patch("inventory_provider.opsdb.db.cursor") + mocker.patch("inventory_provider.db.db.cursor") mocked_convert_to_dict = mocker.patch( - "inventory_provider.opsdb._convert_to_dict") + "inventory_provider.db.opsdb._convert_to_dict") i = {"manufacturer": "infinera"} j = {"manufacturer": "juniper"} mocked_convert_to_dict.return_value = [i, j] mocked_infinera_update = mocker.patch( - "inventory_provider.opsdb._infinera_field_update") + "inventory_provider.db.opsdb._infinera_field_update") mocked_juniper_update = mocker.patch( - "inventory_provider.opsdb._juniper_field_update") + "inventory_provider.db.opsdb._juniper_field_update") - inventory_provider.opsdb.get_circuits(None) + inventory_provider.db.opsdb.get_circuits(None) mocked_infinera_update.assert_called_once_with(i) mocked_juniper_update.assert_called_once_with(j)