Skip to content

Commit 59723ac

Browse files
committed
detach enforced services table
Change-Id: Ie055ee0fcdf20eb225cc61473fb13d0be16f5b7d
1 parent c60f416 commit 59723ac

16 files changed

Lines changed: 516 additions & 89 deletions

File tree

cmk/base/automations/check_mk.py

Lines changed: 137 additions & 26 deletions
Large diffs are not rendered by default.

cmk/base/config.py

Lines changed: 76 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,9 @@ def _aggregate_check_table_services(
244244
*,
245245
config_cache: ConfigCache,
246246
service_name_config: PassiveServiceNameConfig,
247+
enforced_services_table: Callable[
248+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
249+
],
247250
skip_ignored: bool,
248251
filter_mode: FilterMode,
249252
get_autochecks: Callable[[HostAddress], Sequence[AutocheckEntry]],
@@ -275,6 +278,7 @@ def _aggregate_check_table_services(
275278
host_name,
276279
get_autochecks,
277280
configure_autochecks,
281+
enforced_services_table,
278282
plugins,
279283
)
280284
if sfilter.keep(s)
@@ -286,13 +290,7 @@ def _aggregate_check_table_services(
286290
if sfilter.keep(s)
287291
)
288292

289-
yield from (
290-
svc
291-
for _, svc in config_cache.enforced_services_table(
292-
host_name, plugins, service_name_config
293-
).values()
294-
if sfilter.keep(svc)
295-
)
293+
yield from (svc for _, svc in enforced_services_table(host_name).values() if sfilter.keep(svc))
296294

297295
# NOTE: as far as I can see, we only have two cases with the filter mode.
298296
# Either we compute services to check, or we compute services for fetching.
@@ -321,6 +319,7 @@ def _aggregate_check_table_services(
321319
host_name,
322320
get_autochecks,
323321
configure_autochecks,
322+
enforced_services_table,
324323
plugins,
325324
)
326325
if sfilter.keep(s)
@@ -392,6 +391,9 @@ def _get_services_from_cluster_nodes(
392391
[HostName, Sequence[AutocheckEntry]],
393392
Iterable[ConfiguredService],
394393
],
394+
enforced_services_table: Callable[
395+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
396+
],
395397
plugins: Mapping[CheckPluginName, CheckPlugin],
396398
) -> Iterable[ConfiguredService]:
397399
for cluster in config_cache.clusters_of(node_name):
@@ -401,6 +403,7 @@ def _get_services_from_cluster_nodes(
401403
cluster,
402404
get_autochecks,
403405
configure_autochecks,
406+
enforced_services_table,
404407
plugins,
405408
)
406409

@@ -414,6 +417,9 @@ def _get_clustered_services(
414417
[HostName, Sequence[AutocheckEntry]],
415418
Iterable[ConfiguredService],
416419
],
420+
enforced_services_table: Callable[
421+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
422+
],
417423
plugins: Mapping[CheckPluginName, CheckPlugin],
418424
) -> Iterable[ConfiguredService]:
419425
nodes = config_cache.nodes(cluster_name)
@@ -453,10 +459,7 @@ def appears_on_cluster(node_name: HostAddress, entry: AutocheckEntry) -> bool:
453459
)
454460

