From 5016a96ebabfa189684a5c5318157c5ff2472358 Mon Sep 17 00:00:00 2001 From: x4rd0o1Vtx <169253591+x4rd0o1Vtx@users.noreply.github.com> Date: Wed, 15 May 2024 18:45:01 +0200 Subject: [PATCH] Allow healthcheck override without test option (#847) * Add healthcheck test_cli_compatible option * Update plugins/module_utils/util.py Co-authored-by: Felix Fontein * Update plugins/modules/docker_container.py Co-authored-by: Felix Fontein --------- Co-authored-by: Felix Fontein --- ...docker_container-heackcheck-test_cli_compatible.yml | 2 ++ plugins/module_utils/module_container/base.py | 1 + plugins/module_utils/module_container/docker_api.py | 2 +- plugins/module_utils/util.py | 6 +++--- plugins/modules/docker_container.py | 10 ++++++++++ 5 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 changelogs/fragments/847-docker_container-heackcheck-test_cli_compatible.yml diff --git a/changelogs/fragments/847-docker_container-heackcheck-test_cli_compatible.yml b/changelogs/fragments/847-docker_container-heackcheck-test_cli_compatible.yml new file mode 100644 index 00000000..dd960a97 --- /dev/null +++ b/changelogs/fragments/847-docker_container-heackcheck-test_cli_compatible.yml @@ -0,0 +1,2 @@ +minor_changes: + - docker_container - adds ``healthcheck.test_cli_compatible`` to allow omit test option on containers without remove existing image test (https://github.com/ansible-collections/community.docker/pull/847). diff --git a/plugins/module_utils/module_container/base.py b/plugins/module_utils/module_container/base.py index cdecbb92..410ffb15 100644 --- a/plugins/module_utils/module_container/base.py +++ b/plugins/module_utils/module_container/base.py @@ -935,6 +935,7 @@ OPTION_HEALTHCHECK = ( OptionGroup(preprocess=_preprocess_healthcheck) .add_option('healthcheck', type='dict', ansible_suboptions=dict( test=dict(type='raw'), + test_cli_compatible=dict(type='bool', default=False), interval=dict(type='str'), timeout=dict(type='str'), start_period=dict(type='str'), diff --git a/plugins/module_utils/module_container/docker_api.py b/plugins/module_utils/module_container/docker_api.py index eae05a1a..d3da84fe 100644 --- a/plugins/module_utils/module_container/docker_api.py +++ b/plugins/module_utils/module_container/docker_api.py @@ -746,7 +746,7 @@ def _preprocess_etc_hosts(module, client, api_version, value): def _preprocess_healthcheck(module, client, api_version, value): if value is None: return value - if not value or not value.get('test'): + if not value or not (value.get('test') or (value.get('test_cli_compatible') and value.get('test') is None)): value = {'test': ['NONE']} elif 'test' in value: value['test'] = normalize_healthcheck_test(value['test']) diff --git a/plugins/module_utils/util.py b/plugins/module_utils/util.py index f519e98f..9235e34d 100644 --- a/plugins/module_utils/util.py +++ b/plugins/module_utils/util.py @@ -353,7 +353,7 @@ def normalize_healthcheck(healthcheck, normalize_test=False): result = dict() # All supported healthcheck parameters - options = ('test', 'interval', 'timeout', 'start_period', 'start_interval', 'retries') + options = ('test', 'test_cli_compatible', 'interval', 'timeout', 'start_period', 'start_interval', 'retries') duration_options = ('interval', 'timeout', 'start_period', 'start_interval') @@ -366,7 +366,7 @@ def normalize_healthcheck(healthcheck, normalize_test=False): continue if key in duration_options: value = convert_duration_to_nanosecond(value) - if not value: + if not value and not (healthcheck.get('test_cli_compatible') and key == 'test'): continue if key == 'retries': try: @@ -376,7 +376,7 @@ def normalize_healthcheck(healthcheck, normalize_test=False): 'Cannot parse number of retries for healthcheck. ' 'Expected an integer, got "{0}".'.format(value) ) - if key == 'test' and normalize_test: + if key == 'test' and value and normalize_test: value = normalize_healthcheck_test(value) result[key] = value diff --git a/plugins/modules/docker_container.py b/plugins/modules/docker_container.py index c7892a6b..60768637 100644 --- a/plugins/modules/docker_container.py +++ b/plugins/modules/docker_container.py @@ -379,6 +379,16 @@ options: - Command to run to check health. - Must be either a string or a list. If it is a list, the first item must be one of V(NONE), V(CMD) or V(CMD-SHELL). type: raw + test_cli_compatible: + description: + - If set to V(true), omitting O(healthcheck.test) while providing O(healthcheck) does not disable healthchecks, + but simply overwrites the image's values by the ones specified in O(healthcheck). This is + the behavior used by the Docker CLI. + - If set to V(false), omitting O(healthcheck.test) will disable the container's health check. + This is the classical behavior of the module and currently the default behavior. + default: false + type: bool + version_added: 3.10.0 interval: description: - Time between running the check.