Exemplo n.º 1
0
def test_parse_autochecks_file(fix_plugin_legacy, test_config,
                               autochecks_content, expected_result):
    autochecks_file = Path(cmk.utils.paths.autochecks_dir, "host.mk")
    with autochecks_file.open("w", encoding="utf-8") as f:
        f.write(autochecks_content)

    if expected_result is MKGeneralException:
        with pytest.raises(MKGeneralException):
            autochecks.parse_autochecks_file(
                "host",
                config.service_description,
                fix_plugin_legacy.check_variables,
            )
        return

    parsed = autochecks.parse_autochecks_file(
        "host",
        config.service_description,
        fix_plugin_legacy.check_variables,
    )
    assert len(parsed) == len(expected_result)

    for index, service in enumerate(parsed):
        expected = expected_result[index]
        assert service.check_plugin_name == expected[0]
        assert service.item == expected[1]
        assert service.parameters == expected[2], service.check_plugin_name
Exemplo n.º 2
0
def test_automation_set_autochecks(test_cfg, site):
    new_items = {
        ("df", "xxx"): ("'bla'", {
            u"xyz": u"123"
        }),
        ("uptime", None): (None, {}),
    }

    try:
        data = _execute_automation(site,
                                   "set-autochecks",
                                   args=["blablahost"],
                                   stdin=repr(new_items))
        assert data is None

        autochecks_file = "%s/%s.mk" % (cmk.utils.paths.autochecks_dir, "blablahost")
        assert os.path.exists(autochecks_file)

        data = autochecks.parse_autochecks_file("blablahost")
        services = [((s.check_plugin_name, s.item), s.parameters_unresolved,
                     s.service_labels.to_dict()) for s in data]
        assert sorted(services) == [
            (('df', u'xxx'), "'bla'", {
                u"xyz": u"123"
            }),
            (('uptime', None), 'None', {}),
        ]

        assert site.file_exists("var/check_mk/autochecks/blablahost.mk")
    finally:
        if site.file_exists("var/check_mk/autochecks/blablahost.mk"):
            site.delete_file("var/check_mk/autochecks/blablahost.mk")
Exemplo n.º 3
0
def test_test_check_2(request, test_cfg, site, web):
    test_check_path = "local/share/check_mk/checks/test_check_2"

    def cleanup():
        if site.file_exists("etc/check_mk/conf.d/test_check_2.mk"):
            site.delete_file("etc/check_mk/conf.d/test_check_2.mk")
        if site.file_exists("var/check_mk/autochecks/modes-test-host.mk"):
            site.delete_file("var/check_mk/autochecks/modes-test-host.mk")
        site.delete_file(test_check_path)

    request.addfinalizer(cleanup)

    site.write_file(
        test_check_path, """

discover_service = False

def inventory(info):
    if discover_service:
        return [(None, {})]

def check(item, params, info):
    return 0, "OK, discovered!"

check_info["test_check_2"] = {
    "check_function"      : check,
    "inventory_function"  : inventory,
    "service_description" : "Testcheck 2",
}
""")

    site.write_file("var/check_mk/agent_output/modes-test-host", "<<<test_check_2>>>\n1 2\n")

    config.load_checks(check_api.get_check_api_context, ["%s/%s" % (site.root, test_check_path)])
    config.load(with_conf_d=False)

    # Verify that the default variable is in the check context and
    # not in the global checks module context
    assert "discover_service" not in config.__dict__
    assert "test_check_2" in config._check_contexts
    assert "discover_service" in config._check_contexts["test_check_2"]

    web.discover_services("modes-test-host")

    # Should have discovered nothing so far
    assert site.read_file("var/check_mk/autochecks/modes-test-host.mk") == "[\n]\n"

    web.discover_services("modes-test-host")

    # And now overwrite the setting in the config
    site.write_file("etc/check_mk/conf.d/test_check_2.mk", "discover_service = True\n")

    web.discover_services("modes-test-host")

    # Verify that the discovery worked as expected
    services = autochecks.parse_autochecks_file("modes-test-host")
    assert services[0].check_plugin_name == "test_check_2"
    assert services[0].item is None
    assert services[0].parameters_unresolved == "{}"
    assert services[0].service_labels.to_dict() == {}
