c616e54a6e
* refactor Python module_utils locator * no longer recursive * embed special-case module code internally * share common code between collections/not cases * fixes #70134 * properly support subpackage redirection * adds support for FQCN redirect targets used by migration (expands to FQ Python name) * add tests * add changelog
111 lines
3.6 KiB
YAML
111 lines
3.6 KiB
YAML
- hosts: testhost
|
|
gather_facts: no
|
|
tasks:
|
|
- name: Use a specially crafted module to see if things were imported correctly
|
|
test:
|
|
register: result
|
|
|
|
- name: Check that the module imported the correct version of each module_util
|
|
assert:
|
|
that:
|
|
- 'result["abcdefgh"] == "abcdefgh"'
|
|
- 'result["bar0"] == "bar0"'
|
|
- 'result["bar1"] == "bar1"'
|
|
- 'result["bar2"] == "bar2"'
|
|
- 'result["baz1"] == "baz1"'
|
|
- 'result["baz2"] == "baz2"'
|
|
- 'result["foo0"] == "foo0"'
|
|
- 'result["foo1"] == "foo1"'
|
|
- 'result["foo2"] == "foo2"'
|
|
- 'result["qux1"] == "qux1"'
|
|
- 'result["qux2"] == ["qux2:quux", "qux2:quuz"]'
|
|
- 'result["spam1"] == "spam1"'
|
|
- 'result["spam2"] == "spam2"'
|
|
- 'result["spam3"] == "spam3"'
|
|
- 'result["spam4"] == "spam4"'
|
|
- 'result["spam5"] == ["spam5:bacon", "spam5:eggs"]'
|
|
- 'result["spam6"] == ["spam6:bacon", "spam6:eggs"]'
|
|
- 'result["spam7"] == ["spam7:bacon", "spam7:eggs"]'
|
|
- 'result["spam8"] == ["spam8:bacon", "spam8:eggs"]'
|
|
|
|
# Test that overriding something in module_utils with something in the local library works
|
|
- name: Test that local module_utils overrides facts.py
|
|
test_override:
|
|
register: result
|
|
|
|
- name: Make sure the we used the local facts.py, not the one shipped with ansible
|
|
assert:
|
|
that:
|
|
- result["data"] == "overridden facts.py"
|
|
|
|
- name: Test that importing a module that only exists inside of a submodule does not work
|
|
test_failure:
|
|
ignore_errors: True
|
|
register: result
|
|
|
|
- debug: var=result
|
|
- name: Make sure we failed in AnsiBallZ
|
|
assert:
|
|
that:
|
|
- result is failed
|
|
- result['msg'] == "Could not find imported module support code for ansible.modules.test_failure. Looked for (['ansible.module_utils.zebra.foo', 'ansible.module_utils.zebra'])"
|
|
|
|
- name: Test that alias deprecation works
|
|
test_alias_deprecation:
|
|
baz: 'bar'
|
|
register: result
|
|
|
|
- name: Assert that the deprecation message is given correctly
|
|
assert:
|
|
that:
|
|
- result.deprecations[0].msg == "Alias 'baz' is deprecated. See the module docs for more information"
|
|
- result.deprecations[0].version == '9.99'
|
|
|
|
- block:
|
|
- name: Get a string with a \0 in it
|
|
command: echo -e 'hi\0foo'
|
|
register: string_with_null
|
|
|
|
- name: Use the null string as a module parameter
|
|
lineinfile:
|
|
path: "{{ output_dir }}/nulltest"
|
|
line: "{{ string_with_null.stdout }}"
|
|
create: yes
|
|
ignore_errors: yes
|
|
register: nulltest
|
|
|
|
- name: See if the file exists
|
|
stat:
|
|
path: "{{ output_dir }}/nulltest"
|
|
register: nullstat
|
|
|
|
- assert:
|
|
that:
|
|
- nulltest is failed
|
|
- nulltest.msg_to_log.startswith('Invoked ')
|
|
- nulltest.msg.startswith('Failed to log to syslog')
|
|
# Conditionalize this, because when we log with something other than
|
|
# syslog, it's probably successful and these assertions will fail.
|
|
when: nulltest is failed
|
|
|
|
# Ensure we fail out early and don't actually run the module if logging
|
|
# failed.
|
|
- assert:
|
|
that:
|
|
- nullstat.stat.exists == nulltest is successful
|
|
always:
|
|
- file:
|
|
path: "{{ output_dir }}/nulltest"
|
|
state: absent
|
|
|
|
- name: Test that date and datetime in module output works
|
|
test_datetime:
|
|
date: "2020-10-05"
|
|
datetime: "2020-10-05T10:05:05"
|
|
register: datetimetest
|
|
|
|
- name:
|
|
assert:
|
|
that:
|
|
- datetimetest.date == '2020-10-05'
|
|
- datetimetest.datetime == '2020-10-05T10:05:05'
|