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
@@ -0,0 +1,31 @@
|
|
1
|
+
"""Legacy wire format for controller to module communication."""
|
2
|
+
|
3
|
+
from __future__ import annotations as _annotations
|
4
|
+
|
5
|
+
import datetime as _datetime
|
6
|
+
|
7
|
+
from .. import _profiles
|
8
|
+
|
9
|
+
|
10
|
+
class _Profile(_profiles._JSONSerializationProfile["Encoder", "Decoder"]):
|
11
|
+
@classmethod
|
12
|
+
def post_init(cls) -> None:
|
13
|
+
cls.serialize_map = {}
|
14
|
+
cls.serialize_map.update(cls._common_discard_tags)
|
15
|
+
cls.serialize_map.update(
|
16
|
+
{
|
17
|
+
set: cls.serialize_as_list, # legacy _json_encode_fallback behavior
|
18
|
+
tuple: cls.serialize_as_list, # JSONEncoder built-in behavior
|
19
|
+
_datetime.date: cls.serialize_as_isoformat,
|
20
|
+
_datetime.time: cls.serialize_as_isoformat, # always failed pre-2.18, so okay to include for consistency
|
21
|
+
_datetime.datetime: cls.serialize_as_isoformat,
|
22
|
+
}
|
23
|
+
)
|
24
|
+
|
25
|
+
|
26
|
+
class Encoder(_profiles.AnsibleProfileJSONEncoder):
|
27
|
+
_profile = _Profile
|
28
|
+
|
29
|
+
|
30
|
+
class Decoder(_profiles.AnsibleProfileJSONDecoder):
|
31
|
+
_profile = _Profile
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""Legacy wire format for module to controller communication."""
|
2
|
+
|
3
|
+
from __future__ import annotations as _annotations
|
4
|
+
|
5
|
+
import datetime as _datetime
|
6
|
+
|
7
|
+
from .. import _profiles
|
8
|
+
from ansible.module_utils.common.text.converters import to_text as _to_text
|
9
|
+
|
10
|
+
|
11
|
+
class _Profile(_profiles._JSONSerializationProfile["Encoder", "Decoder"]):
|
12
|
+
@classmethod
|
13
|
+
def bytes_to_text(cls, value: bytes) -> str:
|
14
|
+
return _to_text(value, errors='surrogateescape')
|
15
|
+
|
16
|
+
@classmethod
|
17
|
+
def post_init(cls) -> None:
|
18
|
+
cls.allowed_ansible_serializable_types = _profiles._common_module_types | _profiles._common_module_response_types
|
19
|
+
|
20
|
+
cls.serialize_map = {
|
21
|
+
bytes: cls.bytes_to_text, # legacy behavior from jsonify and container_to_text
|
22
|
+
set: cls.serialize_as_list, # legacy _json_encode_fallback behavior
|
23
|
+
tuple: cls.serialize_as_list, # JSONEncoder built-in behavior
|
24
|
+
_datetime.date: cls.serialize_as_isoformat, # legacy parameters.py does this before serialization
|
25
|
+
_datetime.time: cls.serialize_as_isoformat, # always failed pre-2.18, so okay to include for consistency
|
26
|
+
_datetime.datetime: cls.serialize_as_isoformat, # legacy _json_encode_fallback behavior *and* legacy parameters.py does this before serialization
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
class Encoder(_profiles.AnsibleProfileJSONEncoder):
|
31
|
+
_profile = _Profile
|
32
|
+
|
33
|
+
|
34
|
+
class Decoder(_profiles.AnsibleProfileJSONDecoder):
|
35
|
+
_profile = _Profile
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""Data tagging aware wire format for controller to module communication."""
|
2
|
+
|
3
|
+
from __future__ import annotations as _annotations
|
4
|
+
|
5
|
+
import datetime as _datetime
|
6
|
+
|
7
|
+
from ... import _datatag
|
8
|
+
from .. import _profiles
|
9
|
+
|
10
|
+
|
11
|
+
class _Profile(_profiles._JSONSerializationProfile["Encoder", "Decoder"]):
|
12
|
+
encode_strings_as_utf8 = True
|
13
|
+
|
14
|
+
@classmethod
|
15
|
+
def post_init(cls) -> None:
|
16
|
+
cls.serialize_map = {}
|
17
|
+
cls.serialize_map.update(cls._common_discard_tags)
|
18
|
+
cls.serialize_map.update(
|
19
|
+
{
|
20
|
+
# The bytes type is not supported, use str instead (future module profiles may support a bytes wrapper distinct from `bytes`).
|
21
|
+
set: cls.serialize_as_list, # legacy _json_encode_fallback behavior
|
22
|
+
tuple: cls.serialize_as_list, # JSONEncoder built-in behavior
|
23
|
+
_datetime.date: _datatag.AnsibleSerializableDate,
|
24
|
+
_datetime.time: _datatag.AnsibleSerializableTime,
|
25
|
+
_datetime.datetime: _datatag.AnsibleSerializableDateTime,
|
26
|
+
}
|
27
|
+
)
|
28
|
+
|
29
|
+
|
30
|
+
class Encoder(_profiles.AnsibleProfileJSONEncoder):
|
31
|
+
_profile = _Profile
|
32
|
+
|
33
|
+
|
34
|
+
class Decoder(_profiles.AnsibleProfileJSONDecoder):
|
35
|
+
_profile = _Profile
|
@@ -0,0 +1,33 @@
|
|
1
|
+
"""Data tagging aware wire format for module to controller communication."""
|
2
|
+
|
3
|
+
from __future__ import annotations as _annotations
|
4
|
+
|
5
|
+
import datetime as _datetime
|
6
|
+
|
7
|
+
from ... import _datatag
|
8
|
+
from .. import _profiles
|
9
|
+
|
10
|
+
|
11
|
+
class _Profile(_profiles._JSONSerializationProfile["Encoder", "Decoder"]):
|
12
|
+
encode_strings_as_utf8 = True
|
13
|
+
|
14
|
+
@classmethod
|
15
|
+
def post_init(cls) -> None:
|
16
|
+
cls.allowed_ansible_serializable_types = _profiles._common_module_types | _profiles._common_module_response_types
|
17
|
+
|
18
|
+
cls.serialize_map = {
|
19
|
+
# The bytes type is not supported, use str instead (future module profiles may support a bytes wrapper distinct from `bytes`).
|
20
|
+
set: cls.serialize_as_list, # legacy _json_encode_fallback behavior
|
21
|
+
tuple: cls.serialize_as_list, # JSONEncoder built-in behavior
|
22
|
+
_datetime.date: _datatag.AnsibleSerializableDate,
|
23
|
+
_datetime.time: _datatag.AnsibleSerializableTime,
|
24
|
+
_datetime.datetime: _datatag.AnsibleSerializableDateTime,
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
class Encoder(_profiles.AnsibleProfileJSONEncoder):
|
29
|
+
_profile = _Profile
|
30
|
+
|
31
|
+
|
32
|
+
class Decoder(_profiles.AnsibleProfileJSONDecoder):
|
33
|
+
_profile = _Profile
|
@@ -0,0 +1,50 @@
|
|
1
|
+
"""
|
2
|
+
Lossy best-effort serialization for Ansible variables.
|
3
|
+
Default profile for the `to_json` filter.
|
4
|
+
Deserialization behavior is identical to JSONDecoder, except known Ansible custom serialization markers will raise an error.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from __future__ import annotations as _annotations
|
8
|
+
|
9
|
+
import datetime as _datetime
|
10
|
+
import functools as _functools
|
11
|
+
|
12
|
+
from ... import _datatag
|
13
|
+
from .. import _profiles
|
14
|
+
|
15
|
+
|
16
|
+
class _Profile(_profiles._JSONSerializationProfile["Encoder", "Decoder"]):
|
17
|
+
@classmethod
|
18
|
+
def post_init(cls) -> None:
|
19
|
+
cls.serialize_map = {
|
20
|
+
# DTFIX-RELEASE: support serialization of every type that is supported in the Ansible variable type system
|
21
|
+
set: cls.serialize_as_list,
|
22
|
+
tuple: cls.serialize_as_list,
|
23
|
+
_datetime.date: cls.serialize_as_isoformat,
|
24
|
+
_datetime.time: cls.serialize_as_isoformat,
|
25
|
+
_datetime.datetime: cls.serialize_as_isoformat,
|
26
|
+
# bytes intentionally omitted as they are not a supported variable type, they were not originally supported by the old AnsibleJSONEncoder
|
27
|
+
_datatag._AnsibleTaggedDate: cls.discard_tags,
|
28
|
+
_datatag._AnsibleTaggedTime: cls.discard_tags,
|
29
|
+
_datatag._AnsibleTaggedDateTime: cls.discard_tags,
|
30
|
+
_datatag._AnsibleTaggedStr: cls.discard_tags,
|
31
|
+
_datatag._AnsibleTaggedInt: cls.discard_tags,
|
32
|
+
_datatag._AnsibleTaggedFloat: cls.discard_tags,
|
33
|
+
_datatag._AnsibleTaggedSet: cls.discard_tags,
|
34
|
+
_datatag._AnsibleTaggedList: cls.discard_tags,
|
35
|
+
_datatag._AnsibleTaggedTuple: cls.discard_tags,
|
36
|
+
_datatag._AnsibleTaggedDict: cls.discard_tags,
|
37
|
+
}
|
38
|
+
|
39
|
+
cls.deserialize_map = {
|
40
|
+
'__ansible_unsafe': _functools.partial(cls.unsupported_target_type_error, '__ansible_unsafe'),
|
41
|
+
'__ansible_vault': _functools.partial(cls.unsupported_target_type_error, '__ansible_vault'),
|
42
|
+
}
|
43
|
+
|
44
|
+
|
45
|
+
class Encoder(_profiles.AnsibleProfileJSONEncoder):
|
46
|
+
_profile = _Profile
|
47
|
+
|
48
|
+
|
49
|
+
class Decoder(_profiles.AnsibleProfileJSONDecoder):
|
50
|
+
_profile = _Profile
|
@@ -0,0 +1,66 @@
|
|
1
|
+
"""Infrastructure for patching callables with alternative implementations as needed based on patch-specific test criteria."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import abc
|
6
|
+
import typing as t
|
7
|
+
|
8
|
+
|
9
|
+
@t.runtime_checkable
|
10
|
+
class PatchedTarget(t.Protocol):
|
11
|
+
"""Runtime-checkable protocol that allows identification of a patched function via `isinstance`."""
|
12
|
+
|
13
|
+
unpatched_implementation: t.Callable
|
14
|
+
|
15
|
+
|
16
|
+
class CallablePatch(abc.ABC):
|
17
|
+
"""Base class for patches that provides abstractions for validation of broken behavior, installation of patches, and validation of fixed behavior."""
|
18
|
+
|
19
|
+
target_container: t.ClassVar
|
20
|
+
"""The module object containing the function to be patched."""
|
21
|
+
|
22
|
+
target_attribute: t.ClassVar[str]
|
23
|
+
"""The attribute name on the target module to patch."""
|
24
|
+
|
25
|
+
unpatched_implementation: t.ClassVar[t.Callable]
|
26
|
+
"""The unpatched implementation. Available only after the patch has been applied."""
|
27
|
+
|
28
|
+
@classmethod
|
29
|
+
@abc.abstractmethod
|
30
|
+
def is_patch_needed(cls) -> bool:
|
31
|
+
"""Returns True if the patch is currently needed. Returns False if the original target does not need the patch or the patch has already been applied."""
|
32
|
+
|
33
|
+
@abc.abstractmethod
|
34
|
+
def __call__(self, *args, **kwargs) -> t.Any:
|
35
|
+
"""Invoke the patched or original implementation, depending on whether the patch has been applied or not."""
|
36
|
+
|
37
|
+
@classmethod
|
38
|
+
def is_patched(cls) -> bool:
|
39
|
+
"""Returns True if the patch has been applied, otherwise returns False."""
|
40
|
+
return isinstance(cls.get_current_implementation(), PatchedTarget) # using a protocol lets us be more resilient to module unload weirdness
|
41
|
+
|
42
|
+
@classmethod
|
43
|
+
def get_current_implementation(cls) -> t.Any:
|
44
|
+
"""Get the current (possibly patched) implementation from the patch target container."""
|
45
|
+
return getattr(cls.target_container, cls.target_attribute)
|
46
|
+
|
47
|
+
@classmethod
|
48
|
+
def patch(cls) -> None:
|
49
|
+
"""Idempotently apply this patch (if needed)."""
|
50
|
+
if cls.is_patched():
|
51
|
+
return
|
52
|
+
|
53
|
+
cls.unpatched_implementation = cls.get_current_implementation()
|
54
|
+
|
55
|
+
if not cls.is_patch_needed():
|
56
|
+
return
|
57
|
+
|
58
|
+
# __call__ requires an instance (otherwise it'll be __new__)
|
59
|
+
setattr(cls.target_container, cls.target_attribute, cls())
|
60
|
+
|
61
|
+
if not cls.is_patch_needed():
|
62
|
+
return
|
63
|
+
|
64
|
+
setattr(cls.target_container, cls.target_attribute, cls.unpatched_implementation)
|
65
|
+
|
66
|
+
raise RuntimeError(f"Validation of '{cls.target_container.__name__}.{cls.target_attribute}' failed after patching.")
|
@@ -0,0 +1,55 @@
|
|
1
|
+
"""Patches for builtin `dataclasses` module."""
|
2
|
+
|
3
|
+
# deprecated: description='verify ClassVar support in dataclasses has been fixed in Python before removing this patching code', python_version='3.13'
|
4
|
+
|
5
|
+
from __future__ import annotations
|
6
|
+
|
7
|
+
import dataclasses
|
8
|
+
import sys
|
9
|
+
import typing as t
|
10
|
+
|
11
|
+
from . import CallablePatch
|
12
|
+
|
13
|
+
# trigger the bug by exposing typing.ClassVar via a module reference that is not `typing`
|
14
|
+
_ts = sys.modules[__name__]
|
15
|
+
ClassVar = t.ClassVar
|
16
|
+
|
17
|
+
|
18
|
+
class DataclassesIsTypePatch(CallablePatch):
|
19
|
+
"""Patch broken ClassVar support in dataclasses when ClassVar is accessed via a module other than `typing`."""
|
20
|
+
|
21
|
+
target_container: t.ClassVar = dataclasses
|
22
|
+
target_attribute = '_is_type'
|
23
|
+
|
24
|
+
@classmethod
|
25
|
+
def is_patch_needed(cls) -> bool:
|
26
|
+
@dataclasses.dataclass
|
27
|
+
class CheckClassVar:
|
28
|
+
# this is the broken case requiring patching: ClassVar dot-referenced from a module that is not `typing` is treated as an instance field
|
29
|
+
# DTFIX-RELEASE: add link to CPython bug report to-be-filed (or update associated deprecation comments if we don't)
|
30
|
+
a_classvar: _ts.ClassVar[int] # type: ignore[name-defined]
|
31
|
+
a_field: int
|
32
|
+
|
33
|
+
return len(dataclasses.fields(CheckClassVar)) != 1
|
34
|
+
|
35
|
+
def __call__(self, annotation, cls, a_module, a_type, is_type_predicate) -> bool:
|
36
|
+
"""
|
37
|
+
This is a patched copy of `_is_type` from dataclasses.py in Python 3.13.
|
38
|
+
It eliminates the redundant source module reference equality check for the ClassVar type that triggers the bug.
|
39
|
+
"""
|
40
|
+
match = dataclasses._MODULE_IDENTIFIER_RE.match(annotation) # type: ignore[attr-defined]
|
41
|
+
if match:
|
42
|
+
ns = None
|
43
|
+
module_name = match.group(1)
|
44
|
+
if not module_name:
|
45
|
+
# No module name, assume the class's module did
|
46
|
+
# "from dataclasses import InitVar".
|
47
|
+
ns = sys.modules.get(cls.__module__).__dict__
|
48
|
+
else:
|
49
|
+
# Look up module_name in the class's module.
|
50
|
+
module = sys.modules.get(cls.__module__)
|
51
|
+
if module and module.__dict__.get(module_name): # this is the patched line; removed `is a_module`
|
52
|
+
ns = sys.modules.get(a_type.__module__).__dict__
|
53
|
+
if ns and is_type_predicate(ns.get(match.group(2)), a_module):
|
54
|
+
return True
|
55
|
+
return False
|
@@ -0,0 +1,34 @@
|
|
1
|
+
"""Patches for builtin socket module."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import contextlib
|
6
|
+
import socket
|
7
|
+
import typing as t
|
8
|
+
|
9
|
+
from . import CallablePatch
|
10
|
+
|
11
|
+
|
12
|
+
class _CustomInt(int):
|
13
|
+
"""Wrapper around `int` to test if subclasses are accepted."""
|
14
|
+
|
15
|
+
|
16
|
+
class GetAddrInfoPatch(CallablePatch):
|
17
|
+
"""Patch `socket.getaddrinfo` so that its `port` arg works with `int` subclasses."""
|
18
|
+
|
19
|
+
target_container: t.ClassVar = socket
|
20
|
+
target_attribute = 'getaddrinfo'
|
21
|
+
|
22
|
+
@classmethod
|
23
|
+
def is_patch_needed(cls) -> bool:
|
24
|
+
with contextlib.suppress(OSError):
|
25
|
+
socket.getaddrinfo('127.0.0.1', _CustomInt(22))
|
26
|
+
return False
|
27
|
+
|
28
|
+
return True
|
29
|
+
|
30
|
+
def __call__(self, host, port, *args, **kwargs) -> t.Any:
|
31
|
+
if type(port) is not int and isinstance(port, int): # pylint: disable=unidiomatic-typecheck
|
32
|
+
port = int(port)
|
33
|
+
|
34
|
+
return type(self).unpatched_implementation(host, port, *args, **kwargs)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
"""Patches for the builtin `sys` module."""
|
2
|
+
|
3
|
+
from __future__ import annotations
|
4
|
+
|
5
|
+
import contextlib
|
6
|
+
import sys
|
7
|
+
import typing as t
|
8
|
+
|
9
|
+
from . import CallablePatch
|
10
|
+
|
11
|
+
|
12
|
+
class _CustomStr(str):
|
13
|
+
"""Wrapper around `str` to test if subclasses are accepted."""
|
14
|
+
|
15
|
+
|
16
|
+
class SysInternPatch(CallablePatch):
|
17
|
+
"""Patch `sys.intern` so that subclasses of `str` are accepted."""
|
18
|
+
|
19
|
+
target_container: t.ClassVar = sys
|
20
|
+
target_attribute = 'intern'
|
21
|
+
|
22
|
+
@classmethod
|
23
|
+
def is_patch_needed(cls) -> bool:
|
24
|
+
with contextlib.suppress(TypeError):
|
25
|
+
sys.intern(_CustomStr("x"))
|
26
|
+
return False
|
27
|
+
|
28
|
+
return True
|
29
|
+
|
30
|
+
def __call__(self, value: str):
|
31
|
+
if type(value) is not str and isinstance(value, str): # pylint: disable=unidiomatic-typecheck
|
32
|
+
value = str(value)
|
33
|
+
|
34
|
+
return type(self).unpatched_implementation(value)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import typing as t
|
4
|
+
|
5
|
+
from ._ambient_context import AmbientContextBase
|
6
|
+
from ..common.messages import PluginInfo
|
7
|
+
|
8
|
+
|
9
|
+
class HasPluginInfo(t.Protocol):
|
10
|
+
"""Protocol to type-annotate and expose PluginLoader-set values."""
|
11
|
+
|
12
|
+
@property
|
13
|
+
def _load_name(self) -> str:
|
14
|
+
"""The requested name used to load the plugin."""
|
15
|
+
|
16
|
+
@property
|
17
|
+
def ansible_name(self) -> str:
|
18
|
+
"""Fully resolved plugin name."""
|
19
|
+
|
20
|
+
@property
|
21
|
+
def plugin_type(self) -> str:
|
22
|
+
"""Plugin type name."""
|
23
|
+
|
24
|
+
|
25
|
+
class PluginExecContext(AmbientContextBase):
|
26
|
+
"""Execution context that wraps all plugin invocations to allow infrastructure introspection of the currently-executing plugin instance."""
|
27
|
+
|
28
|
+
def __init__(self, executing_plugin: HasPluginInfo) -> None:
|
29
|
+
self._executing_plugin = executing_plugin
|
30
|
+
|
31
|
+
@property
|
32
|
+
def executing_plugin(self) -> HasPluginInfo:
|
33
|
+
return self._executing_plugin
|
34
|
+
|
35
|
+
@property
|
36
|
+
def plugin_info(self) -> PluginInfo:
|
37
|
+
return PluginInfo(
|
38
|
+
requested_name=self._executing_plugin._load_name,
|
39
|
+
resolved_name=self._executing_plugin.ansible_name,
|
40
|
+
type=self._executing_plugin.plugin_type,
|
41
|
+
)
|
42
|
+
|
43
|
+
@classmethod
|
44
|
+
def get_current_plugin_info(cls) -> PluginInfo | None:
|
45
|
+
"""Utility method to extract a PluginInfo for the currently executing plugin (or None if no plugin is executing)."""
|
46
|
+
if ctx := cls.current(optional=True):
|
47
|
+
return ctx.plugin_info
|
48
|
+
|
49
|
+
return None
|
File without changes
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# Copyright (c) 2024 Ansible Project
|
2
|
+
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
|
3
|
+
|
4
|
+
"""Internal utility code for supporting traceback reporting."""
|
5
|
+
|
6
|
+
from __future__ import annotations
|
7
|
+
|
8
|
+
import enum
|
9
|
+
import inspect
|
10
|
+
import traceback
|
11
|
+
|
12
|
+
|
13
|
+
class TracebackEvent(enum.Enum):
|
14
|
+
"""The events for which tracebacks can be enabled."""
|
15
|
+
|
16
|
+
ERROR = enum.auto()
|
17
|
+
WARNING = enum.auto()
|
18
|
+
DEPRECATED = enum.auto()
|
19
|
+
|
20
|
+
|
21
|
+
def traceback_for() -> list[str]:
|
22
|
+
"""Return a list of traceback event names (not enums) which are enabled."""
|
23
|
+
return [value.name.lower() for value in TracebackEvent if is_traceback_enabled(value)]
|
24
|
+
|
25
|
+
|
26
|
+
def is_traceback_enabled(event: TracebackEvent) -> bool:
|
27
|
+
"""Return True if tracebacks are enabled for the specified event, otherwise return False."""
|
28
|
+
return _is_traceback_enabled(event)
|
29
|
+
|
30
|
+
|
31
|
+
def maybe_capture_traceback(event: TracebackEvent) -> str | None:
|
32
|
+
"""
|
33
|
+
Optionally capture a traceback for the current call stack, formatted as a string, if the specified traceback event is enabled.
|
34
|
+
The current and previous frames are omitted to mask the expected call pattern from error/warning handlers.
|
35
|
+
"""
|
36
|
+
if not is_traceback_enabled(event):
|
37
|
+
return None
|
38
|
+
|
39
|
+
tb_lines = []
|
40
|
+
|
41
|
+
if current_frame := inspect.currentframe():
|
42
|
+
# DTFIX-FUTURE: rewrite target-side tracebacks to point at controller-side paths?
|
43
|
+
frames = inspect.getouterframes(current_frame)
|
44
|
+
ignore_frame_count = 2 # ignore this function and its caller
|
45
|
+
tb_lines.append('Traceback (most recent call last):\n')
|
46
|
+
tb_lines.extend(traceback.format_stack(frames[ignore_frame_count].frame))
|
47
|
+
else:
|
48
|
+
tb_lines.append('Traceback unavailable.\n')
|
49
|
+
|
50
|
+
return ''.join(tb_lines)
|
51
|
+
|
52
|
+
|
53
|
+
def maybe_extract_traceback(exception: BaseException, event: TracebackEvent) -> str | None:
|
54
|
+
"""Optionally extract a formatted traceback from the given exception, if the specified traceback event is enabled."""
|
55
|
+
|
56
|
+
if not is_traceback_enabled(event):
|
57
|
+
return None
|
58
|
+
|
59
|
+
# deprecated: description='use the single-arg version of format_traceback' python_version='3.9'
|
60
|
+
tb_lines = traceback.format_exception(type(exception), exception, exception.__traceback__)
|
61
|
+
|
62
|
+
return ''.join(tb_lines)
|
63
|
+
|
64
|
+
|
65
|
+
_module_tracebacks_enabled_events: frozenset[TracebackEvent] | None = None
|
66
|
+
"""Cached enabled TracebackEvent values extracted from `_ansible_tracebacks_for` module arg."""
|
67
|
+
|
68
|
+
|
69
|
+
def _is_module_traceback_enabled(event: TracebackEvent) -> bool:
|
70
|
+
"""Module utility function to lazily load traceback config and determine if traceback collection is enabled for the specified event."""
|
71
|
+
global _module_tracebacks_enabled_events
|
72
|
+
|
73
|
+
if _module_tracebacks_enabled_events is None:
|
74
|
+
try:
|
75
|
+
# Suboptimal error handling, but since import order can matter, and this is a critical error path, better to fail silently
|
76
|
+
# than to mask the triggering error by issuing a new error/warning here.
|
77
|
+
from ..basic import _PARSED_MODULE_ARGS
|
78
|
+
|
79
|
+
_module_tracebacks_enabled_events = frozenset(
|
80
|
+
TracebackEvent[value.upper()] for value in _PARSED_MODULE_ARGS.get('_ansible_tracebacks_for')
|
81
|
+
) # type: ignore[union-attr]
|
82
|
+
except BaseException:
|
83
|
+
return True # if things failed early enough that we can't figure this out, assume we want a traceback for troubleshooting
|
84
|
+
|
85
|
+
return event in _module_tracebacks_enabled_events
|
86
|
+
|
87
|
+
|
88
|
+
_is_traceback_enabled = _is_module_traceback_enabled
|
89
|
+
"""Callable to determine if tracebacks are enabled. Overridden on the controller by display. Use `is_traceback_enabled` instead of calling this directly."""
|