From 975f66f2eebe9dadba04f275774d4ab83f74cf25 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 14:04:41 +0200 Subject: Adding upstream version 7.7.0+dfsg. Signed-off-by: Daniel Baumann --- ansible_collections/cloud/common/tests/config.yml | 2 + .../integration/targets/turbo_fail/tasks/main.yaml | 24 ++++ .../integration/targets/turbo_lookup/playbook.yaml | 81 ++++++++++++ .../integration/targets/turbo_lookup/runme.sh | 3 + .../integration/targets/turbo_mode/playbook.yaml | 5 + .../tests/integration/targets/turbo_mode/runme.sh | 4 + .../integration/targets/turbo_mode/tasks/main.yaml | 77 ++++++++++++ .../targets/turbo_mode_parallel_exec/inventory | 50 ++++++++ .../targets/turbo_mode_parallel_exec/playbook.yaml | 33 +++++ .../targets/turbo_mode_parallel_exec/runme.sh | 4 + .../cloud/common/tests/sanity/ignore-2.10.txt | 76 +++++++++++ .../cloud/common/tests/sanity/ignore-2.11.txt | 84 +++++++++++++ .../cloud/common/tests/sanity/ignore-2.12.txt | 1 + .../cloud/common/tests/sanity/ignore-2.13.txt | 1 + .../cloud/common/tests/sanity/ignore-2.14.txt | 1 + .../cloud/common/tests/sanity/ignore-2.15.txt | 1 + .../cloud/common/tests/sanity/ignore-2.9.txt | 76 +++++++++++ .../unit/plugins/module_utils/turbo/conftest.py | 20 +++ .../unit/plugins/module_utils/turbo/test_module.py | 59 +++++++++ .../module_utils/turbo/test_turbo_module.py | 140 +++++++++++++++++++++ .../cloud/common/tests/unit/requirements.txt | 4 + 21 files changed, 746 insertions(+) create mode 100644 ansible_collections/cloud/common/tests/config.yml create mode 100644 ansible_collections/cloud/common/tests/integration/targets/turbo_fail/tasks/main.yaml create mode 100644 ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/playbook.yaml create mode 100755 ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/runme.sh create mode 100644 ansible_collections/cloud/common/tests/integration/targets/turbo_mode/playbook.yaml create mode 100755 ansible_collections/cloud/common/tests/integration/targets/turbo_mode/runme.sh create mode 100644 ansible_collections/cloud/common/tests/integration/targets/turbo_mode/tasks/main.yaml create mode 100644 ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/inventory create mode 100644 ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/playbook.yaml create mode 100755 ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/runme.sh create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.10.txt create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.11.txt create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.12.txt create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.13.txt create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.14.txt create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.15.txt create mode 100644 ansible_collections/cloud/common/tests/sanity/ignore-2.9.txt create mode 100644 ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/conftest.py create mode 100644 ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_module.py create mode 100644 ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_turbo_module.py create mode 100644 ansible_collections/cloud/common/tests/unit/requirements.txt (limited to 'ansible_collections/cloud/common/tests') diff --git a/ansible_collections/cloud/common/tests/config.yml b/ansible_collections/cloud/common/tests/config.yml new file mode 100644 index 000000000..faff92e33 --- /dev/null +++ b/ansible_collections/cloud/common/tests/config.yml @@ -0,0 +1,2 @@ +modules: + python_requires: '>=3.6' diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_fail/tasks/main.yaml b/ansible_collections/cloud/common/tests/integration/targets/turbo_fail/tasks/main.yaml new file mode 100644 index 000000000..069ba4490 --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_fail/tasks/main.yaml @@ -0,0 +1,24 @@ +- name: fail with no additionnal args + cloud.common.turbo_fail: + register: result + failed_when: not result.failed + +- assert: + that: + - result | list | difference(["failed_when_result"]) | sort == ["changed", "failed", "msg"] + +- name: fail with additionnal args + cloud.common.turbo_fail: + params: + test: + phase: integration + release: 1.0 + environment: production + register: result + failed_when: not result.failed + +- assert: + that: + - result.environment == "production" + - result.test.phase == "integration" + - result.test.release == 1.0 diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/playbook.yaml b/ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/playbook.yaml new file mode 100644 index 000000000..fc75a8e53 --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/playbook.yaml @@ -0,0 +1,81 @@ +- hosts: localhost + gather_facts: false + + environment: + ANSIBLE_TURBO_LOOKUP_TTL: 1 + ANOTHER_ANSIBLE_VARS: 10 + + tasks: + - name: variables definition + set_fact: + var00: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + var01: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + + - pause: + seconds: 2 + + - name: variables definition + set_fact: + var10: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + var11: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + environment: + ANSIBLE_TURBO_LOOKUP_TTL: 4 + + - pause: + seconds: 2 + + - name: variables definition + set_fact: + var20: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + var21: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + + - name: validate output + assert: + that: + - '"turbo_demo_counter: 1" in var00' + - '"turbo_demo_counter: 2" in var01' + - '"turbo_demo_counter: 1" in var10' + - '"turbo_demo_counter: 2" in var11' + - '"turbo_demo_counter: 3" in var20' + - '"turbo_demo_counter: 4" in var21' + + - name: Wait for the socket to be closed + pause: + seconds: 5 + + +- hosts: localhost + gather_facts: false + + vars: + turbo_play_var: "simple ansible playbook variable" + + tasks: + - name: set variables using lookup plugin + set_fact: + var0: "{{ lookup('cloud.common.turbo_demo', terms, playbook_vars=['turbo_play_var', 'turbo_task_var'], wantlist=True) }}" + var1: "{{ lookup('cloud.common.turbo_demo', terms, playbook_vars=['turbo_task_var'], wantlist=True) }}" + var2: "{{ lookup('cloud.common.turbo_demo', terms, playbook_vars=['turbo_play_var'], wantlist=True) }}" + vars: + terms: ["2.9", "2.10"] + turbo_task_var: "simple ansible task variable" + + - name: test lookup plugin using a module + debug: + msg: "{{ lookup('cloud.common.turbo_demo', wantlist=True) }}" + register: output + + - name: validate other settings + assert: + that: + - '"turbo_demo_counter: 1" in var0' + - '"turbo_demo_counter: 2" in var1' + - '"turbo_demo_counter: 3" in var2' + - '"turbo_demo_counter: 4" in output.msg' + - '"simple ansible task variable" in var0' + - '"simple ansible task variable" in var1' + - 'turbo_play_var in var0' + - 'turbo_play_var in var2' + - '["2.9", "2.10"] in var0' + - '["2.9", "2.10"] in var1' + - '["2.9", "2.10"] in var2' diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/runme.sh b/ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/runme.sh new file mode 100755 index 000000000..5e27470e6 --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/runme.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +set -eux +exec ansible-playbook playbook.yaml -vvv diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/playbook.yaml b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/playbook.yaml new file mode 100644 index 000000000..f5202379c --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/playbook.yaml @@ -0,0 +1,5 @@ +- hosts: localhost + gather_facts: false + tasks: + - import_role: + name: turbo_mode diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/runme.sh b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/runme.sh new file mode 100755 index 000000000..4c43575df --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/runme.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -eux +export ANSIBLE_ROLES_PATH=.. +exec ansible-playbook playbook.yaml diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/tasks/main.yaml b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/tasks/main.yaml new file mode 100644 index 000000000..21b6b8c52 --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode/tasks/main.yaml @@ -0,0 +1,77 @@ +- cloud.common.turbo_import: + +- cloud.common.turbo_demo: + with_sequence: count=10 + register: _result +- debug: var=_result.results[-1] +- assert: + that: + - _result.results[-1].counter == 10 +- cloud.common.turbo_demo: + with_sequence: count=10 + check_mode: True + register: _result +- assert: + that: + - _result.results[-1].counter == 10 +- cloud.common.turbo_demo: + with_sequence: count=10 + become: true + register: _result +- assert: + that: + - _result.results[-1].counter == 10 +- cloud.common.turbo_demo: + diff: true + register: _result_with_diff +- assert: + that: + - _result_with_diff.diff is defined +- cloud.common.turbo_demo: + diff: false + register: _result_no_diff +- assert: + that: + - _result_no_diff.diff is undefined + +- name: Test task environment var + cloud.common.turbo_demo: + environment: + TURBO_TEST_VAR: foobar + register: _result + +- assert: + that: + - _result.envvar == "foobar" + +- name: Test task environment var not set + cloud.common.turbo_demo: + register: _result + +- assert: + that: + - not _result.envvar + + +- name: Create temporary dir + ansible.builtin.tempfile: + state: directory + suffix: temp + register: tempdir_1 + +- name: Test with a different remote_tmp, there is no socket yet. + cloud.common.turbo_demo: + vars: + ansible_remote_tmp: "{{ tempdir_1.path }}" + register: _result +- assert: + that: + - _result.counter == 1 + +- name: test using default remote_tmp. socket previously created + cloud.common.turbo_demo: + register: _result + +- assert: + that: + - _result.counter > 1 diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/inventory b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/inventory new file mode 100644 index 000000000..45c6d9bb7 --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/inventory @@ -0,0 +1,50 @@ +host1 ansible_connection=local +host2 ansible_connection=local +host3 ansible_connection=local +host4 ansible_connection=local +host5 ansible_connection=local +host6 ansible_connection=local +host7 ansible_connection=local +host8 ansible_connection=local +host9 ansible_connection=local +host10 ansible_connection=local +host11 ansible_connection=local +host12 ansible_connection=local +host13 ansible_connection=local +host14 ansible_connection=local +host15 ansible_connection=local +host16 ansible_connection=local +host17 ansible_connection=local +host18 ansible_connection=local +host19 ansible_connection=local +host20 ansible_connection=local +host21 ansible_connection=local +host22 ansible_connection=local +host23 ansible_connection=local +host24 ansible_connection=local +host25 ansible_connection=local +host26 ansible_connection=local +host27 ansible_connection=local +host28 ansible_connection=local +host29 ansible_connection=local +host30 ansible_connection=local +host31 ansible_connection=local +host32 ansible_connection=local +host33 ansible_connection=local +host34 ansible_connection=local +host35 ansible_connection=local +host36 ansible_connection=local +host37 ansible_connection=local +host38 ansible_connection=local +host39 ansible_connection=local +host40 ansible_connection=local +host41 ansible_connection=local +host42 ansible_connection=local +host43 ansible_connection=local +host44 ansible_connection=local +host45 ansible_connection=local +host46 ansible_connection=local +host47 ansible_connection=local +host48 ansible_connection=local +host49 ansible_connection=local +host50 ansible_connection=local diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/playbook.yaml b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/playbook.yaml new file mode 100644 index 000000000..4be9cf37a --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/playbook.yaml @@ -0,0 +1,33 @@ +- hosts: localhost + gather_facts: false + tasks: + - cloud.common.turbo_demo: + - pause: + seconds: 5 + +- hosts: all + strategy: free + gather_facts: false + tasks: + - cloud.common.turbo_demo: + with_sequence: count=10 + - cloud.common.turbo_demo: + with_sequence: count=10 + +- hosts: localhost + gather_facts: false + tasks: + - cloud.common.turbo_demo: + register: _result + - debug: var=_result + - assert: + that: + - _result.counter == 1002 + - pause: + seconds: 35 + - cloud.common.turbo_demo: + register: _result + - debug: var=_result + - assert: + that: + - _result.counter == 1 diff --git a/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/runme.sh b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/runme.sh new file mode 100755 index 000000000..83a40fcf0 --- /dev/null +++ b/ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/runme.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -eux +export ANSIBLE_ROLES_PATH=.. +exec ansible-playbook -i inventory playbook.yaml diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.10.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.10.txt new file mode 100644 index 000000000..4ffa55ad8 --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.10.txt @@ -0,0 +1,76 @@ +plugins/module_utils/turbo/exceptions.py compile-2.6!skip +plugins/module_utils/turbo/exceptions.py compile-2.7!skip +plugins/module_utils/turbo/exceptions.py compile-3.5!skip +plugins/module_utils/turbo/exceptions.py future-import-boilerplate!skip +plugins/module_utils/turbo/exceptions.py metaclass-boilerplate!skip +plugins/module_utils/turbo/module.py compile-2.6!skip +plugins/module_utils/turbo/module.py compile-2.7!skip +plugins/module_utils/turbo/module.py compile-3.5!skip +plugins/module_utils/turbo/module.py future-import-boilerplate!skip +plugins/module_utils/turbo/module.py import-2.6!skip +plugins/module_utils/turbo/module.py import-2.7!skip +plugins/module_utils/turbo/module.py import-3.5!skip +plugins/module_utils/turbo/module.py metaclass-boilerplate!skip +plugins/module_utils/turbo/server.py compile-2.6!skip +plugins/module_utils/turbo/server.py compile-2.7!skip +plugins/module_utils/turbo/server.py compile-3.5!skip +plugins/module_utils/turbo/server.py future-import-boilerplate!skip +plugins/module_utils/turbo/server.py import-2.6!skip +plugins/module_utils/turbo/server.py import-2.7!skip +plugins/module_utils/turbo/server.py import-3.5!skip +plugins/module_utils/turbo/server.py metaclass-boilerplate!skip +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import +plugins/modules/turbo_demo.py compile-2.6!skip +plugins/modules/turbo_demo.py compile-2.7!skip +plugins/modules/turbo_demo.py compile-3.5!skip +plugins/modules/turbo_demo.py future-import-boilerplate!skip +plugins/modules/turbo_demo.py import-2.6!skip +plugins/modules/turbo_demo.py import-2.7!skip +plugins/modules/turbo_demo.py import-3.5!skip +plugins/modules/turbo_demo.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-2.6!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-2.7!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-3.5!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py metaclass-boilerplate!skip +plugins/modules/turbo_fail.py compile-2.6!skip +plugins/modules/turbo_fail.py compile-2.7!skip +plugins/modules/turbo_fail.py compile-3.5!skip +plugins/modules/turbo_fail.py future-import-boilerplate!skip +plugins/modules/turbo_fail.py import-2.6!skip +plugins/modules/turbo_fail.py import-2.7!skip +plugins/modules/turbo_fail.py import-3.5!skip +plugins/modules/turbo_fail.py metaclass-boilerplate!skip +plugins/plugin_utils/turbo/lookup.py compile-2.6!skip +plugins/plugin_utils/turbo/lookup.py compile-2.7!skip +plugins/plugin_utils/turbo/lookup.py compile-3.5!skip +plugins/plugin_utils/turbo/lookup.py compile-3.6!skip +plugins/plugin_utils/turbo/lookup.py compile-3.7!skip +plugins/plugin_utils/turbo/lookup.py compile-3.8!skip +plugins/plugin_utils/turbo/lookup.py future-import-boilerplate!skip +plugins/plugin_utils/turbo/lookup.py metaclass-boilerplate!skip +plugins/lookup/turbo_demo.py compile-2.6!skip +plugins/lookup/turbo_demo.py compile-2.7!skip +plugins/lookup/turbo_demo.py compile-3.5!skip +plugins/lookup/turbo_demo.py future-import-boilerplate!skip +plugins/lookup/turbo_demo.py metaclass-boilerplate!skip +plugins/module_utils/turbo/common.py compile-2.6!skip +plugins/module_utils/turbo/common.py compile-2.7!skip +plugins/module_utils/turbo/common.py compile-3.5!skip +plugins/module_utils/turbo/common.py future-import-boilerplate!skip +plugins/module_utils/turbo/common.py import-2.6!skip +plugins/module_utils/turbo/common.py import-2.7!skip +plugins/module_utils/turbo/common.py import-3.5!skip +plugins/module_utils/turbo/common.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/conftest.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/conftest.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_module.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_module.py metaclass-boilerplate!skip +plugins/modules/turbo_import.py compile-2.6!skip +plugins/modules/turbo_import.py compile-2.7!skip +plugins/modules/turbo_import.py compile-3.5!skip +plugins/modules/turbo_import.py future-import-boilerplate!skip +plugins/modules/turbo_import.py import-2.6!skip +plugins/modules/turbo_import.py import-2.7!skip +plugins/modules/turbo_import.py import-3.5!skip +plugins/modules/turbo_import.py metaclass-boilerplate!skip diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.11.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.11.txt new file mode 100644 index 000000000..72bd4688a --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.11.txt @@ -0,0 +1,84 @@ +plugins/module_utils/turbo/exceptions.py compile-2.6!skip +plugins/module_utils/turbo/exceptions.py compile-2.7!skip +plugins/module_utils/turbo/exceptions.py compile-3.5!skip +plugins/module_utils/turbo/exceptions.py future-import-boilerplate!skip +plugins/module_utils/turbo/exceptions.py metaclass-boilerplate!skip +plugins/module_utils/turbo/module.py compile-2.6!skip +plugins/module_utils/turbo/module.py compile-2.7!skip +plugins/module_utils/turbo/module.py compile-3.5!skip +plugins/module_utils/turbo/module.py future-import-boilerplate!skip +plugins/module_utils/turbo/module.py import-2.6!skip +plugins/module_utils/turbo/module.py import-2.7!skip +plugins/module_utils/turbo/module.py import-3.5!skip +plugins/module_utils/turbo/module.py metaclass-boilerplate!skip +plugins/module_utils/turbo/server.py compile-2.6!skip +plugins/module_utils/turbo/server.py compile-2.7!skip +plugins/module_utils/turbo/server.py compile-3.5!skip +plugins/module_utils/turbo/server.py future-import-boilerplate!skip +plugins/module_utils/turbo/server.py import-2.6!skip +plugins/module_utils/turbo/server.py import-2.7!skip +plugins/module_utils/turbo/server.py import-3.5!skip +plugins/module_utils/turbo/server.py metaclass-boilerplate!skip +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import +plugins/modules/turbo_demo.py compile-2.6!skip +plugins/modules/turbo_demo.py compile-2.7!skip +plugins/modules/turbo_demo.py compile-3.5!skip +plugins/modules/turbo_demo.py future-import-boilerplate!skip +plugins/modules/turbo_demo.py import-2.6!skip +plugins/modules/turbo_demo.py import-2.7!skip +plugins/modules/turbo_demo.py import-3.5!skip +plugins/modules/turbo_demo.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-2.6!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-2.7!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-3.5!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py metaclass-boilerplate!skip +plugins/modules/turbo_fail.py compile-2.6!skip +plugins/modules/turbo_fail.py compile-2.7!skip +plugins/modules/turbo_fail.py compile-3.5!skip +plugins/modules/turbo_fail.py future-import-boilerplate!skip +plugins/modules/turbo_fail.py import-2.6!skip +plugins/modules/turbo_fail.py import-2.7!skip +plugins/modules/turbo_fail.py import-3.5!skip +plugins/modules/turbo_fail.py metaclass-boilerplate!skip +plugins/plugin_utils/turbo/lookup.py compile-2.6!skip +plugins/plugin_utils/turbo/lookup.py compile-2.7!skip +plugins/plugin_utils/turbo/lookup.py compile-3.5!skip +plugins/plugin_utils/turbo/lookup.py compile-3.6!skip +plugins/plugin_utils/turbo/lookup.py compile-3.7!skip +plugins/plugin_utils/turbo/lookup.py compile-3.8!skip +plugins/plugin_utils/turbo/lookup.py future-import-boilerplate!skip +plugins/plugin_utils/turbo/lookup.py import-2.6!skip +plugins/plugin_utils/turbo/lookup.py import-2.7!skip +plugins/plugin_utils/turbo/lookup.py import-3.5!skip +plugins/plugin_utils/turbo/lookup.py import-3.6!skip +plugins/plugin_utils/turbo/lookup.py import-3.7!skip +plugins/plugin_utils/turbo/lookup.py import-3.8!skip +plugins/plugin_utils/turbo/lookup.py import-3.9!skip +plugins/plugin_utils/turbo/lookup.py metaclass-boilerplate!skip +plugins/lookup/turbo_demo.py compile-2.6!skip +plugins/lookup/turbo_demo.py compile-2.7!skip +plugins/lookup/turbo_demo.py compile-3.5!skip +plugins/lookup/turbo_demo.py import-2.7!skip +plugins/lookup/turbo_demo.py future-import-boilerplate!skip +plugins/lookup/turbo_demo.py metaclass-boilerplate!skip +plugins/module_utils/turbo/common.py compile-2.6!skip +plugins/module_utils/turbo/common.py compile-2.7!skip +plugins/module_utils/turbo/common.py compile-3.5!skip +plugins/module_utils/turbo/common.py future-import-boilerplate!skip +plugins/module_utils/turbo/common.py import-2.6!skip +plugins/module_utils/turbo/common.py import-2.7!skip +plugins/module_utils/turbo/common.py import-3.5!skip +plugins/module_utils/turbo/common.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/conftest.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/conftest.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_module.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_module.py metaclass-boilerplate!skip +plugins/modules/turbo_import.py compile-2.6!skip +plugins/modules/turbo_import.py compile-2.7!skip +plugins/modules/turbo_import.py compile-3.5!skip +plugins/modules/turbo_import.py future-import-boilerplate!skip +plugins/modules/turbo_import.py import-2.6!skip +plugins/modules/turbo_import.py import-2.7!skip +plugins/modules/turbo_import.py import-3.5!skip +plugins/modules/turbo_import.py metaclass-boilerplate!skip diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.12.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.12.txt new file mode 100644 index 000000000..e7b94a256 --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.12.txt @@ -0,0 +1 @@ +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.13.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.13.txt new file mode 100644 index 000000000..e7b94a256 --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.13.txt @@ -0,0 +1 @@ +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.14.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.14.txt new file mode 100644 index 000000000..e7b94a256 --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.14.txt @@ -0,0 +1 @@ +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.15.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.15.txt new file mode 100644 index 000000000..e7b94a256 --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.15.txt @@ -0,0 +1 @@ +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import diff --git a/ansible_collections/cloud/common/tests/sanity/ignore-2.9.txt b/ansible_collections/cloud/common/tests/sanity/ignore-2.9.txt new file mode 100644 index 000000000..4ffa55ad8 --- /dev/null +++ b/ansible_collections/cloud/common/tests/sanity/ignore-2.9.txt @@ -0,0 +1,76 @@ +plugins/module_utils/turbo/exceptions.py compile-2.6!skip +plugins/module_utils/turbo/exceptions.py compile-2.7!skip +plugins/module_utils/turbo/exceptions.py compile-3.5!skip +plugins/module_utils/turbo/exceptions.py future-import-boilerplate!skip +plugins/module_utils/turbo/exceptions.py metaclass-boilerplate!skip +plugins/module_utils/turbo/module.py compile-2.6!skip +plugins/module_utils/turbo/module.py compile-2.7!skip +plugins/module_utils/turbo/module.py compile-3.5!skip +plugins/module_utils/turbo/module.py future-import-boilerplate!skip +plugins/module_utils/turbo/module.py import-2.6!skip +plugins/module_utils/turbo/module.py import-2.7!skip +plugins/module_utils/turbo/module.py import-3.5!skip +plugins/module_utils/turbo/module.py metaclass-boilerplate!skip +plugins/module_utils/turbo/server.py compile-2.6!skip +plugins/module_utils/turbo/server.py compile-2.7!skip +plugins/module_utils/turbo/server.py compile-3.5!skip +plugins/module_utils/turbo/server.py future-import-boilerplate!skip +plugins/module_utils/turbo/server.py import-2.6!skip +plugins/module_utils/turbo/server.py import-2.7!skip +plugins/module_utils/turbo/server.py import-3.5!skip +plugins/module_utils/turbo/server.py metaclass-boilerplate!skip +plugins/module_utils/turbo/server.py pylint:ansible-bad-module-import +plugins/modules/turbo_demo.py compile-2.6!skip +plugins/modules/turbo_demo.py compile-2.7!skip +plugins/modules/turbo_demo.py compile-3.5!skip +plugins/modules/turbo_demo.py future-import-boilerplate!skip +plugins/modules/turbo_demo.py import-2.6!skip +plugins/modules/turbo_demo.py import-2.7!skip +plugins/modules/turbo_demo.py import-3.5!skip +plugins/modules/turbo_demo.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-2.6!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-2.7!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py compile-3.5!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_turbo_module.py metaclass-boilerplate!skip +plugins/modules/turbo_fail.py compile-2.6!skip +plugins/modules/turbo_fail.py compile-2.7!skip +plugins/modules/turbo_fail.py compile-3.5!skip +plugins/modules/turbo_fail.py future-import-boilerplate!skip +plugins/modules/turbo_fail.py import-2.6!skip +plugins/modules/turbo_fail.py import-2.7!skip +plugins/modules/turbo_fail.py import-3.5!skip +plugins/modules/turbo_fail.py metaclass-boilerplate!skip +plugins/plugin_utils/turbo/lookup.py compile-2.6!skip +plugins/plugin_utils/turbo/lookup.py compile-2.7!skip +plugins/plugin_utils/turbo/lookup.py compile-3.5!skip +plugins/plugin_utils/turbo/lookup.py compile-3.6!skip +plugins/plugin_utils/turbo/lookup.py compile-3.7!skip +plugins/plugin_utils/turbo/lookup.py compile-3.8!skip +plugins/plugin_utils/turbo/lookup.py future-import-boilerplate!skip +plugins/plugin_utils/turbo/lookup.py metaclass-boilerplate!skip +plugins/lookup/turbo_demo.py compile-2.6!skip +plugins/lookup/turbo_demo.py compile-2.7!skip +plugins/lookup/turbo_demo.py compile-3.5!skip +plugins/lookup/turbo_demo.py future-import-boilerplate!skip +plugins/lookup/turbo_demo.py metaclass-boilerplate!skip +plugins/module_utils/turbo/common.py compile-2.6!skip +plugins/module_utils/turbo/common.py compile-2.7!skip +plugins/module_utils/turbo/common.py compile-3.5!skip +plugins/module_utils/turbo/common.py future-import-boilerplate!skip +plugins/module_utils/turbo/common.py import-2.6!skip +plugins/module_utils/turbo/common.py import-2.7!skip +plugins/module_utils/turbo/common.py import-3.5!skip +plugins/module_utils/turbo/common.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/conftest.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/conftest.py metaclass-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_module.py future-import-boilerplate!skip +tests/unit/plugins/module_utils/turbo/test_module.py metaclass-boilerplate!skip +plugins/modules/turbo_import.py compile-2.6!skip +plugins/modules/turbo_import.py compile-2.7!skip +plugins/modules/turbo_import.py compile-3.5!skip +plugins/modules/turbo_import.py future-import-boilerplate!skip +plugins/modules/turbo_import.py import-2.6!skip +plugins/modules/turbo_import.py import-2.7!skip +plugins/modules/turbo_import.py import-3.5!skip +plugins/modules/turbo_import.py metaclass-boilerplate!skip diff --git a/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/conftest.py b/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/conftest.py new file mode 100644 index 000000000..8f8f44e78 --- /dev/null +++ b/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/conftest.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 XLAB Steampunk +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +import json + +import pytest + +from ansible.module_utils import basic +from ansible.module_utils.common.text.converters import to_bytes + + +@pytest.fixture +def set_module_args(monkeypatch): + def wrapper(args=None): + module_args = dict(ANSIBLE_MODULE_ARGS=args or {}) + monkeypatch.setattr(basic, "_ANSIBLE_ARGS", to_bytes(json.dumps(module_args))) + + return wrapper diff --git a/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_module.py b/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_module.py new file mode 100644 index 000000000..61a02e145 --- /dev/null +++ b/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_module.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +# Copyright 2021 XLAB Steampunk +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +import sys + +import pytest + +from ansible_collections.cloud.common.plugins.module_utils.turbo.module import ( + AnsibleTurboModule, +) + + +def _patch_globals(monkeypatch): + # Patch sys.argv so that module does not try to spin up the server on + # initialization. The purpose is to make sure AnsibleTurboModule.embedded_in_server + # is set to True. + monkeypatch.setattr(sys, "argv", ["something/that/ends/on/server.py"]) + + # Collection name detection will fail in unit tests, so we patch it here directly + # and bypass the detection process. + monkeypatch.setattr(AnsibleTurboModule, "collection_name", "namespace.name") + + +def test_module_socket_path_remote_tmp_not_set(monkeypatch, set_module_args): + _patch_globals(monkeypatch) + set_module_args() + module = AnsibleTurboModule(argument_spec={}) + + path = module.socket_path() + + # We cannot know what tmp dir python uses, but we do know that it is a full path + # that ends with deterministc suffix. + assert path.startswith("/") + assert path.endswith("/turbo_mode.namespace.name.socket") + + +@pytest.mark.parametrize("tmp_path", ["/tmp", "/tmp/"]) +def test_module_socket_path_from_remote_tmp(monkeypatch, set_module_args, tmp_path): + _patch_globals(monkeypatch) + set_module_args(dict(_ansible_remote_tmp=tmp_path)) + module = AnsibleTurboModule(argument_spec={}) + + assert module.socket_path() == "/tmp/turbo_mode.namespace.name.socket" + + +@pytest.mark.parametrize( + "tmp_path", ["/t/$MY_VAR", "/t/${MY_VAR}", "/t/$MY_VAR/", "/t/${MY_VAR}/"] +) +def test_module_socket_path_env_vars_in_remote_tmp( + monkeypatch, set_module_args, tmp_path +): + _patch_globals(monkeypatch) + set_module_args(dict(_ansible_remote_tmp=tmp_path)) + monkeypatch.setenv("MY_VAR", "my_var_value") + module = AnsibleTurboModule(argument_spec={}) + + assert module.socket_path() == "/t/my_var_value/turbo_mode.namespace.name.socket" diff --git a/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_turbo_module.py b/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_turbo_module.py new file mode 100644 index 000000000..00756a0d3 --- /dev/null +++ b/ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_turbo_module.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +# Copyright 2020 Red Hat +# GNU General Public License v3.0+ +# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# py38 only, See: https://github.com/PyCQA/pylint/issues/2976 +from posixpath import dirname +from unittest.mock import Mock, ANY # pylint: disable=syntax-error +import time +import pytest +import socket +import subprocess +import os +import ansible.module_utils.basic +from ansible_collections.cloud.common.plugins.module_utils.turbo.module import ( + get_collection_name_from_path, + expand_argument_specs_aliases, + prepare_args, +) +import ansible_collections.cloud.common.plugins.module_utils.turbo.common as turbo_common + + +@pytest.mark.parametrize( + "my_module_path,my_collection_name", + [ + ( + "/tmp/ansible_vmware.vmware_rest.vcenter_vm_info_payload_548h2lev/ansible_vmware.vmware_rest.vcenter_vm_info_payload.zip/ansible/module_utils", + "vmware.vmware_rest", + ) + ], +) +def test_collection_name(monkeypatch, my_module_path, my_collection_name): + def mocked_func(): + return my_module_path + + monkeypatch.setattr(ansible.module_utils.basic, "get_module_path", mocked_func) + assert get_collection_name_from_path() == my_collection_name + + +def test_start_daemon_from_module(monkeypatch): + mocked_Popen = Mock() + monkeypatch.setattr(subprocess, "Popen", mocked_Popen) + turbo_socket = turbo_common.AnsibleTurboSocket(socket_path="/aa") + assert turbo_socket.start_server() + mocked_Popen.assert_called_once_with( + [ + ANY, + "-m", + "ansible_collections.cloud.common.plugins.module_utils.turbo.server", + "--fork", + "--socket-path", + "/aa", + ], + env=ANY, + close_fds=True, + ) + + +def test_start_daemon_from_lookup(monkeypatch): + mocked_Popen = Mock() + monkeypatch.setattr(subprocess, "Popen", mocked_Popen) + turbo_socket = turbo_common.AnsibleTurboSocket( + socket_path="/aa", plugin="lookup", ttl=150 + ) + assert turbo_socket.start_server() + mocked_Popen.assert_called_once_with( + [ + ANY, + os.path.join(os.path.dirname(turbo_common.__file__), "server.py"), + "--fork", + "--socket-path", + "/aa", + "--ttl", + "150", + ], + env=ANY, + close_fds=True, + ) + + +def test_start_daemon_with_no_mock(tmp_path): + my_socket = tmp_path / "socket" + turbo_socket = turbo_common.AnsibleTurboSocket(socket_path=str(my_socket), ttl=1) + assert turbo_socket.start_server() + time.sleep(0.5) + assert my_socket.is_socket() + time.sleep(0.8) + assert not my_socket.exists() + + +def test_connect(monkeypatch): + mocked_socket = Mock() + monkeypatch.setattr(socket, "socket", mocked_socket) + turbo_socket = turbo_common.AnsibleTurboSocket(socket_path="/nowhere") + assert turbo_socket.bind() + mocked_socket.connect_assert_called_once_with("/nowhere") + + +def test_expand_argument_specs_aliases(): + argspec = {"foo": {"type": int, "aliases": ["bar"]}} + assert expand_argument_specs_aliases(argspec) == { + "foo": {"type": int, "aliases": ["bar"]}, + "bar": {"type": int, "aliases": ["bar"]}, + } + + +def test_prepare_args(): + argspec = {"foo": {"type": int}} + params = {"foo": 1} + assert prepare_args(argspec, params) == {"ANSIBLE_MODULE_ARGS": {"foo": 1}} + + +def test_prepare_args_ignore_none(): + argspec = {"foo": {"type": int}} + params = {"foo": None} + assert prepare_args(argspec, params) == {"ANSIBLE_MODULE_ARGS": {}} + + +def test_prepare_args_subkey_freeform(): + argspec = {"foo": {"type": dict, "default": {}}} + params = {"foo": {"bar": 1}} + assert prepare_args(argspec, params) == {"ANSIBLE_MODULE_ARGS": {"foo": {"bar": 1}}} + + +def test_prepare_args_subkey_with_default(): + argspec = {"foo": {"bar": {"default": 1}}} + params = {"foo": {"bar": 1}} + assert prepare_args(argspec, params) == {"ANSIBLE_MODULE_ARGS": {"foo": {}}} + + +def test_prepare_args_dedup_aliases(): + argspec = {"foo": {"aliases": ["bar"], "type": int}} + params = {"foo": 1, "bar": 1} + assert prepare_args(argspec, params) == {"ANSIBLE_MODULE_ARGS": {"foo": 1}} + + +def test_prepare_args_with_aliases(): + argspec = {"foo": {"aliases": ["bar"], "type": int}} + params = {"foo": 1} + assert prepare_args(argspec, params) == {"ANSIBLE_MODULE_ARGS": {"foo": 1}} diff --git a/ansible_collections/cloud/common/tests/unit/requirements.txt b/ansible_collections/cloud/common/tests/unit/requirements.txt new file mode 100644 index 000000000..2975a6e97 --- /dev/null +++ b/ansible_collections/cloud/common/tests/unit/requirements.txt @@ -0,0 +1,4 @@ +pytest +pytest-xdist +pytest-mock +mock -- cgit v1.2.3