Skip to content
Snippets Groups Projects
Commit 6f844ca0 authored by Pelle Koster's avatar Pelle Koster
Browse files

handle old interface checks and detect router netconf checks properly

parent fd1c8229
No related branches found
No related tags found
No related merge requests found
......@@ -158,7 +158,7 @@ def _counters_to_point(
return {
"time": timestamp.strftime("%Y-%m-%dT%H:%M:%SZ"),
"measurement": measurement,
"tags": {"hostname": router_fqdn, "interface_name": interface['name']},
"tags": {"hostname": router_fqdn, "interface_name": interface["name"]},
"fields": counters,
}
......
......@@ -6,15 +6,32 @@ from brian_polling_manager import sensu
logger = logging.getLogger(__name__)
def load_ifc_checks(sensu_params):
def _is_ifc_check(check):
name = check["metadata"]["name"]
# check-* is the old-style name (add to the returned
# data so it can be deleted)
return re.match(r"^(check|ifc)-[^-]+\.geant\.net-.+$", name)
def _is_rtr_check(check):
name = check["metadata"]["name"]
# check-* is the old-style name (add to the returned
# data so it can be deleted)
return re.match(r"^(rtr)-[^-]+\.geant\.net$", name)
ifc_checks = filter(_is_ifc_check, sensu.load_all_checks(sensu_params))
return {c["metadata"]["name"]: c for c in ifc_checks}
def _is_ifc_check(check):
name = check["metadata"]["name"]
# check-* is the old-style name (add to the returned
# data so it can be deleted)
return re.match(r"^(check|ifc)-[^-]+\.geant\.net-.+$", name)
def load_checks(sensu_params, filter_by):
checks = filter(filter_by, sensu.load_all_checks(sensu_params))
return {c["metadata"]["name"]: c for c in checks}
# TODO [POL1-797] rm after POL1-773 runs in production
def load_deprecated_ifc_checks(sensu_params):
return load_checks(sensu_params, _is_ifc_check)
def load_router_checks(sensu_params):
return load_checks(sensu_params, _is_rtr_check)
class NetconfRouterCheck(sensu.AbstractCheck):
......@@ -25,7 +42,7 @@ class NetconfRouterCheck(sensu.AbstractCheck):
@sensu.AbstractCheck.name.getter
def name(self):
return self.router
return f"rtr-{self.router}"
@sensu.AbstractCheck.command.getter
def command(self):
......@@ -44,7 +61,16 @@ def refresh(sensu_params, inventory_interfaces):
routers = {ifc["router"] for ifc in inventory_interfaces}
required_checks = [
NetconfRouterCheck(sensu_params["interface-check"], router) for router in routers
NetconfRouterCheck(sensu_params["interface-check"], router)
for router in routers
]
return sensu.refresh(sensu_params, required_checks, load_ifc_checks(sensu_params))
r1 = sensu.refresh(sensu_params, [], load_deprecated_ifc_checks(sensu_params))
r2 = sensu.refresh(sensu_params, required_checks, load_router_checks(sensu_params))
return {
"checks": r1["checks"] + r2["checks"],
"input": r1["input"] + r2["input"],
"created": r1["created"] + r2["created"],
"updated": r1["updated"] + r2["updated"],
"deleted": r1["deleted"] + r2["deleted"],
}
......@@ -4,6 +4,7 @@ import random
import re
import tempfile
from unittest.mock import patch
from brian_polling_manager import sensu
import brian_polling_manager.configuration
import jsonschema
import pytest
......@@ -78,6 +79,7 @@ def config_filename(config):
@pytest.fixture
def mocked_sensu():
sensu.clear_cached_values()
saved_sensu_checks = {
c["metadata"]["name"]: c for c in json.loads(_load_test_data("checks.json"))
......@@ -117,10 +119,10 @@ def mocked_sensu():
}
# mocked api for returning all checks
responses.add(
responses.add_callback(
method=responses.GET,
url=re.compile(r".*sensu.+/api/core/v2/namespaces/[^\/]+/checks$"),
json=list(saved_sensu_checks.values()),
callback=lambda _: (200, {}, json.dumps(list(saved_sensu_checks.values()))),
)
def new_check_callback(request):
......
......@@ -256,9 +256,7 @@ def app_config_params(free_host_port, data_dir):
"ssl": False,
},
},
"testing": {
"netconf-source-dir": str(data_dir)
},
"testing": {"netconf-source-dir": str(data_dir)},
}
......
......@@ -3,7 +3,7 @@ import copy
import jsonschema
import responses
from brian_polling_manager import sensu, interfaces
from brian_polling_manager import inventory, sensu, interfaces
@responses.activate
......@@ -37,15 +37,35 @@ def test_check_lifecycle(config, mocked_sensu, mocked_inventory):
def test_router_check(config):
check = interfaces.NetconfRouterCheck(config['sensu']['interface-check'], 'xyz').to_dict()
assert check['command'] == (
'/home/brian_checks/venv/get-interface-stats '
'--config /var/lib/sensu/conf/get-interface-stats.config.json --juniper xyz'
check = interfaces.NetconfRouterCheck(
config["sensu"]["interface-check"], "xyz"
).to_dict()
assert check["command"] == (
"/home/brian_checks/venv/get-interface-stats "
"--config /var/lib/sensu/conf/get-interface-stats.config.json --juniper xyz"
)
assert check['proxy_entity_name'] == 'xyz'
assert check['metadata']['name'] == 'xyz'
assert check["proxy_entity_name"] == "xyz"
assert check["metadata"]["name"] == "rtr-xyz"
@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}
sensu.clear_cached_values()
result = interfaces.refresh(config["sensu"], inventory_interfaces=routers)
assert result == {"checks": 2, "input": 2, "created": 0, "updated": 0, "deleted": 0}
@responses.activate
def test_runs_idempotent(config, mocked_sensu, mocked_inventory):
routers = inventory.load_interfaces("http://inventory1")
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}
class DummyCheck(sensu.AbstractCheck):
def __init__(self, name, command, proxy_entity_name):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment