ansible-core 2.16.7__py3-none-any.whl → 2.17.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.

Files changed (597) hide show
  1. ansible/__init__.py +1 -3
  2. ansible/__main__.py +1 -0
  3. ansible/_vendor/__init__.py +1 -2
  4. ansible/cli/__init__.py +7 -8
  5. ansible/cli/adhoc.py +1 -2
  6. ansible/cli/arguments/__init__.py +1 -2
  7. ansible/cli/arguments/option_helpers.py +1 -2
  8. ansible/cli/config.py +1 -2
  9. ansible/cli/console.py +1 -2
  10. ansible/cli/doc.py +326 -202
  11. ansible/cli/galaxy.py +9 -3
  12. ansible/cli/inventory.py +4 -6
  13. ansible/cli/playbook.py +1 -2
  14. ansible/cli/pull.py +4 -5
  15. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -4
  16. ansible/cli/vault.py +1 -2
  17. ansible/collections/list.py +1 -0
  18. ansible/compat/__init__.py +1 -4
  19. ansible/compat/importlib_resources.py +1 -2
  20. ansible/compat/{selectors/__init__.py → selectors.py} +12 -12
  21. ansible/config/ansible_builtin_runtime.yml +2 -0
  22. ansible/config/base.yml +154 -149
  23. ansible/config/manager.py +33 -25
  24. ansible/constants.py +1 -2
  25. ansible/context.py +1 -4
  26. ansible/errors/__init__.py +1 -3
  27. ansible/errors/yaml_strings.py +1 -3
  28. ansible/executor/__init__.py +1 -3
  29. ansible/executor/discovery/python_target.py +1 -2
  30. ansible/executor/interpreter_discovery.py +9 -8
  31. ansible/executor/module_common.py +1 -3
  32. ansible/executor/play_iterator.py +1 -3
  33. ansible/executor/playbook_executor.py +1 -3
  34. ansible/executor/powershell/module_manifest.py +2 -3
  35. ansible/executor/process/__init__.py +1 -3
  36. ansible/executor/process/worker.py +1 -3
  37. ansible/executor/stats.py +1 -3
  38. ansible/executor/task_executor.py +2 -3
  39. ansible/executor/task_queue_manager.py +1 -3
  40. ansible/executor/task_result.py +2 -3
  41. ansible/galaxy/__init__.py +1 -2
  42. ansible/galaxy/api.py +10 -2
  43. ansible/galaxy/collection/__init__.py +38 -24
  44. ansible/galaxy/collection/concrete_artifact_manager.py +1 -2
  45. ansible/galaxy/collection/galaxy_api_proxy.py +1 -2
  46. ansible/galaxy/collection/gpg.py +4 -2
  47. ansible/galaxy/data/apb/meta/main.yml.j2 +0 -15
  48. ansible/galaxy/data/container/meta/main.yml.j2 +0 -18
  49. ansible/galaxy/data/default/role/meta/main.yml.j2 +0 -18
  50. ansible/galaxy/data/network/cliconf_plugins/example.py.j2 +1 -2
  51. ansible/galaxy/data/network/library/example_command.py.j2 +1 -2
  52. ansible/galaxy/data/network/library/example_config.py.j2 +1 -2
  53. ansible/galaxy/data/network/library/example_facts.py.j2 +1 -2
  54. ansible/galaxy/data/network/meta/main.yml.j2 +0 -15
  55. ansible/galaxy/data/network/module_utils/example.py.j2 +1 -2
  56. ansible/galaxy/data/network/netconf_plugins/example.py.j2 +1 -2
  57. ansible/galaxy/data/network/terminal_plugins/example.py.j2 +1 -2
  58. ansible/galaxy/dependency_resolution/__init__.py +1 -2
  59. ansible/galaxy/dependency_resolution/dataclasses.py +5 -6
  60. ansible/galaxy/dependency_resolution/errors.py +1 -2
  61. ansible/galaxy/dependency_resolution/providers.py +3 -4
  62. ansible/galaxy/dependency_resolution/reporters.py +2 -3
  63. ansible/galaxy/dependency_resolution/resolvers.py +1 -2
  64. ansible/galaxy/dependency_resolution/versioning.py +1 -2
  65. ansible/galaxy/role.py +2 -3
  66. ansible/galaxy/token.py +1 -2
  67. ansible/galaxy/user_agent.py +1 -2
  68. ansible/inventory/data.py +1 -2
  69. ansible/inventory/group.py +1 -2
  70. ansible/inventory/helpers.py +1 -2
  71. ansible/inventory/host.py +1 -3
  72. ansible/inventory/manager.py +1 -2
  73. ansible/module_utils/_text.py +1 -2
  74. ansible/module_utils/ansible_release.py +3 -5
  75. ansible/module_utils/api.py +1 -2
  76. ansible/module_utils/basic.py +113 -158
  77. ansible/module_utils/common/_collections_compat.py +1 -2
  78. ansible/module_utils/common/_utils.py +1 -3
  79. ansible/module_utils/common/arg_spec.py +1 -2
  80. ansible/module_utils/common/collections.py +1 -2
  81. ansible/module_utils/common/dict_transformations.py +1 -2
  82. ansible/module_utils/common/file.py +10 -5
  83. ansible/module_utils/common/json.py +1 -3
  84. ansible/module_utils/common/locale.py +1 -2
  85. ansible/module_utils/common/network.py +2 -3
  86. ansible/module_utils/common/parameters.py +9 -9
  87. ansible/module_utils/common/process.py +12 -5
  88. ansible/module_utils/common/respawn.py +2 -3
  89. ansible/module_utils/common/sys_info.py +1 -2
  90. ansible/module_utils/common/text/converters.py +1 -2
  91. ansible/module_utils/common/text/formatters.py +1 -2
  92. ansible/module_utils/common/validation.py +5 -6
  93. ansible/module_utils/common/warnings.py +1 -2
  94. ansible/module_utils/common/yaml.py +1 -2
  95. ansible/module_utils/compat/datetime.py +1 -3
  96. ansible/module_utils/compat/importlib.py +21 -13
  97. ansible/module_utils/compat/paramiko.py +1 -2
  98. ansible/module_utils/compat/selectors.py +10 -34
  99. ansible/module_utils/compat/selinux.py +1 -2
  100. ansible/module_utils/compat/typing.py +1 -2
  101. ansible/module_utils/compat/version.py +1 -2
  102. ansible/module_utils/connection.py +1 -2
  103. ansible/module_utils/csharp/Ansible.Basic.cs +20 -3
  104. ansible/module_utils/distro/__init__.py +3 -4
  105. ansible/module_utils/distro/_distro.py +230 -234
  106. ansible/module_utils/errors.py +1 -2
  107. ansible/module_utils/facts/__init__.py +1 -2
  108. ansible/module_utils/facts/ansible_collector.py +1 -2
  109. ansible/module_utils/facts/collector.py +1 -2
  110. ansible/module_utils/facts/compat.py +1 -2
  111. ansible/module_utils/facts/default_collectors.py +1 -2
  112. ansible/module_utils/facts/hardware/aix.py +1 -2
  113. ansible/module_utils/facts/hardware/base.py +1 -2
  114. ansible/module_utils/facts/hardware/darwin.py +1 -2
  115. ansible/module_utils/facts/hardware/dragonfly.py +1 -2
  116. ansible/module_utils/facts/hardware/freebsd.py +1 -2
  117. ansible/module_utils/facts/hardware/hpux.py +1 -2
  118. ansible/module_utils/facts/hardware/hurd.py +1 -2
  119. ansible/module_utils/facts/hardware/linux.py +8 -6
  120. ansible/module_utils/facts/hardware/netbsd.py +1 -2
  121. ansible/module_utils/facts/hardware/openbsd.py +1 -2
  122. ansible/module_utils/facts/hardware/sunos.py +2 -3
  123. ansible/module_utils/facts/namespace.py +1 -2
  124. ansible/module_utils/facts/network/aix.py +1 -2
  125. ansible/module_utils/facts/network/base.py +1 -2
  126. ansible/module_utils/facts/network/darwin.py +1 -2
  127. ansible/module_utils/facts/network/dragonfly.py +1 -2
  128. ansible/module_utils/facts/network/fc_wwn.py +1 -2
  129. ansible/module_utils/facts/network/freebsd.py +1 -2
  130. ansible/module_utils/facts/network/generic_bsd.py +1 -2
  131. ansible/module_utils/facts/network/hpux.py +1 -2
  132. ansible/module_utils/facts/network/hurd.py +1 -2
  133. ansible/module_utils/facts/network/iscsi.py +1 -2
  134. ansible/module_utils/facts/network/linux.py +1 -2
  135. ansible/module_utils/facts/network/netbsd.py +1 -2
  136. ansible/module_utils/facts/network/nvme.py +1 -2
  137. ansible/module_utils/facts/network/openbsd.py +1 -2
  138. ansible/module_utils/facts/network/sunos.py +1 -2
  139. ansible/module_utils/facts/other/facter.py +1 -2
  140. ansible/module_utils/facts/other/ohai.py +1 -2
  141. ansible/module_utils/facts/packages.py +1 -2
  142. ansible/module_utils/facts/sysctl.py +1 -2
  143. ansible/module_utils/facts/system/apparmor.py +1 -2
  144. ansible/module_utils/facts/system/caps.py +1 -2
  145. ansible/module_utils/facts/system/chroot.py +1 -2
  146. ansible/module_utils/facts/system/cmdline.py +1 -2
  147. ansible/module_utils/facts/system/date_time.py +1 -2
  148. ansible/module_utils/facts/system/distribution.py +4 -5
  149. ansible/module_utils/facts/system/dns.py +1 -2
  150. ansible/module_utils/facts/system/env.py +1 -2
  151. ansible/module_utils/facts/system/fips.py +1 -2
  152. ansible/module_utils/facts/system/loadavg.py +1 -2
  153. ansible/module_utils/facts/system/local.py +1 -2
  154. ansible/module_utils/facts/system/lsb.py +1 -2
  155. ansible/module_utils/facts/system/pkg_mgr.py +7 -30
  156. ansible/module_utils/facts/system/platform.py +1 -2
  157. ansible/module_utils/facts/system/python.py +1 -2
  158. ansible/module_utils/facts/system/selinux.py +1 -2
  159. ansible/module_utils/facts/system/service_mgr.py +1 -2
  160. ansible/module_utils/facts/system/ssh_pub_keys.py +1 -2
  161. ansible/module_utils/facts/system/user.py +1 -2
  162. ansible/module_utils/facts/timeout.py +1 -2
  163. ansible/module_utils/facts/utils.py +1 -2
  164. ansible/module_utils/facts/virtual/base.py +1 -2
  165. ansible/module_utils/facts/virtual/dragonfly.py +1 -2
  166. ansible/module_utils/facts/virtual/freebsd.py +1 -2
  167. ansible/module_utils/facts/virtual/hpux.py +1 -2
  168. ansible/module_utils/facts/virtual/linux.py +1 -2
  169. ansible/module_utils/facts/virtual/netbsd.py +1 -2
  170. ansible/module_utils/facts/virtual/openbsd.py +1 -2
  171. ansible/module_utils/facts/virtual/sunos.py +1 -2
  172. ansible/module_utils/facts/virtual/sysctl.py +1 -2
  173. ansible/module_utils/json_utils.py +1 -2
  174. ansible/module_utils/parsing/convert_bool.py +1 -2
  175. ansible/module_utils/powershell/Ansible.ModuleUtils.Legacy.psm1 +5 -2
  176. ansible/module_utils/powershell/Ansible.ModuleUtils.WebRequest.psm1 +1 -1
  177. ansible/module_utils/pycompat24.py +24 -4
  178. ansible/module_utils/service.py +31 -5
  179. ansible/module_utils/six/__init__.py +1 -1
  180. ansible/module_utils/splitter.py +1 -2
  181. ansible/module_utils/urls.py +335 -1052
  182. ansible/module_utils/yumdnf.py +13 -35
  183. ansible/modules/add_host.py +1 -2
  184. ansible/modules/apt.py +38 -22
  185. ansible/modules/apt_key.py +1 -2
  186. ansible/modules/apt_repository.py +18 -10
  187. ansible/modules/assemble.py +1 -2
  188. ansible/modules/assert.py +8 -4
  189. ansible/modules/async_status.py +17 -14
  190. ansible/modules/async_wrapper.py +11 -9
  191. ansible/modules/blockinfile.py +2 -3
  192. ansible/modules/command.py +1 -2
  193. ansible/modules/copy.py +4 -76
  194. ansible/modules/cron.py +3 -3
  195. ansible/modules/deb822_repository.py +5 -5
  196. ansible/modules/debconf.py +19 -8
  197. ansible/modules/debug.py +1 -2
  198. ansible/modules/dnf.py +39 -46
  199. ansible/modules/dnf5.py +28 -26
  200. ansible/modules/dpkg_selections.py +1 -2
  201. ansible/modules/expect.py +23 -15
  202. ansible/modules/fail.py +1 -2
  203. ansible/modules/fetch.py +1 -2
  204. ansible/modules/file.py +4 -3
  205. ansible/modules/find.py +18 -5
  206. ansible/modules/gather_facts.py +1 -2
  207. ansible/modules/get_url.py +2 -3
  208. ansible/modules/getent.py +2 -3
  209. ansible/modules/git.py +28 -17
  210. ansible/modules/group.py +1 -2
  211. ansible/modules/group_by.py +1 -2
  212. ansible/modules/hostname.py +2 -19
  213. ansible/modules/import_playbook.py +1 -2
  214. ansible/modules/import_role.py +9 -2
  215. ansible/modules/import_tasks.py +1 -2
  216. ansible/modules/include_role.py +1 -2
  217. ansible/modules/include_tasks.py +1 -2
  218. ansible/modules/include_vars.py +1 -2
  219. ansible/modules/iptables.py +38 -21
  220. ansible/modules/known_hosts.py +15 -8
  221. ansible/modules/lineinfile.py +1 -6
  222. ansible/modules/meta.py +3 -2
  223. ansible/modules/package.py +6 -5
  224. ansible/modules/package_facts.py +1 -2
  225. ansible/modules/pause.py +2 -3
  226. ansible/modules/ping.py +1 -2
  227. ansible/modules/pip.py +40 -20
  228. ansible/modules/raw.py +1 -2
  229. ansible/modules/reboot.py +1 -2
  230. ansible/modules/replace.py +7 -5
  231. ansible/modules/rpm_key.py +1 -2
  232. ansible/modules/script.py +1 -2
  233. ansible/modules/service.py +3 -21
  234. ansible/modules/service_facts.py +3 -12
  235. ansible/modules/set_fact.py +1 -2
  236. ansible/modules/set_stats.py +1 -2
  237. ansible/modules/setup.py +1 -2
  238. ansible/modules/shell.py +1 -2
  239. ansible/modules/slurp.py +1 -2
  240. ansible/modules/stat.py +1 -2
  241. ansible/modules/subversion.py +2 -3
  242. ansible/modules/systemd.py +12 -9
  243. ansible/modules/systemd_service.py +12 -9
  244. ansible/modules/sysvinit.py +7 -2
  245. ansible/modules/tempfile.py +7 -2
  246. ansible/modules/template.py +2 -3
  247. ansible/modules/unarchive.py +13 -3
  248. ansible/modules/uri.py +12 -15
  249. ansible/modules/user.py +11 -4
  250. ansible/modules/validate_argument_spec.py +15 -16
  251. ansible/modules/wait_for.py +1 -2
  252. ansible/modules/wait_for_connection.py +1 -2
  253. ansible/modules/yum_repository.py +2 -3
  254. ansible/parsing/__init__.py +1 -3
  255. ansible/parsing/ajson.py +1 -3
  256. ansible/parsing/dataloader.py +23 -12
  257. ansible/parsing/mod_args.py +6 -4
  258. ansible/parsing/plugin_docs.py +1 -2
  259. ansible/parsing/quoting.py +1 -3
  260. ansible/parsing/splitter.py +1 -3
  261. ansible/parsing/utils/__init__.py +1 -3
  262. ansible/parsing/utils/addresses.py +1 -3
  263. ansible/parsing/utils/jsonify.py +1 -3
  264. ansible/parsing/utils/yaml.py +1 -3
  265. ansible/parsing/vault/__init__.py +6 -8
  266. ansible/parsing/yaml/__init__.py +1 -3
  267. ansible/parsing/yaml/constructor.py +1 -3
  268. ansible/parsing/yaml/dumper.py +1 -3
  269. ansible/parsing/yaml/loader.py +1 -3
  270. ansible/parsing/yaml/objects.py +1 -3
  271. ansible/playbook/__init__.py +1 -3
  272. ansible/playbook/attribute.py +1 -3
  273. ansible/playbook/base.py +2 -3
  274. ansible/playbook/block.py +1 -3
  275. ansible/playbook/collectionsearch.py +1 -2
  276. ansible/playbook/conditional.py +1 -3
  277. ansible/playbook/delegatable.py +1 -0
  278. ansible/playbook/handler.py +2 -4
  279. ansible/playbook/handler_task_include.py +1 -3
  280. ansible/playbook/helpers.py +1 -4
  281. ansible/playbook/included_file.py +4 -4
  282. ansible/playbook/loop_control.py +1 -3
  283. ansible/playbook/notifiable.py +1 -0
  284. ansible/playbook/play.py +1 -3
  285. ansible/playbook/play_context.py +1 -3
  286. ansible/playbook/playbook_include.py +1 -3
  287. ansible/playbook/role/__init__.py +1 -3
  288. ansible/playbook/role/definition.py +1 -3
  289. ansible/playbook/role/include.py +1 -3
  290. ansible/playbook/role/metadata.py +1 -3
  291. ansible/playbook/role/requirement.py +1 -3
  292. ansible/playbook/role_include.py +2 -10
  293. ansible/playbook/taggable.py +1 -3
  294. ansible/playbook/task.py +2 -4
  295. ansible/playbook/task_include.py +1 -3
  296. ansible/plugins/__init__.py +4 -5
  297. ansible/plugins/action/__init__.py +19 -13
  298. ansible/plugins/action/add_host.py +2 -4
  299. ansible/plugins/action/assemble.py +2 -3
  300. ansible/plugins/action/assert.py +1 -2
  301. ansible/plugins/action/async_status.py +1 -2
  302. ansible/plugins/action/command.py +1 -2
  303. ansible/plugins/action/copy.py +12 -9
  304. ansible/plugins/action/debug.py +1 -2
  305. ansible/plugins/action/dnf.py +4 -4
  306. ansible/plugins/action/fail.py +1 -2
  307. ansible/plugins/action/fetch.py +2 -3
  308. ansible/plugins/action/gather_facts.py +3 -4
  309. ansible/plugins/action/group_by.py +1 -2
  310. ansible/plugins/action/include_vars.py +1 -2
  311. ansible/plugins/action/normal.py +1 -2
  312. ansible/plugins/action/package.py +36 -21
  313. ansible/plugins/action/pause.py +1 -2
  314. ansible/plugins/action/raw.py +2 -3
  315. ansible/plugins/action/reboot.py +30 -15
  316. ansible/plugins/action/script.py +3 -4
  317. ansible/plugins/action/service.py +1 -2
  318. ansible/plugins/action/set_fact.py +1 -2
  319. ansible/plugins/action/set_stats.py +1 -2
  320. ansible/plugins/action/shell.py +1 -2
  321. ansible/plugins/action/template.py +1 -2
  322. ansible/plugins/action/unarchive.py +1 -2
  323. ansible/plugins/action/uri.py +2 -3
  324. ansible/plugins/action/validate_argument_spec.py +1 -2
  325. ansible/plugins/action/wait_for_connection.py +2 -3
  326. ansible/plugins/become/__init__.py +1 -2
  327. ansible/plugins/become/runas.py +1 -2
  328. ansible/plugins/become/su.py +1 -2
  329. ansible/plugins/become/sudo.py +1 -2
  330. ansible/plugins/cache/__init__.py +3 -3
  331. ansible/plugins/cache/base.py +1 -2
  332. ansible/plugins/cache/jsonfile.py +1 -3
  333. ansible/plugins/cache/memory.py +1 -2
  334. ansible/plugins/callback/__init__.py +2 -4
  335. ansible/plugins/callback/default.py +2 -3
  336. ansible/plugins/callback/junit.py +1 -2
  337. ansible/plugins/callback/minimal.py +1 -3
  338. ansible/plugins/callback/oneline.py +1 -3
  339. ansible/plugins/callback/tree.py +1 -2
  340. ansible/plugins/cliconf/__init__.py +1 -2
  341. ansible/plugins/connection/__init__.py +4 -5
  342. ansible/plugins/connection/local.py +3 -4
  343. ansible/plugins/connection/paramiko_ssh.py +1 -2
  344. ansible/plugins/connection/psrp.py +1 -2
  345. ansible/plugins/connection/ssh.py +18 -54
  346. ansible/plugins/connection/winrm.py +3 -4
  347. ansible/plugins/doc_fragments/action_common_attributes.py +2 -3
  348. ansible/plugins/doc_fragments/action_core.py +3 -4
  349. ansible/plugins/doc_fragments/backup.py +1 -2
  350. ansible/plugins/doc_fragments/connection_pipelining.py +1 -2
  351. ansible/plugins/doc_fragments/constructed.py +1 -2
  352. ansible/plugins/doc_fragments/decrypt.py +2 -3
  353. ansible/plugins/doc_fragments/default_callback.py +1 -2
  354. ansible/plugins/doc_fragments/files.py +1 -2
  355. ansible/plugins/doc_fragments/inventory_cache.py +1 -2
  356. ansible/plugins/doc_fragments/result_format_callback.py +1 -2
  357. ansible/plugins/doc_fragments/return_common.py +1 -2
  358. ansible/plugins/doc_fragments/shell_common.py +1 -2
  359. ansible/plugins/doc_fragments/shell_windows.py +1 -2
  360. ansible/plugins/doc_fragments/template_common.py +1 -2
  361. ansible/plugins/doc_fragments/url.py +1 -2
  362. ansible/plugins/doc_fragments/url_windows.py +1 -2
  363. ansible/plugins/doc_fragments/validate.py +1 -2
  364. ansible/plugins/doc_fragments/vars_plugin_staging.py +1 -2
  365. ansible/plugins/filter/__init__.py +1 -2
  366. ansible/plugins/filter/b64decode.yml +8 -8
  367. ansible/plugins/filter/b64encode.yml +4 -4
  368. ansible/plugins/filter/comment.yml +1 -1
  369. ansible/plugins/filter/core.py +11 -9
  370. ansible/plugins/filter/encryption.py +1 -3
  371. ansible/plugins/filter/extract.yml +1 -1
  372. ansible/plugins/filter/from_yaml_all.yml +1 -1
  373. ansible/plugins/filter/human_readable.yml +3 -3
  374. ansible/plugins/filter/human_to_bytes.yml +2 -2
  375. ansible/plugins/filter/mandatory.yml +1 -1
  376. ansible/plugins/filter/mathstuff.py +2 -2
  377. ansible/plugins/filter/password_hash.yml +3 -2
  378. ansible/plugins/filter/regex_replace.yml +15 -0
  379. ansible/plugins/filter/regex_search.yml +12 -0
  380. ansible/plugins/filter/strftime.yml +2 -9
  381. ansible/plugins/filter/to_datetime.yml +17 -2
  382. ansible/plugins/filter/to_nice_json.yml +4 -0
  383. ansible/plugins/filter/union.yml +1 -1
  384. ansible/plugins/filter/urls.py +1 -2
  385. ansible/plugins/filter/urlsplit.py +1 -2
  386. ansible/plugins/filter/zip.yml +2 -2
  387. ansible/plugins/filter/zip_longest.yml +1 -1
  388. ansible/plugins/httpapi/__init__.py +1 -2
  389. ansible/plugins/inventory/__init__.py +2 -4
  390. ansible/plugins/inventory/advanced_host_list.py +1 -2
  391. ansible/plugins/inventory/auto.py +2 -3
  392. ansible/plugins/inventory/constructed.py +3 -2
  393. ansible/plugins/inventory/generator.py +1 -2
  394. ansible/plugins/inventory/host_list.py +1 -2
  395. ansible/plugins/inventory/ini.py +1 -2
  396. ansible/plugins/inventory/script.py +122 -3
  397. ansible/plugins/inventory/toml.py +1 -2
  398. ansible/plugins/inventory/yaml.py +3 -4
  399. ansible/plugins/list.py +2 -3
  400. ansible/plugins/loader.py +10 -11
  401. ansible/plugins/lookup/__init__.py +1 -3
  402. ansible/plugins/lookup/config.py +19 -15
  403. ansible/plugins/lookup/csvfile.py +16 -7
  404. ansible/plugins/lookup/dict.py +2 -3
  405. ansible/plugins/lookup/env.py +4 -4
  406. ansible/plugins/lookup/file.py +1 -2
  407. ansible/plugins/lookup/fileglob.py +1 -2
  408. ansible/plugins/lookup/first_found.py +8 -7
  409. ansible/plugins/lookup/indexed_items.py +1 -2
  410. ansible/plugins/lookup/ini.py +6 -3
  411. ansible/plugins/lookup/inventory_hostnames.py +1 -2
  412. ansible/plugins/lookup/items.py +1 -2
  413. ansible/plugins/lookup/lines.py +1 -2
  414. ansible/plugins/lookup/list.py +1 -3
  415. ansible/plugins/lookup/nested.py +1 -2
  416. ansible/plugins/lookup/password.py +16 -14
  417. ansible/plugins/lookup/pipe.py +1 -2
  418. ansible/plugins/lookup/random_choice.py +1 -2
  419. ansible/plugins/lookup/sequence.py +21 -52
  420. ansible/plugins/lookup/subelements.py +1 -2
  421. ansible/plugins/lookup/template.py +1 -2
  422. ansible/plugins/lookup/together.py +1 -2
  423. ansible/plugins/lookup/unvault.py +1 -2
  424. ansible/plugins/lookup/url.py +9 -11
  425. ansible/plugins/lookup/varnames.py +1 -2
  426. ansible/plugins/lookup/vars.py +1 -2
  427. ansible/plugins/netconf/__init__.py +1 -2
  428. ansible/plugins/shell/__init__.py +3 -4
  429. ansible/plugins/shell/cmd.py +1 -2
  430. ansible/plugins/shell/powershell.py +1 -2
  431. ansible/plugins/shell/sh.py +1 -2
  432. ansible/plugins/strategy/__init__.py +33 -21
  433. ansible/plugins/strategy/debug.py +1 -2
  434. ansible/plugins/strategy/free.py +17 -7
  435. ansible/plugins/strategy/host_pinned.py +1 -3
  436. ansible/plugins/strategy/linear.py +22 -22
  437. ansible/plugins/terminal/__init__.py +2 -3
  438. ansible/plugins/test/__init__.py +1 -2
  439. ansible/plugins/test/change.yml +1 -1
  440. ansible/plugins/test/changed.yml +1 -1
  441. ansible/plugins/test/contains.yml +1 -1
  442. ansible/plugins/test/core.py +2 -4
  443. ansible/plugins/test/exists.yml +1 -1
  444. ansible/plugins/test/failed.yml +1 -1
  445. ansible/plugins/test/failure.yml +1 -1
  446. ansible/plugins/test/files.py +1 -3
  447. ansible/plugins/test/finished.yml +3 -3
  448. ansible/plugins/test/issuperset.yml +1 -1
  449. ansible/plugins/test/match.yml +1 -1
  450. ansible/plugins/test/mathstuff.py +1 -2
  451. ansible/plugins/test/reachable.yml +1 -1
  452. ansible/plugins/test/regex.yml +1 -1
  453. ansible/plugins/test/search.yml +1 -1
  454. ansible/plugins/test/skip.yml +1 -1
  455. ansible/plugins/test/skipped.yml +1 -1
  456. ansible/plugins/test/started.yml +1 -1
  457. ansible/plugins/test/succeeded.yml +1 -1
  458. ansible/plugins/test/success.yml +1 -1
  459. ansible/plugins/test/successful.yml +1 -1
  460. ansible/plugins/test/superset.yml +1 -1
  461. ansible/plugins/test/unreachable.yml +1 -1
  462. ansible/plugins/test/uri.py +1 -3
  463. ansible/plugins/vars/__init__.py +1 -2
  464. ansible/plugins/vars/host_group_vars.py +2 -3
  465. ansible/release.py +3 -5
  466. ansible/template/__init__.py +14 -27
  467. ansible/template/native_helpers.py +1 -3
  468. ansible/template/template.py +1 -3
  469. ansible/template/vars.py +1 -0
  470. ansible/utils/__init__.py +1 -3
  471. ansible/utils/cmd_functions.py +1 -2
  472. ansible/utils/collection_loader/__init__.py +1 -2
  473. ansible/utils/collection_loader/_collection_config.py +1 -2
  474. ansible/utils/collection_loader/_collection_finder.py +1 -2
  475. ansible/utils/collection_loader/_collection_meta.py +1 -2
  476. ansible/utils/color.py +1 -2
  477. ansible/utils/context_objects.py +1 -4
  478. ansible/utils/display.py +89 -30
  479. ansible/utils/encrypt.py +4 -105
  480. ansible/utils/fqcn.py +1 -2
  481. ansible/utils/galaxy.py +1 -3
  482. ansible/utils/hashing.py +1 -3
  483. ansible/utils/helpers.py +1 -3
  484. ansible/utils/jsonrpc.py +1 -2
  485. ansible/utils/listify.py +1 -3
  486. ansible/utils/lock.py +1 -3
  487. ansible/utils/multiprocessing.py +1 -3
  488. ansible/utils/native_jinja.py +1 -3
  489. ansible/utils/path.py +1 -2
  490. ansible/utils/plugin_docs.py +7 -6
  491. ansible/utils/py3compat.py +17 -55
  492. ansible/utils/sentinel.py +1 -3
  493. ansible/utils/shlex.py +1 -3
  494. ansible/utils/singleton.py +1 -3
  495. ansible/utils/ssh_functions.py +1 -3
  496. ansible/utils/unicode.py +1 -3
  497. ansible/utils/unsafe_proxy.py +1 -2
  498. ansible/utils/vars.py +6 -8
  499. ansible/utils/version.py +1 -3
  500. ansible/vars/clean.py +1 -3
  501. ansible/vars/fact_cache.py +1 -2
  502. ansible/vars/hostvars.py +3 -7
  503. ansible/vars/manager.py +24 -6
  504. ansible/vars/reserved.py +1 -3
  505. {ansible_core-2.16.7.data → ansible_core-2.17.0.data}/scripts/ansible-test +1 -2
  506. {ansible_core-2.16.7.dist-info → ansible_core-2.17.0.dist-info}/METADATA +3 -3
  507. ansible_core-2.17.0.dist-info/RECORD +987 -0
  508. ansible_test/__init__.py +1 -2
  509. ansible_test/_data/completion/docker.txt +7 -9
  510. ansible_test/_data/completion/remote.txt +6 -7
  511. ansible_test/_data/requirements/ansible-test.txt +0 -2
  512. ansible_test/_data/requirements/constraints.txt +1 -6
  513. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -3
  514. ansible_test/_data/requirements/sanity.changelog.txt +3 -3
  515. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -2
  516. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  517. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  518. ansible_test/_data/requirements/sanity.pylint.txt +7 -7
  519. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -1
  520. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -3
  521. ansible_test/_data/requirements/sanity.yamllint.txt +2 -2
  522. ansible_test/_internal/bootstrap.py +2 -2
  523. ansible_test/_internal/classification/__init__.py +0 -5
  524. ansible_test/_internal/commands/integration/cloud/cs.py +1 -1
  525. ansible_test/_internal/commands/integration/cloud/nios.py +1 -1
  526. ansible_test/_internal/commands/sanity/__init__.py +1 -27
  527. ansible_test/_internal/commands/sanity/import.py +0 -18
  528. ansible_test/_internal/commands/sanity/mypy.py +7 -10
  529. ansible_test/_internal/commands/units/__init__.py +1 -1
  530. ansible_test/_internal/config.py +0 -1
  531. ansible_test/_internal/content_config.py +0 -5
  532. ansible_test/_internal/coverage_util.py +0 -1
  533. ansible_test/_internal/docker_util.py +1 -1
  534. ansible_test/_internal/host_profiles.py +5 -4
  535. ansible_test/_internal/pypi_proxy.py +1 -8
  536. ansible_test/_internal/python_requirements.py +1 -119
  537. ansible_test/_internal/ssh.py +1 -0
  538. ansible_test/_internal/util.py +1 -1
  539. ansible_test/_internal/util_common.py +1 -1
  540. ansible_test/_internal/venv.py +10 -108
  541. ansible_test/_util/__init__.py +1 -2
  542. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +0 -6
  543. ansible_test/_util/controller/sanity/mypy/modules.ini +0 -6
  544. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +0 -1
  545. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  546. ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +0 -1
  547. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +0 -1
  548. ansible_test/_util/controller/sanity/pylint/config/default.cfg +0 -1
  549. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +1 -2
  550. ansible_test/_util/controller/sanity/shellcheck/exclude.txt +0 -1
  551. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +31 -59
  552. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +0 -7
  553. ansible_test/_util/controller/sanity/validate-modules/validate_modules/schema.py +10 -2
  554. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  555. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +16 -4
  556. ansible_test/_util/target/__init__.py +1 -2
  557. ansible_test/_util/target/cli/ansible_test_cli_stub.py +1 -2
  558. ansible_test/_util/target/common/constants.py +1 -4
  559. ansible_test/_util/target/injector/python.py +4 -19
  560. ansible_test/_util/target/pytest/plugins/ansible_forked.py +2 -9
  561. ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py +1 -5
  562. ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py +1 -2
  563. ansible_test/_util/target/sanity/compile/compile.py +3 -12
  564. ansible_test/_util/target/sanity/import/importer.py +1 -12
  565. ansible_test/_util/target/setup/bootstrap.sh +49 -105
  566. ansible_test/_util/target/setup/probe_cgroups.py +1 -2
  567. ansible_test/_util/target/setup/quiet_pip.py +1 -16
  568. ansible_test/_util/target/setup/requirements.py +9 -2
  569. ansible_test/_util/target/tools/virtualenvcheck.py +1 -2
  570. ansible_test/_util/target/tools/yamlcheck.py +1 -2
  571. ansible/module_utils/common/_json_compat.py +0 -16
  572. ansible/module_utils/compat/_selectors2.py +0 -655
  573. ansible/modules/yum.py +0 -1821
  574. ansible/plugins/action/yum.py +0 -111
  575. ansible_core-2.16.7.dist-info/RECORD +0 -1009
  576. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.json +0 -7
  577. ansible_test/_util/controller/sanity/code-smell/future-import-boilerplate.py +0 -46
  578. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.json +0 -7
  579. ansible_test/_util/controller/sanity/code-smell/metaclass-boilerplate.py +0 -44
  580. ansible_test/_util/controller/sanity/code-smell/no-basestring.json +0 -7
  581. ansible_test/_util/controller/sanity/code-smell/no-basestring.py +0 -21
  582. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.json +0 -7
  583. ansible_test/_util/controller/sanity/code-smell/no-dict-iteritems.py +0 -21
  584. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.json +0 -7
  585. ansible_test/_util/controller/sanity/code-smell/no-dict-iterkeys.py +0 -21
  586. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.json +0 -7
  587. ansible_test/_util/controller/sanity/code-smell/no-dict-itervalues.py +0 -21
  588. ansible_test/_util/controller/sanity/code-smell/no-main-display.json +0 -10
  589. ansible_test/_util/controller/sanity/code-smell/no-main-display.py +0 -21
  590. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.json +0 -7
  591. ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py +0 -21
  592. ansible_test/_util/controller/tools/sslcheck.py +0 -22
  593. ansible_test/_util/target/common/__init__.py +0 -2
  594. {ansible_core-2.16.7.dist-info → ansible_core-2.17.0.dist-info}/COPYING +0 -0
  595. {ansible_core-2.16.7.dist-info → ansible_core-2.17.0.dist-info}/WHEEL +0 -0
  596. {ansible_core-2.16.7.dist-info → ansible_core-2.17.0.dist-info}/entry_points.txt +0 -0
  597. {ansible_core-2.16.7.dist-info → ansible_core-2.17.0.dist-info}/top_level.txt +0 -0
