summaryrefslogtreecommitdiffstats
path: root/ansible_collections/cloud/common/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:04:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:04:41 +0000
commit975f66f2eebe9dadba04f275774d4ab83f74cf25 (patch)
tree89bd26a93aaae6a25749145b7e4bca4a1e75b2be /ansible_collections/cloud/common/tests
parentInitial commit. (diff)
downloadansible-975f66f2eebe9dadba04f275774d4ab83f74cf25.tar.xz
ansible-975f66f2eebe9dadba04f275774d4ab83f74cf25.zip
Adding upstream version 7.7.0+dfsg.upstream/7.7.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ansible_collections/cloud/common/tests')
-rw-r--r--ansible_collections/cloud/common/tests/config.yml2
-rw-r--r--ansible_collections/cloud/common/tests/integration/targets/turbo_fail/tasks/main.yaml24
-rw-r--r--ansible_collections/cloud/common/tests/integration/targets/turbo_lookup/playbook.yaml81
-rwxr-xr-xansible_collections/cloud/common/tests/integration/targets/turbo_lookup/runme.sh3
-rw-r--r--ansible_collections/cloud/common/tests/integration/targets/turbo_mode/playbook.yaml5
-rwxr-xr-xansible_collections/cloud/common/tests/integration/targets/turbo_mode/runme.sh4
-rw-r--r--ansible_collections/cloud/common/tests/integration/targets/turbo_mode/tasks/main.yaml77
-rw-r--r--ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/inventory50
-rw-r--r--ansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/playbook.yaml33
-rwxr-xr-xansible_collections/cloud/common/tests/integration/targets/turbo_mode_parallel_exec/runme.sh4
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.10.txt76
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.11.txt84
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.12.txt1
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.13.txt1
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.14.txt1
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.15.txt1
-rw-r--r--ansible_collections/cloud/common/tests/sanity/ignore-2.9.txt76
-rw-r--r--ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/conftest.py20
-rw-r--r--ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_module.py59
-rw-r--r--ansible_collections/cloud/common/tests/unit/plugins/module_utils/turbo/test_turbo_module.py140
-rw-r--r--ansible_collections/cloud/common/tests/unit/requirements.txt4
21 files changed, 746 insertions, 0 deletions
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