Exemplo n.º 4
0
def test_parse_autochecks_file(test_config, autochecks_content,
                               expected_result):
    autochecks_file = Path(cmk.utils.paths.autochecks_dir, "host.mk")
    with autochecks_file.open("w", encoding="utf-8") as f:  # pylint: disable=no-member
        f.write(autochecks_content)

    if expected_result is MKGeneralException:
        with pytest.raises(MKGeneralException):
            autochecks.parse_autochecks_file("host")
        return

    parsed = autochecks.parse_autochecks_file("host")
    assert len(parsed) == len(expected_result)

    for index, service in enumerate(parsed):
        expected = expected_result[index]
        assert service.check_plugin_name == expected[0]
        assert service.item == expected[1]
        assert service.parameters_unresolved == expected[2]
Exemplo n.º 5
0
def test_automation_set_autochecks(test_cfg, site):
    hostname = "blablahost"
    new_items: SetAutochecksTable = {
        ("df", "xxx"): ("Filesystem xxx", {}, {
            u"xyz": u"123"
        }, [hostname]),
        ("uptime", None): ("Uptime", None, {}, [hostname]),
    }

    try:
        data = _execute_automation(site,
                                   "set-autochecks",
                                   args=[hostname],
                                   stdin=repr(new_items))
        assert data is None

        autochecks_file = "%s/%s.mk" % (cmk.utils.paths.autochecks_dir,
                                        hostname)
        assert os.path.exists(autochecks_file)

        data = autochecks.parse_autochecks_file(hostname,
                                                config.service_description)
        services = [((str(s.check_plugin_name), s.item), s.parameters,
                     s.service_labels.to_dict()) for s in data]
        assert sorted(services) == [
            (
                ('df', u'xxx'),
                {},
                {
                    u"xyz": u"123"
                },
            ),
            (
                ('uptime', None),
                None,
                {},
            ),
        ]

        assert site.file_exists("var/check_mk/autochecks/%s.mk" % hostname)
    finally:
        if site.file_exists("var/check_mk/autochecks/%s.mk" % hostname):
            site.delete_file("var/check_mk/autochecks/%s.mk" % hostname)
Exemplo n.º 6
0
def test_do_discovery(monkeypatch):
    ts = Scenario().add_host("test-host", ipaddress="127.0.0.1")
    ts.fake_standard_linux_agent_output("test-host")
    ts.apply(monkeypatch)

    with cmk_debug_enabled():
        discovery.do_discovery(
            arg_hostnames={"test-host"},
            selected_sections=NO_SELECTION,
            run_only_plugin_names=None,
            arg_only_new=False,
        )

    services = autochecks.parse_autochecks_file("test-host", config.service_description)
    found = {(s.check_plugin_name, s.item): s.service_labels.to_dict() for s in services}
    assert found == _expected_services

    store = DiscoveredHostLabelsStore("test-host")
    assert store.load() == _expected_host_labels