ansible_test/__init__.py CHANGED
@@ -1,2 +1 @@
1
- # Empty __init__.py to allow importing of `ansible_test._util.target.common` under Python 2.x.
2
- # This allows the ansible-test entry point to report supported Python versions before exiting.
1
+ # Empty __init__.py to allow relative imports to work under mypy.
@@ -1,9 +1,7 @@
1
- base image=quay.io/ansible/base-test-container:5.10.0 python=3.12,2.7,3.6,3.7,3.8,3.9,3.10,3.11
2
- default image=quay.io/ansible/default-test-container:8.12.0 python=3.12,2.7,3.6,3.7,3.8,3.9,3.10,3.11 context=collection
3
- default image=quay.io/ansible/ansible-core-test-container:8.12.0 python=3.12,2.7,3.6,3.7,3.8,3.9,3.10,3.11 context=ansible-core
4
- alpine3 image=quay.io/ansible/alpine3-test-container:6.3.0 python=3.11 cgroup=none audit=none
5
- centos7 image=quay.io/ansible/centos7-test-container:6.3.0 python=2.7 cgroup=v1-only
6
- fedora38 image=quay.io/ansible/fedora38-test-container:6.3.0 python=3.11
7
- opensuse15 image=quay.io/ansible/opensuse15-test-container:6.3.0 python=3.6
8
- ubuntu2004 image=quay.io/ansible/ubuntu2004-test-container:6.3.0 python=3.8
9
- ubuntu2204 image=quay.io/ansible/ubuntu2204-test-container:6.3.0 python=3.10
1
+ base image=quay.io/ansible/base-test-container:6.2.0 python=3.12,3.7,3.8,3.9,3.10,3.11
2
+ default image=quay.io/ansible/default-test-container:9.6.0 python=3.12,3.7,3.8,3.9,3.10,3.11 context=collection
3
+ default image=quay.io/ansible/ansible-core-test-container:9.6.0 python=3.12,3.7,3.8,3.9,3.10,3.11 context=ansible-core
4
+ alpine319 image=quay.io/ansible/alpine319-test-container:7.1.0 python=3.11 cgroup=none audit=none
5
+ fedora39 image=quay.io/ansible/fedora39-test-container:7.1.0 python=3.12
6
+ ubuntu2004 image=quay.io/ansible/ubuntu2004-test-container:7.1.0 python=3.8
7
+ ubuntu2204 image=quay.io/ansible/ubuntu2204-test-container:7.1.0 python=3.10
@@ -1,14 +1,13 @@
1
- alpine/3.18 python=3.11 become=doas_sudo provider=aws arch=x86_64
1
+ alpine/3.19 python=3.11 become=doas_sudo provider=aws arch=x86_64
2
2
  alpine become=doas_sudo provider=aws arch=x86_64
