Module: check_mk
Branch: master
Commit: 6fcbbf9c0e52420bb80124628296e775180df755
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=6fcbbf9c0e5242…
Author: Moritz Kiemer <mo(a)mathias-kettner.de>
Date: Thu Feb 21 09:27:59 2019 +0100
mk_jolokia.py: properly differentiate between server and java errors
Change-Id: Ib935a9712cb6c173ac58abd76c9bfe90065895ba
---
agents/plugins/mk_jolokia.py | 44 +++++++++++++++++--------------
tests/unit/plugins/test_mk_jolokia.py | 49 +++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+), 19 deletions(-)
diff --git a/agents/plugins/mk_jolokia.py b/agents/plugins/mk_jolokia.py
index b4d9249..4827f42 100755
--- a/agents/plugins/mk_jolokia.py
+++ b/agents/plugins/mk_jolokia.py
@@ -333,30 +333,36 @@ class JolokiaInstance(object):
sys.stderr.write("ERROR: %s\n" % exc)
raise SkipMBean(exc)
- if raw_response.status_code == 401:
- sys.stderr.write("ERROR: Unauthorized (authentication
failed/missing)\n")
- raise SkipInstance("auth failed")
- elif raw_response.status_code != 200:
- sys.stderr.write('ERROR: Invalid response when posting %r\n' %
post_data)
- raise SkipMBean("HTTP Error (%s)" % raw_response.status_code)
-
- response = raw_response.json()
- if VERBOSE:
- sys.stderr.write("DEBUG: Result: %r\n" % response)
- return response
+ return validate_response(raw_response)
+
+
+def validate_response(raw):
+ '''return loaded response or raise exception'''
+ # check the status of the http server
+ if not 200 <= raw.status_code < 300:
+ sys.stderr.write("ERROR: HTTP STATUS: %d" % raw.status_code)
+ # Unauthorized, Forbidden, Bad Gateway
+ if raw.status_code in (401, 403, 502):
+ raise SkipInstance("HTTP STATUS", raw.status_code)
+ raise SkipMBean("HTTP STATUS", raw.status_code)
+
+ response = raw.json()
+ # check the status of the jolokia response
+ if response.status != 200:
+ sys.stderr.write("ERROR: JAVA: %s" % response.error)
+ raise SkipMBean("JAVA", response.error)
+
+ if "value" not in response:
+ sys.stderr.write("ERROR: missing 'value': %r\n" % response)
+ raise SkipMBean("ERROR", "missing 'value'")
+
+ return response
def fetch_var(inst, function, path, use_target=False):
data = inst.get_post_data(path, function, use_target=use_target)
obj = inst.post(data)
-
- try:
- return obj['value']
- except KeyError:
- msg = "not found: %s" % path
- if VERBOSE:
- sys.stderr.write("ERROR: %s\n" % msg)
- raise SkipMBean(msg)
+ return obj['value']
# convert single values into lists of items in
diff --git a/tests/unit/plugins/test_mk_jolokia.py
b/tests/unit/plugins/test_mk_jolokia.py
index 09c88e5..65b829d 100644
--- a/tests/unit/plugins/test_mk_jolokia.py
+++ b/tests/unit/plugins/test_mk_jolokia.py
@@ -99,3 +99,52 @@ def test_jolokia_yield_configured_instances():
assert next(yci) == {"server": "s1", "port": 1234}
assert next(yci) == {"server": "s2", "port": 1234}
+
+
+
+class _MockHttpResponse(object):
+ def __init__(self, status, jolo=None):
+ self.status_code = status
+ self._jolo = jolo
+
+ def json(self):
+ return self._jolo
+
+
+class _MockJolokiaResponse(dict):
+ def __init__(self, status):
+ super(_MockJolokiaResponse, self).__init__()
+ self.status = status
+ self.error = "you are thinking too much"
+
+
+def test_jolokia_validate_response_skip_mbean():
+ for status in (199, 300):
+ with pytest.raises(mk_jolokia.SkipMBean):
+ mk_jolokia.validate_response(_MockHttpResponse(status))
+
+ # MBean not found
+ with pytest.raises(mk_jolokia.SkipMBean):
+ joresp = _MockJolokiaResponse(404)
+ mk_jolokia.validate_response(_MockHttpResponse(200, joresp))
+
+ # value not found in MBean
+ with pytest.raises(mk_jolokia.SkipMBean):
+ joresp = _MockJolokiaResponse(200)
+ mk_jolokia.validate_response(_MockHttpResponse(200, joresp))
+
+
+
+def test_jolokia_validate_response_skip_instance():
+ for status in (401, 403, 502):
+ with pytest.raises(mk_jolokia.SkipInstance):
+ mk_jolokia.validate_response(_MockHttpResponse(status))
+
+
+(a)pytest.mark.parametrize("data"data", [
+ {"value": 23},
+])
+def test_jolokia_validate_response_ok(data):
+ joresp = _MockJolokiaResponse(200)
+ joresp.update(data)
+ assert joresp == mk_jolokia.validate_response(_MockHttpResponse(200, joresp))