summaryrefslogtreecommitdiffstats
path: root/test/integration/targets/module_utils/library/test_optional.py
blob: 4d0225d96ff34e3b4538b48856bf0bd9ca710037 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/python
# Most of these names are only available via PluginLoader so pylint doesn't
# know they exist
# pylint: disable=no-name-in-module
from __future__ import absolute_import, division, print_function
__metaclass__ = type

from ansible.module_utils.basic import AnsibleModule

# internal constants to keep pylint from griping about constant-valued conditionals
_private_false = False
_private_true = True

# module_utils import statements nested below any block are considered optional "best-effort" for AnsiballZ to include.
# test a number of different import shapes and nesting types to exercise this...

# first, some nested imports that should succeed...
try:
    from ansible.module_utils.urls import fetch_url as yep1
except ImportError:
    yep1 = None

try:
    import ansible.module_utils.common.text.converters as yep2
except ImportError:
    yep2 = None

try:
    # optional import from a legit collection
    from ansible_collections.testns.testcoll.plugins.module_utils.legit import importme as yep3
except ImportError:
    yep3 = None

# and a bunch that should fail to be found, but not break the module_utils payload build in the process...
try:
    from ansible.module_utils.bogus import fromnope1
except ImportError:
    fromnope1 = None

if _private_false:
    from ansible.module_utils.alsobogus import fromnope2
else:
    fromnope2 = None

try:
    import ansible.module_utils.verybogus
    nope1 = ansible.module_utils.verybogus
except ImportError:
    nope1 = None

# deepish nested with multiple block types- make sure the AST walker made it all the way down
try:
    if _private_true:
        if _private_true:
            if _private_true:
                if _private_true:
                    try:
                        import ansible.module_utils.stillbogus as nope2
                    except ImportError:
                        raise
except ImportError:
    nope2 = None

try:
    # optional import from a valid collection with an invalid package
    from ansible_collections.testns.testcoll.plugins.module_utils.bogus import collnope1
except ImportError:
    collnope1 = None

try:
    # optional import from a bogus collection
    from ansible_collections.bogusns.boguscoll.plugins.module_utils.bogus import collnope2
except ImportError:
    collnope2 = None

module = AnsibleModule(argument_spec={})

if not all([yep1, yep2, yep3]):
    module.fail_json(msg='one or more existing optional imports did not resolve')

if any([fromnope1, fromnope2, nope1, nope2, collnope1, collnope2]):
    module.fail_json(msg='one or more missing optional imports resolved unexpectedly')

module.exit_json(msg='all missing optional imports behaved as expected')