ansible-core 2.18.5rc1__py3-none-any.whl → 2.19.0b2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz.py +265 -0
- ansible/_internal/_collection_proxy.py +47 -0
- ansible/_internal/_datatag/__init__.py +0 -0
- ansible/_internal/_datatag/_tags.py +130 -0
- ansible/_internal/_datatag/_utils.py +19 -0
- ansible/_internal/_datatag/_wrappers.py +33 -0
- ansible/_internal/_errors/__init__.py +0 -0
- ansible/_internal/_errors/_captured.py +128 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_utils.py +310 -0
- ansible/_internal/_json/__init__.py +203 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +55 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +197 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +10 -0
- ansible/_internal/_templating/_access.py +86 -0
- ansible/_internal/_templating/_chain_templar.py +63 -0
- ansible/_internal/_templating/_datatag.py +95 -0
- ansible/_internal/_templating/_engine.py +588 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1066 -0
- ansible/_internal/_templating/_jinja_common.py +332 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +345 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_transform.py +63 -0
- ansible/_internal/_templating/_utils.py +107 -0
- ansible/_internal/_wrapt.py +1052 -0
- ansible/_internal/_yaml/__init__.py +0 -0
- ansible/_internal/_yaml/_constructor.py +240 -0
- ansible/_internal/_yaml/_dumper.py +62 -0
- ansible/_internal/_yaml/_errors.py +166 -0
- ansible/_internal/_yaml/_loader.py +66 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/README.md +11 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/action/debug.py +36 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/apply_trust.py +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/dump_object.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/finalize.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/origin.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.py +24 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/python_literal_eval.yml +33 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/tag_names.py +16 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/true_type.py +17 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/filter/unmask.py +49 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.py +21 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/lookup/config.yml +2 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.py +15 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged.yml +19 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.py +18 -0
- ansible/_internal/ansible_collections/ansible/_protomatter/plugins/test/tagged_with.yml +19 -0
- ansible/cli/__init__.py +159 -89
- ansible/cli/_ssh_askpass.py +47 -0
- ansible/cli/adhoc.py +14 -7
- ansible/cli/arguments/option_helpers.py +154 -7
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +10 -8
- ansible/cli/doc.py +62 -53
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -26
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +51 -11
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/config/base.yml +166 -112
- ansible/config/manager.py +52 -49
- ansible/constants.py +3 -4
- ansible/errors/__init__.py +277 -235
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +426 -493
- ansible/executor/play_iterator.py +22 -27
- ansible/executor/playbook_executor.py +11 -11
- ansible/executor/powershell/async_watchdog.ps1 +97 -102
- ansible/executor/powershell/async_wrapper.ps1 +202 -151
- ansible/executor/powershell/become_wrapper.ps1 +89 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +24 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +82 -135
- ansible/executor/powershell/exec_wrapper.ps1 +462 -196
- ansible/executor/powershell/module_manifest.py +417 -265
- ansible/executor/powershell/module_wrapper.ps1 +169 -186
- ansible/executor/powershell/psrp_fetch_file.ps1 +41 -0
- ansible/executor/powershell/psrp_put_file.ps1 +122 -0
- ansible/executor/powershell/winrm_fetch_file.ps1 +46 -0
- ansible/executor/powershell/winrm_put_file.ps1 +36 -0
- ansible/executor/process/worker.py +161 -96
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +268 -258
- ansible/executor/task_queue_manager.py +124 -90
- ansible/executor/task_result.py +183 -78
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +22 -18
- ansible/galaxy/collection/__init__.py +1 -1
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -11
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +1 -1
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +4 -8
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +44 -72
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +32 -54
- ansible/inventory/manager.py +78 -34
- ansible/keyword_desc.yml +1 -1
- ansible/module_utils/_internal/__init__.py +55 -0
- ansible/module_utils/_internal/_ambient_context.py +58 -0
- ansible/module_utils/_internal/_ansiballz.py +133 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_annotation_patch.py +64 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +928 -0
- ansible/module_utils/_internal/_datatag/_tags.py +38 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_errors.py +30 -0
- ansible/module_utils/_internal/_json/__init__.py +63 -0
- ansible/module_utils/_internal/_json/_legacy_encoder.py +26 -0
- ansible/module_utils/_internal/_json/_profiles/__init__.py +410 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +31 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_c2m.py +35 -0
- ansible/module_utils/_internal/_json/_profiles/_module_modern_m2c.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_tagless.py +50 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +55 -0
- ansible/module_utils/_internal/_patches/_socket_patch.py +34 -0
- ansible/module_utils/_internal/_patches/_sys_intern_patch.py +34 -0
- ansible/module_utils/_internal/_plugin_exec_context.py +49 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_traceback.py +89 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +152 -120
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/collections.py +1 -2
- ansible/module_utils/common/dict_transformations.py +2 -2
- ansible/module_utils/common/file.py +2 -2
- ansible/module_utils/common/json.py +90 -84
- ansible/module_utils/common/locale.py +2 -2
- ansible/module_utils/common/messages.py +108 -0
- ansible/module_utils/common/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -2
- ansible/module_utils/common/respawn.py +41 -19
- ansible/module_utils/common/sentinel.py +66 -0
- ansible/module_utils/common/sys_info.py +8 -8
- ansible/module_utils/common/text/converters.py +16 -37
- ansible/module_utils/common/validation.py +35 -24
- ansible/module_utils/common/warnings.py +86 -25
- ansible/module_utils/common/yaml.py +29 -3
- ansible/module_utils/compat/datetime.py +33 -21
- ansible/module_utils/compat/paramiko.py +21 -10
- ansible/module_utils/compat/typing.py +6 -5
- ansible/module_utils/connection.py +2 -2
- ansible/module_utils/csharp/Ansible.Basic.cs +14 -11
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +46 -0
- ansible/module_utils/distro/__init__.py +2 -2
- ansible/module_utils/facts/ansible_collector.py +4 -5
- ansible/module_utils/facts/collector.py +13 -14
- ansible/module_utils/facts/compat.py +4 -4
- ansible/module_utils/facts/default_collectors.py +1 -1
- ansible/module_utils/facts/hardware/aix.py +34 -0
- ansible/module_utils/facts/hardware/base.py +1 -1
- ansible/module_utils/facts/hardware/darwin.py +1 -3
- ansible/module_utils/facts/hardware/freebsd.py +2 -2
- ansible/module_utils/facts/hardware/linux.py +4 -4
- ansible/module_utils/facts/namespace.py +1 -1
- ansible/module_utils/facts/network/base.py +1 -1
- ansible/module_utils/facts/network/fc_wwn.py +1 -2
- ansible/module_utils/facts/network/iscsi.py +1 -2
- ansible/module_utils/facts/network/nvme.py +1 -2
- ansible/module_utils/facts/other/facter.py +1 -2
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +1 -1
- ansible/module_utils/facts/system/chroot.py +1 -2
- ansible/module_utils/facts/system/cmdline.py +1 -2
- ansible/module_utils/facts/system/date_time.py +5 -3
- ansible/module_utils/facts/system/distribution.py +9 -8
- ansible/module_utils/facts/system/dns.py +1 -1
- ansible/module_utils/facts/system/env.py +1 -2
- ansible/module_utils/facts/system/fips.py +7 -20
- ansible/module_utils/facts/system/loadavg.py +1 -2
- ansible/module_utils/facts/system/local.py +1 -2
- ansible/module_utils/facts/system/lsb.py +1 -2
- ansible/module_utils/facts/system/pkg_mgr.py +1 -2
- ansible/module_utils/facts/system/platform.py +1 -2
- ansible/module_utils/facts/system/python.py +1 -2
- ansible/module_utils/facts/system/selinux.py +1 -1
- ansible/module_utils/facts/system/service_mgr.py +1 -2
- ansible/module_utils/facts/system/ssh_pub_keys.py +1 -1
- ansible/module_utils/facts/system/systemd.py +1 -1
- ansible/module_utils/facts/system/user.py +1 -2
- ansible/module_utils/facts/utils.py +3 -3
- ansible/module_utils/facts/virtual/base.py +1 -1
- ansible/module_utils/facts/virtual/sunos.py +3 -15
- ansible/module_utils/facts/virtual/sysctl.py +3 -16
- ansible/module_utils/json_utils.py +2 -2
- ansible/module_utils/parsing/convert_bool.py +1 -1
- ansible/module_utils/service.py +18 -21
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +60 -31
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +60 -46
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +19 -16
- ansible/modules/assemble.py +6 -6
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +10 -12
- ansible/modules/async_wrapper.py +8 -3
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +10 -17
- ansible/modules/copy.py +57 -144
- ansible/modules/cron.py +20 -15
- ansible/modules/deb822_repository.py +8 -9
- ansible/modules/debconf.py +5 -5
- ansible/modules/debug.py +4 -4
- ansible/modules/dnf.py +8 -8
- ansible/modules/dnf5.py +39 -13
- ansible/modules/dpkg_selections.py +4 -4
- ansible/modules/expect.py +8 -10
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +174 -133
- ansible/modules/find.py +19 -17
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +59 -53
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +28 -25
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +13 -29
- ansible/modules/import_playbook.py +6 -6
- ansible/modules/import_role.py +6 -6
- ansible/modules/import_tasks.py +6 -6
- ansible/modules/include_role.py +6 -6
- ansible/modules/include_tasks.py +6 -6
- ansible/modules/include_vars.py +6 -6
- ansible/modules/iptables.py +86 -73
- ansible/modules/known_hosts.py +10 -10
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +4 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +10 -11
- ansible/modules/raw.py +4 -4
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +9 -13
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +7 -8
- ansible/modules/service_facts.py +87 -10
- ansible/modules/set_fact.py +5 -5
- ansible/modules/set_stats.py +4 -4
- ansible/modules/setup.py +2 -2
- ansible/modules/shell.py +6 -6
- ansible/modules/slurp.py +6 -6
- ansible/modules/stat.py +9 -23
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +6 -6
- ansible/modules/systemd_service.py +6 -6
- ansible/modules/sysvinit.py +6 -6
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +32 -11
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +53 -34
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +32 -27
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +6 -6
- ansible/parsing/ajson.py +14 -32
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +28 -44
- ansible/parsing/plugin_docs.py +21 -86
- ansible/parsing/quoting.py +1 -1
- ansible/parsing/splitter.py +27 -12
- ansible/parsing/utils/addresses.py +24 -24
- ansible/parsing/utils/jsonify.py +5 -1
- ansible/parsing/utils/yaml.py +32 -61
- ansible/parsing/vault/__init__.py +319 -87
- ansible/parsing/yaml/__init__.py +0 -18
- ansible/parsing/yaml/dumper.py +6 -120
- ansible/parsing/yaml/loader.py +6 -39
- ansible/parsing/yaml/objects.py +43 -335
- ansible/playbook/__init__.py +1 -1
- ansible/playbook/attribute.py +8 -3
- ansible/playbook/base.py +182 -132
- ansible/playbook/block.py +26 -24
- ansible/playbook/collectionsearch.py +1 -15
- ansible/playbook/conditional.py +3 -77
- ansible/playbook/handler.py +8 -2
- ansible/playbook/helpers.py +41 -53
- ansible/playbook/included_file.py +31 -27
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +12 -17
- ansible/playbook/playbook_include.py +14 -15
- ansible/playbook/role/__init__.py +24 -26
- ansible/playbook/role/definition.py +15 -17
- ansible/playbook/role/include.py +2 -4
- ansible/playbook/role/metadata.py +10 -11
- ansible/playbook/role_include.py +3 -3
- ansible/playbook/taggable.py +13 -8
- ansible/playbook/task.py +188 -118
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +68 -21
- ansible/plugins/action/__init__.py +209 -176
- ansible/plugins/action/add_host.py +1 -1
- ansible/plugins/action/assemble.py +1 -1
- ansible/plugins/action/assert.py +54 -66
- ansible/plugins/action/copy.py +7 -11
- ansible/plugins/action/debug.py +37 -31
- ansible/plugins/action/dnf.py +3 -4
- ansible/plugins/action/fail.py +1 -1
- ansible/plugins/action/fetch.py +4 -5
- ansible/plugins/action/gather_facts.py +7 -6
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +3 -6
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +15 -8
- ansible/plugins/action/service.py +6 -11
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +35 -59
- ansible/plugins/action/unarchive.py +1 -1
- ansible/plugins/action/validate_argument_spec.py +5 -5
- ansible/plugins/action/wait_for_connection.py +1 -1
- ansible/plugins/become/__init__.py +31 -8
- ansible/plugins/become/runas.py +71 -0
- ansible/plugins/become/su.py +13 -8
- ansible/plugins/become/sudo.py +19 -0
- ansible/plugins/cache/__init__.py +35 -44
- ansible/plugins/cache/base.py +8 -0
- ansible/plugins/cache/jsonfile.py +10 -16
- ansible/plugins/cache/memory.py +6 -12
- ansible/plugins/callback/__init__.py +284 -179
- ansible/plugins/callback/default.py +99 -92
- ansible/plugins/callback/junit.py +44 -39
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +28 -21
- ansible/plugins/callback/tree.py +16 -11
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +150 -54
- ansible/plugins/connection/paramiko_ssh.py +21 -18
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +301 -78
- ansible/plugins/connection/winrm.py +58 -140
- ansible/plugins/doc_fragments/action_common_attributes.py +14 -14
- ansible/plugins/doc_fragments/action_core.py +6 -6
- ansible/plugins/doc_fragments/backup.py +2 -2
- ansible/plugins/doc_fragments/checksum_common.py +27 -0
- ansible/plugins/doc_fragments/constructed.py +6 -2
- ansible/plugins/doc_fragments/decrypt.py +2 -2
- ansible/plugins/doc_fragments/default_callback.py +2 -2
- ansible/plugins/doc_fragments/files.py +2 -2
- ansible/plugins/doc_fragments/inventory_cache.py +2 -2
- ansible/plugins/doc_fragments/result_format_callback.py +2 -2
- ansible/plugins/doc_fragments/return_common.py +2 -2
- ansible/plugins/doc_fragments/template_common.py +4 -4
- ansible/plugins/doc_fragments/url.py +17 -1
- ansible/plugins/doc_fragments/url_windows.py +2 -2
- ansible/plugins/doc_fragments/validate.py +2 -2
- ansible/plugins/doc_fragments/vars_plugin_staging.py +2 -2
- ansible/plugins/filter/__init__.py +6 -2
- ansible/plugins/filter/b64decode.yml +22 -0
- ansible/plugins/filter/b64encode.yml +22 -0
- ansible/plugins/filter/bool.yml +11 -4
- ansible/plugins/filter/core.py +225 -108
- ansible/plugins/filter/encryption.py +32 -32
- ansible/plugins/filter/flatten.yml +3 -2
- ansible/plugins/filter/human_to_bytes.yml +1 -1
- ansible/plugins/filter/mathstuff.py +30 -37
- ansible/plugins/filter/password_hash.yml +8 -0
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_yaml.yml +0 -4
- ansible/plugins/filter/unvault.yml +1 -1
- ansible/plugins/filter/urls.py +1 -1
- ansible/plugins/filter/urlsplit.py +8 -9
- ansible/plugins/filter/vault.yml +14 -9
- ansible/plugins/filter/win_basename.yml +6 -1
- ansible/plugins/filter/win_dirname.yml +5 -0
- ansible/plugins/inventory/__init__.py +97 -77
- ansible/plugins/inventory/advanced_host_list.py +7 -5
- ansible/plugins/inventory/auto.py +11 -4
- ansible/plugins/inventory/constructed.py +21 -24
- ansible/plugins/inventory/generator.py +16 -11
- ansible/plugins/inventory/host_list.py +7 -5
- ansible/plugins/inventory/ini.py +78 -44
- ansible/plugins/inventory/script.py +189 -119
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +3 -3
- ansible/plugins/loader.py +197 -82
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +3 -2
- ansible/plugins/lookup/dict.py +1 -6
- ansible/plugins/lookup/env.py +12 -9
- ansible/plugins/lookup/file.py +5 -8
- ansible/plugins/lookup/first_found.py +86 -55
- ansible/plugins/lookup/indexed_items.py +1 -10
- ansible/plugins/lookup/ini.py +14 -13
- ansible/plugins/lookup/items.py +1 -1
- ansible/plugins/lookup/lines.py +8 -1
- ansible/plugins/lookup/list.py +1 -1
- ansible/plugins/lookup/nested.py +2 -18
- ansible/plugins/lookup/password.py +5 -5
- ansible/plugins/lookup/pipe.py +5 -7
- ansible/plugins/lookup/sequence.py +18 -8
- ansible/plugins/lookup/subelements.py +1 -4
- ansible/plugins/lookup/template.py +42 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +2 -8
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +2 -2
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +39 -22
- ansible/plugins/shell/sh.py +3 -2
- ansible/plugins/strategy/__init__.py +159 -184
- ansible/plugins/strategy/debug.py +2 -2
- ansible/plugins/strategy/free.py +16 -31
- ansible/plugins/strategy/host_pinned.py +2 -2
- ansible/plugins/strategy/linear.py +41 -41
- ansible/plugins/terminal/__init__.py +4 -4
- ansible/plugins/test/__init__.py +7 -2
- ansible/plugins/test/core.py +55 -21
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +3 -3
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +370 -944
- ansible/utils/__init__.py +0 -18
- ansible/utils/_ssh_agent.py +657 -0
- ansible/utils/collection_loader/__init__.py +52 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +79 -93
- ansible/utils/collection_loader/_collection_meta.py +13 -8
- ansible/utils/display.py +433 -63
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/hashing.py +2 -2
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +8 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +4 -4
- ansible/utils/plugin_docs.py +14 -13
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +1 -1
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +51 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +206 -282
- ansible/vars/reserved.py +8 -9
- ansible_core-2.19.0b2.dist-info/BSD-3-Clause.txt +28 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/METADATA +5 -4
- ansible_core-2.19.0b2.dist-info/RECORD +1072 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +7 -7
- ansible_test/_data/completion/remote.txt +6 -6
- ansible_test/_data/completion/windows.txt +1 -0
- ansible_test/_data/requirements/ansible.txt +2 -2
- ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
- ansible_test/_data/requirements/sanity.changelog.txt +1 -1
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_data/requirements/sanity.validate-modules.txt +2 -2
- ansible_test/_data/requirements/sanity.yamllint.txt +1 -1
- ansible_test/_data/requirements/units.txt +1 -0
- ansible_test/_internal/__init__.py +1 -0
- ansible_test/_internal/ansible_util.py +2 -0
- ansible_test/_internal/become.py +1 -0
- ansible_test/_internal/bootstrap.py +1 -0
- ansible_test/_internal/cache.py +1 -0
- ansible_test/_internal/cgroup.py +1 -0
- ansible_test/_internal/ci/__init__.py +1 -0
- ansible_test/_internal/ci/azp.py +1 -0
- ansible_test/_internal/ci/local.py +1 -0
- ansible_test/_internal/classification/__init__.py +1 -0
- ansible_test/_internal/classification/common.py +1 -0
- ansible_test/_internal/classification/csharp.py +1 -0
- ansible_test/_internal/classification/powershell.py +1 -0
- ansible_test/_internal/classification/python.py +1 -0
- ansible_test/_internal/cli/__init__.py +1 -0
- ansible_test/_internal/cli/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/__init__.py +1 -0
- ansible_test/_internal/cli/argparsing/actions.py +1 -0
- ansible_test/_internal/cli/argparsing/argcompletion.py +1 -0
- ansible_test/_internal/cli/argparsing/parsers.py +1 -0
- ansible_test/_internal/cli/commands/__init__.py +11 -0
- ansible_test/_internal/cli/commands/coverage/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/cli/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/cli/commands/coverage/combine.py +1 -0
- ansible_test/_internal/cli/commands/coverage/erase.py +1 -0
- ansible_test/_internal/cli/commands/coverage/html.py +1 -0
- ansible_test/_internal/cli/commands/coverage/report.py +1 -0
- ansible_test/_internal/cli/commands/coverage/xml.py +1 -0
- ansible_test/_internal/cli/commands/env.py +1 -0
- ansible_test/_internal/cli/commands/integration/__init__.py +1 -0
- ansible_test/_internal/cli/commands/integration/network.py +1 -0
- ansible_test/_internal/cli/commands/integration/posix.py +1 -0
- ansible_test/_internal/cli/commands/integration/windows.py +1 -0
- ansible_test/_internal/cli/commands/sanity.py +9 -0
- ansible_test/_internal/cli/commands/shell.py +1 -0
- ansible_test/_internal/cli/commands/units.py +1 -0
- ansible_test/_internal/cli/compat.py +1 -0
- ansible_test/_internal/cli/completers.py +1 -0
- ansible_test/_internal/cli/converters.py +1 -0
- ansible_test/_internal/cli/environments.py +1 -0
- ansible_test/_internal/cli/epilog.py +1 -0
- ansible_test/_internal/cli/parsers/__init__.py +1 -0
- ansible_test/_internal/cli/parsers/base_argument_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/helpers.py +1 -0
- ansible_test/_internal/cli/parsers/host_config_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/key_value_parsers.py +1 -0
- ansible_test/_internal/cli/parsers/value_parsers.py +1 -0
- ansible_test/_internal/commands/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/__init__.py +2 -1
- ansible_test/_internal/commands/coverage/analyze/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/combine.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/expand.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/filter.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/generate.py +1 -0
- ansible_test/_internal/commands/coverage/analyze/targets/missing.py +1 -0
- ansible_test/_internal/commands/coverage/combine.py +2 -1
- ansible_test/_internal/commands/coverage/erase.py +1 -0
- ansible_test/_internal/commands/coverage/html.py +1 -0
- ansible_test/_internal/commands/coverage/report.py +1 -0
- ansible_test/_internal/commands/coverage/xml.py +1 -0
- ansible_test/_internal/commands/env/__init__.py +2 -0
- ansible_test/_internal/commands/integration/__init__.py +4 -0
- ansible_test/_internal/commands/integration/cloud/__init__.py +1 -0
- ansible_test/_internal/commands/integration/cloud/acme.py +2 -1
- ansible_test/_internal/commands/integration/cloud/aws.py +1 -0
- ansible_test/_internal/commands/integration/cloud/azure.py +1 -0
- ansible_test/_internal/commands/integration/cloud/cs.py +1 -0
- ansible_test/_internal/commands/integration/cloud/digitalocean.py +1 -0
- ansible_test/_internal/commands/integration/cloud/galaxy.py +3 -2
- ansible_test/_internal/commands/integration/cloud/hcloud.py +1 -0
- ansible_test/_internal/commands/integration/cloud/httptester.py +2 -1
- ansible_test/_internal/commands/integration/cloud/nios.py +2 -1
- ansible_test/_internal/commands/integration/cloud/opennebula.py +1 -0
- ansible_test/_internal/commands/integration/cloud/openshift.py +1 -0
- ansible_test/_internal/commands/integration/cloud/scaleway.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vcenter.py +1 -0
- ansible_test/_internal/commands/integration/cloud/vultr.py +1 -0
- ansible_test/_internal/commands/integration/coverage.py +1 -0
- ansible_test/_internal/commands/integration/filters.py +1 -0
- ansible_test/_internal/commands/integration/network.py +1 -0
- ansible_test/_internal/commands/integration/posix.py +1 -0
- ansible_test/_internal/commands/integration/windows.py +1 -0
- ansible_test/_internal/commands/sanity/__init__.py +16 -1
- ansible_test/_internal/commands/sanity/ansible_doc.py +1 -0
- ansible_test/_internal/commands/sanity/bin_symlinks.py +1 -0
- ansible_test/_internal/commands/sanity/compile.py +1 -0
- ansible_test/_internal/commands/sanity/ignores.py +1 -0
- ansible_test/_internal/commands/sanity/import.py +1 -0
- ansible_test/_internal/commands/sanity/integration_aliases.py +1 -0
- ansible_test/_internal/commands/sanity/pep8.py +1 -0
- ansible_test/_internal/commands/sanity/pslint.py +1 -0
- ansible_test/_internal/commands/sanity/pylint.py +24 -26
- ansible_test/_internal/commands/sanity/shellcheck.py +1 -0
- ansible_test/_internal/commands/sanity/validate_modules.py +1 -0
- ansible_test/_internal/commands/sanity/yamllint.py +1 -0
- ansible_test/_internal/commands/shell/__init__.py +1 -0
- ansible_test/_internal/commands/units/__init__.py +1 -0
- ansible_test/_internal/compat/__init__.py +1 -0
- ansible_test/_internal/compat/packaging.py +1 -0
- ansible_test/_internal/compat/yaml.py +1 -0
- ansible_test/_internal/completion.py +1 -0
- ansible_test/_internal/config.py +2 -0
- ansible_test/_internal/connections.py +1 -0
- ansible_test/_internal/constants.py +1 -0
- ansible_test/_internal/containers.py +1 -0
- ansible_test/_internal/content_config.py +1 -0
- ansible_test/_internal/core_ci.py +1 -0
- ansible_test/_internal/coverage_util.py +11 -10
- ansible_test/_internal/data.py +1 -0
- ansible_test/_internal/delegation.py +1 -0
- ansible_test/_internal/dev/__init__.py +1 -0
- ansible_test/_internal/dev/container_probe.py +1 -0
- ansible_test/_internal/diff.py +3 -2
- ansible_test/_internal/docker_util.py +2 -1
- ansible_test/_internal/encoding.py +1 -0
- ansible_test/_internal/executor.py +1 -0
- ansible_test/_internal/git.py +1 -0
- ansible_test/_internal/host_configs.py +1 -0
- ansible_test/_internal/host_profiles.py +1 -0
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +35 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +1 -0
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/provider/__init__.py +1 -0
- ansible_test/_internal/provider/layout/__init__.py +1 -0
- ansible_test/_internal/provider/layout/ansible.py +1 -0
- ansible_test/_internal/provider/layout/collection.py +1 -0
- ansible_test/_internal/provider/layout/unsupported.py +1 -0
- ansible_test/_internal/provider/source/__init__.py +1 -0
- ansible_test/_internal/provider/source/git.py +1 -0
- ansible_test/_internal/provider/source/installed.py +1 -0
- ansible_test/_internal/provider/source/unsupported.py +1 -0
- ansible_test/_internal/provider/source/unversioned.py +1 -0
- ansible_test/_internal/provisioning.py +1 -0
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +1 -0
- ansible_test/_internal/ssh.py +1 -0
- ansible_test/_internal/target.py +1 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +1 -0
- ansible_test/_internal/timeout.py +1 -0
- ansible_test/_internal/util.py +1 -0
- ansible_test/_internal/util_common.py +5 -2
- ansible_test/_internal/venv.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/action-plugin-docs.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog/sphinx.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/changelog.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/empty-init.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/line-endings.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-assert.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-get-exception.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-illegal-filenames.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/no-smart-quotes.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +28 -1
- ansible_test/_util/controller/sanity/code-smell/shebang.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/symlinks.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-argspec-type-path.py +1 -0
- ansible_test/_util/controller/sanity/code-smell/use-compat-six.py +1 -0
- ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py +2 -1
- ansible_test/_util/controller/sanity/pep8/current-ignore.txt +4 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +7 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +3 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +7 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -13
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +1 -0
- ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +1 -8
- ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +1 -8
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +55 -28
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +12 -5
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +13 -2
- ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -0
- ansible_test/_util/controller/sanity/yamllint/yamllinter.py +35 -17
- ansible_test/_util/controller/tools/collection_detail.py +1 -0
- ansible_test/_util/controller/tools/yaml_to_json.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_forked.py +6 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +2 -1
- ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -0
- ansible_test/_util/target/sanity/compile/compile.py +1 -0
- ansible_test/_util/target/sanity/import/importer.py +15 -16
- ansible_test/_util/target/setup/bootstrap.sh +9 -20
- ansible_test/_util/target/setup/probe_cgroups.py +1 -0
- ansible_test/_util/target/setup/quiet_pip.py +1 -0
- ansible_test/_util/target/setup/requirements.py +35 -27
- ansible_test/_util/target/tools/virtualenvcheck.py +2 -1
- ansible_test/_util/target/tools/yamlcheck.py +2 -1
- ansible/compat/selectors.py +0 -32
- ansible/errors/yaml_strings.py +0 -138
- ansible/executor/action_write_locks.py +0 -44
- ansible/executor/discovery/python_target.py +0 -47
- ansible/executor/powershell/module_powershell_wrapper.ps1 +0 -86
- ansible/executor/powershell/module_script_wrapper.ps1 +0 -22
- ansible/module_utils/compat/importlib.py +0 -26
- ansible/module_utils/compat/selectors.py +0 -32
- ansible/module_utils/pycompat24.py +0 -73
- ansible/parsing/yaml/constructor.py +0 -178
- ansible/template/native_helpers.py +0 -251
- ansible/template/template.py +0 -43
- ansible/template/vars.py +0 -77
- ansible/utils/native_jinja.py +0 -11
- ansible/vars/fact_cache.py +0 -71
- ansible_core-2.18.5rc1.dist-info/RECORD +0 -992
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/COPYING +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.5rc1.dist-info → ansible_core-2.19.0b2.dist-info}/top_level.txt +0 -0
ansible/errors/__init__.py
CHANGED
@@ -1,42 +1,38 @@
|
|
1
1
|
# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com>
|
2
|
-
#
|
3
|
-
# This file is part of Ansible
|
4
|
-
#
|
5
|
-
# Ansible is free software: you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU General Public License as published by
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# Ansible is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU General Public License
|
16
|
-
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
2
|
+
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
17
3
|
|
18
4
|
from __future__ import annotations
|
19
5
|
|
20
|
-
import
|
6
|
+
import enum
|
21
7
|
import traceback
|
8
|
+
import sys
|
9
|
+
import types
|
10
|
+
import typing as t
|
22
11
|
|
23
12
|
from collections.abc import Sequence
|
24
13
|
|
25
|
-
from
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
14
|
+
from json import JSONDecodeError
|
15
|
+
|
16
|
+
from ansible.module_utils.common.text.converters import to_text
|
17
|
+
from ..module_utils.datatag import native_type_name
|
18
|
+
from ansible._internal._datatag import _tags
|
19
|
+
from .._internal._errors import _utils
|
20
|
+
|
21
|
+
|
22
|
+
class ExitCode(enum.IntEnum):
|
23
|
+
SUCCESS = 0 # used by TQM, must be bit-flag safe
|
24
|
+
GENERIC_ERROR = 1 # used by TQM, must be bit-flag safe
|
25
|
+
HOST_FAILED = 2 # TQM-sourced, must be bit-flag safe
|
26
|
+
HOST_UNREACHABLE = 4 # TQM-sourced, must be bit-flag safe
|
27
|
+
PARSER_ERROR = 4 # FIXME: CLI-sourced, conflicts with HOST_UNREACHABLE
|
28
|
+
INVALID_CLI_OPTION = 5
|
29
|
+
UNICODE_ERROR = 6 # obsolete, no longer used
|
30
|
+
KEYBOARD_INTERRUPT = 99
|
31
|
+
UNKNOWN_ERROR = 250
|
36
32
|
|
37
33
|
|
38
34
|
class AnsibleError(Exception):
|
39
|
-
|
35
|
+
"""
|
40
36
|
This is the base class for all errors raised from Ansible code,
|
41
37
|
and can be instantiated with two optional parameters beyond the
|
42
38
|
error message to control whether detailed information is displayed
|
@@ -44,257 +40,271 @@ class AnsibleError(Exception):
|
|
44
40
|
|
45
41
|
Usage:
|
46
42
|
|
47
|
-
raise AnsibleError('some message here', obj=obj
|
48
|
-
|
49
|
-
Where "obj"
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
43
|
+
raise AnsibleError('some message here', obj=obj)
|
44
|
+
|
45
|
+
Where "obj" may be tagged with Origin to provide context for error messages.
|
46
|
+
"""
|
47
|
+
|
48
|
+
_exit_code = ExitCode.GENERIC_ERROR
|
49
|
+
_default_message = ''
|
50
|
+
_default_help_text: str | None = None
|
51
|
+
_include_cause_message = True
|
52
|
+
"""
|
53
|
+
When `True`, the exception message will be augmented with cause message(s).
|
54
|
+
Subclasses doing complex error analysis can disable this to take responsibility for reporting cause messages as needed.
|
55
|
+
"""
|
56
|
+
|
57
|
+
def __init__(
|
58
|
+
self,
|
59
|
+
message: str = "",
|
60
|
+
obj: t.Any = None,
|
61
|
+
show_content: bool = True,
|
62
|
+
suppress_extended_error: bool | types.EllipsisType = ...,
|
63
|
+
orig_exc: BaseException | None = None,
|
64
|
+
help_text: str | None = None,
|
65
|
+
) -> None:
|
66
|
+
# DTFIX-FUTURE: these fallback cases mask incorrect use of AnsibleError.message, what should we do?
|
67
|
+
if message is None:
|
68
|
+
message = ''
|
69
|
+
elif not isinstance(message, str):
|
70
|
+
message = str(message)
|
71
|
+
|
72
|
+
if self._default_message and message:
|
73
|
+
message = _utils.concat_message(self._default_message, message)
|
74
|
+
elif self._default_message:
|
75
|
+
message = self._default_message
|
76
|
+
elif not message:
|
77
|
+
message = f'Unexpected {type(self).__name__} error.'
|
78
|
+
|
79
|
+
super().__init__(message)
|
55
80
|
|
56
81
|
self._show_content = show_content
|
57
|
-
self.
|
58
|
-
self.
|
82
|
+
self._message = message
|
83
|
+
self._help_text_value = help_text or self._default_help_text
|
59
84
|
self.obj = obj
|
85
|
+
|
86
|
+
# deprecated: description='deprecate support for orig_exc, callers should use `raise ... from` only' core_version='2.23'
|
87
|
+
# deprecated: description='remove support for orig_exc' core_version='2.27'
|
60
88
|
self.orig_exc = orig_exc
|
61
89
|
|
62
|
-
|
63
|
-
|
64
|
-
# we import this here to prevent an import loop problem,
|
65
|
-
# since the objects code also imports ansible.errors
|
66
|
-
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
|
90
|
+
if suppress_extended_error is not ...:
|
91
|
+
from ..utils.display import Display
|
67
92
|
|
68
|
-
|
93
|
+
if suppress_extended_error:
|
94
|
+
self._show_content = False
|
69
95
|
|
70
|
-
|
71
|
-
|
72
|
-
|
96
|
+
Display().deprecated(
|
97
|
+
msg=f"The `suppress_extended_error` argument to `{type(self).__name__}` is deprecated. Use `show_content=False` instead.",
|
98
|
+
version="2.23",
|
99
|
+
)
|
73
100
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
if extended_error and not self._suppress_extended_error:
|
78
|
-
message.append(
|
79
|
-
'\n\n%s' % to_native(extended_error)
|
80
|
-
)
|
101
|
+
@property
|
102
|
+
def _original_message(self) -> str:
|
103
|
+
return self._message
|
81
104
|
|
82
|
-
|
105
|
+
@property
|
106
|
+
def message(self) -> str:
|
107
|
+
"""
|
108
|
+
If `include_cause_message` is False, return the original message.
|
109
|
+
Otherwise, return the original message with cause message(s) appended, stopping on (and including) the first non-AnsibleError.
|
110
|
+
The recursion is due to `AnsibleError.__str__` calling this method, which uses `str` on child exceptions to create the cause message.
|
111
|
+
Recursion stops on the first non-AnsibleError since those exceptions do not implement the custom `__str__` behavior.
|
112
|
+
"""
|
113
|
+
return _utils.get_chained_message(self)
|
83
114
|
|
84
115
|
@message.setter
|
85
|
-
def message(self, val):
|
116
|
+
def message(self, val) -> None:
|
86
117
|
self._message = val
|
87
118
|
|
88
|
-
|
89
|
-
|
119
|
+
@property
|
120
|
+
def _formatted_source_context(self) -> str | None:
|
121
|
+
with _utils.RedactAnnotatedSourceContext.when(not self._show_content):
|
122
|
+
if source_context := _utils.SourceContext.from_value(self.obj):
|
123
|
+
return str(source_context)
|
124
|
+
|
125
|
+
return None
|
126
|
+
|
127
|
+
@property
|
128
|
+
def _help_text(self) -> str | None:
|
129
|
+
return self._help_text_value
|
130
|
+
|
131
|
+
@_help_text.setter
|
132
|
+
def _help_text(self, value: str | None) -> None:
|
133
|
+
self._help_text_value = value
|
90
134
|
|
91
|
-
def
|
135
|
+
def __str__(self) -> str:
|
92
136
|
return self.message
|
93
137
|
|
94
|
-
def
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
'''
|
129
|
-
Given an object reporting the location of the exception in a file, return
|
130
|
-
detailed information regarding it including:
|
131
|
-
|
132
|
-
* the line which caused the error as well as the one preceding it
|
133
|
-
* causes and suggested remedies for common syntax errors
|
134
|
-
|
135
|
-
If this error was created with show_content=False, the reporting of content
|
136
|
-
is suppressed, as the file contents may be sensitive (ie. vault data).
|
137
|
-
'''
|
138
|
-
|
139
|
-
error_message = ''
|
140
|
-
|
141
|
-
try:
|
142
|
-
(src_file, line_number, col_number) = self.obj.ansible_pos
|
143
|
-
error_message += YAML_POSITION_DETAILS % (src_file, line_number, col_number)
|
144
|
-
if src_file not in ('<string>', '<unicode>') and self._show_content:
|
145
|
-
(target_line, prev_line) = self._get_error_lines_from_file(src_file, line_number - 1)
|
146
|
-
target_line = to_text(target_line)
|
147
|
-
prev_line = to_text(prev_line)
|
148
|
-
if target_line:
|
149
|
-
stripped_line = target_line.replace(" ", "")
|
150
|
-
|
151
|
-
# Check for k=v syntax in addition to YAML syntax and set the appropriate error position,
|
152
|
-
# arrow index
|
153
|
-
if re.search(r'\w+(\s+)?=(\s+)?[\w/-]+', prev_line):
|
154
|
-
error_position = prev_line.rstrip().find('=')
|
155
|
-
arrow_line = (" " * error_position) + "^ here"
|
156
|
-
error_message = YAML_POSITION_DETAILS % (src_file, line_number - 1, error_position + 1)
|
157
|
-
error_message += "\nThe offending line appears to be:\n\n%s\n%s\n\n" % (prev_line.rstrip(), arrow_line)
|
158
|
-
error_message += YAML_AND_SHORTHAND_ERROR
|
159
|
-
else:
|
160
|
-
arrow_line = (" " * (col_number - 1)) + "^ here"
|
161
|
-
error_message += "\nThe offending line appears to be:\n\n%s\n%s\n%s\n" % (prev_line.rstrip(), target_line.rstrip(), arrow_line)
|
162
|
-
|
163
|
-
# TODO: There may be cases where there is a valid tab in a line that has other errors.
|
164
|
-
if '\t' in target_line:
|
165
|
-
error_message += YAML_COMMON_LEADING_TAB_ERROR
|
166
|
-
# common error/remediation checking here:
|
167
|
-
# check for unquoted vars starting lines
|
168
|
-
if ('{{' in target_line and '}}' in target_line) and ('"{{' not in target_line or "'{{" not in target_line):
|
169
|
-
error_message += YAML_COMMON_UNQUOTED_VARIABLE_ERROR
|
170
|
-
# check for common dictionary mistakes
|
171
|
-
elif ":{{" in stripped_line and "}}" in stripped_line:
|
172
|
-
error_message += YAML_COMMON_DICT_ERROR
|
173
|
-
# check for common unquoted colon mistakes
|
174
|
-
elif (len(target_line) and
|
175
|
-
len(target_line) > 1 and
|
176
|
-
len(target_line) > col_number and
|
177
|
-
target_line[col_number] == ":" and
|
178
|
-
target_line.count(':') > 1):
|
179
|
-
error_message += YAML_COMMON_UNQUOTED_COLON_ERROR
|
180
|
-
# otherwise, check for some common quoting mistakes
|
181
|
-
else:
|
182
|
-
# FIXME: This needs to split on the first ':' to account for modules like lineinfile
|
183
|
-
# that may have lines that contain legitimate colons, e.g., line: 'i ALL= (ALL) NOPASSWD: ALL'
|
184
|
-
# and throw off the quote matching logic.
|
185
|
-
parts = target_line.split(":")
|
186
|
-
if len(parts) > 1:
|
187
|
-
middle = parts[1].strip()
|
188
|
-
match = False
|
189
|
-
unbalanced = False
|
190
|
-
|
191
|
-
if middle.startswith("'") and not middle.endswith("'"):
|
192
|
-
match = True
|
193
|
-
elif middle.startswith('"') and not middle.endswith('"'):
|
194
|
-
match = True
|
195
|
-
|
196
|
-
if (len(middle) > 0 and
|
197
|
-
middle[0] in ['"', "'"] and
|
198
|
-
middle[-1] in ['"', "'"] and
|
199
|
-
target_line.count("'") > 2 or
|
200
|
-
target_line.count('"') > 2):
|
201
|
-
unbalanced = True
|
202
|
-
|
203
|
-
if match:
|
204
|
-
error_message += YAML_COMMON_PARTIALLY_QUOTED_LINE_ERROR
|
205
|
-
if unbalanced:
|
206
|
-
error_message += YAML_COMMON_UNBALANCED_QUOTES_ERROR
|
207
|
-
|
208
|
-
except (IOError, TypeError):
|
209
|
-
error_message += '\n(could not open file to display line)'
|
210
|
-
except IndexError:
|
211
|
-
error_message += '\n(specified line no longer in file, maybe it changed?)'
|
212
|
-
|
213
|
-
return error_message
|
138
|
+
def __getstate__(self) -> dict[str, t.Any]:
|
139
|
+
"""Augment object.__getstate__ to preserve additional values not represented in BaseException.__dict__."""
|
140
|
+
state = t.cast(dict[str, t.Any], super().__getstate__())
|
141
|
+
state.update(
|
142
|
+
args=self.args,
|
143
|
+
__cause__=self.__cause__,
|
144
|
+
__context__=self.__context__,
|
145
|
+
__suppress_context__=self.__suppress_context__,
|
146
|
+
)
|
147
|
+
|
148
|
+
return state
|
149
|
+
|
150
|
+
def __reduce__(self) -> tuple[t.Callable, tuple[type], dict[str, t.Any]]:
|
151
|
+
"""
|
152
|
+
Enable copy/pickle of AnsibleError derived types by correcting for BaseException's ancient C __reduce__ impl that:
|
153
|
+
|
154
|
+
* requires use of a type constructor with positional args
|
155
|
+
* assumes positional args are passed through from the derived type __init__ to BaseException.__init__ unmodified
|
156
|
+
* does not propagate args/__cause__/__context__/__suppress_context__
|
157
|
+
|
158
|
+
NOTE: This does not preserve the dunder attributes on non-AnsibleError derived cause/context exceptions.
|
159
|
+
As a result, copy/pickle will discard chained exceptions after the first non-AnsibleError cause/context.
|
160
|
+
"""
|
161
|
+
return type(self).__new__, (type(self),), self.__getstate__()
|
162
|
+
|
163
|
+
|
164
|
+
class AnsibleUndefinedConfigEntry(AnsibleError):
|
165
|
+
"""The requested config entry is not defined."""
|
166
|
+
|
167
|
+
|
168
|
+
class AnsibleTaskError(AnsibleError):
|
169
|
+
"""Task execution failed; provides contextual information about the task."""
|
170
|
+
|
171
|
+
_default_message = 'Task failed.'
|
214
172
|
|
215
173
|
|
216
174
|
class AnsiblePromptInterrupt(AnsibleError):
|
217
|
-
|
175
|
+
"""User interrupt."""
|
218
176
|
|
219
177
|
|
220
178
|
class AnsiblePromptNoninteractive(AnsibleError):
|
221
|
-
|
179
|
+
"""Unable to get user input."""
|
222
180
|
|
223
181
|
|
224
182
|
class AnsibleAssertionError(AnsibleError, AssertionError):
|
225
|
-
|
226
|
-
pass
|
183
|
+
"""Invalid assertion."""
|
227
184
|
|
228
185
|
|
229
186
|
class AnsibleOptionsError(AnsibleError):
|
230
|
-
|
231
|
-
|
187
|
+
"""Invalid options were passed."""
|
188
|
+
|
189
|
+
# FIXME: This exception is used for many non-CLI related errors.
|
190
|
+
# The few cases which are CLI related should really be handled by argparse instead, at which point the exit code here can be removed.
|
191
|
+
_exit_code = ExitCode.INVALID_CLI_OPTION
|
232
192
|
|
233
193
|
|
234
194
|
class AnsibleRequiredOptionError(AnsibleOptionsError):
|
235
|
-
|
236
|
-
pass
|
195
|
+
"""Bad or incomplete options passed."""
|
237
196
|
|
238
197
|
|
239
198
|
class AnsibleParserError(AnsibleError):
|
240
|
-
|
241
|
-
|
199
|
+
"""A playbook or data file could not be parsed."""
|
200
|
+
|
201
|
+
_exit_code = ExitCode.PARSER_ERROR
|
202
|
+
|
203
|
+
|
204
|
+
class AnsibleFieldAttributeError(AnsibleParserError):
|
205
|
+
"""Errors caused during field attribute processing."""
|
206
|
+
|
207
|
+
|
208
|
+
class AnsibleJSONParserError(AnsibleParserError):
|
209
|
+
"""JSON-specific parsing failure wrapping an exception raised by the JSON parser."""
|
210
|
+
|
211
|
+
_default_message = 'JSON parsing failed.'
|
212
|
+
_include_cause_message = False # hide the underlying cause message, it's included by `handle_exception` as needed
|
213
|
+
|
214
|
+
@classmethod
|
215
|
+
def handle_exception(cls, exception: Exception, origin: _tags.Origin) -> t.NoReturn:
|
216
|
+
if isinstance(exception, JSONDecodeError):
|
217
|
+
origin = origin.replace(line_num=exception.lineno, col_num=exception.colno)
|
218
|
+
|
219
|
+
message = str(exception)
|
220
|
+
|
221
|
+
error = cls(message, obj=origin)
|
222
|
+
|
223
|
+
raise error from exception
|
242
224
|
|
243
225
|
|
244
226
|
class AnsibleInternalError(AnsibleError):
|
245
|
-
|
246
|
-
pass
|
227
|
+
"""Internal safeguards tripped, something happened in the code that should never happen."""
|
247
228
|
|
248
229
|
|
249
230
|
class AnsibleRuntimeError(AnsibleError):
|
250
|
-
|
251
|
-
pass
|
231
|
+
"""Ansible had a problem while running a playbook."""
|
252
232
|
|
253
233
|
|
254
234
|
class AnsibleModuleError(AnsibleRuntimeError):
|
255
|
-
|
256
|
-
pass
|
235
|
+
"""A module failed somehow."""
|
257
236
|
|
258
237
|
|
259
238
|
class AnsibleConnectionFailure(AnsibleRuntimeError):
|
260
|
-
|
261
|
-
pass
|
239
|
+
"""The transport / connection_plugin had a fatal error."""
|
262
240
|
|
263
241
|
|
264
242
|
class AnsibleAuthenticationFailure(AnsibleConnectionFailure):
|
265
|
-
|
266
|
-
|
243
|
+
"""Invalid username/password/key."""
|
244
|
+
|
245
|
+
_default_message = "Failed to authenticate."
|
267
246
|
|
268
247
|
|
269
248
|
class AnsibleCallbackError(AnsibleRuntimeError):
|
270
|
-
|
271
|
-
pass
|
249
|
+
"""A callback failure."""
|
272
250
|
|
273
251
|
|
274
252
|
class AnsibleTemplateError(AnsibleRuntimeError):
|
275
|
-
|
276
|
-
|
253
|
+
"""A template related error."""
|
254
|
+
|
255
|
+
|
256
|
+
class TemplateTrustCheckFailedError(AnsibleTemplateError):
|
257
|
+
"""Raised when processing was requested on an untrusted template or expression."""
|
258
|
+
|
259
|
+
_default_message = 'Encountered untrusted template or expression.'
|
260
|
+
_default_help_text = ('Templates and expressions must be defined by trusted sources such as playbooks or roles, '
|
261
|
+
'not untrusted sources such as module results.')
|
262
|
+
|
263
|
+
|
264
|
+
class AnsibleTemplateTransformLimitError(AnsibleTemplateError):
|
265
|
+
"""The internal template transform limit was exceeded."""
|
266
|
+
|
267
|
+
_default_message = "Template transform limit exceeded."
|
277
268
|
|
278
269
|
|
279
|
-
class
|
280
|
-
|
281
|
-
pass
|
270
|
+
class AnsibleTemplateSyntaxError(AnsibleTemplateError):
|
271
|
+
"""A syntax error was encountered while parsing a Jinja template or expression."""
|
282
272
|
|
283
273
|
|
284
|
-
class
|
285
|
-
|
286
|
-
|
274
|
+
class AnsibleBrokenConditionalError(AnsibleTemplateError):
|
275
|
+
"""A broken conditional with non-boolean result was used."""
|
276
|
+
|
277
|
+
_default_help_text = 'Broken conditionals can be temporarily allowed with the `ALLOW_BROKEN_CONDITIONALS` configuration option.'
|
287
278
|
|
288
279
|
|
289
280
|
class AnsibleUndefinedVariable(AnsibleTemplateError):
|
290
|
-
|
291
|
-
|
281
|
+
"""An undefined variable was encountered while processing a template or expression."""
|
282
|
+
|
283
|
+
|
284
|
+
class AnsibleValueOmittedError(AnsibleTemplateError):
|
285
|
+
"""
|
286
|
+
Raised when the result of a template operation was the Omit singleton. This exception purposely does
|
287
|
+
not derive from AnsibleError to avoid elision of the traceback, since uncaught errors of this type always
|
288
|
+
indicate a bug.
|
289
|
+
"""
|
290
|
+
|
291
|
+
_default_message = "A template was resolved to an Omit scalar."
|
292
|
+
_default_help_text = "Callers must be prepared to handle this value. This is most likely a bug in the code requesting templating."
|
293
|
+
|
294
|
+
|
295
|
+
class AnsibleTemplatePluginError(AnsibleTemplateError):
|
296
|
+
"""An error sourced by a template plugin (lookup/filter/test)."""
|
297
|
+
|
298
|
+
|
299
|
+
# deprecated: description='add deprecation warnings for these aliases' core_version='2.23'
|
300
|
+
AnsibleFilterError = AnsibleTemplatePluginError
|
301
|
+
AnsibleLookupError = AnsibleTemplatePluginError
|
292
302
|
|
293
303
|
|
294
304
|
class AnsibleFileNotFound(AnsibleRuntimeError):
|
295
|
-
|
305
|
+
"""A file missing failure."""
|
296
306
|
|
297
|
-
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error
|
307
|
+
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, paths=None, file_name=None):
|
298
308
|
|
299
309
|
self.file_name = file_name
|
300
310
|
self.paths = paths
|
@@ -322,10 +332,9 @@ class AnsibleFileNotFound(AnsibleRuntimeError):
|
|
322
332
|
# DO NOT USE as they will probably be removed soon.
|
323
333
|
# We will port the action modules in our tree to use a context manager instead.
|
324
334
|
class AnsibleAction(AnsibleRuntimeError):
|
325
|
-
|
326
|
-
|
327
|
-
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=False, orig_exc=None, result=None):
|
335
|
+
"""Base Exception for Action plugin flow control."""
|
328
336
|
|
337
|
+
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
|
329
338
|
super(AnsibleAction, self).__init__(message=message, obj=obj, show_content=show_content,
|
330
339
|
suppress_extended_error=suppress_extended_error, orig_exc=orig_exc)
|
331
340
|
if result is None:
|
@@ -335,54 +344,87 @@ class AnsibleAction(AnsibleRuntimeError):
|
|
335
344
|
|
336
345
|
|
337
346
|
class AnsibleActionSkip(AnsibleAction):
|
338
|
-
|
347
|
+
"""An action runtime skip."""
|
339
348
|
|
340
|
-
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error
|
349
|
+
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
|
341
350
|
super(AnsibleActionSkip, self).__init__(message=message, obj=obj, show_content=show_content,
|
342
351
|
suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
|
343
352
|
self.result.update({'skipped': True, 'msg': message})
|
344
353
|
|
345
354
|
|
346
355
|
class AnsibleActionFail(AnsibleAction):
|
347
|
-
|
348
|
-
|
356
|
+
"""An action runtime failure."""
|
357
|
+
|
358
|
+
def __init__(self, message="", obj=None, show_content=True, suppress_extended_error=..., orig_exc=None, result=None):
|
349
359
|
super(AnsibleActionFail, self).__init__(message=message, obj=obj, show_content=show_content,
|
350
360
|
suppress_extended_error=suppress_extended_error, orig_exc=orig_exc, result=result)
|
351
|
-
|
361
|
+
|
362
|
+
result_overrides = {'failed': True, 'msg': message}
|
363
|
+
# deprecated: description='use sys.exception()' python_version='3.11'
|
364
|
+
if sys.exc_info()[1]: # DTFIX-RELEASE: remove this hack once TaskExecutor is no longer shucking AnsibleActionFail and returning its result
|
365
|
+
result_overrides['exception'] = traceback.format_exc()
|
366
|
+
|
367
|
+
self.result.update(result_overrides)
|
352
368
|
|
353
369
|
|
354
370
|
class _AnsibleActionDone(AnsibleAction):
|
355
|
-
|
356
|
-
pass
|
371
|
+
"""An action runtime early exit."""
|
357
372
|
|
358
373
|
|
359
374
|
class AnsiblePluginError(AnsibleError):
|
360
|
-
|
375
|
+
"""Base class for Ansible plugin-related errors that do not need AnsibleError contextual data."""
|
376
|
+
|
361
377
|
def __init__(self, message=None, plugin_load_context=None):
|
362
378
|
super(AnsiblePluginError, self).__init__(message)
|
363
379
|
self.plugin_load_context = plugin_load_context
|
364
380
|
|
365
381
|
|
366
382
|
class AnsiblePluginRemovedError(AnsiblePluginError):
|
367
|
-
|
368
|
-
pass
|
383
|
+
"""A requested plugin has been removed."""
|
369
384
|
|
370
385
|
|
371
386
|
class AnsiblePluginCircularRedirect(AnsiblePluginError):
|
372
|
-
|
373
|
-
pass
|
387
|
+
"""A cycle was detected in plugin redirection."""
|
374
388
|
|
375
389
|
|
376
390
|
class AnsibleCollectionUnsupportedVersionError(AnsiblePluginError):
|
377
|
-
|
378
|
-
pass
|
391
|
+
"""A collection is not supported by this version of Ansible."""
|
379
392
|
|
380
393
|
|
381
|
-
class
|
382
|
-
|
383
|
-
pass
|
394
|
+
class AnsibleTypeError(AnsibleRuntimeError, TypeError):
|
395
|
+
"""Ansible-augmented TypeError subclass."""
|
384
396
|
|
385
397
|
|
386
398
|
class AnsiblePluginNotFound(AnsiblePluginError):
|
387
|
-
|
388
|
-
|
399
|
+
"""Indicates we did not find an Ansible plugin."""
|
400
|
+
|
401
|
+
|
402
|
+
class AnsibleConditionalError(AnsibleRuntimeError):
|
403
|
+
"""Errors related to failed conditional expression evaluation."""
|
404
|
+
|
405
|
+
|
406
|
+
class AnsibleVariableTypeError(AnsibleRuntimeError):
|
407
|
+
"""An error due to attempted storage of an unsupported variable type."""
|
408
|
+
|
409
|
+
@classmethod
|
410
|
+
def from_value(cls, *, obj: t.Any) -> t.Self:
|
411
|
+
# avoid an incorrect error message when `obj` is a type
|
412
|
+
type_name = type(obj).__name__ if isinstance(obj, type) else native_type_name(obj)
|
413
|
+
|
414
|
+
return cls(message=f'Type {type_name!r} is unsupported for variable storage.', obj=obj)
|
415
|
+
|
416
|
+
|
417
|
+
def __getattr__(name: str) -> t.Any:
|
418
|
+
"""Inject import-time deprecation warnings."""
|
419
|
+
from ..utils.display import Display
|
420
|
+
|
421
|
+
if name == 'AnsibleFilterTypeError':
|
422
|
+
Display().deprecated(
|
423
|
+
msg="Importing 'AnsibleFilterTypeError' is deprecated.",
|
424
|
+
help_text=f"Import {AnsibleTypeError.__name__!r} instead.",
|
425
|
+
version="2.23",
|
426
|
+
)
|
427
|
+
|
428
|
+
return AnsibleTypeError
|
429
|
+
|
430
|
+
raise AttributeError(f'module {__name__!r} has no attribute {name!r}')
|