Module: check_mk
Branch: master
Commit: cac7ae64f70d26465981c16b36c66f8ce5d8049a
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=cac7ae64f70d26…
Author: Lars Michelsen <lm(a)mathias-kettner.de>
Date: Mon Nov 13 09:03:11 2017 +0100
Add missing error handling to inventory call
Change-Id: I81a6cc1387350cc2c577524c3311a0bf8a8c122a
---
cmk_base/inventory.py | 36 +++++++++-----
tests/cmk_base/test_data_sources.py | 96 +++++++++++++++++++++++++++++++++++++
2 files changed, 119 insertions(+), 13 deletions(-)
diff --git a/cmk_base/inventory.py b/cmk_base/inventory.py
index 7ecdf2b..17344c2 100644
--- a/cmk_base/inventory.py
+++ b/cmk_base/inventory.py
@@ -83,15 +83,26 @@ def do_inv(hostnames):
for hostname in hostnames:
try:
console.verbose("Doing HW/SW-Inventory for %s..." % hostname)
- do_inv_for(hostname)
+
+ if config.is_cluster(hostname):
+ ipaddress = None
+ else:
+ ipaddress = ip_lookup.lookup_ip_address(hostname)
+
+ _do_inv_for(hostname, ipaddress)
console.verbose("..OK\n")
except Exception, e:
- # TODO: handle data_sources.get_data_source_errors_of_host() here
if cmk.debug.enabled():
raise
+
console.verbose("Failed: %s\n" % e)
errors.append("Failed to inventorize %s: %s" % (hostname, e))
- cmk_base.utils.cleanup_globals()
+ finally:
+ for data_source, exceptions in
data_sources.get_data_source_errors_of_host(hostname, ipaddress).items():
+ for exc in exceptions:
+ errors.append("%s" % exc)
+
+ cmk_base.utils.cleanup_globals()
if errors:
raise MKGeneralException("\n".join(errors))
@@ -105,7 +116,12 @@ def do_inv_check(options, hostname):
_inv_fail_status = options.get("inv-fail-status", _inv_fail_status)
try:
- inv_tree, old_timestamp = do_inv_for(hostname)
+ if config.is_cluster(hostname):
+ ipaddress = None
+ else:
+ ipaddress = ip_lookup.lookup_ip_address(hostname)
+
+ inv_tree, old_timestamp = _do_inv_for(hostname, ipaddress)
num_entries = _count_nodes(g_inv_tree)
if not num_entries:
console.output("OK - Found no data\n")
@@ -142,7 +158,6 @@ def do_inv_check(options, hostname):
infotexts.append(infotext)
- ipaddress = ip_lookup.lookup_ip_address(hostname)
for data_source, exceptions in
data_sources.get_data_source_errors_of_host(hostname, ipaddress).items():
for exc in exceptions:
infotexts.append("%s" % exc)
@@ -158,7 +173,7 @@ def do_inv_check(options, hostname):
sys.exit(_inv_fail_status)
-def do_inv_for(hostname):
+def _do_inv_for(hostname, ipaddress):
_initialize_inventory_tree()
node = inv_tree("software.applications.check_mk.cluster.")
@@ -168,7 +183,7 @@ def do_inv_for(hostname):
_do_inv_for_cluster(hostname)
else:
node["is_cluster"] = False
- _do_inv_for_realhost(hostname)
+ _do_inv_for_realhost(hostname, ipaddress)
# Remove empty paths
_cleanup_inventory_tree(g_inv_tree)
@@ -189,12 +204,7 @@ def _do_inv_for_cluster(hostname):
})
-def _do_inv_for_realhost(hostname):
- try:
- ipaddress = ip_lookup.lookup_ip_address(hostname)
- except:
- raise MKGeneralException("Cannot resolve hostname '%s'." %
hostname)
-
+def _do_inv_for_realhost(hostname, ipaddress):
sources = data_sources.DataSources(hostname)
for source in sources.get_data_sources():
diff --git a/tests/cmk_base/test_data_sources.py b/tests/cmk_base/test_data_sources.py
new file mode 100644
index 0000000..f980e41
--- /dev/null
+++ b/tests/cmk_base/test_data_sources.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+# These tests verify the behaviour of the Check_MK base methods
+# that do the actual checking/discovery/inventory work. Especially
+# the default caching and handling of global options affecting the
+# caching is checked
+
+import pytest
+from testlib import web, repo_path
+
+import cmk_base.config as config
+import cmk_base.modes
+
+(a)pytest.fixture(scope="module")
+def test_cfg(web, site):
+ print "Applying default config"
+ web.add_host("ds-test-host1", attributes={
+ "ipaddress": "127.0.0.1",
+ })
+ web.add_host("ds-test-host2", attributes={
+ "ipaddress": "127.0.0.1",
+ })
+
+ site.write_file("etc/check_mk/conf.d/ds-test-host.mk",
+ "datasource_programs.append(('cat
~/var/check_mk/agent_output/<HOST>', [], ALL_HOSTS))\n")
+
+ site.makedirs("var/check_mk/agent_output/")
+ site.write_file("var/check_mk/agent_output/ds-test-host1",
+ file("%s/tests/data/linux-agent-output" % repo_path()).read())
+ site.write_file("var/check_mk/agent_output/ds-test-host2",
+ file("%s/tests/data/linux-agent-output" % repo_path()).read())
+
+ web.activate_changes()
+
+ import cmk.debug
+ cmk.debug.enable()
+
+ config.load()
+ yield None
+
+ #
+ # Cleanup code
+ #
+ print "Cleaning up test config"
+
+ site.delete_dir("var/check_mk/agent_output")
+ site.delete_file("etc/check_mk/conf.d/ds-test-host.mk")
+
+ web.delete_host("ds-test-host1")
+ web.delete_host("ds-test-host2")
+
+ web.activate_changes()
+
+
+# Globale Optionen:
+# --cache
+# --no-cache
+# --no-tcp
+# --usewalk
+# --force
+
+# TODO: Use force
+# TODO: With hostnames and without
+def test_mode_inventory_set_caching(test_cfg, mocker):
+ use_cachefile_patcher =
mocker.patch("cmk_base.data_sources.abstract.DataSource.set_use_cachefile")
+ use_persisted_sections_patcher =
mocker.patch("cmk_base.data_sources.abstract.CheckMKAgentDataSource.use_outdated_persisted_sections")
+
+ # When called without hosts, it uses all hosts and defaults to using the data source
cache
+ cmk_base.modes.check_mk.mode_inventory([], [])
+ use_cachefile_patcher.assert_called_once_with()
+ use_persisted_sections_patcher.assert_not_called()
+
+ # When called with an explicit list of hosts the cache is not used by default
+ cmk_base.modes.check_mk.mode_inventory([], ["ds-test-host1"])
+ use_cachefile_patcher.assert_not_called()
+ use_persisted_sections_patcher.assert_not_called()
+
+ cmk_base.modes.check_mk.mode_inventory(["force"],
["ds-test-host1"])
+ use_cachefile_patcher.assert_not_called()
+ use_persisted_sections_patcher.assert_called()
+
+# mode_inventory()
+# mode_inventory_as_check(options, hostname):
+# mode_discover_marked_hosts():
+# mode_check_discovery(*args):
+# mode_discover(options, args):
+# mode_check(options, args):
+# dump host
+#
+# automation:
+# AutomationTryDiscovery
+# AutomationDiscovery
+# AutomationDiagHost
+#
+# Keepalive check
+# Keepalive discovery
+