Skip to content

Commit

Permalink
diagnostics: pass loaded config instance
Browse files Browse the repository at this point in the history
This ensures we actually have loaded the
config.

Change-Id: I01820d930e95f8c4c8657a86cadf0e958faf381e
  • Loading branch information
mo-ki committed Feb 28, 2025
1 parent fee7bc9 commit fcc125c
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 21 deletions.
4 changes: 3 additions & 1 deletion cmk/base/automations/check_mk.py
Original file line number Diff line number Diff line change
Expand Up @@ -3275,12 +3275,14 @@ def execute(
plugins: AgentBasedPlugins | None,
loaded_config: config.LoadedConfigFragment | None,
) -> CreateDiagnosticsDumpResult:
if loaded_config is None:
loaded_config = load_config(discovery_rulesets=())
buf = io.StringIO()
with redirect_stdout(buf), redirect_stderr(buf):
log.setup_console_logging()
# NOTE: All the stuff is logged on this level only, which is below the default WARNING level.
log.logger.setLevel(logging.INFO)
dump = DiagnosticsDump(deserialize_cl_parameters(args))
dump = DiagnosticsDump(loaded_config, deserialize_cl_parameters(args))
dump.create()
return CreateDiagnosticsDumpResult(
output=buf.getvalue(),
Expand Down
36 changes: 21 additions & 15 deletions cmk/base/diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import traceback
import urllib.parse
import uuid
from collections.abc import Iterable, Iterator, Mapping
from collections.abc import Iterator, Mapping
from datetime import datetime
from functools import cache
from pathlib import Path
Expand Down Expand Up @@ -61,13 +61,9 @@
from cmk.utils.local_secrets import SiteInternalSecret
from cmk.utils.log import console, section
from cmk.utils.paths import omd_root
from cmk.utils.rulesets import RuleSetName
from cmk.utils.structured_data import load_tree, SDNodeName, SDRawTree, serialize_tree

from cmk.base.api.agent_based.register import (
extract_known_discovery_rulesets,
get_previously_loaded_plugins,
)
from cmk.base.config import LoadedConfigFragment

if cmk_version.edition(cmk.utils.paths.omd_root) in [
cmk_version.Edition.CEE,
Expand All @@ -80,15 +76,17 @@
)
else:

def cmc_specific_attrs(discovery_rulesets: Iterable[RuleSetName]) -> Mapping[str, int]:
def cmc_specific_attrs(loaded_config: LoadedConfigFragment) -> Mapping[str, int]:
return {}


SUFFIX = ".tar.gz"


def create_diagnostics_dump(parameters: DiagnosticsOptionalParameters | None) -> None:
dump = DiagnosticsDump(parameters)
def create_diagnostics_dump(
loaded_config: LoadedConfigFragment, parameters: DiagnosticsOptionalParameters | None
) -> None:
dump = DiagnosticsDump(loaded_config, parameters)
dump.create()

section.section_step("Creating diagnostics dump", verbose=False)
Expand Down Expand Up @@ -147,8 +145,12 @@ class DiagnosticsDump:

_keep_num_dumps = 10

def __init__(self, parameters: DiagnosticsOptionalParameters | None = None) -> None:
self.fixed_elements = self._get_fixed_elements()
def __init__(
self,
loaded_config: LoadedConfigFragment,
parameters: DiagnosticsOptionalParameters | None = None,
) -> None:
self.fixed_elements = self._get_fixed_elements(loaded_config)
self.optional_elements = self._get_optional_elements(parameters)
self.elements = self.fixed_elements + self.optional_elements

Expand All @@ -158,10 +160,12 @@ def __init__(self, parameters: DiagnosticsOptionalParameters | None = None) -> N
self.tarfile_path = dump_folder.joinpath(_file_name).with_suffix(SUFFIX)
self.tarfile_created = False

def _get_fixed_elements(self) -> list[ABCDiagnosticsElement]:
def _get_fixed_elements(
self, loaded_config: LoadedConfigFragment
) -> list[ABCDiagnosticsElement]:
return [
GeneralDiagnosticsElement(),
PerfDataDiagnosticsElement(),
PerfDataDiagnosticsElement(loaded_config),
HWDiagnosticsElement(),
VendorDiagnosticsElement(),
EnvironmentDiagnosticsElement(),
Expand Down Expand Up @@ -528,6 +532,9 @@ def _collect_infos(self) -> DiagnosticsElementJSONResult:


class PerfDataDiagnosticsElement(ABCDiagnosticsElementJSONDump):
def __init__(self, load_config: LoadedConfigFragment) -> None:
self._loaded_config = load_config

@property
def ident(self) -> str:
return "perfdata"
Expand All @@ -550,8 +557,7 @@ def _collect_infos(self) -> DiagnosticsElementJSONResult:
if (key := result[0][i]) not in ["license_usage_history"]
}

discovery_rulesets = extract_known_discovery_rulesets(get_previously_loaded_plugins())
performance_data.update(cmc_specific_attrs(discovery_rulesets))
performance_data.update(cmc_specific_attrs(self._loaded_config))

return performance_data

Expand Down
3 changes: 2 additions & 1 deletion cmk/base/modes/check_mk.py
Original file line number Diff line number Diff line change
Expand Up @@ -3184,7 +3184,8 @@ def mode_create_diagnostics_dump(options: DiagnosticsModesParameters) -> None:
# NOTE: All the stuff is logged on this level only, which is below the default WARNING level.
log.logger.setLevel(logging.INFO)
cmk.base.diagnostics.create_diagnostics_dump(
cmk.utils.diagnostics.deserialize_modes_parameters(options)
config.load(discovery_rulesets=()),
cmk.utils.diagnostics.deserialize_modes_parameters(options),
)


Expand Down
17 changes: 13 additions & 4 deletions tests/unit/cmk/base/test_diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@
import cmk.utils.paths

from cmk.base import diagnostics
from cmk.base.config import ConfigCache, LoadedConfigFragment


def _make_diagnostics_dump() -> diagnostics.DiagnosticsDump:
return diagnostics.DiagnosticsDump(
LoadedConfigFragment(discovery_rules={}, config_cache=ConfigCache())
)


@pytest.fixture(autouse=True)
Expand Down Expand Up @@ -55,13 +62,13 @@ def test_diagnostics_dump_elements() -> None:
fixed_element_classes = {
diagnostics.GeneralDiagnosticsElement,
}
element_classes = {type(e) for e in diagnostics.DiagnosticsDump().elements}
element_classes = {type(e) for e in _make_diagnostics_dump().elements}
assert fixed_element_classes.issubset(element_classes)


@pytest.mark.usefixtures("mock_livestatus")
def test_diagnostics_dump_create() -> None:
diagnostics_dump = diagnostics.DiagnosticsDump()
diagnostics_dump = _make_diagnostics_dump()
diagnostics_dump._create_dump_folder()

assert isinstance(diagnostics_dump.dump_folder, Path)
Expand All @@ -77,7 +84,7 @@ def test_diagnostics_dump_create() -> None:


def test_diagnostics_cleanup_dump_folder() -> None:
diagnostics_dump = diagnostics.DiagnosticsDump()
diagnostics_dump = _make_diagnostics_dump()
diagnostics_dump._create_dump_folder()

# Fake existing tarfiles
Expand Down Expand Up @@ -140,7 +147,9 @@ def test_diagnostics_element_general_content(


def test_diagnostics_element_perfdata() -> None:
diagnostics_element = diagnostics.PerfDataDiagnosticsElement()
diagnostics_element = diagnostics.PerfDataDiagnosticsElement(
LoadedConfigFragment(discovery_rules={}, config_cache=ConfigCache())
)
assert diagnostics_element.ident == "perfdata"
assert diagnostics_element.title == "Performance data"
assert diagnostics_element.description == (
Expand Down

0 comments on commit fcc125c

Please sign in to comment.