Compare commits

...

2 Commits

Author SHA1 Message Date
Felix Fontein
dc0a554966
docker_container: do not send wrong host IP for duplicate ports (#1214) (#1215)
* DRY.

* Port spec can be a list of port specs.

* Add changelog fragment.

* Add test.

(cherry picked from commit 846fc8564b)
2025-11-26 07:08:38 +00:00
Felix Fontein
a049898f19 Prepare 4.8.4. 2025-11-26 07:34:14 +01:00
4 changed files with 74 additions and 10 deletions

View File

@ -0,0 +1,3 @@
bugfixes:
- "docker_container - when the same port is mapped more than once for the same protocol without specifying an interface, a bug caused an invalid value to be passed for the interface
(https://github.com/ansible-collections/community.docker/issues/1213, https://github.com/ansible-collections/community.docker/pull/1214)."

View File

@ -0,0 +1 @@
release_summary: Bugfix release.

View File

@ -23,6 +23,7 @@ from ansible_collections.community.docker.plugins.module_utils._platform import
)
from ansible_collections.community.docker.plugins.module_utils.module_container.base import (
_DEFAULT_IP_REPLACEMENT_STRING,
OPTION_AUTO_REMOVE,
OPTION_BLKIO_WEIGHT,
OPTION_CAPABILITIES,
@ -117,9 +118,6 @@ from ansible_collections.community.docker.plugins.module_utils._api.utils.utils
)
_DEFAULT_IP_REPLACEMENT_STRING = '[[DEFAULT_IP:iewahhaeB4Sae6Aen8IeShairoh4zeph7xaekoh8Geingunaesaeweiy3ooleiwi]]'
def _get_ansible_type(type):
if type == 'set':
return 'list'
@ -1270,16 +1268,26 @@ def _preprocess_value_ports(module, client, api_version, options, values):
if 'published_ports' not in values:
return values
found = False
for port_spec in values['published_ports'].values():
if port_spec[0] == _DEFAULT_IP_REPLACEMENT_STRING:
found = True
break
for port_specs in values["published_ports"].values():
if not isinstance(port_specs, list):
port_specs = [port_specs]
for port_spec in port_specs:
if port_spec[0] == _DEFAULT_IP_REPLACEMENT_STRING:
found = True
break
if not found:
return values
default_ip = _get_default_host_ip(module, client)
for port, port_spec in values['published_ports'].items():
if port_spec[0] == _DEFAULT_IP_REPLACEMENT_STRING:
values['published_ports'][port] = tuple([default_ip] + list(port_spec[1:]))
for port, port_specs in values["published_ports"].items():
if isinstance(port_specs, list):
for index, port_spec in enumerate(port_specs):
if port_spec[0] == _DEFAULT_IP_REPLACEMENT_STRING:
port_specs[index] = tuple([default_ip] + list(port_spec[1:]))
else:
if port_specs[0] == _DEFAULT_IP_REPLACEMENT_STRING:
values["published_ports"][port] = tuple(
[default_ip] + list(port_specs[1:])
)
return values

View File

@ -277,6 +277,58 @@
- published_ports_2 is not changed
- published_ports_3 is changed
####################################################################
## published_ports: duplicate ports ################################
####################################################################
- name: published_ports -- duplicate ports
community.docker.docker_container:
image: "{{ docker_test_image_alpine }}"
command: '/bin/sh -c "sleep 10m"'
name: "{{ cname }}"
state: started
published_ports:
- 8000:80
- 10000:80
register: published_ports_1
- name: published_ports -- duplicate ports (idempotency)
community.docker.docker_container:
image: "{{ docker_test_image_alpine }}"
command: '/bin/sh -c "sleep 10m"'
name: "{{ cname }}"
state: started
published_ports:
- 8000:80
- 10000:80
force_kill: true
register: published_ports_2
- name: published_ports -- duplicate ports (idempotency w/ protocol)
community.docker.docker_container:
image: "{{ docker_test_image_alpine }}"
command: '/bin/sh -c "sleep 10m"'
name: "{{ cname }}"
state: started
published_ports:
- 8000:80/tcp
- 10000:80/tcp
force_kill: true
register: published_ports_3
- name: cleanup
community.docker.docker_container:
name: "{{ cname }}"
state: absent
force_kill: true
diff: false
- ansible.builtin.assert:
that:
- published_ports_1 is changed
- published_ports_2 is not changed
- published_ports_3 is not changed
####################################################################
## published_ports: IPv6 addresses #################################
####################################################################