mirror of
https://github.com/ansible-collections/community.docker.git
synced 2026-07-29 11:55:04 +00:00
Add docker_compose_v2 module (#739)
* Add docker_compose_v2 module. * Add note on compatibility. * Parse more events. Emit warnings (or things we assume are warnings), and report unparsable messages to the user so they can report them to us.
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
azp/4
|
||||
destructive
|
||||
@@ -0,0 +1,10 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
dependencies:
|
||||
- setup_docker_cli_compose
|
||||
# The Python dependencies are needed for the other modules
|
||||
- setup_docker_python_deps
|
||||
- setup_remote_tmp_dir
|
||||
@@ -0,0 +1,48 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
####################################################################
|
||||
# WARNING: These are designed specifically for Ansible tests #
|
||||
# and should not be used as examples of how to write Ansible roles #
|
||||
####################################################################
|
||||
|
||||
# Create random name prefix (for services, ...)
|
||||
- name: Create random container name prefix
|
||||
set_fact:
|
||||
name_prefix: "{{ 'ansible-docker-test-%0x' % ((2**32) | random) }}"
|
||||
cnames: []
|
||||
dnetworks: []
|
||||
|
||||
- debug:
|
||||
msg: "Using name prefix {{ name_prefix }}"
|
||||
|
||||
# Run the tests
|
||||
- block:
|
||||
- command: docker compose --help
|
||||
|
||||
- include_tasks: run-test.yml
|
||||
with_fileglob:
|
||||
- "tests/*.yml"
|
||||
loop_control:
|
||||
loop_var: test_name
|
||||
|
||||
always:
|
||||
- name: "Make sure all containers are removed"
|
||||
docker_container:
|
||||
name: "{{ item }}"
|
||||
state: absent
|
||||
force_kill: true
|
||||
with_items: "{{ cnames }}"
|
||||
diff: false
|
||||
|
||||
- name: "Make sure all networks are removed"
|
||||
docker_network:
|
||||
name: "{{ item }}"
|
||||
state: absent
|
||||
force: true
|
||||
with_items: "{{ dnetworks }}"
|
||||
diff: false
|
||||
|
||||
when: docker_has_compose and docker_compose_version is version('2.18.0', '>=')
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
- name: "Loading tasks from {{ test_name }}"
|
||||
include_tasks: "{{ test_name }}"
|
||||
@@ -0,0 +1,265 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
- name: Set up project and container names
|
||||
set_fact:
|
||||
pname: "{{ name_prefix }}"
|
||||
cname: "{{ name_prefix ~ '-hi' }}"
|
||||
|
||||
- name: Registering container name
|
||||
set_fact:
|
||||
cnames: "{{ cnames + [pname ~ '-' ~ cname ~ '-1'] }}"
|
||||
dnetworks: "{{ dnetworks + [pname ~ '_default'] }}"
|
||||
|
||||
- name: Define services
|
||||
set_fact:
|
||||
project_src: "{{ remote_tmp_dir }}/{{ pname }}"
|
||||
test_service: |
|
||||
version: '3'
|
||||
services:
|
||||
{{ cname }}:
|
||||
image: "{{ docker_test_image_alpine }}"
|
||||
command: '/bin/sh -c "sleep 10m"'
|
||||
stop_grace_period: 1s
|
||||
test_service_mod: |
|
||||
version: '3'
|
||||
services:
|
||||
{{ cname }}:
|
||||
image: "{{ docker_test_image_alpine }}"
|
||||
command: '/bin/sh -c "sleep 15m"'
|
||||
stop_grace_period: 1s
|
||||
|
||||
- name: Create project directory
|
||||
file:
|
||||
path: '{{ project_src }}'
|
||||
state: directory
|
||||
|
||||
####################################################################
|
||||
## Present #########################################################
|
||||
####################################################################
|
||||
|
||||
- name: Template default project file
|
||||
copy:
|
||||
dest: '{{ project_src }}/docker-compose.yml'
|
||||
content: '{{ test_service }}'
|
||||
|
||||
- name: Present (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
check_mode: true
|
||||
register: present_1_check
|
||||
|
||||
- name: Present
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
register: present_1
|
||||
|
||||
- name: Present (idempotent check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
check_mode: true
|
||||
register: present_2_check
|
||||
|
||||
- name: Present (idempotent)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
register: present_2
|
||||
|
||||
- name: Template modified project file
|
||||
copy:
|
||||
dest: '{{ project_src }}/docker-compose.yml'
|
||||
content: '{{ test_service_mod }}'
|
||||
|
||||
- name: Present (changed check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
check_mode: true
|
||||
register: present_3_check
|
||||
|
||||
- name: Present (changed)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
register: present_3
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- present_1_check is changed
|
||||
- present_1 is changed
|
||||
- present_1.containers | length == 1
|
||||
- present_1.containers[0].Name == pname ~ '-' ~ cname ~ '-1'
|
||||
- present_1.containers[0].Image == docker_test_image_alpine
|
||||
- present_1.images | length == 1
|
||||
- present_1.images[0].ContainerName == pname ~ '-' ~ cname ~ '-1'
|
||||
- present_1.images[0].Repository == (docker_test_image_alpine | split(':') | first)
|
||||
- present_1.images[0].Tag == (docker_test_image_alpine | split(':') | last)
|
||||
- present_2_check is not changed
|
||||
- present_2 is not changed
|
||||
- present_3_check is changed
|
||||
- present_3 is changed
|
||||
|
||||
####################################################################
|
||||
## Absent ##########################################################
|
||||
####################################################################
|
||||
|
||||
- name: Absent (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: absent
|
||||
check_mode: true
|
||||
register: absent_1_check
|
||||
|
||||
- name: Absent
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: absent
|
||||
register: absent_1
|
||||
|
||||
- name: Absent (idempotent check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: absent
|
||||
check_mode: true
|
||||
register: absent_2_check
|
||||
|
||||
- name: Absent (idempotent)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: absent
|
||||
register: absent_2
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- absent_1_check is changed
|
||||
- absent_1 is changed
|
||||
- absent_2_check is not changed
|
||||
- absent_2 is not changed
|
||||
|
||||
####################################################################
|
||||
## Stopping and starting ###########################################
|
||||
####################################################################
|
||||
|
||||
- name: Template default project file
|
||||
copy:
|
||||
dest: '{{ project_src }}/docker-compose.yml'
|
||||
content: '{{ test_service }}'
|
||||
|
||||
- name: Present stopped (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: stopped
|
||||
check_mode: true
|
||||
register: present_1_check
|
||||
|
||||
- name: Present stopped
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: stopped
|
||||
register: present_1
|
||||
|
||||
- name: Present stopped (idempotent check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: stopped
|
||||
check_mode: true
|
||||
register: present_2_check
|
||||
|
||||
- name: Present stopped (idempotent)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: stopped
|
||||
register: present_2
|
||||
|
||||
- name: Started (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
check_mode: true
|
||||
register: present_3_check
|
||||
|
||||
- name: Started
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
register: present_3
|
||||
|
||||
- name: Started (idempotent check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
check_mode: true
|
||||
register: present_4_check
|
||||
|
||||
- name: Started (idempotent)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: present
|
||||
register: present_4
|
||||
|
||||
- name: Restarted (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: restarted
|
||||
check_mode: true
|
||||
register: present_5_check
|
||||
|
||||
- name: Restarted
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: restarted
|
||||
register: present_5
|
||||
|
||||
- name: Stopped (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: stopped
|
||||
check_mode: true
|
||||
register: present_6_check
|
||||
|
||||
- name: Stopped
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: stopped
|
||||
register: present_6
|
||||
|
||||
- name: Restarted (check)
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: restarted
|
||||
check_mode: true
|
||||
register: present_7_check
|
||||
|
||||
- name: Restarted
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: restarted
|
||||
register: present_7
|
||||
|
||||
- name: Cleanup
|
||||
docker_compose_v2:
|
||||
project_src: '{{ project_src }}'
|
||||
state: absent
|
||||
|
||||
- assert:
|
||||
that:
|
||||
- present_1_check is changed
|
||||
- present_1 is changed
|
||||
- present_2_check is not changed
|
||||
- present_2 is not changed
|
||||
- present_3_check is changed
|
||||
- present_3 is changed
|
||||
- present_4_check is not changed
|
||||
- present_4 is not changed
|
||||
- present_5_check is changed
|
||||
- present_5 is changed
|
||||
- present_6_check is changed
|
||||
- present_6 is changed
|
||||
- present_7_check is changed
|
||||
- present_7 is changed
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
dependencies:
|
||||
- setup_docker
|
||||
@@ -0,0 +1,13 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
- name: Compose is available from Alpine 3.15 on
|
||||
set_fact:
|
||||
docker_has_compose: "{{ ansible_facts.distribution_version is version('3.15', '>=') }}"
|
||||
|
||||
- name: Install Docker compose CLI plugin
|
||||
apk:
|
||||
name: docker-cli-compose
|
||||
when: docker_has_compose
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
- name: Install Docker compose CLI plugin
|
||||
community.general.pacman:
|
||||
name: docker-compose
|
||||
@@ -0,0 +1 @@
|
||||
nothing.yml
|
||||
@@ -0,0 +1 @@
|
||||
nothing.yml
|
||||
@@ -0,0 +1 @@
|
||||
nothing.yml
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
- name: For some reason we don't have the buildx plugin
|
||||
set_fact:
|
||||
docker_has_compose: false
|
||||
@@ -0,0 +1 @@
|
||||
nothing.yml
|
||||
@@ -0,0 +1,14 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
- name: Compose is available in OpenSuSE 15.5, not sure which versions before
|
||||
set_fact:
|
||||
docker_has_compose: "{{ ansible_facts.distribution_version is version('15.5', '>=') }}"
|
||||
|
||||
- name: Install Docker compose CLI plugin
|
||||
community.general.zypper:
|
||||
name: docker-compose
|
||||
disable_gpg_check: true
|
||||
when: docker_has_compose
|
||||
@@ -0,0 +1,65 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
####################################################################
|
||||
# WARNING: These are designed specifically for Ansible tests #
|
||||
# and should not be used as examples of how to write Ansible roles #
|
||||
####################################################################
|
||||
|
||||
- name: Setup Docker
|
||||
when: ansible_facts.distribution ~ ansible_facts.distribution_major_version not in ['CentOS6', 'RedHat6']
|
||||
block:
|
||||
- name:
|
||||
debug:
|
||||
msg: |-
|
||||
OS family: {{ ansible_facts.os_family }}
|
||||
Distribution: {{ ansible_facts.distribution }}
|
||||
Distribution major version: {{ ansible_facts.distribution_major_version }}
|
||||
Distribution full version: {{ ansible_facts.distribution_version }}
|
||||
|
||||
- name: Set facts for Docker features to defaults
|
||||
set_fact:
|
||||
docker_has_compose: true
|
||||
docker_compose_version: "0.0"
|
||||
|
||||
- name: Include distribution specific variables
|
||||
include_vars: "{{ lookup('first_found', params) }}"
|
||||
vars:
|
||||
params:
|
||||
files:
|
||||
- "{{ ansible_facts.distribution }}-{{ ansible_facts.distribution_major_version }}.yml"
|
||||
- "{{ ansible_facts.os_family }}-{{ ansible_facts.distribution_major_version }}.yml"
|
||||
- "{{ ansible_facts.distribution }}.yml"
|
||||
- "{{ ansible_facts.os_family }}.yml"
|
||||
- default.yml
|
||||
paths:
|
||||
- "{{ role_path }}/vars"
|
||||
|
||||
- name: Include distribution specific tasks
|
||||
include_tasks: "{{ lookup('first_found', params) }}"
|
||||
vars:
|
||||
params:
|
||||
files:
|
||||
- "{{ ansible_facts.distribution }}-{{ ansible_facts.distribution_major_version }}.yml"
|
||||
- "{{ ansible_facts.os_family }}-{{ ansible_facts.distribution_major_version }}.yml"
|
||||
- "{{ ansible_facts.distribution }}.yml"
|
||||
- "{{ ansible_facts.os_family }}.yml"
|
||||
paths:
|
||||
- "{{ role_path }}/tasks"
|
||||
|
||||
- name: Obtain Docker Compose version
|
||||
when: docker_has_compose
|
||||
block:
|
||||
- command:
|
||||
cmd: docker info --format '{% raw %}{{ json .ClientInfo.Plugins }}{% endraw %}'
|
||||
register: docker_cli_plugins_stdout
|
||||
- set_fact:
|
||||
docker_has_compose: >-
|
||||
{{ docker_cli_plugins_stdout.stdout | from_json | selectattr('Name', 'eq', 'compose') | map(attribute='Version') | length > 0 }}
|
||||
docker_compose_version: >-
|
||||
{{ docker_cli_plugins_stdout.stdout | from_json | selectattr('Name', 'eq', 'compose') | map(attribute='Version') | first | default('0.0') | regex_replace('^v', '') }}
|
||||
|
||||
- debug:
|
||||
msg: "Has Docker compoes plugin: {{ docker_has_compose }}; Docker compose plugin version: {{ docker_compose_version }}"
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# nothing to do
|
||||
[]
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
# Copyright (c) Ansible Project
|
||||
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
@@ -7,5 +7,6 @@
|
||||
plugins/modules/current_container_facts.py validate-modules:return-syntax-error
|
||||
plugins/module_utils/module_container/module.py compile-2.6!skip # Uses Python 2.7+ syntax
|
||||
plugins/module_utils/module_container/module.py import-2.6!skip # Uses Python 2.7+ syntax
|
||||
plugins/modules/docker_compose_v2.py validate-modules:return-syntax-error
|
||||
plugins/modules/docker_container.py import-2.6!skip # Import uses Python 2.7+ syntax
|
||||
plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
|
||||
|
||||
@@ -7,5 +7,6 @@
|
||||
plugins/modules/current_container_facts.py validate-modules:return-syntax-error
|
||||
plugins/module_utils/module_container/module.py compile-2.6!skip # Uses Python 2.7+ syntax
|
||||
plugins/module_utils/module_container/module.py import-2.6!skip # Uses Python 2.7+ syntax
|
||||
plugins/modules/docker_compose_v2.py validate-modules:return-syntax-error
|
||||
plugins/modules/docker_container.py import-2.6!skip # Import uses Python 2.7+ syntax
|
||||
plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
.azure-pipelines/scripts/publish-codecov.py replace-urlopen
|
||||
plugins/modules/current_container_facts.py validate-modules:return-syntax-error
|
||||
plugins/modules/docker_compose_v2.py validate-modules:return-syntax-error
|
||||
plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
.azure-pipelines/scripts/publish-codecov.py replace-urlopen
|
||||
plugins/modules/docker_compose_v2.py validate-modules:return-syntax-error
|
||||
plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
|
||||
|
||||
@@ -6,5 +6,6 @@
|
||||
.azure-pipelines/scripts/publish-codecov.py metaclass-boilerplate
|
||||
plugins/module_utils/module_container/module.py compile-2.6!skip # Uses Python 2.7+ syntax
|
||||
plugins/module_utils/module_container/module.py import-2.6!skip # Uses Python 2.7+ syntax
|
||||
plugins/modules/docker_compose_v2.py validate-modules:return-syntax-error
|
||||
plugins/modules/docker_container.py import-2.6!skip # Import uses Python 2.7+ syntax
|
||||
plugins/modules/docker_container_copy_into.py validate-modules:undocumented-parameter # _max_file_size_for_diff is used by the action plugin
|
||||
|
||||
Reference in New Issue
Block a user