docker_container: add mount endpoint collision detection (#60384)

* Add mount endpoint collision detection.

* Add changelog.

* Fix error.
pull/60691/head
Felix Fontein 5 years ago committed by GitHub
parent 523e40e993
commit 48541910bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -0,0 +1,2 @@
minor_changes:
- "docker_container - now tests for mount endpoint collisions (for both ``mounts`` and ``volumes``) to abort early when collisions are found"

@ -1290,6 +1290,8 @@ class TaskParameters(DockerBaseClass):
self.mounts_opt, self.expected_mounts = self._process_mounts() self.mounts_opt, self.expected_mounts = self._process_mounts()
self._check_mount_target_collisions()
for param_name in ["device_read_bps", "device_write_bps"]: for param_name in ["device_read_bps", "device_write_bps"]:
if client.module.params.get(param_name): if client.module.params.get(param_name):
self._process_rate_bps(option=param_name) self._process_rate_bps(option=param_name)
@ -1842,6 +1844,25 @@ class TaskParameters(DockerBaseClass):
return mode return mode
return 'container:{0}'.format(container['Id']) return 'container:{0}'.format(container['Id'])
def _check_mount_target_collisions(self):
last = dict()
def f(t, name):
if t in last:
if name == last[t]:
self.client.fail('The mount point "{0}" appears twice in the {1} option'.format(t, name))
else:
self.client.fail('The mount point "{0}" appears both in the {1} and {2} option'.format(t, name, last[t]))
last[t] = name
if self.expected_mounts:
for t in [m['target'] for m in self.expected_mounts]:
f(t, 'mounts')
if self.volumes:
for v in self.volumes:
vs = v.split(':')
f(vs[0 if len(vs) == 1 else 1], 'volumes')
class Container(DockerBaseClass): class Container(DockerBaseClass):

@ -101,6 +101,24 @@
register: mounts_5 register: mounts_5
ignore_errors: yes ignore_errors: yes
- name: mounts (endpoint collision)
docker_container:
image: alpine:3.8
command: '/bin/sh -c "sleep 10m"'
name: "{{ cname }}"
state: started
mounts:
- source: /home
target: /x
type: bind
- source: /etc
target: /x
type: bind
read_only: no
force_kill: yes
register: mounts_6
ignore_errors: yes
- name: cleanup - name: cleanup
docker_container: docker_container:
name: "{{ cname }}" name: "{{ cname }}"
@ -115,6 +133,8 @@
- mounts_3 is not changed - mounts_3 is not changed
- mounts_4 is changed - mounts_4 is changed
- mounts_5 is changed - mounts_5 is changed
- mounts_6 is failed
- "'The mount point \"/x\" appears twice in the mounts option' == mounts_6.msg"
when: docker_py_version is version('2.6.0', '>=') when: docker_py_version is version('2.6.0', '>=')
- assert: - assert:
that: that:
@ -206,6 +226,7 @@
- mounts_volumes_2 is not changed - mounts_volumes_2 is not changed
- mounts_volumes_3 is changed - mounts_volumes_3 is changed
- mounts_volumes_4 is failed - mounts_volumes_4 is failed
- "'The mount point \"/tmp\" appears both in the volumes and mounts option' in mounts_volumes_4.msg"
when: docker_py_version is version('2.6.0', '>=') when: docker_py_version is version('2.6.0', '>=')
- assert: - assert:
that: that:
@ -319,6 +340,19 @@
force_kill: yes force_kill: yes
register: volumes_5 register: volumes_5
- name: volumes (collision)
docker_container:
image: alpine:3.8
command: '/bin/sh -c "sleep 10m"'
name: "{{ cname }}"
state: started
volumes:
- "/etc:/tmp"
- "/home:/tmp:ro"
force_kill: yes
register: volumes_6
ignore_errors: yes
- name: cleanup - name: cleanup
docker_container: docker_container:
name: "{{ cname }}" name: "{{ cname }}"
@ -333,6 +367,8 @@
- volumes_3 is not changed - volumes_3 is not changed
- volumes_4 is changed - volumes_4 is changed
- volumes_5 is changed - volumes_5 is changed
- volumes_6 is failed
- "'The mount point \"/tmp\" appears twice in the volumes option' in volumes_6.msg"
#################################################################### ####################################################################
## volumes_from #################################################### ## volumes_from ####################################################

Loading…
Cancel
Save