3
- fedora/38 python=3.11 become=sudo provider=aws arch=x86_64
3
+ fedora/39 python=3.12 become=sudo provider=aws arch=x86_64
4
4
  fedora become=sudo provider=aws arch=x86_64
5
- freebsd/13.2 python=3.9,3.11 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
5
+ freebsd/13.3 python=3.9,3.11 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
6
+ freebsd/14.0 python=3.9,3.11 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
6
7
  freebsd python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
7
- macos/13.2 python=3.11 python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64
8
+ macos/14.3 python=3.11 python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64
8
9
  macos python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64
9
- rhel/7.9 python=2.7 become=sudo provider=aws arch=x86_64
10
- rhel/8.8 python=3.6,3.11 become=sudo provider=aws arch=x86_64
11
- rhel/9.2 python=3.9,3.11 become=sudo provider=aws arch=x86_64
10
+ rhel/9.3 python=3.9,3.11 become=sudo provider=aws arch=x86_64
12
11
  rhel become=sudo provider=aws arch=x86_64
13
12
  ubuntu/22.04 python=3.10 become=sudo provider=aws arch=x86_64
14
13
  ubuntu become=sudo provider=aws arch=x86_64
@@ -1,5 +1,3 @@
1
1
  # The test-constraints sanity test verifies this file, but changes must be made manually to keep it in up-to-date.
