diff --git a/changelogs/fragments/47938-docker_swarm_service-requirements.yaml b/changelogs/fragments/47938-docker_swarm_service-requirements.yaml new file mode 100644 index 0000000000..7d07eda99b --- /dev/null +++ b/changelogs/fragments/47938-docker_swarm_service-requirements.yaml @@ -0,0 +1,2 @@ +bugfixes: +- "docker_swarm_service - The ``publish``.``mode`` parameter was being ignored if docker-py version was < 3.0.0. Added a parameter validation test." diff --git a/lib/ansible/modules/cloud/docker/docker_swarm_service.py b/lib/ansible/modules/cloud/docker/docker_swarm_service.py index 46aa4f81a8..f28ce760d8 100644 --- a/lib/ansible/modules/cloud/docker/docker_swarm_service.py +++ b/lib/ansible/modules/cloud/docker/docker_swarm_service.py @@ -191,7 +191,7 @@ options: - List of dictionaries describing the service published ports. - Every item must be a dictionary exposing the keys published_port, target_port, protocol (defaults to 'tcp') - Only used with api_version >= 1.25 - - If api_version >= 1.32 the dictionaries can contain the attribute 'mode' set to 'ingress' or 'host' (default 'ingress'). + - If api_version >= 1.32 and docker python library >= 3.0.0 attribute 'mode' can be set to 'ingress' or 'host' (default 'ingress'). replicas: required: false default: -1 @@ -457,6 +457,7 @@ EXAMPLES = ''' import time from ansible.module_utils.docker_common import DockerBaseClass from ansible.module_utils.docker_common import AnsibleDockerClient +from ansible.module_utils.docker_common import docker_version from ansible.module_utils.basic import human_to_bytes from ansible.module_utils._text import to_text @@ -1041,10 +1042,11 @@ class DockerServiceManager(): % (pv['param'], pv['min_version']))) for publish_def in self.client.module.params.get('publish', []): - if ('mode' in publish_def.keys() and - (LooseVersion(self.client.version()['ApiVersion']) < - LooseVersion('1.25'))): - self.client.module.fail_json(msg='publish.mode parameter supported only with api_version>=1.25') + if 'mode' in publish_def.keys(): + if LooseVersion(self.client.version()['ApiVersion']) < LooseVersion('1.25'): + self.client.module.fail_json(msg='publish.mode parameter supported only with api_version>=1.25') + if LooseVersion(docker_version) < LooseVersion('3.0.0'): + self.client.module.fail_json(msg='publish.mode parameter requires docker python library>=3.0.0') def run(self): self.test_parameter_versions()