ansible-core 2.18.7rc1__py3-none-any.whl → 2.19.0__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.
Potentially problematic release.
This version of ansible-core might be problematic. Click here for more details.
- ansible/_internal/__init__.py +53 -0
- ansible/_internal/_ansiballz/__init__.py +0 -0
- ansible/_internal/_ansiballz/_builder.py +101 -0
- ansible/_internal/_ansiballz/_wrapper.py +262 -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/_alarm_timeout.py +66 -0
- ansible/_internal/_errors/_captured.py +123 -0
- ansible/_internal/_errors/_error_factory.py +89 -0
- ansible/_internal/_errors/_error_utils.py +240 -0
- ansible/_internal/_errors/_handler.py +91 -0
- ansible/_internal/_errors/_task_timeout.py +28 -0
- ansible/_internal/_event_formatting.py +127 -0
- ansible/_internal/_json/__init__.py +214 -0
- ansible/_internal/_json/_legacy_encoder.py +34 -0
- ansible/_internal/_json/_profiles/__init__.py +0 -0
- ansible/_internal/_json/_profiles/_cache_persistence.py +57 -0
- ansible/_internal/_json/_profiles/_inventory_legacy.py +40 -0
- ansible/_internal/_json/_profiles/_legacy.py +189 -0
- ansible/_internal/_locking.py +21 -0
- ansible/_internal/_plugins/__init__.py +0 -0
- ansible/_internal/_plugins/_cache.py +57 -0
- ansible/_internal/_ssh/__init__.py +0 -0
- ansible/_internal/_ssh/_agent_launch.py +91 -0
- ansible/_internal/_ssh/_ssh_agent.py +619 -0
- ansible/_internal/_task.py +78 -0
- ansible/_internal/_templating/__init__.py +12 -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 +592 -0
- ansible/_internal/_templating/_errors.py +28 -0
- ansible/_internal/_templating/_jinja_bits.py +1106 -0
- ansible/_internal/_templating/_jinja_common.py +323 -0
- ansible/_internal/_templating/_jinja_patches.py +44 -0
- ansible/_internal/_templating/_jinja_plugins.py +375 -0
- ansible/_internal/_templating/_lazy_containers.py +633 -0
- ansible/_internal/_templating/_marker_behaviors.py +103 -0
- ansible/_internal/_templating/_template_vars.py +72 -0
- ansible/_internal/_templating/_transform.py +70 -0
- ansible/_internal/_templating/_utils.py +108 -0
- ansible/_internal/_testing.py +26 -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 +70 -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 +27 -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 +93 -104
- ansible/cli/_ssh_askpass.py +54 -0
- ansible/cli/adhoc.py +20 -10
- ansible/cli/arguments/option_helpers.py +163 -10
- ansible/cli/config.py +43 -68
- ansible/cli/console.py +13 -11
- ansible/cli/doc.py +134 -77
- ansible/cli/galaxy.py +27 -20
- ansible/cli/inventory.py +28 -28
- ansible/cli/playbook.py +4 -12
- ansible/cli/pull.py +6 -3
- ansible/cli/scripts/ansible_connection_cli_stub.py +7 -7
- ansible/cli/vault.py +12 -11
- ansible/compat/__init__.py +2 -2
- ansible/compat/importlib_resources.py +9 -12
- ansible/config/base.yml +218 -133
- ansible/config/manager.py +220 -159
- ansible/constants.py +2 -65
- ansible/errors/__init__.py +350 -256
- ansible/executor/interpreter_discovery.py +28 -149
- ansible/executor/module_common.py +480 -514
- 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 +204 -153
- ansible/executor/powershell/become_wrapper.ps1 +107 -144
- ansible/executor/powershell/bootstrap_wrapper.ps1 +46 -9
- ansible/executor/powershell/coverage_wrapper.ps1 +91 -135
- ansible/executor/powershell/exec_wrapper.ps1 +675 -196
- ansible/executor/powershell/module_manifest.py +469 -265
- ansible/executor/powershell/module_wrapper.ps1 +195 -186
- ansible/executor/powershell/powershell_expand_user.ps1 +20 -0
- ansible/executor/powershell/powershell_mkdtemp.ps1 +17 -0
- 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 +139 -149
- ansible/executor/stats.py +5 -5
- ansible/executor/task_executor.py +270 -297
- ansible/executor/task_queue_manager.py +135 -137
- ansible/executor/task_result.py +182 -79
- ansible/galaxy/__init__.py +2 -2
- ansible/galaxy/api.py +26 -25
- ansible/galaxy/collection/__init__.py +6 -14
- ansible/galaxy/collection/concrete_artifact_manager.py +12 -21
- ansible/galaxy/dependency_resolution/dataclasses.py +14 -4
- ansible/galaxy/dependency_resolution/providers.py +4 -4
- ansible/galaxy/dependency_resolution/reporters.py +81 -0
- ansible/galaxy/role.py +6 -10
- ansible/galaxy/token.py +28 -21
- ansible/inventory/data.py +47 -57
- ansible/inventory/group.py +50 -73
- ansible/inventory/helpers.py +9 -0
- ansible/inventory/host.py +37 -54
- ansible/inventory/manager.py +79 -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/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/__init__.py +0 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_coverage.py +45 -0
- ansible/module_utils/_internal/_ansiballz/_extensions/_pydevd.py +62 -0
- ansible/module_utils/_internal/_ansiballz/_loader.py +81 -0
- ansible/module_utils/_internal/_ansiballz/_respawn.py +32 -0
- ansible/module_utils/_internal/_ansiballz/_respawn_wrapper.py +23 -0
- ansible/module_utils/_internal/_concurrent/_daemon_threading.py +1 -0
- ansible/module_utils/_internal/_dataclass_validation.py +217 -0
- ansible/module_utils/_internal/_datatag/__init__.py +961 -0
- ansible/module_utils/_internal/_datatag/_tags.py +16 -0
- ansible/module_utils/_internal/_debugging.py +31 -0
- ansible/module_utils/_internal/_deprecator.py +157 -0
- ansible/module_utils/_internal/_errors.py +101 -0
- ansible/module_utils/_internal/_event_utils.py +61 -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 +428 -0
- ansible/module_utils/_internal/_json/_profiles/_fallback_to_str.py +73 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_c2m.py +33 -0
- ansible/module_utils/_internal/_json/_profiles/_module_legacy_m2c.py +37 -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 +52 -0
- ansible/module_utils/_internal/_messages.py +130 -0
- ansible/module_utils/_internal/_patches/__init__.py +66 -0
- ansible/module_utils/_internal/_patches/_dataclass_annotation_patch.py +53 -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_info.py +38 -0
- ansible/module_utils/_internal/_stack.py +22 -0
- ansible/module_utils/_internal/_testing.py +0 -0
- ansible/module_utils/_internal/_text_utils.py +6 -0
- ansible/module_utils/_internal/_traceback.py +92 -0
- ansible/module_utils/_internal/_validation.py +14 -0
- ansible/module_utils/ansible_release.py +2 -2
- ansible/module_utils/api.py +1 -2
- ansible/module_utils/basic.py +303 -202
- ansible/module_utils/common/_utils.py +24 -28
- ansible/module_utils/common/arg_spec.py +8 -3
- ansible/module_utils/common/collections.py +7 -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/parameters.py +27 -24
- ansible/module_utils/common/process.py +2 -3
- ansible/module_utils/common/respawn.py +11 -33
- 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 +143 -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 +10 -13
- ansible/module_utils/csharp/Ansible.Basic.cs +15 -12
- ansible/module_utils/csharp/Ansible.Become.cs +1 -0
- ansible/module_utils/csharp/Ansible.Privilege.cs +2 -2
- ansible/module_utils/csharp/Ansible._Async.cs +517 -0
- ansible/module_utils/datatag.py +49 -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 +2 -2
- 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 +5 -5
- 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 +2 -3
- ansible/module_utils/facts/other/ohai.py +2 -3
- ansible/module_utils/facts/sysctl.py +4 -6
- ansible/module_utils/facts/system/apparmor.py +1 -2
- ansible/module_utils/facts/system/caps.py +3 -3
- 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 +27 -13
- 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 +2 -3
- 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/linux.py +3 -3
- 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 +7 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.AddType.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CamelConversion.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.CommandUtil.psm1 +1 -1
- ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
- ansible/module_utils/service.py +21 -31
- ansible/module_utils/splitter.py +7 -7
- ansible/module_utils/testing.py +31 -0
- ansible/module_utils/urls.py +64 -35
- ansible/modules/add_host.py +4 -4
- ansible/modules/apt.py +69 -49
- ansible/modules/apt_key.py +19 -12
- ansible/modules/apt_repository.py +32 -51
- ansible/modules/assemble.py +16 -14
- ansible/modules/assert.py +4 -4
- ansible/modules/async_status.py +24 -24
- ansible/modules/async_wrapper.py +20 -25
- ansible/modules/blockinfile.py +6 -7
- ansible/modules/command.py +13 -20
- ansible/modules/copy.py +60 -147
- ansible/modules/cron.py +24 -21
- 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 +13 -15
- ansible/modules/fail.py +4 -4
- ansible/modules/fetch.py +4 -4
- ansible/modules/file.py +184 -144
- ansible/modules/find.py +22 -20
- ansible/modules/gather_facts.py +3 -3
- ansible/modules/get_url.py +77 -54
- ansible/modules/getent.py +7 -9
- ansible/modules/git.py +38 -38
- ansible/modules/group.py +6 -6
- ansible/modules/group_by.py +4 -4
- ansible/modules/hostname.py +15 -32
- 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 +22 -24
- ansible/modules/lineinfile.py +5 -5
- ansible/modules/meta.py +4 -4
- ansible/modules/mount_facts.py +2 -2
- ansible/modules/package.py +10 -4
- ansible/modules/package_facts.py +22 -10
- ansible/modules/pause.py +6 -6
- ansible/modules/ping.py +6 -6
- ansible/modules/pip.py +21 -26
- ansible/modules/raw.py +6 -6
- ansible/modules/reboot.py +6 -6
- ansible/modules/replace.py +10 -14
- ansible/modules/rpm_key.py +7 -8
- ansible/modules/script.py +4 -4
- ansible/modules/service.py +10 -17
- 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 +16 -19
- ansible/modules/stat.py +15 -31
- ansible/modules/subversion.py +15 -15
- ansible/modules/systemd.py +7 -7
- ansible/modules/systemd_service.py +7 -7
- ansible/modules/sysvinit.py +9 -9
- ansible/modules/tempfile.py +5 -6
- ansible/modules/template.py +6 -6
- ansible/modules/unarchive.py +38 -17
- ansible/modules/uri.py +33 -26
- ansible/modules/user.py +45 -32
- ansible/modules/validate_argument_spec.py +10 -7
- ansible/modules/wait_for.py +70 -60
- ansible/modules/wait_for_connection.py +6 -6
- ansible/modules/yum_repository.py +10 -9
- ansible/parsing/ajson.py +17 -37
- ansible/parsing/dataloader.py +99 -54
- ansible/parsing/mod_args.py +62 -60
- 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 +327 -99
- 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 +187 -134
- 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 +32 -26
- ansible/playbook/loop_control.py +2 -2
- ansible/playbook/play.py +85 -44
- ansible/playbook/play_context.py +14 -17
- ansible/playbook/playbook_include.py +27 -62
- ansible/playbook/role/__init__.py +64 -49
- 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 +28 -12
- ansible/playbook/task.py +192 -121
- ansible/playbook/task_include.py +5 -5
- ansible/plugins/__init__.py +58 -26
- ansible/plugins/action/__init__.py +188 -186
- ansible/plugins/action/add_host.py +2 -2
- ansible/plugins/action/assemble.py +11 -18
- ansible/plugins/action/assert.py +55 -67
- ansible/plugins/action/async_status.py +7 -2
- ansible/plugins/action/copy.py +14 -17
- 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 +7 -8
- ansible/plugins/action/gather_facts.py +13 -14
- ansible/plugins/action/group_by.py +1 -1
- ansible/plugins/action/include_vars.py +10 -11
- ansible/plugins/action/package.py +8 -14
- ansible/plugins/action/pause.py +2 -2
- ansible/plugins/action/script.py +27 -38
- ansible/plugins/action/service.py +9 -18
- ansible/plugins/action/set_fact.py +3 -12
- ansible/plugins/action/set_stats.py +3 -8
- ansible/plugins/action/template.py +47 -67
- ansible/plugins/action/unarchive.py +6 -16
- ansible/plugins/action/uri.py +9 -20
- 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 +52 -63
- 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 +294 -201
- ansible/plugins/callback/default.py +99 -95
- ansible/plugins/callback/junit.py +44 -43
- ansible/plugins/callback/minimal.py +28 -25
- ansible/plugins/callback/oneline.py +34 -21
- ansible/plugins/callback/tree.py +27 -16
- ansible/plugins/connection/__init__.py +47 -34
- ansible/plugins/connection/local.py +156 -60
- ansible/plugins/connection/paramiko_ssh.py +34 -24
- ansible/plugins/connection/psrp.py +76 -165
- ansible/plugins/connection/ssh.py +326 -86
- ansible/plugins/connection/winrm.py +62 -141
- 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 +8 -4
- 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 +245 -120
- ansible/plugins/filter/encryption.py +42 -34
- 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/pow.yml +1 -1
- ansible/plugins/filter/regex_search.yml +1 -4
- ansible/plugins/filter/root.yml +1 -1
- ansible/plugins/filter/split.yml +1 -1
- ansible/plugins/filter/strftime.yml +3 -3
- ansible/plugins/filter/to_nice_yaml.yml +0 -4
- ansible/plugins/filter/to_uuid.yml +1 -1
- 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 +107 -86
- 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 +190 -120
- ansible/plugins/inventory/toml.py +16 -126
- ansible/plugins/inventory/yaml.py +10 -8
- ansible/plugins/list.py +72 -19
- ansible/plugins/loader.py +383 -198
- ansible/plugins/lookup/__init__.py +21 -4
- ansible/plugins/lookup/config.py +21 -35
- ansible/plugins/lookup/csvfile.py +19 -73
- 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 +87 -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 +47 -36
- ansible/plugins/lookup/together.py +0 -12
- ansible/plugins/lookup/unvault.py +1 -5
- ansible/plugins/lookup/url.py +4 -10
- ansible/plugins/lookup/vars.py +16 -24
- ansible/plugins/shell/__init__.py +58 -4
- ansible/plugins/shell/cmd.py +2 -2
- ansible/plugins/shell/powershell.py +106 -31
- ansible/plugins/shell/sh.py +13 -7
- ansible/plugins/strategy/__init__.py +168 -193
- 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 +75 -35
- ansible/plugins/test/files.py +1 -1
- ansible/plugins/test/finished.yml +1 -1
- ansible/plugins/test/mathstuff.py +3 -3
- ansible/plugins/test/uri.py +5 -8
- ansible/plugins/vars/host_group_vars.py +7 -14
- ansible/release.py +2 -2
- ansible/template/__init__.py +353 -943
- ansible/utils/__init__.py +0 -18
- ansible/utils/collection_loader/__init__.py +54 -5
- ansible/utils/collection_loader/_collection_config.py +5 -6
- ansible/utils/collection_loader/_collection_finder.py +82 -96
- ansible/utils/collection_loader/_collection_meta.py +15 -8
- ansible/utils/display.py +485 -73
- ansible/utils/encrypt.py +27 -19
- ansible/utils/fqcn.py +2 -2
- ansible/utils/galaxy.py +2 -2
- ansible/utils/hashing.py +8 -10
- ansible/utils/helpers.py +2 -2
- ansible/utils/listify.py +10 -8
- ansible/utils/lock.py +2 -2
- ansible/utils/path.py +10 -12
- ansible/utils/plugin_docs.py +16 -14
- ansible/utils/py3compat.py +2 -7
- ansible/utils/sentinel.py +4 -62
- ansible/utils/singleton.py +2 -0
- ansible/utils/ssh_functions.py +6 -2
- ansible/utils/unsafe_proxy.py +23 -332
- ansible/utils/vars.py +55 -8
- ansible/utils/version.py +2 -2
- ansible/vars/clean.py +5 -5
- ansible/vars/hostvars.py +60 -90
- ansible/vars/manager.py +220 -285
- ansible/vars/plugins.py +4 -4
- ansible/vars/reserved.py +13 -12
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/METADATA +4 -3
- ansible_core-2.19.0.dist-info/RECORD +1097 -0
- ansible_core-2.19.0.dist-info/licenses/licenses/BSD-3-Clause.txt +28 -0
- 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 +2 -2
- ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
- ansible_test/_data/requirements/sanity.pep8.txt +1 -1
- ansible_test/_data/requirements/sanity.pylint.txt +5 -5
- 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 +6 -0
- ansible_test/_internal/ansible_util.py +3 -1
- 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 -5
- 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 +52 -5
- 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 +3 -2
- 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 +22 -5
- 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 +3 -2
- 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 +8 -2
- 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 +19 -2
- 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 +12 -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 +25 -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 +44 -4
- ansible_test/_internal/commands/units/__init__.py +5 -1
- 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 +23 -13
- 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/debugging.py +166 -0
- ansible_test/_internal/delegation.py +22 -13
- 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 +260 -16
- ansible_test/_internal/http.py +1 -0
- ansible_test/_internal/init.py +1 -0
- ansible_test/_internal/inventory.py +39 -3
- ansible_test/_internal/io.py +1 -0
- ansible_test/_internal/metadata.py +95 -4
- ansible_test/_internal/payload.py +1 -0
- ansible_test/_internal/processes.py +80 -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 +11 -4
- ansible_test/_internal/pypi_proxy.py +6 -5
- ansible_test/_internal/python_requirements.py +28 -0
- ansible_test/_internal/ssh.py +2 -5
- ansible_test/_internal/target.py +9 -0
- ansible_test/_internal/test.py +3 -2
- ansible_test/_internal/thread.py +3 -1
- ansible_test/_internal/timeout.py +2 -1
- ansible_test/_internal/util.py +41 -12
- ansible_test/_internal/util_common.py +18 -5
- 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 +8 -5
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +8 -5
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +4 -5
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +8 -7
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_calls.py +541 -0
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated_comment.py +137 -0
- 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/injector/python.py +8 -0
- 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 +38 -36
- 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.7rc1.dist-info/RECORD +0 -992
- ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +0 -411
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/WHEEL +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/COPYING +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/Apache-License.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/MIT-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/PSF-license.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/licenses/licenses/simplified_bsd.txt +0 -0
- {ansible_core-2.18.7rc1.dist-info → ansible_core-2.19.0.dist-info}/top_level.txt +0 -0
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
"""Test metadata for passing data to delegated tests."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import dataclasses
|
|
3
6
|
import typing as t
|
|
4
7
|
|
|
5
8
|
from .util import (
|
|
6
9
|
display,
|
|
7
10
|
generate_name,
|
|
11
|
+
ANSIBLE_TEST_ROOT,
|
|
12
|
+
ANSIBLE_LIB_ROOT,
|
|
8
13
|
)
|
|
9
14
|
|
|
10
15
|
from .io import (
|
|
@@ -21,13 +26,19 @@ from .diff import (
|
|
|
21
26
|
class Metadata:
|
|
22
27
|
"""Metadata object for passing data to delegated tests."""
|
|
23
28
|
|
|
24
|
-
def __init__(self) -> None:
|
|
29
|
+
def __init__(self, debugger_flags: DebuggerFlags) -> None:
|
|
25
30
|
"""Initialize metadata."""
|
|
26
31
|
self.changes: dict[str, tuple[tuple[int, int], ...]] = {}
|
|
27
32
|
self.cloud_config: t.Optional[dict[str, dict[str, t.Union[int, str, bool]]]] = None
|
|
28
33
|
self.change_description: t.Optional[ChangeDescription] = None
|
|
29
34
|
self.ci_provider: t.Optional[str] = None
|
|
30
35
|
self.session_id = generate_name()
|
|
36
|
+
self.ansible_lib_root = ANSIBLE_LIB_ROOT
|
|
37
|
+
self.ansible_test_root = ANSIBLE_TEST_ROOT
|
|
38
|
+
self.collection_root: str | None = None
|
|
39
|
+
self.debugger_flags = debugger_flags
|
|
40
|
+
self.debugger_settings: DebuggerSettings | None = None
|
|
41
|
+
self.loaded = False
|
|
31
42
|
|
|
32
43
|
def populate_changes(self, diff: t.Optional[list[str]]) -> None:
|
|
33
44
|
"""Populate the changeset using the given diff."""
|
|
@@ -54,8 +65,13 @@ class Metadata:
|
|
|
54
65
|
changes=self.changes,
|
|
55
66
|
cloud_config=self.cloud_config,
|
|
56
67
|
ci_provider=self.ci_provider,
|
|
57
|
-
change_description=self.change_description.to_dict(),
|
|
68
|
+
change_description=self.change_description.to_dict() if self.change_description else None,
|
|
58
69
|
session_id=self.session_id,
|
|
70
|
+
ansible_lib_root=self.ansible_lib_root,
|
|
71
|
+
ansible_test_root=self.ansible_test_root,
|
|
72
|
+
collection_root=self.collection_root,
|
|
73
|
+
debugger_flags=dataclasses.asdict(self.debugger_flags),
|
|
74
|
+
debugger_settings=dataclasses.asdict(self.debugger_settings) if self.debugger_settings else None,
|
|
59
75
|
)
|
|
60
76
|
|
|
61
77
|
def to_file(self, path: str) -> None:
|
|
@@ -75,12 +91,20 @@ class Metadata:
|
|
|
75
91
|
@staticmethod
|
|
76
92
|
def from_dict(data: dict[str, t.Any]) -> Metadata:
|
|
77
93
|
"""Return metadata loaded from the specified dictionary."""
|
|
78
|
-
metadata = Metadata(
|
|
94
|
+
metadata = Metadata(
|
|
95
|
+
debugger_flags=DebuggerFlags(**data['debugger_flags']),
|
|
96
|
+
)
|
|
97
|
+
|
|
79
98
|
metadata.changes = data['changes']
|
|
80
99
|
metadata.cloud_config = data['cloud_config']
|
|
81
100
|
metadata.ci_provider = data['ci_provider']
|
|
82
|
-
metadata.change_description = ChangeDescription.from_dict(data['change_description'])
|
|
101
|
+
metadata.change_description = ChangeDescription.from_dict(data['change_description']) if data['change_description'] else None
|
|
83
102
|
metadata.session_id = data['session_id']
|
|
103
|
+
metadata.ansible_lib_root = data['ansible_lib_root']
|
|
104
|
+
metadata.ansible_test_root = data['ansible_test_root']
|
|
105
|
+
metadata.collection_root = data['collection_root']
|
|
106
|
+
metadata.debugger_settings = DebuggerSettings(**data['debugger_settings']) if data['debugger_settings'] else None
|
|
107
|
+
metadata.loaded = True
|
|
84
108
|
|
|
85
109
|
return metadata
|
|
86
110
|
|
|
@@ -129,3 +153,70 @@ class ChangeDescription:
|
|
|
129
153
|
changes.no_integration_paths = data['no_integration_paths']
|
|
130
154
|
|
|
131
155
|
return changes
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@dataclasses.dataclass(frozen=True, kw_only=True)
|
|
159
|
+
class DebuggerSettings:
|
|
160
|
+
"""Settings for remote debugging."""
|
|
161
|
+
|
|
162
|
+
module: str | None = None
|
|
163
|
+
"""
|
|
164
|
+
The Python module to import.
|
|
165
|
+
This should be pydevd or a derivative.
|
|
166
|
+
If not provided it will be auto-detected.
|
|
167
|
+
"""
|
|
168
|
+
|
|
169
|
+
package: str | None = None
|
|
170
|
+
"""
|
|
171
|
+
The Python package to install for debugging.
|
|
172
|
+
If `None` then the package will be auto-detected.
|
|
173
|
+
If an empty string, then no package will be installed.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
settrace: dict[str, object] = dataclasses.field(default_factory=dict)
|
|
177
|
+
"""
|
|
178
|
+
Options to pass to the `{module}.settrace` method.
|
|
179
|
+
Used for running AnsiballZ modules only.
|
|
180
|
+
The `host` and `port` options will be provided by ansible-test.
|
|
181
|
+
The `suspend` option defaults to `False`.
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
args: list[str] = dataclasses.field(default_factory=list)
|
|
185
|
+
"""
|
|
186
|
+
Arguments to pass to `pydevd` on the command line.
|
|
187
|
+
Used for running Ansible CLI programs only.
|
|
188
|
+
The `--client` and `--port` options will be provided by ansible-test.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
port: int = 5678
|
|
192
|
+
"""
|
|
193
|
+
The port on the origin host which is listening for incoming connections from pydevd.
|
|
194
|
+
SSH port forwarding will be automatically configured for non-local hosts to connect to this port as needed.
|
|
195
|
+
"""
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@dataclasses.dataclass(frozen=True, kw_only=True)
|
|
199
|
+
class DebuggerFlags:
|
|
200
|
+
"""Flags for enabling specific debugging features."""
|
|
201
|
+
|
|
202
|
+
self: bool = False
|
|
203
|
+
"""Debug ansible-test itself."""
|
|
204
|
+
|
|
205
|
+
ansiballz: bool = False
|
|
206
|
+
"""Debug AnsiballZ modules."""
|
|
207
|
+
|
|
208
|
+
cli: bool = False
|
|
209
|
+
"""Debug Ansible CLI programs other than ansible-test."""
|
|
210
|
+
|
|
211
|
+
on_demand: bool = False
|
|
212
|
+
"""Enable debugging features only when ansible-test is running under a debugger."""
|
|
213
|
+
|
|
214
|
+
@property
|
|
215
|
+
def enable(self) -> bool:
|
|
216
|
+
"""Return `True` if any debugger feature other than on-demand is enabled."""
|
|
217
|
+
return any(getattr(self, field.name) for field in dataclasses.fields(self) if field.name != 'on_demand')
|
|
218
|
+
|
|
219
|
+
@classmethod
|
|
220
|
+
def all(cls, enabled: bool) -> t.Self:
|
|
221
|
+
"""Return a `DebuggerFlags` instance with all flags enabled or disabled."""
|
|
222
|
+
return cls(**{field.name: enabled for field in dataclasses.fields(cls)})
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""Wrappers around `ps` for querying running processes."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import collections
|
|
6
|
+
import dataclasses
|
|
7
|
+
import os
|
|
8
|
+
import pathlib
|
|
9
|
+
import shlex
|
|
10
|
+
|
|
11
|
+
from ansible_test._internal.util import raw_command
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclasses.dataclass(frozen=True)
|
|
15
|
+
class ProcessData:
|
|
16
|
+
"""Data about a running process."""
|
|
17
|
+
|
|
18
|
+
pid: int
|
|
19
|
+
ppid: int
|
|
20
|
+
command: str
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclasses.dataclass(frozen=True)
|
|
24
|
+
class Process:
|
|
25
|
+
"""A process in the process tree."""
|
|
26
|
+
|
|
27
|
+
pid: int
|
|
28
|
+
command: str
|
|
29
|
+
parent: Process | None = None
|
|
30
|
+
children: tuple[Process, ...] = dataclasses.field(default_factory=tuple)
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def args(self) -> list[str]:
|
|
34
|
+
"""The list of arguments that make up `command`."""
|
|
35
|
+
return shlex.split(self.command)
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def path(self) -> pathlib.Path:
|
|
39
|
+
"""The path to the process."""
|
|
40
|
+
return pathlib.Path(self.args[0])
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_process_data(pids: list[int] | None = None) -> list[ProcessData]:
|
|
44
|
+
"""Return a list of running processes."""
|
|
45
|
+
if pids:
|
|
46
|
+
args = ['-p', ','.join(map(str, pids))]
|
|
47
|
+
else:
|
|
48
|
+
args = ['-A']
|
|
49
|
+
|
|
50
|
+
lines = raw_command(['ps'] + args + ['-o', 'pid,ppid,command'], capture=True)[0].splitlines()[1:]
|
|
51
|
+
processes = [ProcessData(pid=int(pid), ppid=int(ppid), command=command) for pid, ppid, command in (line.split(maxsplit=2) for line in lines)]
|
|
52
|
+
|
|
53
|
+
return processes
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_process_tree() -> dict[int, Process]:
|
|
57
|
+
"""Return the process tree."""
|
|
58
|
+
processes = get_process_data()
|
|
59
|
+
pid_to_process: dict[int, Process] = {}
|
|
60
|
+
pid_to_children: dict[int, list[Process]] = collections.defaultdict(list)
|
|
61
|
+
|
|
62
|
+
for data in processes:
|
|
63
|
+
pid_to_process[data.pid] = process = Process(pid=data.pid, command=data.command)
|
|
64
|
+
|
|
65
|
+
if data.ppid:
|
|
66
|
+
pid_to_children[data.ppid].append(process)
|
|
67
|
+
|
|
68
|
+
for data in processes:
|
|
69
|
+
pid_to_process[data.pid] = dataclasses.replace(
|
|
70
|
+
pid_to_process[data.pid],
|
|
71
|
+
parent=pid_to_process.get(data.ppid),
|
|
72
|
+
children=tuple(pid_to_children[data.pid]),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
return pid_to_process
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def get_current_process() -> Process:
|
|
79
|
+
"""Return the current process along with its ancestors and descendants."""
|
|
80
|
+
return get_process_tree()[os.getpid()]
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Provision hosts for running tests."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import collections.abc as c
|
|
@@ -115,9 +116,11 @@ def prepare_profiles(
|
|
|
115
116
|
else:
|
|
116
117
|
run_pypi_proxy(args, targets_use_pypi)
|
|
117
118
|
|
|
119
|
+
controller_host_profile = t.cast(ControllerHostProfile, create_host_profile(args, args.controller, None))
|
|
120
|
+
|
|
118
121
|
host_state = HostState(
|
|
119
|
-
controller_profile=
|
|
120
|
-
target_profiles=[create_host_profile(args, target,
|
|
122
|
+
controller_profile=controller_host_profile,
|
|
123
|
+
target_profiles=[create_host_profile(args, target, controller_host_profile) for target in args.targets],
|
|
121
124
|
)
|
|
122
125
|
|
|
123
126
|
if args.prime_containers:
|
|
@@ -136,7 +139,9 @@ def prepare_profiles(
|
|
|
136
139
|
if not skip_setup:
|
|
137
140
|
profile.setup()
|
|
138
141
|
|
|
139
|
-
dispatch_jobs(
|
|
142
|
+
dispatch_jobs(
|
|
143
|
+
[(profile, WrappedThread(functools.partial(provision, profile), f'Provision: {profile}')) for profile in host_state.profiles]
|
|
144
|
+
)
|
|
140
145
|
|
|
141
146
|
host_state.controller_profile.configure()
|
|
142
147
|
|
|
@@ -156,7 +161,9 @@ def prepare_profiles(
|
|
|
156
161
|
if requirements:
|
|
157
162
|
requirements(profile)
|
|
158
163
|
|
|
159
|
-
dispatch_jobs(
|
|
164
|
+
dispatch_jobs(
|
|
165
|
+
[(profile, WrappedThread(functools.partial(configure, profile), f'Configure: {profile}')) for profile in host_state.target_profiles]
|
|
166
|
+
)
|
|
160
167
|
|
|
161
168
|
return host_state
|
|
162
169
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""PyPI proxy management."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import os
|
|
@@ -69,7 +70,7 @@ def run_pypi_proxy(args: EnvironmentConfig, targets_use_pypi: bool) -> None:
|
|
|
69
70
|
display.warning('Unable to use the PyPI proxy because Docker is not available. Installation of packages using `pip` may fail.')
|
|
70
71
|
return
|
|
71
72
|
|
|
72
|
-
image = 'quay.io/ansible/pypi-test-container:3.
|
|
73
|
+
image = 'quay.io/ansible/pypi-test-container:3.3.0'
|
|
73
74
|
port = 3141
|
|
74
75
|
|
|
75
76
|
run_support_container(
|
|
@@ -134,11 +135,11 @@ def configure_target_pypi_proxy(args: EnvironmentConfig, profile: HostProfile, p
|
|
|
134
135
|
def configure_pypi_proxy_pip(args: EnvironmentConfig, profile: HostProfile, pypi_endpoint: str, pypi_hostname: str) -> None:
|
|
135
136
|
"""Configure a custom index for pip based installs."""
|
|
136
137
|
pip_conf_path = os.path.expanduser('~/.pip/pip.conf')
|
|
137
|
-
pip_conf =
|
|
138
|
+
pip_conf = """
|
|
138
139
|
[global]
|
|
139
140
|
index-url = {0}
|
|
140
141
|
trusted-host = {1}
|
|
141
|
-
|
|
142
|
+
""".format(pypi_endpoint, pypi_hostname).strip()
|
|
142
143
|
|
|
143
144
|
def pip_conf_cleanup() -> None:
|
|
144
145
|
"""Remove custom pip PyPI config."""
|
|
@@ -159,10 +160,10 @@ trusted-host = {1}
|
|
|
159
160
|
def configure_pypi_proxy_easy_install(args: EnvironmentConfig, profile: HostProfile, pypi_endpoint: str) -> None:
|
|
160
161
|
"""Configure a custom index for easy_install based installs."""
|
|
161
162
|
pydistutils_cfg_path = os.path.expanduser('~/.pydistutils.cfg')
|
|
162
|
-
pydistutils_cfg =
|
|
163
|
+
pydistutils_cfg = """
|
|
163
164
|
[easy_install]
|
|
164
165
|
index_url = {0}
|
|
165
|
-
|
|
166
|
+
""".format(pypi_endpoint).strip()
|
|
166
167
|
|
|
167
168
|
if os.path.exists(pydistutils_cfg_path) and not profile.config.is_managed:
|
|
168
169
|
raise ApplicationError('Refusing to overwrite existing file: %s' % pydistutils_cfg_path)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Python requirements management"""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import base64
|
|
@@ -54,6 +55,11 @@ from .coverage_util import (
|
|
|
54
55
|
get_coverage_version,
|
|
55
56
|
)
|
|
56
57
|
|
|
58
|
+
if t.TYPE_CHECKING:
|
|
59
|
+
from .host_profiles import (
|
|
60
|
+
HostProfile,
|
|
61
|
+
)
|
|
62
|
+
|
|
57
63
|
QUIET_PIP_SCRIPT_PATH = os.path.join(ANSIBLE_TEST_TARGET_ROOT, 'setup', 'quiet_pip.py')
|
|
58
64
|
REQUIREMENTS_SCRIPT_PATH = os.path.join(ANSIBLE_TEST_TARGET_ROOT, 'setup', 'requirements.py')
|
|
59
65
|
|
|
@@ -121,6 +127,7 @@ class PipBootstrap(PipCommand):
|
|
|
121
127
|
|
|
122
128
|
def install_requirements(
|
|
123
129
|
args: EnvironmentConfig,
|
|
130
|
+
host_profile: HostProfile | None,
|
|
124
131
|
python: PythonConfig,
|
|
125
132
|
ansible: bool = False,
|
|
126
133
|
command: bool = False,
|
|
@@ -132,6 +139,7 @@ def install_requirements(
|
|
|
132
139
|
create_result_directories(args)
|
|
133
140
|
|
|
134
141
|
if not requirements_allowed(args, controller):
|
|
142
|
+
post_install(host_profile)
|
|
135
143
|
return
|
|
136
144
|
|
|
137
145
|
if command and isinstance(args, (UnitsConfig, IntegrationConfig)) and args.coverage:
|
|
@@ -160,7 +168,17 @@ def install_requirements(
|
|
|
160
168
|
sanity=None,
|
|
161
169
|
)
|
|
162
170
|
|
|
171
|
+
from .host_profiles import DebuggableProfile
|
|
172
|
+
|
|
173
|
+
if isinstance(host_profile, DebuggableProfile) and host_profile.debugging_enabled and args.metadata.debugger_settings.package:
|
|
174
|
+
commands.append(PipInstall(
|
|
175
|
+
requirements=[],
|
|
176
|
+
constraints=[],
|
|
177
|
+
packages=[args.metadata.debugger_settings.package],
|
|
178
|
+
))
|
|
179
|
+
|
|
163
180
|
if not commands:
|
|
181
|
+
post_install(host_profile)
|
|
164
182
|
return
|
|
165
183
|
|
|
166
184
|
run_pip(args, python, commands, connection)
|
|
@@ -169,6 +187,16 @@ def install_requirements(
|
|
|
169
187
|
if any(isinstance(command, PipInstall) and command.has_package('pyyaml') for command in commands):
|
|
170
188
|
check_pyyaml(python)
|
|
171
189
|
|
|
190
|
+
post_install(host_profile)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def post_install(host_profile: HostProfile) -> None:
|
|
194
|
+
"""Operations to perform after requirements are installed."""
|
|
195
|
+
from .host_profiles import DebuggableProfile
|
|
196
|
+
|
|
197
|
+
if isinstance(host_profile, DebuggableProfile):
|
|
198
|
+
host_profile.activate_debugger()
|
|
199
|
+
|
|
172
200
|
|
|
173
201
|
def collect_bootstrap(python: PythonConfig) -> list[PipCommand]:
|
|
174
202
|
"""Return the details necessary to bootstrap pip into an empty virtual environment."""
|
ansible_test/_internal/ssh.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""High level functions for working with SSH."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import dataclasses
|
|
@@ -12,7 +13,6 @@ import shlex
|
|
|
12
13
|
import typing as t
|
|
13
14
|
|
|
14
15
|
from .encoding import (
|
|
15
|
-
to_bytes,
|
|
16
16
|
to_text,
|
|
17
17
|
)
|
|
18
18
|
|
|
@@ -222,13 +222,10 @@ def run_ssh_command(
|
|
|
222
222
|
cmd_show = shlex.join(cmd)
|
|
223
223
|
display.info('Run background command: %s' % cmd_show, verbosity=1, truncate=True)
|
|
224
224
|
|
|
225
|
-
cmd_bytes = [to_bytes(arg) for arg in cmd]
|
|
226
|
-
env_bytes = dict((to_bytes(k), to_bytes(v)) for k, v in env.items())
|
|
227
|
-
|
|
228
225
|
if args.explain:
|
|
229
226
|
process = SshProcess(None)
|
|
230
227
|
else:
|
|
231
|
-
process = SshProcess(subprocess.Popen(
|
|
228
|
+
process = SshProcess(subprocess.Popen(cmd, env=env, bufsize=-1, # pylint: disable=consider-using-with
|
|
232
229
|
stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.PIPE))
|
|
233
230
|
|
|
234
231
|
return process
|
ansible_test/_internal/target.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Test target identification, iteration and inclusion/exclusion."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import collections
|
|
@@ -581,6 +582,14 @@ class IntegrationTarget(CompletionTarget):
|
|
|
581
582
|
else:
|
|
582
583
|
static_aliases = tuple()
|
|
583
584
|
|
|
585
|
+
# non-group aliases which need to be extracted before group mangling occurs
|
|
586
|
+
|
|
587
|
+
self.env_set: dict[str, str] = {
|
|
588
|
+
match.group('key'): match.group('value') for match in (
|
|
589
|
+
re.match(r'env/set/(?P<key>[^/]+)/(?P<value>.*)', alias) for alias in static_aliases
|
|
590
|
+
) if match
|
|
591
|
+
}
|
|
592
|
+
|
|
584
593
|
# modules
|
|
585
594
|
|
|
586
595
|
if self.name in modules:
|
ansible_test/_internal/test.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Classes for storing and processing test results."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import collections.abc as c
|
|
@@ -141,12 +142,12 @@ class TestTimeout(TestResult):
|
|
|
141
142
|
|
|
142
143
|
# Include a leading newline to improve readability on Shippable "Tests" tab.
|
|
143
144
|
# Without this, the first line becomes indented.
|
|
144
|
-
output =
|
|
145
|
+
output = """
|
|
145
146
|
One or more of the following situations may be responsible:
|
|
146
147
|
|
|
147
148
|
- Code changes have resulted in tests that hang or run for an excessive amount of time.
|
|
148
149
|
- Tests have been added which exceed the time limit when combined with existing tests.
|
|
149
|
-
- Test infrastructure and/or external dependencies are operating slower than normal.
|
|
150
|
+
- Test infrastructure and/or external dependencies are operating slower than normal."""
|
|
150
151
|
|
|
151
152
|
if args.coverage:
|
|
152
153
|
output += '\n- Additional overhead from collecting code coverage has resulted in tests exceeding the time limit.'
|
ansible_test/_internal/thread.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Python threading tools."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import collections.abc as c
|
|
@@ -16,11 +17,12 @@ TCallable = t.TypeVar('TCallable', bound=t.Callable[..., t.Any])
|
|
|
16
17
|
class WrappedThread(threading.Thread):
|
|
17
18
|
"""Wrapper around Thread which captures results and exceptions."""
|
|
18
19
|
|
|
19
|
-
def __init__(self, action: c.Callable[[], t.Any]) -> None:
|
|
20
|
+
def __init__(self, action: c.Callable[[], t.Any], name: str) -> None:
|
|
20
21
|
super().__init__()
|
|
21
22
|
self._result: queue.Queue[t.Any] = queue.Queue()
|
|
22
23
|
self.action = action
|
|
23
24
|
self.result = None
|
|
25
|
+
self.name = name
|
|
24
26
|
|
|
25
27
|
def run(self) -> None:
|
|
26
28
|
"""
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"""Timeout management for tests."""
|
|
2
|
+
|
|
2
3
|
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
import dataclasses
|
|
@@ -125,6 +126,6 @@ def configure_test_timeout(args: TestConfig) -> None:
|
|
|
125
126
|
|
|
126
127
|
signal.signal(signal.SIGUSR1, timeout_handler)
|
|
127
128
|
|
|
128
|
-
instance = WrappedThread(functools.partial(timeout_waiter, timeout_remaining.total_seconds()))
|
|
129
|
+
instance = WrappedThread(functools.partial(timeout_waiter, timeout_remaining.total_seconds()), 'Timeout Watchdog')
|
|
129
130
|
instance.daemon = True
|
|
130
131
|
instance.start()
|