2
- virtualenv == 16.7.12 ; python_version < '3'
3
2
  coverage == 7.3.2 ; python_version >= '3.8' and python_version <= '3.12'
4
3
  coverage == 6.5.0 ; python_version >= '3.7' and python_version <= '3.7'
5
- coverage == 4.5.4 ; python_version >= '2.6' and python_version <= '3.6'
@@ -1,16 +1,11 @@
1
1
  # do not add a cryptography or pyopenssl constraint to this file, they require special handling, see get_cryptography_requirements in python_requirements.py
2
2
  # do not add a coverage constraint to this file, it is handled internally by ansible-test
3
- packaging < 21.0 ; python_version < '3.6' # packaging 21.0 requires Python 3.6 or newer
4
3
  pypsrp < 1.0.0 # in case the next major version is too big of a change
5
4
  pywinrm >= 0.3.0 ; python_version < '3.11' # message encryption support
6
5
  pywinrm >= 0.4.3 ; python_version >= '3.11' # support for Python 3.11
7
- pytest < 5.0.0, >= 4.5.0 ; python_version == '2.7' # pytest 5.0.0 and later will no longer support python 2.7
8
- pytest >= 4.5.0 ; python_version > '2.7' # pytest 4.5.0 added support for --strict-markers
6
+ pytest >= 4.5.0 # pytest 4.5.0 added support for --strict-markers
9
7
  ntlm-auth >= 1.3.0 # message encryption support using cryptography
