diff --git a/tests/integration/targets/docker_compose_v2_build/aliases b/tests/integration/targets/docker_compose_v2_build/aliases new file mode 100644 index 00000000..2e1acc0a --- /dev/null +++ b/tests/integration/targets/docker_compose_v2_build/aliases @@ -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 diff --git a/tests/integration/targets/docker_compose_v2_build/meta/main.yml b/tests/integration/targets/docker_compose_v2_build/meta/main.yml new file mode 100644 index 00000000..aefcf50f --- /dev/null +++ b/tests/integration/targets/docker_compose_v2_build/meta/main.yml @@ -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 diff --git a/tests/integration/targets/docker_compose_v2_build/tasks/main.yml b/tests/integration/targets/docker_compose_v2_build/tasks/main.yml new file mode 100644 index 00000000..d2c8497b --- /dev/null +++ b/tests/integration/targets/docker_compose_v2_build/tasks/main.yml @@ -0,0 +1,52 @@ +--- +# 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 }}" + +- name: Show images + command: docker images --all --digests + +# Run the tests +- block: + - name: Show docker compose --help output + 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', '>=') diff --git a/tests/integration/targets/docker_compose_v2_build/tasks/run-test.yml b/tests/integration/targets/docker_compose_v2_build/tasks/run-test.yml new file mode 100644 index 00000000..72a58962 --- /dev/null +++ b/tests/integration/targets/docker_compose_v2_build/tasks/run-test.yml @@ -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 }}" diff --git a/tests/integration/targets/docker_compose_v2_build/tasks/tests/build.yml b/tests/integration/targets/docker_compose_v2_build/tasks/tests/build.yml new file mode 100644 index 00000000..b30ca1f3 --- /dev/null +++ b/tests/integration/targets/docker_compose_v2_build/tasks/tests/build.yml @@ -0,0 +1,114 @@ +--- +# 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 + +- vars: + bname: "{{ name_prefix }}-build" + cname: "{{ name_prefix }}-cont" + non_existing_image: does-not-exist:latest + dockerfile_path: test-dockerfile + base_image: hello-world:latest + project_src: "{{ remote_tmp_dir }}/{{ bname }}" + test_service_non_existing: | + version: '3' + services: + {{ cname }}: + image: {{ non_existing_image }} + build: + dockerfile: Dockerfile-does-not-exist + test_service_simple: | + version: '3' + services: + {{ cname }}: + image: {{ docker_test_image_simple_1 }} + build: + dockerfile: {{ dockerfile_path }} + command: 10m + stop_grace_period: 1s + test_service_simple_dockerfile: | + FROM {{ base_image }} + + block: + - name: Registering container name + set_fact: + cnames: "{{ cnames + [bname ~ '-' ~ cname ~ '-1'] + [ base_image ]}}" + dnetworks: "{{ dnetworks + [bname ~ '_default'] }}" + + - name: Create project directory + file: + path: '{{ project_src }}' + state: directory + + - name: Make sure images are not around + docker_image_remove: + name: '{{ item }}' + loop: + - '{{ base_image }}' + - '{{ non_existing_image }}' + - '{{ docker_test_image_simple_1 }}' + +#################################################################### +## Image with missing dockerfile ################################### +#################################################################### + + - name: Template project file with non-existing image + copy: + dest: '{{ project_src }}/docker-compose.yml' + content: '{{ test_service_non_existing }}' + + - name: Build (check) + docker_compose_v2_build: + project_src: '{{ project_src }}' + check_mode: true + register: build_1_check + ignore_errors: true + + - name: Build + docker_compose_v2_build: + project_src: '{{ project_src }}' + register: build_1 + ignore_errors: true + + - assert: + that: + - build_1_check is failed or build_1_check is changed + - build_1_check is changed or build_1_check.msg.startswith('Error when processing ') + - build_1_check.warnings | default([]) | select('regex', 'Cannot parse event from ') | length == 0 + - build_1 is failed + - build_1.msg.startswith('Error when processing ') + - build_1.warnings | default([]) | select('regex', 'Cannot parse event from ') | length == 0 + +#################################################################### +## Regular image ################################################### +#################################################################### + + - name: Template project file with simple dockerfile + copy: + dest: '{{ project_src }}/docker-compose.yml' + content: '{{ test_service_simple }}' + + - name: Template dockerfile + copy: + dest: '{{ project_src }}/{{ dockerfile_path }}' + content: '{{ test_service_simple_dockerfile }}' + + - name: Build (check) + docker_compose_v2_build: + project_src: '{{ project_src }}' + check_mode: true + register: build_1_check + + - name: Build + docker_compose_v2_build: + project_src: '{{ project_src }}' + register: build_1 + + - assert: + that: + - build_1_check is changed + - (build_1_check.actions | selectattr('status', 'eq', 'Building') | first) is truthy + - build_1_check.warnings | default([]) | select('regex', 'Cannot parse event from ') | length == 0 + - build_1 is changed + - (build_1.actions | selectattr('status', 'eq', 'Building') | first) is truthy + - build_1.warnings | default([]) | select('regex', 'Cannot parse event from ') | length == 0