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
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")
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() == {}
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]
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)
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
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
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
def test_parse_autochecks_file_not_existing(): assert autochecks.parse_autochecks_file("host") == []
def test_parse_autochecks_file_not_existing(): assert autochecks.parse_autochecks_file("host", config.service_description) == []
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'
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')
def _load_existing_services( *, host_name: HostName, ) -> Sequence[Service]: return autochecks.parse_autochecks_file(host_name, config.service_description)