10
8
  requests-ntlm >= 1.1.0 # message encryption support
11
9
  requests-credssp >= 0.1.0 # message encryption support
12
- pyparsing < 3.0.0 ; python_version < '3.5' # pyparsing 3 and later require python 3.5 or later
13
10
  mock >= 2.0.0 # needed for features backported from Python 3.6 unittest.mock (assert_called, assert_called_once...)
14
11
  pytest-mock >= 1.4.0 # needed for mock_use_standalone_module pytest option
15
- setuptools < 45 ; python_version == '2.7' # setuptools 45 and later require python 3.5 or later
16
- wheel < 0.38.0 ; python_version < '3.7' # wheel 0.38.0 and later require python 3.7 or later
@@ -1,5 +1,5 @@
1
1
  # edit "sanity.ansible-doc.in" and generate with: hacking/update-sanity-requirements.py --test ansible-doc
2
- Jinja2==3.1.2
3
- MarkupSafe==2.1.3
4
- packaging==23.2
2
+ Jinja2==3.1.3
3
+ MarkupSafe==2.1.5
4
+ packaging==24.0
5
5
  PyYAML==6.0.1
@@ -1,9 +1,9 @@
1
1
  # edit "sanity.changelog.in" and generate with: hacking/update-sanity-requirements.py --test changelog