Exemplo n.º 7
0
def test_test_check_1(request, test_cfg, site, web):

    test_check_path = "local/share/check_mk/checks/test_check_1"

    def cleanup():
        if site.file_exists("etc/check_mk/conf.d/test_check_1.mk"):
            site.delete_file("etc/check_mk/conf.d/test_check_1.mk")

        if site.file_exists("var/check_mk/autochecks/modes-test-host.mk"):
            site.delete_file("var/check_mk/autochecks/modes-test-host.mk")

        site.delete_file(test_check_path)

    request.addfinalizer(cleanup)

    site.write_file(
        test_check_path, """

test_check_1_default_levels = 10.0, 20.0

def inventory(info):
    return [(None, "test_check_1_default_levels")]

def check(item, params, info):
    return 0, "OK - %r" % (test_check_1_default_levels, )

check_info["test_check_1"] = {
    "check_function"          : check,
    "inventory_function"      : inventory,
    "service_description"     : "Testcheck 1",
#    "default_levels_variable" : "test_check_1_default_levels"
}
""")

    site.write_file("var/check_mk/agent_output/modes-test-host",
                    "<<<test_check_1>>>\n1 2\n")

    config.load_checks(check_api.get_check_api_context,
                       ["%s/%s" % (site.root, test_check_path)])
    config.load(with_conf_d=False)

    # Verify that the default variable is in the check context and
    # not in the global checks module context.
    assert "test_check_1_default_levels" not in config.__dict__
    assert "test_check_1" in config._check_contexts
    assert "test_check_1_default_levels" in config._check_contexts[
        "test_check_1"]

    web.discover_services("modes-test-host")

    # Verify that the discovery worked as expected
    services = autochecks.parse_autochecks_file("modes-test-host",
                                                config.service_description)
    assert services[0].check_plugin_name == "test_check_1"
    assert services[0].item is None
    assert services[0].parameters_unresolved == "test_check_1_default_levels"
    assert services[0].service_labels.to_dict() == {}

    # Now execute the check function to verify the variable is available
    p = site.execute(["cmk", "-nv", "modes-test-host"],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
    assert "OK - (10.0, 20.0)" in stdout
    assert stderr == ''
    assert p.returncode == 0

    # And now overwrite the setting in the config
    site.write_file("etc/check_mk/conf.d/test_check_1.mk",
                    "test_check_1_default_levels = 5.0, 30.1\n")

    p = site.execute(["cmk", "-nv", "modes-test-host"],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
    assert "OK - (10.0, 20.0)" not in stdout
    assert "OK - (5.0, 30.1)" in stdout
    assert stderr == ''
    assert p.returncode == 0
Exemplo n.º 8
0
def test_check_factory_settings(request, test_cfg, site, web):
    test_check_path = "local/share/check_mk/checks/test_check_3"

    def cleanup():
        if site.file_exists("etc/check_mk/conf.d/test_check_3.mk"):
            site.delete_file("etc/check_mk/conf.d/test_check_3.mk")
        if site.file_exists("var/check_mk/autochecks/modes-test-host.mk"):
            site.delete_file("var/check_mk/autochecks/modes-test-host.mk")
        site.delete_file(test_check_path)

    request.addfinalizer(cleanup)

    site.write_file(
        test_check_path, """

factory_settings["test_check_3_default_levels"] = {
    "param1": 123,
}

def inventory(info):
    return [(None, {})]

def check(item, params, info):
    return 0, "OK - %r" % (params, )

check_info["test_check_3"] = {
    "check_function"          : check,
    "inventory_function"      : inventory,
    "service_description"     : "Testcheck 3",
    "group"                   : "asd",
    "default_levels_variable" : "test_check_3_default_levels",
}
""")

    site.write_file("var/check_mk/agent_output/modes-test-host",
                    "<<<test_check_3>>>\n1 2\n")

    config.load_checks(check_api.get_check_api_context,
                       ["%s/%s" % (site.root, test_check_path)])

    # Verify that the default variable is in the check context and
    # not in the global checks module context
    assert "test_check_3_default_levels" not in config.__dict__
    assert "test_check_3" in config._check_contexts
    assert "test_check_3_default_levels" in config._check_contexts[
        "test_check_3"]

    web.discover_services("modes-test-host")

    # Verify that the discovery worked as expected
    services = autochecks.parse_autochecks_file("modes-test-host",
                                                config.service_description)
    assert services[0].check_plugin_name == "test_check_3"
    assert services[0].item is None
    assert services[0].parameters_unresolved == "{}"
    assert services[0].service_labels.to_dict() == {}

    # Now execute the check function to verify the variable is available
    p = site.execute(["cmk", "-nv", "modes-test-host"],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
    assert "OK - {'param1': 123}\n" in stdout
    assert stderr == ''
    assert p.returncode == 0

    # And now overwrite the setting in the config
    site.write_file(
        "etc/check_mk/conf.d/test_check_3.mk", """
checkgroup_parameters.setdefault('asd', [])

checkgroup_parameters['asd'] = [
    ( {'param2': 'xxx'}, [], ALL_HOSTS, {} ),
] + checkgroup_parameters['asd']
""")

    # And execute the check again to check for the parameters
    p = site.execute(["cmk", "-nv", "modes-test-host"],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
    stdout, stderr = p.communicate()
    assert "'param1': 123" in stdout
    assert "'param2': 'xxx'" in stdout
    assert stderr == ''
    assert p.returncode == 0
Exemplo n.º 9
0
def test_parse_autochecks_file_not_existing():
    assert autochecks.parse_autochecks_file("host") == []
Exemplo n.º 10
0
def test_parse_autochecks_file_not_existing():
    assert autochecks.parse_autochecks_file("host",
                                            config.service_description) == []
Exemplo n.º 11
0
def test_test_check_1_merged_rule(request, site, web):  # noqa: F811 # pylint: disable=redefined-outer-name

    test_check_path = "local/lib/check_mk/base/plugins/agent_based/test_check_1.py"

    def cleanup():
        if site.file_exists("etc/check_mk/conf.d/test_check_1.mk"):
            site.delete_file("etc/check_mk/conf.d/test_check_1.mk")

        if site.file_exists("var/check_mk/autochecks/modes-test-host.mk"):
            site.delete_file("var/check_mk/autochecks/modes-test-host.mk")

        site.delete_file(test_check_path)

    request.addfinalizer(cleanup)

    site.write_file(
        test_check_path, """
import pprint

from .agent_based_api.v1 import register, Service


def discover(params, section):
    yield Service(item=pprint.pformat(params))


def check(item, section):
    return
    yield


register.check_plugin(
    name="test_check_1",
    discovery_function=discover,
    discovery_ruleset_name="discover_test_check_1",
    discovery_ruleset_type=register.RuleSetType.MERGED,
    discovery_default_parameters={"default": 42},
    check_function=check,
    service_name="Foo %s",
)
""")

    site.write_file("var/check_mk/agent_output/modes-test-host", "<<<test_check_1>>>\n1 2\n")

    config.load_all_agent_based_plugins(check_api.get_check_api_context)
    config.load(with_conf_d=False)

    web.discover_services("modes-test-host")

    # Verify that the discovery worked as expected
    services = autochecks.parse_autochecks_file("modes-test-host", config.service_description)
    for service in services:
        if str(service.check_plugin_name) == "test_check_1":
            assert service.item == "Parameters({'default': 42})"
            break
    else:
        assert False, '"test_check_1" not discovered'

    # And now overwrite the setting in the config
    site.write_file("etc/check_mk/conf.d/test_check_1.mk",
                    "discover_test_check_1 = [{'value': {'levels': (1, 2)}, 'condition': {}}]\n")

    # rediscover with the setting in the config
    site.delete_file("var/check_mk/autochecks/modes-test-host.mk")
    web.discover_services("modes-test-host")
    services = autochecks.parse_autochecks_file("modes-test-host", config.service_description)
    for service in services:
        if str(service.check_plugin_name) == "test_check_1":
            assert service.item == "Parameters({'default': 42, 'levels': (1, 2)})"
            break
    else:
        assert False, '"test_check_1" not discovered'
Exemplo n.º 12
0
def test_test_check_1_all_rule(request, site, web):  # noqa: F811 # pylint: disable=redefined-outer-name

    host_name = "disco-params-test-host"

    create_linux_test_host(request, web, site, host_name)
    site.write_file("var/check_mk/agent_output/disco-params-test-host",
                    "<<<test_check_2>>>\n1 2\n")

    test_check_path = "local/lib/check_mk/base/plugins/agent_based/test_check_2.py"

    def cleanup():
        if site.file_exists("etc/check_mk/conf.d/test_check_2.mk"):
            site.delete_file("etc/check_mk/conf.d/test_check_2.mk")

        site.delete_file(test_check_path)

    request.addfinalizer(cleanup)

    site.write_file(
        test_check_path,
        """
import pprint

from .agent_based_api.v1 import register, Service


def discover(params, section):
    yield Service(item=pprint.pformat(params))


def check(item, section):
    return
    yield


register.check_plugin(
    name="test_check_2",
    discovery_function=discover,
    discovery_ruleset_name="discover_test_check_2",
    discovery_ruleset_type=register.RuleSetType.ALL,
    discovery_default_parameters={"default": 42},
    check_function=check,
    service_name="Foo %s",
)
""",
    )

    web.activate_changes()

    web.discover_services(host_name)

    # Verify that the discovery worked as expected
    services = autochecks.parse_autochecks_file(HostName(host_name),
                                                config.service_description)

    for service in services:
        if str(service.check_plugin_name) == "test_check_2":
            assert service.item == "[Parameters({'default': 42})]"
            break
    else:
        raise AssertionError('"test_check_2" not discovered')

    # And now overwrite the setting in the config
    site.write_file(
        "etc/check_mk/conf.d/test_check_2.mk",
        "discover_test_check_2 = [{'value': {'levels': (1, 2)}, 'condition': {}}]\n",
    )

    # rediscover with the setting in the config
    site.delete_file(f"var/check_mk/autochecks/{host_name}.mk")
    web.discover_services(host_name)
    services = autochecks.parse_autochecks_file(HostName(host_name),
                                                config.service_description)
    for service in services:
        if str(service.check_plugin_name) == "test_check_2":
            assert service.item == ("[Parameters({'levels': (1, 2)}),"
                                    " Parameters({'default': 42})]")
            break
    else:
        raise AssertionError('"test_check_2" not discovered')
Exemplo n.º 13
0
def _load_existing_services(
    *,
    host_name: HostName,
) -> Sequence[Service]:
    return autochecks.parse_autochecks_file(host_name, config.service_description)