diff --git a/plugins/module_utils/module_container/base.py b/plugins/module_utils/module_container/base.py index 0f776aa5c..cdecbb928 100644 --- a/plugins/module_utils/module_container/base.py +++ b/plugins/module_utils/module_container/base.py @@ -938,6 +938,7 @@ def _compare_platform(option, param_value, container_value): interval=dict(type='str'), timeout=dict(type='str'), start_period=dict(type='str'), + start_interval=dict(type='str'), retries=dict(type='int'), )) ) diff --git a/plugins/module_utils/module_container/docker_api.py b/plugins/module_utils/module_container/docker_api.py index 61a5500c9..9a24a6b5b 100644 --- a/plugins/module_utils/module_container/docker_api.py +++ b/plugins/module_utils/module_container/docker_api.py @@ -436,6 +436,7 @@ def config_value( min_api_version=None, preprocess_value=None, update_parameter=None, + extra_option_minimal_versions=None, ): def preprocess_value_(module, client, api_version, options, values): if len(options) != 1: @@ -499,6 +500,7 @@ def update_value(module, data, api_version, options, values): set_value=set_value, min_api_version=min_api_version, update_value=update_value, + extra_option_minimal_versions=extra_option_minimal_versions, ) @classmethod @@ -512,6 +514,7 @@ def host_config_value( min_api_version=None, preprocess_value=None, update_parameter=None, + extra_option_minimal_versions=None, ): def preprocess_value_(module, client, api_version, options, values): if len(options) != 1: @@ -577,6 +580,7 @@ def update_value(module, data, api_version, options, values): set_value=set_value, min_api_version=min_api_version, update_value=update_value, + extra_option_minimal_versions=extra_option_minimal_versions, ) @@ -751,6 +755,7 @@ def _preprocess_healthcheck(module, client, api_version, value): 'Interval': value.get('interval'), 'Timeout': value.get('timeout'), 'StartPeriod': value.get('start_period'), + 'StartInterval': value.get('start_interval'), 'Retries': value.get('retries'), }) @@ -1300,7 +1305,16 @@ def _preprocess_container_names(module, client, api_version, value): OPTION_GROUPS.add_engine('docker_api', DockerAPIEngine.host_config_value('GroupAdd')) OPTION_HEALTHCHECK.add_engine('docker_api', DockerAPIEngine.config_value( - 'Healthcheck', preprocess_value=_preprocess_healthcheck, postprocess_for_get=_postprocess_healthcheck_get_value)) + 'Healthcheck', + preprocess_value=_preprocess_healthcheck, + postprocess_for_get=_postprocess_healthcheck_get_value, + extra_option_minimal_versions={ + 'healthcheck.start_interval': { + 'docker_api_version': '1.44', + 'detect_usage': lambda c: any(c.module.params['healthcheck']['start_interval'] is not None), + }, + }, +)) OPTION_HOSTNAME.add_engine('docker_api', DockerAPIEngine.config_value('Hostname')) diff --git a/plugins/module_utils/util.py b/plugins/module_utils/util.py index efd3301f1..cad6408d0 100644 --- a/plugins/module_utils/util.py +++ b/plugins/module_utils/util.py @@ -348,9 +348,9 @@ def normalize_healthcheck(healthcheck, normalize_test=False): result = dict() # All supported healthcheck parameters - options = ('test', 'interval', 'timeout', 'start_period', 'retries') + options = ('test', 'interval', 'timeout', 'start_period', 'start_interval', 'retries') - duration_options = ('interval', 'timeout', 'start_period') + duration_options = ('interval', 'timeout', 'start_period', 'start_interval') for key in options: if key in healthcheck: diff --git a/plugins/modules/docker_container.py b/plugins/modules/docker_container.py index d7dbc3780..c7892a6b7 100644 --- a/plugins/modules/docker_container.py +++ b/plugins/modules/docker_container.py @@ -369,7 +369,7 @@ - Configure a check that is run to determine whether or not containers for this service are "healthy". - "See the docs for the L(HEALTHCHECK Dockerfile instruction,https://docs.docker.com/engine/reference/builder/#healthcheck) for details on how healthchecks work." - - "O(healthcheck.interval), O(healthcheck.timeout) and O(healthcheck.start_period) are specified as durations. + - "O(healthcheck.interval), O(healthcheck.timeout), O(healthcheck.start_period), and O(healthcheck.start_interval) are specified as durations. They accept duration as a string in a format that look like: V(5h34m56s), V(1m30s), and so on. The supported units are V(us), V(ms), V(s), V(m) and V(h)." type: dict @@ -399,6 +399,12 @@ - Start period for the container to initialize before starting health-retries countdown. - The default used by the Docker daemon is V(0s). type: str + start_interval: + description: + - Time between health checks during the start period. This option requires Docker Engine version 25.0 or later. + - The default used by the Docker daemon is V(5s). + type: str + version_added: 3.10.0 hostname: description: - The container's hostname. @@ -1196,6 +1202,7 @@ timeout: 10s retries: 3 start_period: 30s + start_interval: 10s - name: Remove healthcheck from container community.docker.docker_container: diff --git a/plugins/modules/docker_swarm_service.py b/plugins/modules/docker_swarm_service.py index 4660d1138..f07178bc4 100644 --- a/plugins/modules/docker_swarm_service.py +++ b/plugins/modules/docker_swarm_service.py @@ -148,7 +148,7 @@ - Configure a check that is run to determine whether or not containers for this service are "healthy". See the docs for the L(HEALTHCHECK Dockerfile instruction,https://docs.docker.com/engine/reference/builder/#healthcheck) for details on how healthchecks work. - - "O(healthcheck.interval), O(healthcheck.timeout), and O(healthcheck.start_period) are specified as durations. + - "O(healthcheck.interval), O(healthcheck.timeout), O(healthcheck.start_period), and O(healthcheck.start_interval) are specified as durations. They accept duration as a string in a format that look like: V(5h34m56s), V(1m30s), and so on. The supported units are V(us), V(ms), V(s), V(m) and V(h)." type: dict @@ -174,6 +174,11 @@ description: - Start period for the container to initialize before starting health-retries countdown. type: str + start_interval: + description: + - Time between health checks during the start period. This option requires Docker Engine version 25.0 or later. + type: str + version_added: 3.10.0 hostname: description: - Container hostname. @@ -701,6 +706,7 @@ "interval": 90000000000, "retries": 3, "start_period": 30000000000, + "start_interval": 10000000000, "test": [ "CMD", "curl", @@ -920,6 +926,7 @@ timeout: 10s retries: 3 start_period: 30s + start_interval: 10s - name: Configure service resources community.docker.docker_swarm_service: @@ -2185,6 +2192,7 @@ def get_service(self, name): 'Interval': 'interval', 'Timeout': 'timeout', 'StartPeriod': 'start_period', + 'StartInterval': 'start_interval', 'Retries': 'retries' } healthcheck = dict( @@ -2585,6 +2593,12 @@ def _detect_healthcheck_start_period(client): return False +def _detect_healthcheck_start_interval(client): + if client.module.params['healthcheck']: + return client.module.params['healthcheck']['start_interval'] is not None + return False + + def _detect_mount_tmpfs_usage(client): for mount in client.module.params['mounts'] or []: if mount.get('type') == 'tmpfs': @@ -2684,6 +2698,7 @@ def main(): interval=dict(type='str'), timeout=dict(type='str'), start_period=dict(type='str'), + start_interval=dict(type='str'), retries=dict(type='int'), )), hostname=dict(type='str'), @@ -2779,6 +2794,12 @@ def main(): detect_usage=_detect_healthcheck_start_period, usage_msg='set healthcheck.start_period' ), + healthcheck_start_interval=dict( + docker_py_version='2.6.0', + docker_api_version='1.44', + detect_usage=_detect_healthcheck_start_interval, + usage_msg='set healthcheck.start_interval' + ), update_config_max_failure_ratio=dict( docker_py_version='2.1.0', detect_usage=lambda c: (c.module.params['update_config'] or {}).get(