455461
yield from merge_enforced_services(
456-
{
457-
node_name: config_cache.enforced_services_table(node_name, plugins, service_name_config)
458-
for node_name in nodes
459-
},
462+
{node_name: enforced_services_table(node_name) for node_name in nodes},
460463
# similiar to appears_on_cluster, but we don't check for ignored services
461464
lambda node_name, service_name, discovered_labels: (
462465
config_cache.effective_host(
@@ -563,6 +566,9 @@ class LoadedConfigFragment:
563566
folder_attributes: Mapping[str, FolderAttributesForBase]
564567
discovery_rules: Mapping[RuleSetName, Sequence[RuleSpec]]
565568
checkgroup_parameters: Mapping[str, Sequence[RuleSpec[Mapping[str, object]]]]
569+
static_checks: Mapping[
570+
str, list[RuleSpec[list[object]]]
571+
] # a.k.a. "enforced_services". Keep the name for consistency
566572
service_rule_groups: set[str]
567573
service_descriptions: Mapping[str, str]
568574
service_description_translation: Sequence[RuleSpec[Mapping[str, object]]]
@@ -710,6 +716,7 @@ def _perform_post_config_loading_actions(
710716
folder_attributes=folder_attributes,
711717
discovery_rules=discovery_settings,
712718
checkgroup_parameters=checkgroup_parameters,
719+
static_checks=static_checks,
713720
service_rule_groups=service_rule_groups,
714721
service_descriptions=service_descriptions,
715722
service_description_translation=service_description_translation,
@@ -1703,6 +1710,9 @@ def fetcher_factory(
17031710
service_configurer: ServiceConfigurer,
17041711
ip_lookup: ip_lookup.IPLookup,
17051712
service_name_config: PassiveServiceNameConfig,
1713+
enforced_services_table: Callable[
1714+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
1715+
],
17061716
) -> FetcherFactory:
17071717
return FetcherFactory(
17081718
self,
@@ -1713,6 +1723,7 @@ def fetcher_factory(
17131723
self.ruleset_matcher,
17141724
service_configurer,
17151725
service_name_config,
1726+
enforced_services_table,
17161727
is_cmc=self._loaded_config.monitoring_core == "cmc",
17171728
)
17181729

@@ -1856,6 +1867,9 @@ def make_checking_sections(
18561867
service_configurer: ServiceConfigurer,
18571868
service_name_config: PassiveServiceNameConfig,
18581869
hostname: HostName,
1870+
enforced_services_table: Callable[
1871+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
1872+
],
18591873
*,
18601874
selected_sections: SectionNameCollection,
18611875
) -> frozenset[SectionName]:
@@ -1871,6 +1885,7 @@ def make_checking_sections(
18711885
plugins.check_plugins,
18721886
service_configurer,
18731887
service_name_config,
1888+
enforced_services_table,
18741889
filter_mode=FilterMode.INCLUDE_CLUSTERED,
18751890
skip_ignored=True,
18761891
).needed_check_names()
@@ -1921,6 +1936,9 @@ def check_table(
19211936
plugins: Mapping[CheckPluginName, CheckPlugin],
19221937
service_configurer: ServiceConfigurer,
19231938
service_name_config: PassiveServiceNameConfig,
1939+
enforced_services_table: Callable[
1940+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
1941+
],
19241942
*,
19251943
use_cache: bool = True,
19261944
filter_mode: FilterMode = FilterMode.NONE,
@@ -1937,6 +1955,7 @@ def check_table(
19371955
hostname,
19381956
config_cache=self,
19391957
service_name_config=service_name_config,
1958+
enforced_services_table=enforced_services_table,
19401959
skip_ignored=skip_ignored,
19411960
filter_mode=filter_mode,
19421961
get_autochecks=self.autochecks_memoizer.read,
@@ -1956,10 +1975,15 @@ def _sorted_services(
19561975
plugins: Mapping[CheckPluginName, CheckPlugin],
19571976
service_configurer: ServiceConfigurer,
19581977
service_name_config: PassiveServiceNameConfig,
1978+
enforced_services_table: Callable[
1979+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
1980+
],
19591981
) -> Sequence[ConfiguredService]:
19601982
# This method is only useful for the monkeypatching orgy of the "unit"-tests.
19611983
return sorted(
1962-
self.check_table(hostname, plugins, service_configurer, service_name_config).values(),
1984+
self.check_table(
1985+
hostname, plugins, service_configurer, service_name_config, enforced_services_table
1986+
).values(),
19631987
key=lambda service: service.description,
19641988
)
19651989

@@ -1969,9 +1993,14 @@ def configured_services(
19691993
plugins: Mapping[CheckPluginName, CheckPlugin],
19701994
service_configurer: ServiceConfigurer,
19711995
service_name_config: PassiveServiceNameConfig,
1996+
enforced_services_table: Callable[
1997+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
1998+
],
19721999
service_depends_on: Callable[[HostAddress, ServiceName], Sequence[ServiceName]],
19732000
) -> Sequence[ConfiguredService]:
1974-
services = self._sorted_services(hostname, plugins, service_configurer, service_name_config)
2001+
services = self._sorted_services(
2002+
hostname, plugins, service_configurer, service_name_config, enforced_services_table
2003+
)
19752004
if self._loaded_config.monitoring_core == "cmc":
19762005
return services
19772006

@@ -3621,11 +3650,28 @@ def _site_of_host(self, host_name: HostName) -> SiteId:
36213650
)
36223651
)
36233652

3624-
def enforced_services_table(
3653+
3654+
class EnforcedServicesTable:
3655+
"""A table of enforced services"""
3656+
3657+
def __init__(
36253658
self,
3626-
hostname: HostName,
3627-
plugins: Mapping[CheckPluginName, CheckPlugin],
3659+
enforced_services_config: Callable[
3660+
[HostName],
3661+
Mapping[str, Sequence[Sequence[object]]],
3662+
],
36283663
service_name_config: PassiveServiceNameConfig,
3664+
plugins: Mapping[CheckPluginName, CheckPlugin],
3665+
) -> None:
3666+
self._enforced_services_config = enforced_services_config
3667+
self._service_name_config = service_name_config
3668+
self._plugins = plugins
3669+
self._memoized: dict[
3670+
HostName, Mapping[ServiceID, tuple[RulesetName, ConfiguredService]]
3671+
] = {}
3672+
3673+
def __call__(
3674+
self, hostname: HostName
36293675
) -> Mapping[
36303676
ServiceID,
36313677
tuple[RulesetName, ConfiguredService],
@@ -3638,24 +3684,24 @@ def enforced_services_table(
36383684
and item.
36393685
"""
36403686
with contextlib.suppress(KeyError):
3641-
return self.__enforced_services_table[hostname]
3687+
return self._memoized[hostname]
36423688

3643-
return self.__enforced_services_table.setdefault(
3689+
return self._memoized.setdefault(
36443690
hostname,
36453691
{
36463692
ServiceID(check_plugin_name, item): (
36473693
RulesetName(checkgroup_name),
36483694
ConfiguredService(
36493695
check_plugin_name=check_plugin_name,
36503696
item=item,
3651-
description=service_name_config.make_name(
3697+
description=self._service_name_config.make_name(
36523698
hostname,
36533699
check_plugin_name,
36543700
service_name_template=(
36553701
None
36563702
if (
36573703
p := agent_based_register.get_check_plugin(
3658-
check_plugin_name, plugins
3704+
check_plugin_name, self._plugins
36593705
)
36603706
)
36613707
is None
@@ -3664,22 +3710,19 @@ def enforced_services_table(
36643710
item=item,
36653711
),
36663712
parameters=compute_enforced_service_parameters(
3667-
plugins, check_plugin_name, params
3713+
self._plugins, check_plugin_name, params
36683714
),
36693715
discovered_parameters={},
36703716
discovered_labels={},
36713717
labels={},
36723718
is_enforced=True,
36733719
),
36743720
)
3675-
for checkgroup_name, ruleset in static_checks.items()
3721+
for checkgroup_name, matched_rule_values in self._enforced_services_config(
3722+
hostname
3723+
).items()
36763724
for check_plugin_name, item, params in (
3677-
ConfigCache._sanitize_enforced_entry(*entry)
3678-
for entry in reversed(
3679-
self.ruleset_matcher.get_host_values_all(
3680-
hostname, ruleset, self.label_manager.labels_of_host
3681-
)
3682-
)
3725+
self._sanitize_enforced_entry(*entry) for entry in reversed(matched_rule_values)
36833726
)
36843727
},
36853728
)
@@ -3824,6 +3867,9 @@ def __init__(
38243867
ruleset_matcher_: RulesetMatcher,
38253868
service_configurer: ServiceConfigurer,
38263869
service_name_config: PassiveServiceNameConfig,
3870+
enforced_services_table: Callable[
3871+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
3872+
],
38273873
*,
38283874
is_cmc: bool,
38293875
) -> None:
@@ -3834,6 +3880,7 @@ def __init__(
38343880
self._ruleset_matcher: Final = ruleset_matcher_
38353881
self._service_configurer: Final = service_configurer
38363882
self._service_name_config: Final = service_name_config
3883+
self._enforced_services_table: Final = enforced_services_table
38373884
self.is_cmc: Final = is_cmc
38383885
self.__disabled_snmp_sections: dict[HostName, frozenset[SectionName]] = {}
38393886

@@ -3907,6 +3954,7 @@ def make_snmp_fetcher(
39073954
self._service_configurer,
39083955
self._service_name_config,
39093956
host_name,
3957+
self._enforced_services_table,
39103958
selected_sections=fetcher_config.selected_sections,
39113959
),
39123960
sections=plugins.snmp_sections.values(),

cmk/base/core.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from cmk.ccc import store, tty
2424
from cmk.ccc.exceptions import MKBailOut, MKGeneralException
2525
from cmk.ccc.hostaddress import HostName, Hosts
26-
from cmk.checkengine.plugins import AgentBasedPlugins
26+
from cmk.checkengine.plugins import AgentBasedPlugins, ConfiguredService, ServiceID
2727
from cmk.utils import ip_lookup
2828
from cmk.utils.rulesets import RuleSetName
2929
from cmk.utils.rulesets.ruleset_matcher import RuleSpec
@@ -57,6 +57,9 @@ def do_reload(
5757
config_cache: ConfigCache,
5858
hosts_config: Hosts,
5959
service_name_config: PassiveServiceNameConfig,
60+
enforced_services_table: Callable[
61+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
62+
],
6063
get_ip_stack_config: Callable[[HostName], ip_lookup.IPStackConfig],
6164
default_address_family: Callable[
6265
[HostName], Literal[socket.AddressFamily.AF_INET, socket.AddressFamily.AF_INET6]
@@ -77,6 +80,7 @@ def do_reload(
7780
config_cache,
7881
hosts_config,
7982
service_name_config,
83+
enforced_services_table,
8084
get_ip_stack_config,
8185
default_address_family,
8286
ip_address_of,
@@ -97,6 +101,9 @@ def do_restart(
97101
config_cache: ConfigCache,
98102
host_config: Hosts,
99103
service_name_config: PassiveServiceNameConfig,
104+
enforced_services_table: Callable[
105+
[HostName], Mapping[ServiceID, tuple[object, ConfiguredService]]
106+
],
100107
get_ip_stack_config: Callable[[HostName], ip_lookup.IPStackConfig],
101108
default_address_family: Callable[
102109
[HostName], Literal[socket.AddressFamily.AF_INET, socket.AddressFamily.AF_INET6]
@@ -121,6 +128,7 @@ def do_restart(
121128
config_cache=config_cache,
122129
hosts_config=host_config,
123130
service_name_config=service_name_config,
131+
enforced_services_table=enforced_services_table,
124132
plugins=plugins,
125133
discovery_rules=discovery_rules,
126134
get_ip_stack_config=get_ip_stack_config,

0 commit comments

Comments
 (0)