Module: check_mk
Branch: master
Commit: 7cb3d61aa1ed5a4b831c8761d3a298b939767d58
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=7cb3d61aa1ed5a…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Thu May 2 18:24:56 2019 +0200
Moved service level processing to ConfigCache/HostConfig
CMK-2030
Change-Id: Iba33321198004a1d46e9c72f33dcc2bbe4b63c56
---
cmk_base/check_api.py | 21 +++++++++----------
cmk_base/config.py | 15 ++++++++++++++
tests/unit/cmk_base/test_check_api.py | 38 +++++++++++++++++++++++++++++------
tests/unit/cmk_base/test_config.py | 34 +++++++++++++++++++++++++++++++
4 files changed, 91 insertions(+), 17 deletions(-)
diff --git a/cmk_base/check_api.py b/cmk_base/check_api.py
index 688c629..cdd62c4 100644
--- a/cmk_base/check_api.py
+++ b/cmk_base/check_api.py
@@ -201,17 +201,17 @@ def savefloat(f):
return 0.0
-# Compatibility wrapper for the pre 1.6 existant conf.service_extra_conf()
+# Compatibility wrapper for the pre 1.6 existant config.service_extra_conf()
def service_extra_conf(hostname, service, ruleset):
return _config.get_config_cache().service_extra_conf(hostname, service, ruleset)
-# Compatibility wrapper for the pre 1.6 existant conf.service_extra_conf()
+# Compatibility wrapper for the pre 1.6 existant config.host_extra_conf()
def host_extra_conf(hostname, ruleset):
return _config.get_config_cache().host_extra_conf(hostname, ruleset)
-# Compatibility wrapper for the pre 1.6 existant conf.service_extra_conf()
+# Compatibility wrapper for the pre 1.6 existant config.in_binary_hostlist()
def in_binary_hostlist(hostname, ruleset):
return _config.get_config_cache().in_binary_hostlist(hostname, ruleset)
@@ -504,15 +504,14 @@ def get_effective_service_level():
"""Get the service level that applies to the current service.
This can only be used within check functions, not during discovery nor
parsing."""
config_cache = _config.get_config_cache()
- service_levels = config_cache.service_extra_conf(host_name(), service_description(),
- _config.service_service_levels)
+ service_level = config_cache.service_level_of_service(host_name(),
service_description())
+ if service_level is not None:
+ return service_level
+
+ service_level = config_cache.get_host_config(host_name()).service_level
+ if service_level is not None:
+ return service_level
- if service_levels:
- return service_levels[0]
- else:
- service_levels = config_cache.host_extra_conf(host_name(),
_config.host_service_levels)
- if service_levels:
- return service_levels[0]
return 0
diff --git a/cmk_base/config.py b/cmk_base/config.py
index d614770..ecf56fe 100644
--- a/cmk_base/config.py
+++ b/cmk_base/config.py
@@ -2858,6 +2858,14 @@ class HostConfig(object):
return params.get("host_label_inventory", True)
+ @property
+ def service_level(self):
+ # type: () -> Optional[int]
+ entries = self._config_cache.host_extra_conf(self.hostname, host_service_levels)
+ if not entries:
+ return None
+ return entries[0]
+
#.
# .--Configuration Cache-------------------------------------------------.
@@ -3100,6 +3108,13 @@ class ConfigCache(object):
itertools.chain(
*self.service_extra_conf(hostname, description,
custom_service_attributes)))
+ def service_level_of_service(self, hostname, description):
+ # type: (str, Text) -> Optional[int]
+ entries = self.service_extra_conf(hostname, description, service_service_levels)
+ if not entries:
+ return None
+ return entries[0]
+
def get_explicit_service_custom_variables(self, hostname, description):
# type: (str, Text) -> Dict[str, str]
try:
diff --git a/tests/unit/cmk_base/test_check_api.py
b/tests/unit/cmk_base/test_check_api.py
index cb02c21..b0749cd 100644
--- a/tests/unit/cmk_base/test_check_api.py
+++ b/tests/unit/cmk_base/test_check_api.py
@@ -1,14 +1,11 @@
# -*- coding: utf-8 -*-
-r"""
-Test Check API
-==============
-
-"""
import math
-import pytest
+import pytest # type: ignore
+from testlib.base import Scenario
import cmk_base.check_api as check_api
import cmk_base.config as config
+import cmk_base.check_api_utils as check_api_utils
@check_api.get_parsed_item_data
@@ -237,3 +234,32 @@ def test_http_proxy(mocker):
proxy_patch = mocker.patch.object(config, "get_http_proxy")
check_api.get_http_proxy(("url", "http://xy:123"))
assert proxy_patch.called_once()
+
+
+def test_get_effective_service_level(monkeypatch):
+ ts = Scenario().add_host("testhost1")
+ ts.add_host("testhost2")
+ ts.add_host("testhost3")
+ ts.set_ruleset(
+ "host_service_levels",
+ [
+ (10, [], ["testhost2"], {}),
+ (2, [], ["testhost2"], {}),
+ ],
+ )
+ ts.set_ruleset(
+ "service_service_levels",
+ [
+ (33, [], ["testhost1"], ["CPU load$"], {}),
+ ],
+ )
+ ts.apply(monkeypatch)
+
+ check_api_utils.set_service("cpu.loads", "CPU load")
+
+ check_api_utils.set_hostname("testhost1")
+ assert check_api.get_effective_service_level() == 33
+ check_api_utils.set_hostname("testhost2")
+ assert check_api.get_effective_service_level() == 10
+ check_api_utils.set_hostname("testhost3")
+ assert check_api.get_effective_service_level() == 0
diff --git a/tests/unit/cmk_base/test_config.py b/tests/unit/cmk_base/test_config.py
index 8f88292..8c0777e 100644
--- a/tests/unit/cmk_base/test_config.py
+++ b/tests/unit/cmk_base/test_config.py
@@ -1136,6 +1136,23 @@ def test_config_cache_custom_attributes_of_service(monkeypatch,
hostname, result
assert config_cache.custom_attributes_of_service(hostname, "CPU load") ==
result
+(a)pytest.mark.parametrize("hostname,result"sult", [
+ ("testhost1", None),
+ ("testhost2", 10),
+])
+def test_config_cache_service_level_of_service(monkeypatch, hostname, result):
+ ts = Scenario().add_host(hostname)
+ ts.set_ruleset(
+ "service_service_levels",
+ [
+ (10, [], ["testhost2"], ["CPU load$"], {}),
+ (2, [], ["testhost2"], ["CPU load$"], {}),
+ ],
+ )
+ config_cache = ts.apply(monkeypatch)
+ assert config_cache.service_level_of_service(hostname, "CPU load") ==
result
+
+
@pytest.mark.parametrize("edition_short,expected_cache_class_name,expected_host_class_name",
[
("cme", "CEEConfigCache", "CEEHostConfig"),
("cee", "CEEConfigCache", "CEEHostConfig"),
@@ -1253,3 +1270,20 @@ def test_host_config_do_host_label_discovery_for(monkeypatch,
result, ruleset):
config_cache = ts.apply(monkeypatch)
assert config_cache.get_host_config("abc").do_host_label_discovery ==
result
+
+
+(a)pytest.mark.parametrize("hostname,result"sult", [
+ ("testhost1", None),
+ ("testhost2", 10),
+])
+def test_host_config_service_level(monkeypatch, hostname, result):
+ ts = Scenario().add_host(hostname)
+ ts.set_ruleset(
+ "host_service_levels",
+ [
+ (10, [], ["testhost2"], {}),
+ (2, [], ["testhost2"], {}),
+ ],
+ )
+ config_cache = ts.apply(monkeypatch)
+ assert config_cache.get_host_config(hostname).service_level == result