mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
monit: add support for all monit services when checking process state (#1532)
* add support for all monit service types * ignore case when performing check * add changelog * Escape special characters before matching Co-authored-by: Felix Fontein <felix@fontein.de> * escape each element individually Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
fd741ed663
commit
bed1dc479f
3 changed files with 36 additions and 12 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- monit - add support for all monit service checks (https://github.com/ansible-collections/community.general/pull/1532).
|
|
@ -62,6 +62,9 @@ STATE_COMMAND_MAP = {
|
||||||
'restarted': 'restart'
|
'restarted': 'restart'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MONIT_SERVICES = ['Process', 'File', 'Fifo', 'Filesystem', 'Directory', 'Remote host', 'System', 'Program',
|
||||||
|
'Network']
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class StatusValue(namedtuple("Status", "value, is_pending")):
|
class StatusValue(namedtuple("Status", "value, is_pending")):
|
||||||
|
@ -151,7 +154,9 @@ class Monit(object):
|
||||||
return self._parse_status(out, err)
|
return self._parse_status(out, err)
|
||||||
|
|
||||||
def _parse_status(self, output, err):
|
def _parse_status(self, output, err):
|
||||||
if "Process '%s'" % self.process_name not in output:
|
escaped_monit_services = '|'.join([re.escape(x) for x in MONIT_SERVICES])
|
||||||
|
pattern = "(%s) '%s'" % (escaped_monit_services, re.escape(self.process_name))
|
||||||
|
if not re.search(pattern, output, re.IGNORECASE):
|
||||||
return Status.MISSING
|
return Status.MISSING
|
||||||
|
|
||||||
status_val = re.findall(r"^\s*status\s*([\w\- ]+)", output, re.MULTILINE)
|
status_val = re.findall(r"^\s*status\s*([\w\- ]+)", output, re.MULTILINE)
|
||||||
|
|
|
@ -12,7 +12,7 @@ from ansible_collections.community.general.tests.unit.plugins.modules.utils impo
|
||||||
|
|
||||||
|
|
||||||
TEST_OUTPUT = """
|
TEST_OUTPUT = """
|
||||||
Process '%s'
|
%s '%s'
|
||||||
status %s
|
status %s
|
||||||
monitoring status Not monitored
|
monitoring status Not monitored
|
||||||
monitoring mode active
|
monitoring mode active
|
||||||
|
@ -106,28 +106,45 @@ def test_status_value(status_name):
|
||||||
|
|
||||||
|
|
||||||
BASIC_OUTPUT_CASES = [
|
BASIC_OUTPUT_CASES = [
|
||||||
(TEST_OUTPUT % ('processX', name), getattr(monit.Status, name.upper()))
|
(TEST_OUTPUT % ('Process', 'processX', name), getattr(monit.Status, name.upper()))
|
||||||
for name in monit.StatusValue.ALL_STATUS
|
for name in monit.StatusValue.ALL_STATUS
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('output, expected', BASIC_OUTPUT_CASES + [
|
@pytest.mark.parametrize('output, expected', BASIC_OUTPUT_CASES + [
|
||||||
('', monit.Status.MISSING),
|
('', monit.Status.MISSING),
|
||||||
(TEST_OUTPUT % ('processY', 'OK'), monit.Status.MISSING),
|
(TEST_OUTPUT % ('Process', 'processY', 'OK'), monit.Status.MISSING),
|
||||||
(TEST_OUTPUT % ('processX', 'Not Monitored - start pending'), monit.Status.OK),
|
(TEST_OUTPUT % ('Process', 'processX', 'Not Monitored - start pending'), monit.Status.OK),
|
||||||
(TEST_OUTPUT % ('processX', 'Monitored - stop pending'), monit.Status.NOT_MONITORED),
|
(TEST_OUTPUT % ('Process', 'processX', 'Monitored - stop pending'), monit.Status.NOT_MONITORED),
|
||||||
(TEST_OUTPUT % ('processX', 'Monitored - restart pending'), monit.Status.OK),
|
(TEST_OUTPUT % ('Process', 'processX', 'Monitored - restart pending'), monit.Status.OK),
|
||||||
(TEST_OUTPUT % ('processX', 'Not Monitored - monitor pending'), monit.Status.OK),
|
(TEST_OUTPUT % ('Process', 'processX', 'Not Monitored - monitor pending'), monit.Status.OK),
|
||||||
(TEST_OUTPUT % ('processX', 'Does not exist'), monit.Status.DOES_NOT_EXIST),
|
(TEST_OUTPUT % ('Process', 'processX', 'Does not exist'), monit.Status.DOES_NOT_EXIST),
|
||||||
(TEST_OUTPUT % ('processX', 'Not monitored'), monit.Status.NOT_MONITORED),
|
(TEST_OUTPUT % ('Process', 'processX', 'Not monitored'), monit.Status.NOT_MONITORED),
|
||||||
(TEST_OUTPUT % ('processX', 'Running'), monit.Status.OK),
|
(TEST_OUTPUT % ('Process', 'processX', 'Running'), monit.Status.OK),
|
||||||
(TEST_OUTPUT % ('processX', 'Execution failed | Does not exist'), monit.Status.EXECUTION_FAILED),
|
(TEST_OUTPUT % ('Process', 'processX', 'Execution failed | Does not exist'), monit.Status.EXECUTION_FAILED),
|
||||||
])
|
])
|
||||||
def test_parse_status(output, expected):
|
def test_parse_status(output, expected):
|
||||||
status = monit.Monit(None, '', 'processX', 0)._parse_status(output, '')
|
status = monit.Monit(None, '', 'processX', 0)._parse_status(output, '')
|
||||||
assert status == expected
|
assert status == expected
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('output, expected', BASIC_OUTPUT_CASES + [
|
||||||
|
(TEST_OUTPUT % ('Process', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('File', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Fifo', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Filesystem', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Directory', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Remote host', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('System', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Program', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Network', 'processX', 'OK'), monit.Status.OK),
|
||||||
|
(TEST_OUTPUT % ('Unsupported', 'processX', 'OK'), monit.Status.MISSING),
|
||||||
|
])
|
||||||
|
def test_parse_status_supports_all_services(output, expected):
|
||||||
|
status = monit.Monit(None, '', 'processX', 0)._parse_status(output, '')
|
||||||
|
assert status == expected
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize('output, expected', [
|
@pytest.mark.parametrize('output, expected', [
|
||||||
('This is monit version 5.18.1', '5.18.1'),
|
('This is monit version 5.18.1', '5.18.1'),
|
||||||
('This is monit version 12.18', '12.18'),
|
('This is monit version 12.18', '12.18'),
|
||||||
|
|
Loading…
Reference in a new issue