1---
2- name: Registering container name
3  set_fact:
4    cname: "{{ cname_prefix ~ '-mounts' }}"
5    cname_h1: "{{ cname_prefix ~ '-mounts-h1' }}"
6    cname_h2: "{{ cname_prefix ~ '-mounts-h2' }}"
7- name: Registering container name
8  set_fact:
9    cnames: "{{ cnames + [cname, cname_h1, cname_h2] }}"
10
11####################################################################
12## keep_volumes ####################################################
13####################################################################
14
15# TODO: - keep_volumes
16
17####################################################################
18## mounts ##########################################################
19####################################################################
20
21- name: mounts
22  docker_container:
23    image: quay.io/ansible/docker-test-containers:alpine3.8
24    command: '/bin/sh -c "sleep 10m"'
25    name: "{{ cname }}"
26    state: started
27    mounts:
28    - source: /tmp
29      target: /tmp
30      type: bind
31    - source: /
32      target: /whatever
33      type: bind
34      read_only: no
35  register: mounts_1
36  ignore_errors: yes
37
38- name: mounts (idempotency)
39  docker_container:
40    image: quay.io/ansible/docker-test-containers:alpine3.8
41    command: '/bin/sh -c "sleep 10m"'
42    name: "{{ cname }}"
43    state: started
44    mounts:
45    - source: /
46      target: /whatever
47      type: bind
48      read_only: no
49    - source: /tmp
50      target: /tmp
51      type: bind
52  register: mounts_2
53  ignore_errors: yes
54
55- name: mounts (less mounts)
56  docker_container:
57    image: quay.io/ansible/docker-test-containers:alpine3.8
58    command: '/bin/sh -c "sleep 10m"'
59    name: "{{ cname }}"
60    state: started
61    mounts:
62    - source: /tmp
63      target: /tmp
64      type: bind
65  register: mounts_3
66  ignore_errors: yes
67
68- name: mounts (more mounts)
69  docker_container:
70    image: quay.io/ansible/docker-test-containers:alpine3.8
71    command: '/bin/sh -c "sleep 10m"'
72    name: "{{ cname }}"
73    state: started
74    mounts:
75    - source: /tmp
76      target: /tmp
77      type: bind
78    - source: /tmp
79      target: /somewhereelse
80      type: bind
81      read_only: yes
82    force_kill: yes
83  register: mounts_4
84  ignore_errors: yes
85
86- name: mounts (different modes)
87  docker_container:
88    image: quay.io/ansible/docker-test-containers:alpine3.8
89    command: '/bin/sh -c "sleep 10m"'
90    name: "{{ cname }}"
91    state: started
92    mounts:
93    - source: /tmp
94      target: /tmp
95      type: bind
96    - source: /tmp
97      target: /somewhereelse
98      type: bind
99      read_only: no
100    force_kill: yes
101  register: mounts_5
102  ignore_errors: yes
103
104- name: mounts (endpoint collision)
105  docker_container:
106    image: quay.io/ansible/docker-test-containers:alpine3.8
107    command: '/bin/sh -c "sleep 10m"'
108    name: "{{ cname }}"
109    state: started
110    mounts:
111    - source: /home
112      target: /x
113      type: bind
114    - source: /etc
115      target: /x
116      type: bind
117      read_only: no
118    force_kill: yes
119  register: mounts_6
120  ignore_errors: yes
121
122- name: cleanup
123  docker_container:
124    name: "{{ cname }}"
125    state: absent
126    force_kill: yes
127  diff: no
128
129- assert:
130    that:
131    - mounts_1 is changed
132    - mounts_2 is not changed
133    - mounts_3 is not changed
134    - mounts_4 is changed
135    - mounts_5 is changed
136    - mounts_6 is failed
137    - "'The mount point \"/x\" appears twice in the mounts option' == mounts_6.msg"
138  when: docker_py_version is version('2.6.0', '>=')
139- assert:
140    that:
141    - mounts_1 is failed
142    - "('version is ' ~ docker_py_version ~ ' ') in mounts_1.msg"
143    - "'Minimum version required is 2.6.0 ' in mounts_1.msg"
144  when: docker_py_version is version('2.6.0', '<')
145
146####################################################################
147## mounts + volumes ################################################
148####################################################################
149
150- name: mounts + volumes
151  docker_container:
152    image: quay.io/ansible/docker-test-containers:alpine3.8
153    command: '/bin/sh -c "sleep 10m"'
154    name: "{{ cname }}"
155    state: started
156    mounts:
157    - source: /
158      target: /whatever
159      type: bind
160      read_only: yes
161    volumes:
162    - /tmp:/tmp
163  register: mounts_volumes_1
164  ignore_errors: yes
165
166- name: mounts + volumes (idempotency)
167  docker_container:
168    image: quay.io/ansible/docker-test-containers:alpine3.8
169    command: '/bin/sh -c "sleep 10m"'
170    name: "{{ cname }}"
171    state: started
172    mounts:
173    - source: /
174      target: /whatever
175      type: bind
176      read_only: yes
177    volumes:
178    - /tmp:/tmp
179  register: mounts_volumes_2
180  ignore_errors: yes
181
182- name: mounts + volumes (switching)
183  docker_container:
184    image: quay.io/ansible/docker-test-containers:alpine3.8
185    command: '/bin/sh -c "sleep 10m"'
186    name: "{{ cname }}"
187    state: started
188    mounts:
189    - source: /tmp
190      target: /tmp
191      type: bind
192      read_only: no
193    volumes:
194    - /:/whatever:ro
195    force_kill: yes
196  register: mounts_volumes_3
197  ignore_errors: yes
198
199- name: mounts + volumes (collision, should fail)
200  docker_container:
201    image: quay.io/ansible/docker-test-containers:alpine3.8
202    command: '/bin/sh -c "sleep 10m"'
203    name: "{{ cname }}"
204    state: started
205    mounts:
206    - source: /tmp
207      target: /tmp
208      type: bind
209      read_only: no
210    volumes:
211    - /tmp:/tmp
212    force_kill: yes
213  register: mounts_volumes_4
214  ignore_errors: yes
215
216- name: cleanup
217  docker_container:
218    name: "{{ cname }}"
219    state: absent
220    force_kill: yes
221  diff: no
222
223- assert:
224    that:
225    - mounts_volumes_1 is changed
226    - mounts_volumes_2 is not changed
227    - mounts_volumes_3 is changed
228    - mounts_volumes_4 is failed
229    - "'The mount point \"/tmp\" appears both in the volumes and mounts option' in mounts_volumes_4.msg"
230  when: docker_py_version is version('2.6.0', '>=')
231- assert:
232    that:
233    - mounts_volumes_1 is failed
234    - "('version is ' ~ docker_py_version ~ ' ') in mounts_1.msg"
235    - "'Minimum version required is 2.6.0 ' in mounts_1.msg"
236  when: docker_py_version is version('2.6.0', '<')
237
238####################################################################
239## volume_driver ###################################################
240####################################################################
241
242- name: volume_driver
243  docker_container:
244    image: quay.io/ansible/docker-test-containers:alpine3.8
245    command: '/bin/sh -c "sleep 10m"'
246    name: "{{ cname }}"
247    volume_driver: local
248    state: started
249  register: volume_driver_1
250
251- name: volume_driver (idempotency)
252  docker_container:
253    image: quay.io/ansible/docker-test-containers:alpine3.8
254    command: '/bin/sh -c "sleep 10m"'
255    name: "{{ cname }}"
256    volume_driver: local
257    state: started
258  register: volume_driver_2
259
260- name: volume_driver (change)
261  docker_container:
262    image: quay.io/ansible/docker-test-containers:alpine3.8
263    command: '/bin/sh -c "sleep 10m"'
264    name: "{{ cname }}"
265    volume_driver: /
266    state: started
267    force_kill: yes
268  register: volume_driver_3
269
270- name: cleanup
271  docker_container:
272    name: "{{ cname }}"
273    state: absent
274    force_kill: yes
275  diff: no
276
277- assert:
278    that:
279    - volume_driver_1 is changed
280    - volume_driver_2 is not changed
281    - volume_driver_3 is changed
282
283####################################################################
284## volumes #########################################################
285####################################################################
286
287- name: volumes
288  docker_container:
289    image: quay.io/ansible/docker-test-containers:alpine3.8
290    command: '/bin/sh -c "sleep 10m"'
291    name: "{{ cname }}"
292    state: started
293    volumes:
294    - "/tmp:/tmp"
295    - "/:/whatever:rw,z"
296  register: volumes_1
297
298- name: volumes (idempotency)
299  docker_container:
300    image: quay.io/ansible/docker-test-containers:alpine3.8
301    command: '/bin/sh -c "sleep 10m"'
302    name: "{{ cname }}"
303    state: started
304    volumes:
305    - "/:/whatever:rw,z"
306    - "/tmp:/tmp"
307  register: volumes_2
308
309- name: volumes (less volumes)
310  docker_container:
311    image: quay.io/ansible/docker-test-containers:alpine3.8
312    command: '/bin/sh -c "sleep 10m"'
313    name: "{{ cname }}"
314    state: started
315    volumes:
316    - "/tmp:/tmp"
317  register: volumes_3
318
319- name: volumes (more volumes)
320  docker_container:
321    image: quay.io/ansible/docker-test-containers:alpine3.8
322    command: '/bin/sh -c "sleep 10m"'
323    name: "{{ cname }}"
324    state: started
325    volumes:
326    - "/tmp:/tmp"
327    - "/tmp:/somewhereelse:ro,Z"
328    force_kill: yes
329  register: volumes_4
330
331- name: volumes (different modes)
332  docker_container:
333    image: quay.io/ansible/docker-test-containers:alpine3.8
334    command: '/bin/sh -c "sleep 10m"'
335    name: "{{ cname }}"
336    state: started
337    volumes:
338    - "/tmp:/tmp"
339    - "/tmp:/somewhereelse:ro"
340    force_kill: yes
341  register: volumes_5
342
343- name: volumes (collision)
344  docker_container:
345    image: quay.io/ansible/docker-test-containers:alpine3.8
346    command: '/bin/sh -c "sleep 10m"'
347    name: "{{ cname }}"
348    state: started
349    volumes:
350    - "/etc:/tmp"
351    - "/home:/tmp:ro"
352    force_kill: yes
353  register: volumes_6
354  ignore_errors: yes
355
356- name: cleanup
357  docker_container:
358    name: "{{ cname }}"
359    state: absent
360    force_kill: yes
361  diff: no
362
363- assert:
364    that:
365    - volumes_1 is changed
366    - volumes_2 is not changed
367    - volumes_3 is not changed
368    - volumes_4 is changed
369    - volumes_5 is changed
370    - volumes_6 is failed
371    - "'The mount point \"/tmp\" appears twice in the volumes option' in volumes_6.msg"
372
373####################################################################
374## volumes_from ####################################################
375####################################################################
376
377- name: start helpers
378  docker_container:
379    image: quay.io/ansible/docker-test-containers:alpine3.8
380    command: '/bin/sh -c "sleep 10m"'
381    name: "{{ container_name }}"
382    state: started
383    volumes:
384    - "{{ '/tmp:/tmp' if container_name == cname_h1 else '/:/whatever:ro' }}"
385  loop:
386  - "{{ cname_h1 }}"
387  - "{{ cname_h2 }}"
388  loop_control:
389    loop_var: container_name
390
391- name: volumes_from
392  docker_container:
393    image: quay.io/ansible/docker-test-containers:alpine3.8
394    command: '/bin/sh -c "sleep 10m"'
395    name: "{{ cname }}"
396    state: started
397    volumes_from: "{{ cname_h1 }}"
398  register: volumes_from_1
399
400- name: volumes_from (idempotency)
401  docker_container:
402    image: quay.io/ansible/docker-test-containers:alpine3.8
403    command: '/bin/sh -c "sleep 10m"'
404    name: "{{ cname }}"
405    state: started
406    volumes_from: "{{ cname_h1 }}"
407  register: volumes_from_2
408
409- name: volumes_from (change)
410  docker_container:
411    image: quay.io/ansible/docker-test-containers:alpine3.8
412    command: '/bin/sh -c "sleep 10m"'
413    name: "{{ cname }}"
414    state: started
415    volumes_from: "{{ cname_h2 }}"
416    force_kill: yes
417  register: volumes_from_3
418
419- name: cleanup
420  docker_container:
421    name: "{{ container_name }}"
422    state: absent
423    force_kill: yes
424  loop:
425  - "{{ cname }}"
426  - "{{ cname_h1 }}"
427  - "{{ cname_h2 }}"
428  loop_control:
429    loop_var: container_name
430  diff: no
431
432- assert:
433    that:
434    - volumes_from_1 is changed
435    - volumes_from_2 is not changed
436    - volumes_from_3 is changed
437
438####################################################################
439####################################################################
440####################################################################
441