def _find_candidates( broker: ParsedSectionsBroker, run_plugin_names: Container[CheckPluginName], ) -> Set[CheckPluginName]: """Return names of check plugins that this multi_host_section may contain data for. Given this mutli_host_section, there is no point in trying to discover any check plugins not returned by this function. This does not address the question whether or not the returned check plugins will discover something. We have to consider both the host, and the management board as source type. Note that the determination of the plugin names is not quite symmetric: For the host, we filter out all management plugins, for the management board we create management variants from all plugins that are not already designed for management boards. """ if run_plugin_names is EVERYTHING: preliminary_candidates = list(agent_based_register.iter_all_check_plugins()) else: preliminary_candidates = [ p for p in agent_based_register.iter_all_check_plugins() if p.name in run_plugin_names ] parsed_sections_of_interest = { parsed_section_name for plugin in preliminary_candidates for parsed_section_name in plugin.sections } return (_find_host_candidates(broker, preliminary_candidates, parsed_sections_of_interest) | _find_mgmt_candidates(broker, preliminary_candidates, parsed_sections_of_interest))
def test__find_candidates(): mhs = MultiHostSections() mhs._data = { # we just care about the keys here, content set to [] for simplicity # section names have been are chosen arbitrarily. # any HostSections type is fine. HostKey("test_node", "1.2.3.4", SourceType.HOST): AgentHostSections({ SectionName("kernel"): [], # host only SectionName("uptime"): [['123']], # host & mgmt }), HostKey("test_node", "1.2.3.4", SourceType.MANAGEMENT): AgentHostSections({ SectionName("uptime"): [['123']], # host & mgmt SectionName("liebert_fans"): [[]], # mgmt only SectionName("mgmt_snmp_info"): [[]], # is already mgmt_ prefixed }), } preliminary_candidates = list(agent_based_register.iter_all_check_plugins()) parsed_sections_of_interest = { parsed_section_name for plugin in preliminary_candidates for parsed_section_name in plugin.sections } assert discovery._find_host_candidates( mhs, preliminary_candidates, parsed_sections_of_interest, ) == { CheckPluginName('docker_container_status_uptime'), CheckPluginName("kernel"), CheckPluginName('kernel_performance'), CheckPluginName('kernel_util'), CheckPluginName("uptime"), } assert discovery._find_mgmt_candidates( mhs, preliminary_candidates, parsed_sections_of_interest, ) == { CheckPluginName('mgmt_docker_container_status_uptime'), CheckPluginName("mgmt_liebert_fans"), CheckPluginName("mgmt_uptime"), CheckPluginName("mgmt_snmp_info"), # not mgmt_mgmt_... } assert discovery._find_candidates( mhs, selected_check_plugins=None, ) == { CheckPluginName('docker_container_status_uptime'), CheckPluginName("kernel"), CheckPluginName('kernel_performance'), CheckPluginName('kernel_util'), CheckPluginName('mgmt_docker_container_status_uptime'), CheckPluginName("mgmt_liebert_fans"), CheckPluginName("mgmt_uptime"), CheckPluginName("mgmt_snmp_info"), # not mgmt_mgmt_... CheckPluginName("uptime"), }
def test__find_candidates(): broker = ParsedSectionsBroker({ # we just care about the keys here, content set to arbitrary values that can be parsed. # section names have been are chosen arbitrarily. HostKey("test_node", "1.2.3.4", SourceType.HOST): AgentHostSections({ SectionName("kernel"): [], # host only SectionName("uptime"): [['123']], # host & mgmt }), HostKey("test_node", "1.2.3.4", SourceType.MANAGEMENT): SNMPHostSections({ # host & mgmt: SectionName("uptime"): [['123']], # type: ignore[dict-item] # mgmt only: SectionName("liebert_fans"): [[['Fan', '67', 'umin']]], # type: ignore[dict-item] # is already mgmt_ prefixed: SectionName("mgmt_snmp_info"): [[['a', 'b', 'c', 'd']]], # type: ignore[dict-item] }), }) preliminary_candidates = list(agent_based_register.iter_all_check_plugins()) parsed_sections_of_interest = { parsed_section_name for plugin in preliminary_candidates for parsed_section_name in plugin.sections } assert discovery._discovered_services._find_host_candidates( broker, preliminary_candidates, parsed_sections_of_interest, ) == { CheckPluginName('docker_container_status_uptime'), CheckPluginName("kernel"), CheckPluginName('kernel_performance'), CheckPluginName('kernel_util'), CheckPluginName("uptime"), } assert discovery._discovered_services._find_mgmt_candidates( broker, preliminary_candidates, parsed_sections_of_interest, ) == { CheckPluginName('mgmt_docker_container_status_uptime'), CheckPluginName("mgmt_liebert_fans"), CheckPluginName("mgmt_uptime"), } assert discovery._discovered_services._find_candidates( broker, run_only_plugin_names=None, ) == { CheckPluginName('docker_container_status_uptime'), CheckPluginName("kernel"), CheckPluginName('kernel_performance'), CheckPluginName('kernel_util'), CheckPluginName('mgmt_docker_container_status_uptime'), CheckPluginName("mgmt_liebert_fans"), CheckPluginName("mgmt_uptime"), CheckPluginName("uptime"), }
def _extract_disabled_snmp_sections_from_ignored_checks( self, all_rulesets): ignored_checks_ruleset = all_rulesets.get("ignored_checks") if ignored_checks_ruleset.is_empty(): # nothing to do return if not all_rulesets.get("snmp_exclude_sections").is_empty(): # this must be an upgrade from 2.0.0 or newer - don't mess with # the existing rules! return self._logger.log(VERBOSE, "Extracting excluded SNMP sections") all_snmp_section_names = set( s.name for s in register.iter_all_snmp_sections()) all_check_plugin_names = set( p.name for p in register.iter_all_check_plugins()) all_inventory_plugin_names = set( i.name for i in register.iter_all_inventory_plugins()) snmp_exclude_sections_ruleset = cmk.gui.watolib.rulesets.Ruleset( "snmp_exclude_sections", ignored_checks_ruleset.tag_to_group_map) for folder, _index, rule in ignored_checks_ruleset.get_rules(): disabled = {CheckPluginName(n) for n in rule.value} still_needed_sections_names = set( register.get_relevant_raw_sections( check_plugin_names=all_check_plugin_names - disabled, inventory_plugin_names=all_inventory_plugin_names, )) sections_to_disable = all_snmp_section_names - still_needed_sections_names if not sections_to_disable: continue new_rule = cmk.gui.watolib.rulesets.Rule( rule.folder, snmp_exclude_sections_ruleset) new_rule.from_config(rule.to_config()) new_rule.id = cmk.gui.watolib.rulesets.utils.gen_id() new_rule.value = { # type: ignore[assignment] 'sections_disabled': sorted(str(s) for s in sections_to_disable), 'sections_enabled': [], } new_rule.rule_options["comment"] = ( '%s - Checkmk: automatically converted during upgrade from rule ' '"Disabled checks". Please review if these rules can be deleted.' ) % time.strftime("%Y-%m-%d %H:%M", time.localtime()) snmp_exclude_sections_ruleset.append_rule(folder, new_rule) all_rulesets.set(snmp_exclude_sections_ruleset.name, snmp_exclude_sections_ruleset)
def test_find_missing_manpages_cluster_section(config_load_all_checks, all_pages): missing_cluster_description = set() for plugin in agent_based_register.iter_all_check_plugins(): if plugin.cluster_check_function.__name__ in ( "unfit_for_clustering", "cluster_legacy_mode_from_hell", ): continue man_page = all_pages[str(plugin.name)] assert man_page if "cluster" not in man_page["header"]: missing_cluster_description.add(str(plugin.name)) assert not missing_cluster_description
def _extract_disabled_snmp_sections_from_ignored_checks( self, all_rulesets): ignored_checks_ruleset = all_rulesets.get("ignored_checks") if ignored_checks_ruleset.is_empty(): # nothing to do return if not all_rulesets.get("snmp_exclude_sections").is_empty(): # this must be an upgrade from 2.0.0 or newer - don't mess with # the existing rules! return self._logger.log(VERBOSE, "Extracting excluded SNMP sections") all_snmp_section_names = set( s.name for s in register.iter_all_snmp_sections()) all_check_plugin_names = set( p.name for p in register.iter_all_check_plugins()) all_inventory_plugin_names = set( i.name for i in register.iter_all_inventory_plugins()) snmp_exclude_sections_ruleset = cmk.gui.watolib.rulesets.Ruleset( "snmp_exclude_sections", ignored_checks_ruleset.tag_to_group_map) for folder, _index, rule in ignored_checks_ruleset.get_rules(): disabled = {CheckPluginName(n) for n in rule.value} still_needed_sections_names = set( register.get_relevant_raw_sections( check_plugin_names=all_check_plugin_names - disabled, inventory_plugin_names=all_inventory_plugin_names, )) sections_to_disable = all_snmp_section_names - still_needed_sections_names new_rule = cmk.gui.watolib.rulesets.Rule( rule.folder, snmp_exclude_sections_ruleset) new_rule.from_config(rule.to_config()) new_rule.id = cmk.gui.watolib.rulesets.utils.gen_id() new_rule.value = { # type: ignore[assignment] 'sections_disabled': sorted(str(s) for s in sections_to_disable), 'sections_enabled': [], } snmp_exclude_sections_ruleset.append_rule(folder, new_rule) all_rulesets.set(snmp_exclude_sections_ruleset.name, snmp_exclude_sections_ruleset)
def _verify_non_deprecated_checkgroups() -> None: """Verify that the user has no deprecated check groups configured.""" # 'check_plugin.check_ruleset_name' is of type RuleSetName, which is an ABCName (good), # but config.checkgroup_parameters contains strings (todo) check_ruleset_names_with_plugin = { str(plugin.check_ruleset_name) for plugin in agent_based_register.iter_all_check_plugins() if plugin.check_ruleset_name } for checkgroup in config.checkgroup_parameters: if checkgroup not in check_ruleset_names_with_plugin: warning( 'Found configured rules of deprecated check group "%s". These rules are not used ' "by any check plugin. Maybe this check group has been renamed during an update, " "in this case you will have to migrate your configuration to the new ruleset manually. " "Please check out the release notes of the involved versions. " 'You may use the page "Deprecated rules" in the "Rule search" to view your rules' "and move them to the new rulesets." % checkgroup)
def test_find_missing_manpages_passive(config_load_all_checks, all_pages): for plugin_name in (str(p.name) for p in agent_based_register.iter_all_check_plugins()): if plugin_name in ("labels", "esx_systeminfo"): continue # these checks discovery functions can only create labels, never a service assert plugin_name in all_pages, "Manpage missing: %s" % plugin_name