mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-24 19:31:26 -07:00
docker_swarm_service: Add healthcheck option (#52419)
* Define yaml versions as strings * Add healthcheck option * Add changelog fragment * Don’t set version_added as strings * Use single quoted string * Disable healthcheck tests on python 2.6 * Bring back quoting on already quoted version-added * Python 2.6 compat * Move functions to docker-common * Move parse_healthcheck to docker-common * Cast exception to str before printing failure * Extend parse_healthcheck tests
This commit is contained in:
parent
77d116f66e
commit
18b968d486
7 changed files with 374 additions and 80 deletions
|
@ -18,8 +18,10 @@
|
|||
|
||||
import os
|
||||
import re
|
||||
from datetime import timedelta
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule, env_fallback
|
||||
from ansible.module_utils.six.moves.urllib.parse import urlparse
|
||||
from ansible.module_utils.parsing.convert_bool import BOOLEANS_TRUE, BOOLEANS_FALSE
|
||||
|
@ -833,3 +835,91 @@ def clean_dict_booleans_for_docker_api(data):
|
|||
v = str(v)
|
||||
result[str(k)] = v
|
||||
return result
|
||||
|
||||
|
||||
def convert_duration_to_nanosecond(time_str):
|
||||
"""
|
||||
Return time duration in nanosecond.
|
||||
"""
|
||||
if not isinstance(time_str, str):
|
||||
raise ValueError('Missing unit in duration - %s' % time_str)
|
||||
|
||||
regex = re.compile(
|
||||
r'^(((?P<hours>\d+)h)?'
|
||||
r'((?P<minutes>\d+)m(?!s))?'
|
||||
r'((?P<seconds>\d+)s)?'
|
||||
r'((?P<milliseconds>\d+)ms)?'
|
||||
r'((?P<microseconds>\d+)us)?)$'
|
||||
)
|
||||
parts = regex.match(time_str)
|
||||
|
||||
if not parts:
|
||||
raise ValueError('Invalid time duration - %s' % time_str)
|
||||
|
||||
parts = parts.groupdict()
|
||||
time_params = {}
|
||||
for (name, value) in parts.items():
|
||||
if value:
|
||||
time_params[name] = int(value)
|
||||
|
||||
delta = timedelta(**time_params)
|
||||
time_in_nanoseconds = (
|
||||
delta.microseconds + (delta.seconds + delta.days * 24 * 3600) * 10 ** 6
|
||||
) * 10 ** 3
|
||||
|
||||
return time_in_nanoseconds
|
||||
|
||||
|
||||
def parse_healthcheck(healthcheck):
|
||||
"""
|
||||
Return dictionary of healthcheck parameters and boolean if
|
||||
healthcheck defined in image was requested to be disabled.
|
||||
"""
|
||||
if (not healthcheck) or (not healthcheck.get('test')):
|
||||
return None, None
|
||||
|
||||
result = dict()
|
||||
|
||||
# All supported healthcheck parameters
|
||||
options = dict(
|
||||
test='test',
|
||||
interval='interval',
|
||||
timeout='timeout',
|
||||
start_period='start_period',
|
||||
retries='retries'
|
||||
)
|
||||
|
||||
duration_options = ['interval', 'timeout', 'start_period']
|
||||
|
||||
for (key, value) in options.items():
|
||||
if value in healthcheck:
|
||||
if healthcheck.get(value) is None:
|
||||
# due to recursive argument_spec, all keys are always present
|
||||
# (but have default value None if not specified)
|
||||
continue
|
||||
if value in duration_options:
|
||||
time = convert_duration_to_nanosecond(healthcheck.get(value))
|
||||
if time:
|
||||
result[key] = time
|
||||
elif healthcheck.get(value):
|
||||
result[key] = healthcheck.get(value)
|
||||
if key == 'test':
|
||||
if isinstance(result[key], (tuple, list)):
|
||||
result[key] = [str(e) for e in result[key]]
|
||||
else:
|
||||
result[key] = ['CMD-SHELL', str(result[key])]
|
||||
elif key == 'retries':
|
||||
try:
|
||||
result[key] = int(result[key])
|
||||
except ValueError:
|
||||
raise ValueError(
|
||||
'Cannot parse number of retries for healthcheck. '
|
||||
'Expected an integer, got "{0}".'.format(result[key])
|
||||
)
|
||||
|
||||
if result['test'] == ['NONE']:
|
||||
# If the user explicitly disables the healthcheck, return None
|
||||
# as the healthcheck object, and set disable_healthcheck to True
|
||||
return None, True
|
||||
|
||||
return result, False
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue