a096cd08c5
* docker_swarm_service: Sort lists when checking for changes When two lists are checked for changes in this module, the lists are reported changed when the order of the items is different. This PR resolves this issue. * docker_swarm_service: Minor typo fix * docker_swarm_service: Another minor typo * docker_swarm_service: Should use sorted(), not sort() * docker_swarm_service: Sort lists of dictionaries * docker_swarm_service: Fix style issues in tests * docker_swarm_service: Updates to integration tests * docker_swarm_service: Casting string types within lists when comparing * docker_swarm_service: Special handling of unordered networks with ordered aliases * docker_swarm_service: Sorting network lists * docker_swarm_serivce: Better unit test code coverage for lists and networks * docker_swarm_service: Fixed coding style for sanity tests * docker_swarm_service: More coding style fixes * docker_swarm_service: Ignoring test for Python < 3 * docker_swarm_service: Update to version info check for backwards compatibility * docker_swarm_service: Added change fragment #63887 * docker_swarm_service: Better handling of missing sort key for dictionary of lists * docker_swarm_service: Preventing sorts from modifying in-place Co-Authored-By: Felix Fontein <felix@fontein.de> * docker_swarm_service: Removed spurious import in test * docker_swarm_service: Preventing sorts from modifying more data in-place Co-Authored-By: Felix Fontein <felix@fontein.de>
601 lines
16 KiB
YAML
601 lines
16 KiB
YAML
- name: Registering service name
|
|
set_fact:
|
|
service_name: "{{ name_prefix ~ '-mounts' }}"
|
|
volume_name_1: "{{ name_prefix ~ '-volume-1' }}"
|
|
volume_name_2: "{{ name_prefix ~ '-volume-2' }}"
|
|
|
|
- name: Registering service name
|
|
set_fact:
|
|
service_names: "{{ service_names + [service_name] }}"
|
|
volume_names: "{{ volume_names + [volume_name_1, volume_name_2] }}"
|
|
|
|
- docker_volume:
|
|
name: "{{ volume_name }}"
|
|
state: present
|
|
loop:
|
|
- "{{ volume_name_1 }}"
|
|
- "{{ volume_name_2 }}"
|
|
loop_control:
|
|
loop_var: volume_name
|
|
|
|
####################################################################
|
|
## mounts ##########################################################
|
|
####################################################################
|
|
|
|
- name: mounts
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
register: mounts_1
|
|
|
|
- name: mounts (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
register: mounts_2
|
|
|
|
- name: mounts (add)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
- source: "/tmp/"
|
|
target: "/tmp/{{ volume_name_2 }}"
|
|
type: "bind"
|
|
register: mounts_3
|
|
|
|
- name: mounts (order idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "/tmp/"
|
|
target: "/tmp/{{ volume_name_2 }}"
|
|
type: "bind"
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
register: mounts_4
|
|
|
|
- name: mounts (empty)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts: []
|
|
register: mounts_5
|
|
|
|
- name: mounts (empty idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts: []
|
|
register: mounts_6
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_1 is changed
|
|
- mounts_2 is not changed
|
|
- mounts_3 is changed
|
|
- mounts_4 is not changed
|
|
- mounts_5 is changed
|
|
- mounts_6 is not changed
|
|
|
|
####################################################################
|
|
## mounts.readonly #################################################
|
|
####################################################################
|
|
|
|
- name: mounts.readonly
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
readonly: true
|
|
register: mounts_readonly_1
|
|
|
|
|
|
- name: mounts.readonly (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
readonly: true
|
|
register: mounts_readonly_2
|
|
|
|
- name: mounts.readonly (change)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
readonly: false
|
|
register: mounts_readonly_3
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_readonly_1 is changed
|
|
- mounts_readonly_2 is not changed
|
|
- mounts_readonly_3 is changed
|
|
|
|
####################################################################
|
|
## mounts.propagation ##############################################
|
|
####################################################################
|
|
|
|
- name: mounts.propagation
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "/tmp"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "bind"
|
|
propagation: "slave"
|
|
register: mounts_propagation_1
|
|
|
|
|
|
- name: mounts.propagation (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "/tmp"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "bind"
|
|
propagation: "slave"
|
|
register: mounts_propagation_2
|
|
|
|
- name: mounts.propagation (change)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "/tmp"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "bind"
|
|
propagation: "rprivate"
|
|
register: mounts_propagation_3
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_propagation_1 is changed
|
|
- mounts_propagation_2 is not changed
|
|
- mounts_propagation_3 is changed
|
|
|
|
####################################################################
|
|
## mounts.labels ##################################################
|
|
####################################################################
|
|
|
|
- name: mounts.labels
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
labels:
|
|
mylabel: hello-world
|
|
my-other-label: hello-mars
|
|
register: mounts_labels_1
|
|
|
|
|
|
- name: mounts.labels (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
labels:
|
|
mylabel: hello-world
|
|
my-other-label: hello-mars
|
|
register: mounts_labels_2
|
|
|
|
- name: mounts.labels (change)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
labels:
|
|
mylabel: hello-world
|
|
register: mounts_labels_3
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_labels_1 is changed
|
|
- mounts_labels_2 is not changed
|
|
- mounts_labels_3 is changed
|
|
|
|
####################################################################
|
|
## mounts.no_copy ##################################################
|
|
####################################################################
|
|
|
|
- name: mounts.no_copy
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
no_copy: true
|
|
register: mounts_no_copy_1
|
|
|
|
|
|
- name: mounts.no_copy (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
no_copy: true
|
|
register: mounts_no_copy_2
|
|
|
|
- name: mounts.no_copy (change)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
no_copy: false
|
|
register: mounts_no_copy_3
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_no_copy_1 is changed
|
|
- mounts_no_copy_2 is not changed
|
|
- mounts_no_copy_3 is changed
|
|
|
|
####################################################################
|
|
## mounts.driver_config ############################################
|
|
####################################################################
|
|
|
|
- name: mounts.driver_config
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
driver_config:
|
|
name: "nfs"
|
|
options:
|
|
addr: "127.0.0.1"
|
|
register: mounts_driver_config_1
|
|
|
|
- name: mounts.driver_config
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
driver_config:
|
|
name: "nfs"
|
|
options:
|
|
addr: "127.0.0.1"
|
|
register: mounts_driver_config_2
|
|
|
|
- name: mounts.driver_config
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "volume"
|
|
driver_config:
|
|
name: "local"
|
|
register: mounts_driver_config_3
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_driver_config_1 is changed
|
|
- mounts_driver_config_2 is not changed
|
|
- mounts_driver_config_3 is changed
|
|
|
|
####################################################################
|
|
## mounts.tmpfs_size ###############################################
|
|
####################################################################
|
|
|
|
- name: mounts.tmpfs_size
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
tmpfs_size: "50M"
|
|
register: mounts_tmpfs_size_1
|
|
ignore_errors: yes
|
|
|
|
- name: mounts.tmpfs_size (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
tmpfs_size: "50M"
|
|
register: mounts_tmpfs_size_2
|
|
ignore_errors: yes
|
|
|
|
- name: mounts.tmpfs_size (change)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
tmpfs_size: "25M"
|
|
register: mounts_tmpfs_size_3
|
|
ignore_errors: yes
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_tmpfs_size_1 is changed
|
|
- mounts_tmpfs_size_2 is not changed
|
|
- mounts_tmpfs_size_3 is changed
|
|
when: docker_py_version is version('2.6.0', '>=')
|
|
- assert:
|
|
that:
|
|
- mounts_tmpfs_size_1 is failed
|
|
- "'Minimum version required' in mounts_tmpfs_size_1.msg"
|
|
when: docker_py_version is version('2.6.0', '<')
|
|
|
|
####################################################################
|
|
## mounts.tmpfs_mode ###############################################
|
|
####################################################################
|
|
|
|
- name: mounts.tmpfs_mode
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
tmpfs_mode: 0444
|
|
register: mounts_tmpfs_mode_1
|
|
ignore_errors: yes
|
|
|
|
- name: mounts.tmpfs_mode (idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
tmpfs_mode: 0444
|
|
register: mounts_tmpfs_mode_2
|
|
ignore_errors: yes
|
|
|
|
- name: mounts.tmpfs_mode (change)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: "{{ volume_name_1 }}"
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
tmpfs_mode: 0777
|
|
register: mounts_tmpfs_mode_3
|
|
ignore_errors: yes
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_tmpfs_mode_1 is changed
|
|
- mounts_tmpfs_mode_2 is not changed
|
|
- mounts_tmpfs_mode_3 is changed
|
|
when: docker_py_version is version('2.6.0', '>=')
|
|
- assert:
|
|
that:
|
|
- mounts_tmpfs_size_1 is failed
|
|
- "'Minimum version required' in mounts_tmpfs_size_1.msg"
|
|
when: docker_py_version is version('2.6.0', '<')
|
|
|
|
####################################################################
|
|
## mounts.source ###################################################
|
|
####################################################################
|
|
|
|
- name: mounts.source (empty for tmpfs)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: ""
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
register: mounts_tmpfs_source_1
|
|
ignore_errors: yes
|
|
|
|
- name: mounts.source (empty for tmpfs idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- source: ""
|
|
target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
register: mounts_tmpfs_source_2
|
|
ignore_errors: yes
|
|
|
|
- name: mounts.source (not specified for tmpfs idempotency)
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
image: alpine:3.8
|
|
resolve_image: no
|
|
command: '/bin/sh -v -c "sleep 10m"'
|
|
mounts:
|
|
- target: "/tmp/{{ volume_name_1 }}"
|
|
type: "tmpfs"
|
|
register: mounts_tmpfs_source_3
|
|
ignore_errors: yes
|
|
|
|
- name: cleanup
|
|
docker_swarm_service:
|
|
name: "{{ service_name }}"
|
|
state: absent
|
|
diff: no
|
|
|
|
- assert:
|
|
that:
|
|
- mounts_tmpfs_source_1 is changed
|
|
- mounts_tmpfs_source_2 is not changed
|
|
- mounts_tmpfs_source_3 is not changed
|
|
when: docker_py_version is version('2.6.0', '>=')
|
|
- assert:
|
|
that:
|
|
- mounts_tmpfs_source_1 is failed
|
|
- "'Minimum version required' in mounts_tmpfs_source_1.msg"
|
|
when: docker_py_version is version('2.6.0', '<')
|
|
|
|
####################################################################
|
|
####################################################################
|
|
####################################################################
|
|
|
|
- name: Delete volumes
|
|
docker_volume:
|
|
name: "{{ volume_name }}"
|
|
state: absent
|
|
loop:
|
|
- "{{ volume_name_1 }}"
|
|
- "{{ volume_name_2 }}"
|
|
loop_control:
|
|
loop_var: volume_name
|
|
ignore_errors: yes
|