2
- antsibull-changelog==0.23.0
2
+ antsibull-changelog==0.26.0
3
3
  docutils==0.18.1
4
- packaging==23.2
4
+ packaging==24.0
5
5
  PyYAML==6.0.1
6
6
  rstcheck==5.0.0
7
7
  semantic-version==2.10.0
8
8
  types-docutils==0.18.3
9
- typing_extensions==4.8.0
9
+ typing_extensions==4.10.0
@@ -1,4 +1,4 @@
1
1
  # edit "sanity.import.plugin.in" and generate with: hacking/update-sanity-requirements.py --test import.plugin
2
- Jinja2==3.1.2
3
- MarkupSafe==2.1.3
2
+ Jinja2==3.1.3
3
+ MarkupSafe==2.1.5
4
4
  PyYAML==6.0.1
@@ -1,18 +1,18 @@
1
1
  # edit "sanity.mypy.in" and generate with: hacking/update-sanity-requirements.py --test mypy
2
2
  cffi==1.16.0
3
- cryptography==41.0.4
4
- Jinja2==3.1.2
5
- MarkupSafe==2.1.3
6
- mypy==1.5.1
3
+ cryptography==42.0.5
4
+ Jinja2==3.1.3
5
+ MarkupSafe==2.1.5
6
+ mypy==1.9.0
7
7
  mypy-extensions==1.0.0
8
- packaging==23.2
8
+ packaging==24.0
9
9
  pycparser==2.21
10
10
  tomli==2.0.1
11
11
  types-backports==0.1.3
12
- types-paramiko==3.3.0.0
13
- types-PyYAML==6.0.12.12
14
- types-requests==2.31.0.7
15
- types-setuptools==68.2.0.0
16
- types-toml==0.10.8.7
17
- typing_extensions==4.8.0
18
- urllib3==2.0.6
12
+ types-paramiko==3.4.0.20240311
13
+ types-PyYAML==6.0.12.20240311
14
+ types-requests==2.31.0.20240311
15
+ types-setuptools==69.2.0.20240317
16
+ types-toml==0.10.8.20240310
17
+ typing_extensions==4.10.0
18
+ urllib3==2.2.1
@@ -1,2 +1,2 @@
1
1
  # edit "sanity.pep8.in" and generate with: hacking/update-sanity-requirements.py --test pep8
2
- pycodestyle==2.11.0
2
+ pycodestyle==2.11.1
@@ -1,11 +1,11 @@
1
1
  # edit "sanity.pylint.in" and generate with: hacking/update-sanity-requirements.py --test pylint
2
- astroid==3.0.0
3
- dill==0.3.7
4
- isort==5.12.0
2
+ astroid==3.1.0
3
+ dill==0.3.8
4
+ isort==5.13.2
5
5
  mccabe==0.7.0
6
- platformdirs==3.11.0
7
- pylint==3.0.1
6
+ platformdirs==4.2.0
7
+ pylint==3.1.0
8
8
  PyYAML==6.0.1
9
9
  tomli==2.0.1
10
- tomlkit==0.12.1
11
- typing_extensions==4.8.0
10
+ tomlkit==0.12.4
11
+ typing_extensions==4.10.0
@@ -1,3 +1,3 @@
1
1
  # edit "sanity.runtime-metadata.in" and generate with: hacking/update-sanity-requirements.py --test runtime-metadata
2
2
  PyYAML==6.0.1
3
- voluptuous==0.13.1
3
+ voluptuous==0.14.2
@@ -1,6 +1,6 @@
1
1
  # edit "sanity.validate-modules.in" and generate with: hacking/update-sanity-requirements.py --test validate-modules
2
2
  antsibull-docs-parser==1.0.0
3
- Jinja2==3.1.2
4
- MarkupSafe==2.1.3
3
+ Jinja2==3.1.3
4
+ MarkupSafe==2.1.5
5
5
  PyYAML==6.0.1
6
- voluptuous==0.13.1
6
+ voluptuous==0.14.2
@@ -1,4 +1,4 @@
1
1
  # edit "sanity.yamllint.in" and generate with: hacking/update-sanity-requirements.py --test yamllint
