diff --git a/brian_polling_manager/interfaces.py b/brian_polling_manager/interfaces.py index b295dc7f0be907bfec1e5a3549c2295b81156c4d..bdcfbbec2b030115e286a3eebf19bdccf7db7876 100644 --- a/brian_polling_manager/interfaces.py +++ b/brian_polling_manager/interfaces.py @@ -1,5 +1,6 @@ import logging import re +from typing import Optional from brian_polling_manager import sensu @@ -38,10 +39,16 @@ class NetconfRouterCheck(sensu.AbstractCheck): METRIC_FORMAT = "" METRIC_HANDLERS = None - def __init__(self, ifc_check_params, router: str): + def __init__(self, ifc_check_params, router: str, vendor: Optional[str] = None): super().__init__() self.ifc_check_params = ifc_check_params self.router = router + self.vendor = vendor or self.vendor_from_router_name(router) + + @staticmethod + def vendor_from_router_name(router): + # Hacky vendor check + return "nokia" if router.startswith("rt0") else "juniper" @sensu.AbstractCheck.name.getter def name(self): @@ -53,7 +60,7 @@ class NetconfRouterCheck(sensu.AbstractCheck): hostname=self.router, config=self.ifc_check_params["config"], script=self.ifc_check_params["script"], - args=f"--juniper {self.router} --all", + args=f"--{self.vendor} {self.router} --all", ) @sensu.AbstractCheck.proxy_entity_name.getter @@ -62,11 +69,13 @@ class NetconfRouterCheck(sensu.AbstractCheck): def refresh(sensu_params, inventory_interfaces): - routers = {ifc["router"] for ifc in inventory_interfaces} + routers_w_vendor = { + (ifc["router"], ifc.get("vendor")) for ifc in inventory_interfaces + } required_checks = [ - NetconfRouterCheck(sensu_params["interface-check"], router) - for router in routers + NetconfRouterCheck(sensu_params["interface-check"], router, vendor=vendor) + for router, vendor in routers_w_vendor ] r1 = sensu.refresh(sensu_params, [], load_deprecated_ifc_checks(sensu_params)) diff --git a/brian_polling_manager/inventory.py b/brian_polling_manager/inventory.py index 23a67e0216f6e59a2043109dc9b793abe3ebf514..f9838a306c84ca16448533512034886b4ddc5d53 100644 --- a/brian_polling_manager/inventory.py +++ b/brian_polling_manager/inventory.py @@ -40,7 +40,7 @@ INVENTORY_INTERFACES_SCHEMA = { 'router': {'type': 'string'}, 'name': {'type': 'string'}, }, - 'required': ['router', 'name',], + 'required': ['router', 'name'], } }, diff --git a/test/conftest.py b/test/conftest.py index f70af73fa6b8debce59ef3a3e1527a7ae4965b10..e2bd49b1f5ce643b6aefb26d57925b9947fb3360 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -118,11 +118,14 @@ def mocked_sensu(): "additionalProperties": True, } + def get_checks(_): + return (200, {}, json.dumps(list(saved_sensu_checks.values()))) + # mocked api for returning all checks responses.add_callback( method=responses.GET, url=re.compile(r".*sensu.+/api/core/v2/namespaces/[^\/]+/checks$"), - callback=lambda _: (200, {}, json.dumps(list(saved_sensu_checks.values()))), + callback=get_checks, ) def new_check_callback(request): diff --git a/test/data/interfaces.json b/test/data/interfaces.json index da1e1231cf5cf96bc4c465a8a432fd9ce5bbdabb..04a1eeda7b4c115e6950e92ecac6d25f420c0a9e 100644 --- a/test/data/interfaces.json +++ b/test/data/interfaces.json @@ -46,5 +46,14 @@ } ], "snmp-index": 9999 + }, + { + "router": "rt0.on.uk.lab.office.geant.net", + "name": "1/1/c2/3", + "bundle": [], + "bundle-parents": [], + "description": "blah blah nokia router", + "circuits": [], + "snmp-index": 9999 } ] diff --git a/test/test_sensu_checks.py b/test/test_sensu_checks.py index 31e0998c46033005c141e5ffd577dd2f906ae774..fd03063c802896b28b1c9310afffc16541619536 100644 --- a/test/test_sensu_checks.py +++ b/test/test_sensu_checks.py @@ -53,14 +53,29 @@ def test_router_check(config): assert check["output_metric_handlers"] == [] +def test_nokia_router_check(config): + check = interfaces.NetconfRouterCheck( + config["sensu"]["interface-check"], "xyz", vendor="nokia" + ).to_dict() + assert check["command"] == ( + "/home/brian_checks/venv/get-interface-stats " + "--config /var/lib/sensu/conf/get-interface-stats.config.json " + "--nokia xyz --all" + ) + assert check["proxy_entity_name"] == "xyz" + assert check["metadata"]["name"] == "rtr-xyz" + assert check["output_metric_format"] == "" + assert check["output_metric_handlers"] == [] + + @responses.activate def test_cleans_up_old_interface_checks(config, mocked_sensu, mocked_inventory): routers = inventory.load_interfaces("http://inventory1") result = interfaces.refresh(config["sensu"], inventory_interfaces=routers) - assert result == {"checks": 3, "input": 2, "created": 2, "updated": 0, "deleted": 3} + assert result == {"checks": 3, "input": 3, "created": 3, "updated": 0, "deleted": 3} sensu.clear_cached_values() result = interfaces.refresh(config["sensu"], inventory_interfaces=routers) - assert result == {"checks": 2, "input": 2, "created": 0, "updated": 0, "deleted": 0} + assert result == {"checks": 3, "input": 3, "created": 0, "updated": 0, "deleted": 0} @responses.activate @@ -69,7 +84,7 @@ def test_runs_idempotent(config, mocked_sensu, mocked_inventory): interfaces.refresh(config["sensu"], inventory_interfaces=routers) sensu.clear_cached_values() result = interfaces.refresh(config["sensu"], inventory_interfaces=routers) - assert result == {"checks": 2, "input": 2, "created": 0, "updated": 0, "deleted": 0} + assert result == {"checks": 3, "input": 3, "created": 0, "updated": 0, "deleted": 0} class DummyCheck(sensu.AbstractCheck):