2
- pathspec==0.11.2
2
+ pathspec==0.12.1
3
3
  PyYAML==6.0.1
4
- yamllint==1.32.0
4
+ yamllint==1.35.1
@@ -28,7 +28,7 @@ class Bootstrap:
28
28
  """Base class for bootstrapping systems."""
29
29
 
30
30
  controller: bool
31
- python_versions: list[str]
31
+ python_interpreters: dict[str, str]
32
32
  ssh_key: SshKey
33
33
 
34
34
  @property
@@ -41,7 +41,7 @@ class Bootstrap:
41
41
  return dict(
42
42
  bootstrap_type=self.bootstrap_type,
43
43
  controller='yes' if self.controller else '',
44
- python_versions=self.python_versions,
44
+ python_interpreters=[f'{key}:{value}' for key, value in self.python_interpreters.items()],
45
45
  ssh_key_type=self.ssh_key.KEY_TYPE,
46
46
  ssh_private_key=self.ssh_key.key_contents,
47
47
  ssh_public_key=self.ssh_key.pub_contents,
@@ -674,11 +674,6 @@ class PathMapper:
674
674
 
675
675
  # Early classification that needs to occur before common classification belongs here.
676
676
 
677
- if path.startswith('test/units/compat/'):
678
- return {
679
- 'units': 'test/units/',
680
- }
681
-
682
677
  if dirname == '.azure-pipelines/commands':
683
678
  test_map = {
684
679
  'cloud.sh': 'integration:cloud/',
@@ -38,7 +38,7 @@ class CsCloudProvider(CloudProvider):
38
38
  def __init__(self, args: IntegrationConfig) -> None:
39
39
  super().__init__(args)
40
40
 
41
- self.image = os.environ.get('ANSIBLE_CLOUDSTACK_CONTAINER', 'quay.io/ansible/cloudstack-test-container:1.6.1')
41
+ self.image = os.environ.get('ANSIBLE_CLOUDSTACK_CONTAINER', 'quay.io/ansible/cloudstack-test-container:1.7.0')
42
42
  self.host = ''
43
43
  self.port = 0
44
44
 
@@ -28,7 +28,7 @@ class NiosProvider(CloudProvider):
28
28
  #
29
29
  # It's source source itself resides at:
30
30
  # https://github.com/ansible/nios-test-container
31
- DOCKER_IMAGE = 'quay.io/ansible/nios-test-container:2.0.0'
31
+ DOCKER_IMAGE = 'quay.io/ansible/nios-test-container:3.0.0'
32
32
 
33
33
  def __init__(self, args: IntegrationConfig) -> None:
34
34
  super().__init__(args)
@@ -764,11 +764,6 @@ class SanityTest(metaclass=abc.ABCMeta):
764
764
  """True if the test targets should include symlinks."""
765
765
  return False
766
766
 
767
- @property
768
- def py2_compat(self) -> bool:
769
- """True if the test only applies to code that runs on Python 2.x."""
770
- return False
771
-
772
767
  @property
773
768
  def supported_python_versions(self) -> t.Optional[tuple[str, ...]]:
774
769
  """A tuple of supported Python versions or None if the test does not depend on specific Python versions."""
@@ -786,23 +781,11 @@ class SanityTest(metaclass=abc.ABCMeta):
786
781
 
787
782
  def filter_targets_by_version(self, args: SanityConfig, targets: list[TestTarget], python_version: str) -> list[TestTarget]:
788
783
  """Return the given list of test targets, filtered to include only those relevant for the test, taking into account the Python version."""
784
+ del args # args is not used here, but derived classes may make use of it
789
785
  del python_version # python_version is not used here, but derived classes may make use of it
790
786
 
791
787
  targets = self.filter_targets(targets)
792
788
 
793
- if self.py2_compat:
794
- # This sanity test is a Python 2.x compatibility test.
795
- content_config = get_content_config(args)
796
-
797
- if content_config.py2_support:
798
- # This collection supports Python 2.x.
799
- # Filter targets to include only those that require support for remote-only Python versions.
800
- targets = self.filter_remote_targets(targets)
801
- else:
802
- # This collection does not support Python 2.x.
803
- # There are no targets to test.
804
- targets = []
805
-
806
789
  return targets
807
790
 
808
791
  @staticmethod
@@ -878,7 +861,6 @@ class SanityCodeSmellTest(SanitySingleVersion):
878
861
  self.__no_targets: bool = self.config.get('no_targets')
879
862
  self.__include_directories: bool = self.config.get('include_directories')
880
863
  self.__include_symlinks: bool = self.config.get('include_symlinks')
881
- self.__py2_compat: bool = self.config.get('py2_compat', False)
882
864
  self.__error_code: str | None = self.config.get('error_code', None)
883
865
  else:
884
866
  self.output = None
@@ -894,7 +876,6 @@ class SanityCodeSmellTest(SanitySingleVersion):
894
876
  self.__no_targets = True
895
877
  self.__include_directories = False
896
878
  self.__include_symlinks = False
897
- self.__py2_compat = False
898
879
  self.__error_code = None
899
880
 
900
881
  if self.no_targets:
@@ -939,11 +920,6 @@ class SanityCodeSmellTest(SanitySingleVersion):
939
920
  """True if the test targets should include symlinks."""
940
921
  return self.__include_symlinks
941
922
 
942
- @property
943
- def py2_compat(self) -> bool:
944
- """True if the test only applies to code that runs on Python 2.x."""
945
- return self.__py2_compat
946
-
947
923
  @property
948
924
  def supported_python_versions(self) -> t.Optional[tuple[str, ...]]:
949
925
  """A tuple of supported Python versions or None if the test does not depend on specific Python versions."""
@@ -1141,10 +1117,8 @@ def create_sanity_virtualenv(
1141
1117
  commands = collect_requirements( # create_sanity_virtualenv()
1142
1118
  python=python,
1143
1119
  controller=True,
1144
- virtualenv=False,
1145
1120
  command=None,
1146
1121
  ansible=False,
1147
- cryptography=False,
1148
1122
  coverage=coverage,
1149
1123
  minimize=minimize,
1150
1124
  sanity=name,
@@ -47,11 +47,6 @@ from ...ansible_util import (
47
47
  ansible_environment,
48
48
  )
49
49
 
50
- from ...python_requirements import (
51
- PipUnavailableError,
52
- install_requirements,
53
- )
54
-
55
50
  from ...config import (
56
51
  SanityConfig,
57
52
  )
@@ -68,10 +63,6 @@ from ...host_configs import (
68
63
  PythonConfig,
69
64
  )
70
65
 
71
- from ...venv import (
72
- get_virtualenv_version,
73
- )
74
-
75
66
 
76
67
  def _get_module_test(module_restrictions: bool) -> c.Callable[[str], bool]:
77
68
  """Create a predicate which tests whether a path can be used by modules or not."""
@@ -109,15 +100,6 @@ class ImportTest(SanityMultipleVersion):
109
100
 
110
101
  paths = [target.path for target in targets.include]
111
102
 
112
- if python.version.startswith('2.') and (get_virtualenv_version(args, python.path) or (0,)) < (13,):
113
- # hack to make sure that virtualenv is available under Python 2.x
114
- # on Python 3.x we can use the built-in venv
115
- # version 13+ is required to use the `--no-wheel` option
116
- try:
117
- install_requirements(args, python, virtualenv=True, controller=False) # sanity (import)
118
- except PipUnavailableError as ex:
119
- display.warning(str(ex))
120
-
121
103
  temp_root = os.path.join(ResultType.TMP.path, 'sanity', 'import')
122
104
 
123
105
  messages = []
@@ -66,7 +66,6 @@ class MypyTest(SanityMultipleVersion):
66
66
  vendored_paths = (
67
67
  'lib/ansible/module_utils/six/__init__.py',
68
68
  'lib/ansible/module_utils/distro/_distro.py',
69
- 'lib/ansible/module_utils/compat/_selectors2.py',
70
69
  )
71
70
 
72
71
  def filter_targets(self, targets: list[TestTarget]) -> list[TestTarget]:
@@ -76,15 +75,6 @@ class MypyTest(SanityMultipleVersion):
76
75
  or target.path.startswith('packaging/')
77
76
  or target.path.startswith('test/lib/ansible_test/_util/target/sanity/import/'))]
78
77
 
79
- @property
80
- def supported_python_versions(self) -> t.Optional[tuple[str, ...]]:
81
- """A tuple of supported Python versions or None if the test does not depend on specific Python versions."""
82
- # mypy 0.981 dropped support for Python 2
83
- # see: https://mypy-lang.blogspot.com/2022/09/mypy-0981-released.html
84
- # cryptography dropped support for Python 3.5 in version 3.3
85
- # see: https://cryptography.io/en/latest/changelog/#v3-3
86
- return tuple(version for version in SUPPORTED_PYTHON_VERSIONS if str_to_version(version) >= (3, 6))
87
-
88
78
  @property
89
79
  def error_code(self) -> t.Optional[str]:
90
80
  """Error code for ansible-test matching the format used by the underlying test program, or None if the program does not use error codes."""
@@ -95,6 +85,13 @@ class MypyTest(SanityMultipleVersion):
95
85
  """True if the test requires PyPI, otherwise False."""
96
86
  return True
97
87
 
88
+ @property
89
+ def supported_python_versions(self) -> t.Optional[tuple[str, ...]]:
90
+ """A tuple of supported Python versions or None if the test does not depend on specific Python versions."""
91
+ # Because the version of typeshed mypy use in 1.9 doesn't support 3.7, neither does mypy 1.9.
92
+ # see: https://mypy-lang.blogspot.com/2024/03/mypy-19-released.html
93
+ return tuple(version for version in SUPPORTED_PYTHON_VERSIONS if str_to_version(version) >= (3, 8))
94
+
98
95
  def test(self, args: SanityConfig, targets: SanityTargets, python: PythonConfig) -> TestResult:
99
96
  settings = self.load_processor(args, python.version)
100
97
 
@@ -245,7 +245,7 @@ def command_units(args: UnitsConfig) -> None:
245
245
  #
246
246
  # NOTE: This only affects use of pytest-mock.
247
247
  # Collection unit tests may directly import mock, which will be provided by ansible-test when it installs requirements using pip.
248
- # Although mock is available for ansible-core unit tests, they should import units.compat.mock instead.
248
+ # Although mock is available for ansible-core unit tests, they should import unittest.mock instead.
249
249
  if str_to_version(python.version) < (3, 8):
250
250
  config_name = 'legacy.ini'
251
251
  else:
@@ -65,7 +65,6 @@ class ContentConfig:
65
65
 
66
66
  modules: ModulesConfig
67
67
  python_versions: tuple[str, ...]
68
- py2_support: bool
69
68
 
70
69
 
71
70
  class EnvironmentConfig(CommonConfig):
@@ -29,7 +29,6 @@ from .io import (
29
29
  from .util import (
30
30
  ApplicationError,
31
31
  display,
32
- str_to_version,
33
32
  )
34
33
 
35
34
  from .data import (
@@ -75,13 +74,9 @@ def parse_content_config(data: t.Any) -> ContentConfig:
75
74
  python_versions = tuple(version for version in SUPPORTED_PYTHON_VERSIONS
76
75
  if version in CONTROLLER_PYTHON_VERSIONS or version in modules.python_versions)
77
76
 
78
- # True if Python 2.x is supported.
79
- py2_support = any(version for version in python_versions if str_to_version(version)[0] == 2)
80
-
81
77
  return ContentConfig(
82
78
  modules=modules,
83
79
  python_versions=python_versions,
84
- py2_support=py2_support,
85
80
  )
86
81
 
87
82
 
@@ -71,7 +71,6 @@ COVERAGE_VERSIONS = (
71
71
  # IMPORTANT: Keep this in sync with the ansible-test.txt requirements file.
72
72
  CoverageVersion('7.3.2', 7, (3, 8), (3, 12)),
73
73
  CoverageVersion('6.5.0', 7, (3, 7), (3, 7)),
74
- CoverageVersion('4.5.4', 0, (2, 6), (3, 6)),
75
74
  )
76
75
  """
77
76
  This tuple specifies the coverage version to use for Python version ranges.
@@ -496,7 +496,7 @@ def get_docker_hostname() -> str:
496
496
  """Return the hostname of the Docker service."""
497
497
  docker_host = os.environ.get('DOCKER_HOST')
498
498
 
499
- if docker_host and docker_host.startswith('tcp://'):
499
+ if docker_host and docker_host.startswith(('tcp://', 'ssh://')):
500
500
  try:
501
501
  hostname = urllib.parse.urlparse(docker_host)[1].split(':')[0]
502
502
  display.info('Detected Docker host: %s' % hostname, verbosity=1)
@@ -958,7 +958,7 @@ class DockerProfile(ControllerHostProfile[DockerConfig], SshTargetHostProfile[Do
958
958
  """Perform out-of-band setup before delegation."""
959
959
  bootstrapper = BootstrapDocker(
960
960
  controller=self.controller,
961
- python_versions=[self.python.version],
961
+ python_interpreters={self.python.version: self.python.path},
962
962
  ssh_key=SshKey(self.args),
963
963
  )
964
964
 
@@ -1214,8 +1214,9 @@ class PosixRemoteProfile(ControllerHostProfile[PosixRemoteConfig], RemoteProfile
1214
1214
  def configure(self) -> None:
1215
1215
  """Perform in-band configuration. Executed before delegation for the controller and after delegation for targets."""
1216
1216
  # a target uses a single python version, but a controller may include additional versions for targets running on the controller
1217
- python_versions = [self.python.version] + [target.python.version for target in self.targets if isinstance(target, ControllerConfig)]
1218
- python_versions = sorted_versions(list(set(python_versions)))
1217
+ python_interpreters = {self.python.version: self.python.path}
1218
+ python_interpreters.update({target.python.version: target.python.path for target in self.targets if isinstance(target, ControllerConfig)})
1219
+ python_interpreters = {version: python_interpreters[version] for version in sorted_versions(list(python_interpreters.keys()))}
1219
1220
 
1220
1221
  core_ci = self.wait_for_instance()
1221
1222
  pwd = self.wait_until_ready()
@@ -1226,7 +1227,7 @@ class PosixRemoteProfile(ControllerHostProfile[PosixRemoteConfig], RemoteProfile
1226
1227
  controller=self.controller,
1227
1228
  platform=self.config.platform,
1228
1229
  platform_version=self.config.version,
1229
- python_versions=python_versions,
1230
+ python_interpreters=python_interpreters,
1230
1231
  ssh_key=core_ci.ssh_key,
1231
1232
  )
1232
1233
 
@@ -14,7 +14,6 @@ from .config import (
14
14
 
15
15
  from .host_configs import (
16
16
  PosixConfig,
17
- DockerConfig,
18
17
  )
19
18
 
20
19
  from .util import (
@@ -56,14 +55,8 @@ def run_pypi_proxy(args: EnvironmentConfig, targets_use_pypi: bool) -> None:
56
55
  return # user has overridden the proxy endpoint, there is nothing to provision
57
56
 
58
57
  versions_needing_proxy: tuple[str, ...] = tuple() # preserved for future use, no versions currently require this
59
- containers_needing_proxy: set[str] = {'centos7'}
60
58
  posix_targets = [target for target in args.targets if isinstance(target, PosixConfig)]
61
- need_proxy = targets_use_pypi and any(
62
- target.python.version in versions_needing_proxy or
63
- (isinstance(target, DockerConfig) and target.name in containers_needing_proxy)
64
- for target in posix_targets
65
- )
66
-
59
+ need_proxy = targets_use_pypi and any(target.python.version in versions_needing_proxy for target in posix_targets)
67
60
  use_proxy = args.pypi_proxy or need_proxy
68
61
 
69
62
  if not use_proxy: