ansible-core 2.15.4rc1__py3-none-any.whl → 2.16.0b2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of ansible-core might be problematic. Click here for more details.

Files changed (427) hide show
  1. ansible/cli/__init__.py +3 -3
  2. ansible/cli/adhoc.py +1 -1
  3. ansible/cli/arguments/option_helpers.py +15 -5
  4. ansible/cli/config.py +2 -2
  5. ansible/cli/console.py +21 -17
  6. ansible/cli/doc.py +8 -9
  7. ansible/cli/galaxy.py +60 -27
  8. ansible/cli/inventory.py +1 -1
  9. ansible/cli/playbook.py +1 -1
  10. ansible/cli/pull.py +2 -2
  11. ansible/cli/scripts/ansible_connection_cli_stub.py +1 -1
  12. ansible/cli/vault.py +11 -6
  13. ansible/collections/__init__.py +0 -29
  14. ansible/collections/list.py +23 -44
  15. ansible/config/ansible_builtin_runtime.yml +8 -4
  16. ansible/config/base.yml +34 -22
  17. ansible/config/manager.py +1 -1
  18. ansible/constants.py +3 -5
  19. ansible/errors/__init__.py +1 -1
  20. ansible/executor/interpreter_discovery.py +1 -1
  21. ansible/executor/module_common.py +39 -32
  22. ansible/executor/play_iterator.py +0 -15
  23. ansible/executor/playbook_executor.py +3 -3
  24. ansible/executor/powershell/module_manifest.py +1 -1
  25. ansible/executor/powershell/module_wrapper.ps1 +4 -1
  26. ansible/executor/process/worker.py +22 -7
  27. ansible/executor/task_executor.py +39 -40
  28. ansible/executor/task_queue_manager.py +8 -11
  29. ansible/galaxy/__init__.py +1 -1
  30. ansible/galaxy/api.py +8 -11
  31. ansible/galaxy/collection/__init__.py +17 -4
  32. ansible/galaxy/collection/concrete_artifact_manager.py +7 -2
  33. ansible/galaxy/collection/galaxy_api_proxy.py +1 -1
  34. ansible/galaxy/data/container/README.md +3 -5
  35. ansible/galaxy/dependency_resolution/__init__.py +1 -6
  36. ansible/galaxy/dependency_resolution/dataclasses.py +22 -1
  37. ansible/galaxy/dependency_resolution/providers.py +61 -69
  38. ansible/galaxy/role.py +31 -13
  39. ansible/galaxy/token.py +2 -2
  40. ansible/inventory/group.py +1 -1
  41. ansible/inventory/manager.py +1 -1
  42. ansible/module_utils/ansible_release.py +2 -2
  43. ansible/module_utils/basic.py +11 -41
  44. ansible/module_utils/common/file.py +0 -100
  45. ansible/module_utils/common/json.py +1 -1
  46. ansible/module_utils/common/locale.py +1 -1
  47. ansible/module_utils/common/text/converters.py +2 -2
  48. ansible/module_utils/common/validation.py +1 -1
  49. ansible/module_utils/compat/_selectors2.py +4 -4
  50. ansible/module_utils/compat/datetime.py +40 -0
  51. ansible/module_utils/compat/selinux.py +1 -1
  52. ansible/module_utils/compat/typing.py +1 -1
  53. ansible/module_utils/connection.py +1 -1
  54. ansible/module_utils/facts/hardware/linux.py +2 -2
  55. ansible/module_utils/facts/hardware/openbsd.py +1 -1
  56. ansible/module_utils/facts/network/linux.py +3 -3
  57. ansible/module_utils/facts/other/facter.py +8 -15
  58. ansible/module_utils/facts/sysctl.py +1 -1
  59. ansible/module_utils/facts/system/date_time.py +2 -2
  60. ansible/module_utils/facts/system/distribution.py +1 -1
  61. ansible/module_utils/facts/system/local.py +6 -2
  62. ansible/module_utils/facts/system/pkg_mgr.py +6 -1
  63. ansible/module_utils/facts/system/service_mgr.py +4 -2
  64. ansible/module_utils/parsing/convert_bool.py +1 -1
  65. ansible/module_utils/service.py +9 -6
  66. ansible/module_utils/urls.py +40 -22
  67. ansible/modules/add_host.py +2 -2
  68. ansible/modules/apt.py +48 -31
  69. ansible/modules/apt_key.py +4 -4
  70. ansible/modules/apt_repository.py +5 -5
  71. ansible/modules/assemble.py +7 -7
  72. ansible/modules/assert.py +1 -1
  73. ansible/modules/async_status.py +11 -7
  74. ansible/modules/async_wrapper.py +1 -1
  75. ansible/modules/blockinfile.py +60 -17
  76. ansible/modules/command.py +37 -15
  77. ansible/modules/copy.py +35 -30
  78. ansible/modules/cron.py +14 -14
  79. ansible/modules/deb822_repository.py +4 -3
  80. ansible/modules/debconf.py +35 -14
  81. ansible/modules/debug.py +1 -1
  82. ansible/modules/dnf.py +29 -27
  83. ansible/modules/dnf5.py +22 -22
  84. ansible/modules/dpkg_selections.py +9 -2
  85. ansible/modules/expect.py +4 -4
  86. ansible/modules/fetch.py +7 -7
  87. ansible/modules/file.py +30 -30
  88. ansible/modules/find.py +82 -22
  89. ansible/modules/gather_facts.py +6 -2
  90. ansible/modules/get_url.py +29 -29
  91. ansible/modules/getent.py +4 -4
  92. ansible/modules/git.py +27 -27
  93. ansible/modules/group.py +5 -12
  94. ansible/modules/hostname.py +21 -2
  95. ansible/modules/include_role.py +5 -5
  96. ansible/modules/include_tasks.py +2 -2
  97. ansible/modules/include_vars.py +5 -5
  98. ansible/modules/iptables.py +70 -65
  99. ansible/modules/known_hosts.py +7 -7
  100. ansible/modules/lineinfile.py +33 -33
  101. ansible/modules/meta.py +13 -13
  102. ansible/modules/package.py +8 -8
  103. ansible/modules/package_facts.py +3 -3
  104. ansible/modules/pause.py +2 -2
  105. ansible/modules/ping.py +5 -5
  106. ansible/modules/pip.py +80 -46
  107. ansible/modules/reboot.py +8 -4
  108. ansible/modules/replace.py +20 -15
  109. ansible/modules/rpm_key.py +2 -2
  110. ansible/modules/script.py +16 -10
  111. ansible/modules/service.py +26 -98
  112. ansible/modules/service_facts.py +36 -12
  113. ansible/modules/set_fact.py +2 -2
  114. ansible/modules/set_stats.py +2 -2
  115. ansible/modules/setup.py +18 -18
  116. ansible/modules/shell.py +3 -3
  117. ansible/modules/stat.py +9 -30
  118. ansible/modules/subversion.py +9 -9
  119. ansible/modules/systemd.py +20 -19
  120. ansible/modules/systemd_service.py +20 -19
  121. ansible/modules/sysvinit.py +26 -21
  122. ansible/modules/tempfile.py +5 -4
  123. ansible/modules/template.py +60 -6
  124. ansible/modules/unarchive.py +21 -18
  125. ansible/modules/uri.py +39 -39
  126. ansible/modules/user.py +81 -53
  127. ansible/modules/wait_for.py +22 -21
  128. ansible/modules/wait_for_connection.py +4 -4
  129. ansible/modules/yum.py +38 -38
  130. ansible/modules/yum_repository.py +58 -80
  131. ansible/parsing/dataloader.py +27 -27
  132. ansible/parsing/mod_args.py +1 -1
  133. ansible/parsing/plugin_docs.py +3 -3
  134. ansible/parsing/splitter.py +14 -16
  135. ansible/parsing/utils/yaml.py +1 -1
  136. ansible/parsing/vault/__init__.py +8 -6
  137. ansible/parsing/yaml/constructor.py +1 -1
  138. ansible/parsing/yaml/objects.py +1 -1
  139. ansible/playbook/__init__.py +1 -1
  140. ansible/playbook/base.py +2 -2
  141. ansible/playbook/block.py +0 -1
  142. ansible/playbook/conditional.py +40 -114
  143. ansible/playbook/helpers.py +5 -28
  144. ansible/playbook/included_file.py +8 -7
  145. ansible/playbook/play.py +1 -1
  146. ansible/playbook/play_context.py +2 -2
  147. ansible/playbook/playbook_include.py +2 -2
  148. ansible/playbook/role/__init__.py +1 -1
  149. ansible/playbook/role/include.py +1 -1
  150. ansible/playbook/role/metadata.py +1 -1
  151. ansible/playbook/role_include.py +1 -1
  152. ansible/playbook/task.py +2 -2
  153. ansible/playbook/task_include.py +1 -24
  154. ansible/plugins/__init__.py +13 -5
  155. ansible/plugins/action/__init__.py +17 -43
  156. ansible/plugins/action/add_host.py +2 -3
  157. ansible/plugins/action/assemble.py +1 -1
  158. ansible/plugins/action/assert.py +2 -1
  159. ansible/plugins/action/copy.py +2 -2
  160. ansible/plugins/action/debug.py +2 -1
  161. ansible/plugins/action/fail.py +1 -0
  162. ansible/plugins/action/fetch.py +3 -1
  163. ansible/plugins/action/gather_facts.py +37 -13
  164. ansible/plugins/action/group_by.py +1 -0
  165. ansible/plugins/action/include_vars.py +3 -2
  166. ansible/plugins/action/normal.py +3 -3
  167. ansible/plugins/action/pause.py +1 -1
  168. ansible/plugins/action/reboot.py +21 -16
  169. ansible/plugins/action/script.py +23 -8
  170. ansible/plugins/action/set_fact.py +1 -0
  171. ansible/plugins/action/set_stats.py +1 -0
  172. ansible/plugins/action/shell.py +6 -0
  173. ansible/plugins/action/template.py +1 -1
  174. ansible/plugins/action/unarchive.py +1 -1
  175. ansible/plugins/action/uri.py +1 -1
  176. ansible/plugins/action/validate_argument_spec.py +1 -0
  177. ansible/plugins/action/wait_for_connection.py +4 -4
  178. ansible/plugins/become/__init__.py +1 -1
  179. ansible/plugins/become/su.py +1 -1
  180. ansible/plugins/cache/__init__.py +1 -1
  181. ansible/plugins/callback/junit.py +1 -1
  182. ansible/plugins/callback/oneline.py +1 -1
  183. ansible/plugins/callback/tree.py +1 -1
  184. ansible/plugins/cliconf/__init__.py +2 -2
  185. ansible/plugins/connection/__init__.py +65 -37
  186. ansible/plugins/connection/local.py +9 -8
  187. ansible/plugins/connection/paramiko_ssh.py +34 -28
  188. ansible/plugins/connection/psrp.py +56 -43
  189. ansible/plugins/connection/ssh.py +67 -43
  190. ansible/plugins/connection/winrm.py +77 -30
  191. ansible/plugins/doc_fragments/constructed.py +4 -4
  192. ansible/plugins/doc_fragments/files.py +12 -12
  193. ansible/plugins/doc_fragments/inventory_cache.py +0 -6
  194. ansible/plugins/doc_fragments/result_format_callback.py +5 -5
  195. ansible/plugins/doc_fragments/shell_common.py +2 -2
  196. ansible/plugins/doc_fragments/shell_windows.py +1 -1
  197. ansible/plugins/doc_fragments/template_common.py +6 -6
  198. ansible/plugins/doc_fragments/url.py +10 -10
  199. ansible/plugins/doc_fragments/url_windows.py +15 -15
  200. ansible/plugins/doc_fragments/vars_plugin_staging.py +4 -4
  201. ansible/plugins/filter/b64decode.yml +1 -1
  202. ansible/plugins/filter/b64encode.yml +2 -2
  203. ansible/plugins/filter/bool.yml +5 -5
  204. ansible/plugins/filter/combine.yml +1 -1
  205. ansible/plugins/filter/commonpath.yml +2 -1
  206. ansible/plugins/filter/core.py +6 -8
  207. ansible/plugins/filter/dict2items.yml +11 -1
  208. ansible/plugins/filter/difference.yml +1 -0
  209. ansible/plugins/filter/encryption.py +1 -1
  210. ansible/plugins/filter/extract.yml +1 -1
  211. ansible/plugins/filter/flatten.yml +1 -1
  212. ansible/plugins/filter/from_yaml.yml +1 -1
  213. ansible/plugins/filter/from_yaml_all.yml +2 -2
  214. ansible/plugins/filter/hash.yml +1 -1
  215. ansible/plugins/filter/human_readable.yml +1 -1
  216. ansible/plugins/filter/human_to_bytes.yml +2 -2
  217. ansible/plugins/filter/intersect.yml +1 -0
  218. ansible/plugins/filter/mandatory.yml +7 -0
  219. ansible/plugins/filter/mathstuff.py +15 -17
  220. ansible/plugins/filter/normpath.yml +1 -1
  221. ansible/plugins/filter/path_join.yml +8 -1
  222. ansible/plugins/filter/realpath.yml +3 -2
  223. ansible/plugins/filter/regex_findall.yml +8 -2
  224. ansible/plugins/filter/regex_replace.yml +9 -3
  225. ansible/plugins/filter/regex_search.yml +8 -2
  226. ansible/plugins/filter/relpath.yml +2 -2
  227. ansible/plugins/filter/root.yml +1 -1
  228. ansible/plugins/filter/splitext.yml +1 -1
  229. ansible/plugins/filter/subelements.yml +2 -2
  230. ansible/plugins/filter/symmetric_difference.yml +1 -0
  231. ansible/plugins/filter/ternary.yml +5 -5
  232. ansible/plugins/filter/to_json.yml +7 -7
  233. ansible/plugins/filter/to_nice_json.yml +5 -5
  234. ansible/plugins/filter/to_yaml.yml +2 -2
  235. ansible/plugins/filter/type_debug.yml +1 -1
  236. ansible/plugins/filter/union.yml +1 -0
  237. ansible/plugins/filter/unvault.yml +2 -2
  238. ansible/plugins/filter/urldecode.yml +13 -32
  239. ansible/plugins/filter/urlsplit.py +1 -1
  240. ansible/plugins/filter/vault.yml +1 -1
  241. ansible/plugins/filter/zip.yml +1 -1
  242. ansible/plugins/filter/zip_longest.yml +1 -1
  243. ansible/plugins/inventory/__init__.py +1 -1
  244. ansible/plugins/inventory/advanced_host_list.py +1 -1
  245. ansible/plugins/inventory/constructed.py +2 -2
  246. ansible/plugins/inventory/host_list.py +1 -1
  247. ansible/plugins/inventory/ini.py +6 -3
  248. ansible/plugins/inventory/script.py +8 -2
  249. ansible/plugins/inventory/toml.py +1 -1
  250. ansible/plugins/inventory/yaml.py +1 -1
  251. ansible/plugins/list.py +21 -17
  252. ansible/plugins/loader.py +66 -88
  253. ansible/plugins/lookup/__init__.py +1 -1
  254. ansible/plugins/lookup/config.py +16 -6
  255. ansible/plugins/lookup/csvfile.py +7 -4
  256. ansible/plugins/lookup/env.py +1 -1
  257. ansible/plugins/lookup/file.py +5 -2
  258. ansible/plugins/lookup/fileglob.py +5 -2
  259. ansible/plugins/lookup/first_found.py +20 -14
  260. ansible/plugins/lookup/ini.py +6 -3
  261. ansible/plugins/lookup/lines.py +2 -1
  262. ansible/plugins/lookup/password.py +7 -7
  263. ansible/plugins/lookup/pipe.py +1 -0
  264. ansible/plugins/lookup/random_choice.py +2 -2
  265. ansible/plugins/lookup/sequence.py +1 -1
  266. ansible/plugins/lookup/subelements.py +2 -2
  267. ansible/plugins/lookup/template.py +4 -1
  268. ansible/plugins/lookup/unvault.py +4 -1
  269. ansible/plugins/lookup/url.py +6 -6
  270. ansible/plugins/lookup/varnames.py +1 -1
  271. ansible/plugins/netconf/__init__.py +3 -3
  272. ansible/plugins/shell/__init__.py +1 -1
  273. ansible/plugins/shell/cmd.py +7 -7
  274. ansible/plugins/shell/powershell.py +1 -1
  275. ansible/plugins/strategy/__init__.py +8 -10
  276. ansible/plugins/strategy/free.py +1 -1
  277. ansible/plugins/strategy/linear.py +3 -3
  278. ansible/plugins/terminal/__init__.py +2 -2
  279. ansible/plugins/test/abs.yml +1 -1
  280. ansible/plugins/test/all.yml +1 -1
  281. ansible/plugins/test/any.yml +1 -1
  282. ansible/plugins/test/change.yml +2 -2
  283. ansible/plugins/test/changed.yml +2 -2
  284. ansible/plugins/test/contains.yml +1 -1
  285. ansible/plugins/test/core.py +1 -1
  286. ansible/plugins/test/directory.yml +1 -1
  287. ansible/plugins/test/exists.yml +3 -2
  288. ansible/plugins/test/failed.yml +2 -2
  289. ansible/plugins/test/failure.yml +2 -2
  290. ansible/plugins/test/falsy.yml +2 -2
  291. ansible/plugins/test/file.yml +1 -1
  292. ansible/plugins/test/finished.yml +2 -2
  293. ansible/plugins/test/is_abs.yml +1 -1
  294. ansible/plugins/test/is_dir.yml +1 -1
  295. ansible/plugins/test/is_file.yml +1 -1
  296. ansible/plugins/test/is_link.yml +1 -1
  297. ansible/plugins/test/is_mount.yml +1 -1
  298. ansible/plugins/test/is_same_file.yml +1 -1
  299. ansible/plugins/test/isnan.yml +1 -1
  300. ansible/plugins/test/issubset.yml +1 -2
  301. ansible/plugins/test/issuperset.yml +1 -2
  302. ansible/plugins/test/link.yml +1 -1
  303. ansible/plugins/test/link_exists.yml +1 -1
  304. ansible/plugins/test/match.yml +2 -2
  305. ansible/plugins/test/mount.yml +1 -1
  306. ansible/plugins/test/nan.yml +1 -1
  307. ansible/plugins/test/reachable.yml +2 -2
  308. ansible/plugins/test/regex.yml +1 -1
  309. ansible/plugins/test/same_file.yml +1 -1
  310. ansible/plugins/test/search.yml +2 -2
  311. ansible/plugins/test/skip.yml +3 -3
  312. ansible/plugins/test/skipped.yml +3 -3
  313. ansible/plugins/test/started.yml +2 -2
  314. ansible/plugins/test/subset.yml +1 -2
  315. ansible/plugins/test/succeeded.yml +2 -2
  316. ansible/plugins/test/success.yml +2 -2
  317. ansible/plugins/test/successful.yml +2 -2
  318. ansible/plugins/test/superset.yml +1 -2
  319. ansible/plugins/test/truthy.yml +3 -3
  320. ansible/plugins/test/unreachable.yml +2 -2
  321. ansible/plugins/test/uri.yml +1 -1
  322. ansible/plugins/test/url.yml +1 -1
  323. ansible/plugins/test/urn.yml +1 -1
  324. ansible/plugins/test/vault_encrypted.yml +1 -1
  325. ansible/plugins/test/version.yml +7 -7
  326. ansible/plugins/test/version_compare.yml +7 -7
  327. ansible/plugins/vars/host_group_vars.py +1 -1
  328. ansible/release.py +2 -2
  329. ansible/template/__init__.py +24 -26
  330. ansible/template/native_helpers.py +1 -1
  331. ansible/template/vars.py +1 -1
  332. ansible/utils/_junit_xml.py +1 -1
  333. ansible/utils/cmd_functions.py +1 -1
  334. ansible/utils/collection_loader/_collection_finder.py +12 -1
  335. ansible/utils/display.py +113 -62
  336. ansible/utils/encrypt.py +11 -14
  337. ansible/utils/hashing.py +1 -1
  338. ansible/utils/jsonrpc.py +1 -1
  339. ansible/utils/path.py +1 -1
  340. ansible/utils/plugin_docs.py +1 -1
  341. ansible/utils/py3compat.py +1 -1
  342. ansible/utils/shlex.py +2 -10
  343. ansible/utils/ssh_functions.py +5 -4
  344. ansible/utils/unicode.py +1 -1
  345. ansible/utils/unsafe_proxy.py +1 -1
  346. ansible/utils/vars.py +4 -29
  347. ansible/vars/hostvars.py +1 -2
  348. ansible/vars/manager.py +13 -9
  349. ansible/vars/plugins.py +2 -2
  350. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/COPYING +4 -5
  351. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/METADATA +2 -4
  352. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/RECORD +424 -425
  353. ansible_test/_data/completion/docker.txt +9 -9
  354. ansible_test/_data/completion/remote.txt +4 -7
  355. ansible_test/_data/completion/windows.txt +0 -2
  356. ansible_test/_data/requirements/ansible-test.txt +2 -1
  357. ansible_test/_data/requirements/ansible.txt +0 -3
  358. ansible_test/_data/requirements/constraints.txt +0 -2
  359. ansible_test/_data/requirements/sanity.ansible-doc.txt +3 -5
  360. ansible_test/_data/requirements/sanity.changelog.in +1 -2
  361. ansible_test/_data/requirements/sanity.changelog.txt +4 -6
  362. ansible_test/_data/requirements/sanity.import.plugin.txt +2 -4
  363. ansible_test/_data/requirements/sanity.import.txt +1 -3
  364. ansible_test/_data/requirements/sanity.integration-aliases.txt +1 -3
  365. ansible_test/_data/requirements/sanity.mypy.txt +12 -12
  366. ansible_test/_data/requirements/sanity.pep8.txt +1 -1
  367. ansible_test/_data/requirements/sanity.pylint.txt +6 -12
  368. ansible_test/_data/requirements/sanity.runtime-metadata.txt +1 -3
  369. ansible_test/_data/requirements/sanity.validate-modules.in +1 -1
  370. ansible_test/_data/requirements/sanity.validate-modules.txt +3 -5
  371. ansible_test/_data/requirements/sanity.yamllint.txt +3 -5
  372. ansible_test/_data/requirements/units.txt +0 -1
  373. ansible_test/_internal/ci/azp.py +4 -4
  374. ansible_test/_internal/cli/environments.py +0 -13
  375. ansible_test/_internal/commands/coverage/analyze/targets/__init__.py +4 -4
  376. ansible_test/_internal/commands/coverage/combine.py +1 -1
  377. ansible_test/_internal/commands/integration/cloud/acme.py +6 -8
  378. ansible_test/_internal/commands/integration/cloud/cs.py +4 -9
  379. ansible_test/_internal/commands/integration/cloud/galaxy.py +103 -96
  380. ansible_test/_internal/commands/integration/cloud/httptester.py +0 -3
  381. ansible_test/_internal/commands/integration/cloud/nios.py +7 -9
  382. ansible_test/_internal/commands/integration/cloud/openshift.py +2 -7
  383. ansible_test/_internal/commands/integration/cloud/vcenter.py +11 -95
  384. ansible_test/_internal/commands/sanity/__init__.py +10 -0
  385. ansible_test/_internal/commands/sanity/import.py +8 -2
  386. ansible_test/_internal/commands/sanity/pylint.py +27 -1
  387. ansible_test/_internal/commands/units/__init__.py +2 -1
  388. ansible_test/_internal/config.py +0 -7
  389. ansible_test/_internal/containers.py +11 -56
  390. ansible_test/_internal/core_ci.py +0 -7
  391. ansible_test/_internal/coverage_util.py +8 -3
  392. ansible_test/_internal/delegation.py +0 -1
  393. ansible_test/_internal/diff.py +1 -1
  394. ansible_test/_internal/docker_util.py +9 -2
  395. ansible_test/_internal/host_profiles.py +6 -6
  396. ansible_test/_internal/http.py +1 -1
  397. ansible_test/_internal/junit_xml.py +1 -1
  398. ansible_test/_internal/pypi_proxy.py +1 -1
  399. ansible_test/_internal/python_requirements.py +3 -8
  400. ansible_test/_internal/util.py +1 -6
  401. ansible_test/_util/controller/sanity/code-smell/no-get-exception.json +4 -0
  402. ansible_test/_util/controller/sanity/code-smell/replace-urlopen.json +4 -0
  403. ansible_test/_util/controller/sanity/code-smell/use-compat-six.json +4 -0
  404. ansible_test/_util/controller/sanity/mypy/ansible-core.ini +3 -0
  405. ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +2 -0
  406. ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +0 -1
  407. ansible_test/_util/controller/sanity/pylint/config/collection.cfg +1 -0
  408. ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py +172 -10
  409. ansible_test/_util/controller/sanity/pylint/plugins/string_format.py +13 -2
  410. ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py +7 -1
  411. ansible_test/_util/controller/sanity/validate-modules/validate_modules/main.py +6 -6
  412. ansible_test/_util/controller/sanity/validate-modules/validate_modules/module_args.py +1 -1
  413. ansible_test/_util/controller/sanity/validate-modules/validate_modules/utils.py +1 -1
  414. ansible_test/_util/controller/sanity/yamllint/yamllinter.py +3 -3
  415. ansible_test/_util/controller/tools/collection_detail.py +2 -2
  416. ansible_test/_util/target/common/constants.py +2 -2
  417. ansible_test/_util/target/pytest/plugins/ansible_forked.py +103 -0
  418. ansible_test/_util/target/sanity/import/importer.py +0 -8
  419. ansible_test/_util/target/setup/bootstrap.sh +36 -16
  420. ansible_test/_util/target/setup/quiet_pip.py +0 -4
  421. ansible/modules/_include.py +0 -80
  422. ansible_test/_internal/commands/integration/cloud/foreman.py +0 -102
  423. ansible_test/_util/target/setup/ConfigureRemotingForAnsible.ps1 +0 -435
  424. {ansible_core-2.15.4rc1.data → ansible_core-2.16.0b2.data}/scripts/ansible-test +0 -0
  425. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/WHEEL +0 -0
  426. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/entry_points.txt +0 -0
  427. {ansible_core-2.15.4rc1.dist-info → ansible_core-2.16.0b2.dist-info}/top_level.txt +0 -0
@@ -27,6 +27,7 @@ class ActionModule(ActionBase):
27
27
  # We need to be able to modify the inventory
28
28
  TRANSFERS_FILES = False
29
29
  _VALID_ARGS = frozenset(('key', 'parents'))
30
+ _requires_connection = False
30
31
 
31
32
  def run(self, tmp=None, task_vars=None):
32
33
  if task_vars is None:
@@ -10,7 +10,7 @@ import re
10
10
  import ansible.constants as C
11
11
  from ansible.errors import AnsibleError
12
12
  from ansible.module_utils.six import string_types
13
- from ansible.module_utils._text import to_native, to_text
13
+ from ansible.module_utils.common.text.converters import to_native, to_text
14
14
  from ansible.plugins.action import ActionBase
15
15
  from ansible.utils.vars import combine_vars
16
16
 
@@ -23,6 +23,7 @@ class ActionModule(ActionBase):
23
23
  VALID_DIR_ARGUMENTS = ['dir', 'depth', 'files_matching', 'ignore_files', 'extensions', 'ignore_unknown_extensions']
24
24
  VALID_FILE_ARGUMENTS = ['file', '_raw_params']
25
25
  VALID_ALL = ['name', 'hash_behaviour']
26
+ _requires_connection = False
26
27
 
27
28
  def _set_dir_defaults(self):
28
29
  if not self.depth:
@@ -182,7 +183,7 @@ class ActionModule(ActionBase):
182
183
  The default depth is unlimited.
183
184
  """
184
185
  current_depth = 0
185
- sorted_walk = list(walk(self.source_dir, onerror=self._log_walk))
186
+ sorted_walk = list(walk(self.source_dir, onerror=self._log_walk, followlinks=True))
186
187
  sorted_walk.sort(key=lambda x: x[0])
187
188
  for current_root, current_dir, current_files in sorted_walk:
188
189
  current_depth += 1
@@ -24,12 +24,12 @@ from ansible.utils.vars import merge_hash
24
24
 
25
25
  class ActionModule(ActionBase):
26
26
 
27
+ _supports_check_mode = True
28
+ _supports_async = True
29
+
27
30
  def run(self, tmp=None, task_vars=None):
28
31
 
29
32
  # individual modules might disagree but as the generic the action plugin, pass at this point.
30
- self._supports_check_mode = True
31
- self._supports_async = True
32
-
33
33
  result = super(ActionModule, self).run(tmp, task_vars)
34
34
  del tmp # tmp no longer has any effect
35
35
 
@@ -21,7 +21,7 @@ import datetime
21
21
  import time
22
22
 
23
23
  from ansible.errors import AnsibleError, AnsiblePromptInterrupt, AnsiblePromptNoninteractive
24
- from ansible.module_utils._text import to_text
24
+ from ansible.module_utils.common.text.converters import to_text
25
25
  from ansible.plugins.action import ActionBase
26
26
  from ansible.utils.display import Display
27
27
 
@@ -8,10 +8,10 @@ __metaclass__ = type
8
8
  import random
9
9
  import time
10
10
 
11
- from datetime import datetime, timedelta
11
+ from datetime import datetime, timedelta, timezone
12
12
 
13
13
  from ansible.errors import AnsibleError, AnsibleConnectionFailure
14
- from ansible.module_utils._text import to_native, to_text
14
+ from ansible.module_utils.common.text.converters import to_native, to_text
15
15
  from ansible.module_utils.common.validation import check_type_list, check_type_str
16
16
  from ansible.plugins.action import ActionBase
17
17
  from ansible.utils.display import Display
@@ -129,7 +129,7 @@ class ActionModule(ActionBase):
129
129
  else:
130
130
  args = self._get_value_from_facts('SHUTDOWN_COMMAND_ARGS', distribution, 'DEFAULT_SHUTDOWN_COMMAND_ARGS')
131
131
 
132
- # Convert seconds to minutes. If less that 60, set it to 0.
132
+ # Convert seconds to minutes. If less than 60, set it to 0.
133
133
  delay_min = self.pre_reboot_delay // 60
134
134
  reboot_message = self._task.args.get('msg', self.DEFAULT_REBOOT_MESSAGE)
135
135
  return args.format(delay_sec=self.pre_reboot_delay, delay_min=delay_min, message=reboot_message)
@@ -236,7 +236,7 @@ class ActionModule(ActionBase):
236
236
  display.vvv("{action}: attempting to get system boot time".format(action=self._task.action))
237
237
  connect_timeout = self._task.args.get('connect_timeout', self._task.args.get('connect_timeout_sec', self.DEFAULT_CONNECT_TIMEOUT))
238
238
 
239
- # override connection timeout from defaults to custom value
239
+ # override connection timeout from defaults to the custom value
240
240
  if connect_timeout:
241
241
  try:
242
242
  display.debug("{action}: setting connect_timeout to {value}".format(action=self._task.action, value=connect_timeout))
@@ -280,14 +280,15 @@ class ActionModule(ActionBase):
280
280
  display.vvv("{action}: system successfully rebooted".format(action=self._task.action))
281
281
 
282
282
  def do_until_success_or_timeout(self, action, reboot_timeout, action_desc, distribution, action_kwargs=None):
283
- max_end_time = datetime.utcnow() + timedelta(seconds=reboot_timeout)
283
+ max_end_time = datetime.now(timezone.utc) + timedelta(seconds=reboot_timeout)
284
284
  if action_kwargs is None:
285
285
  action_kwargs = {}
286
286
 
287
287
  fail_count = 0
288
288
  max_fail_sleep = 12
289
+ last_error_msg = ''
289
290
 
290
- while datetime.utcnow() < max_end_time:
291
+ while datetime.now(timezone.utc) < max_end_time:
291
292
  try:
292
293
  action(distribution=distribution, **action_kwargs)
293
294
  if action_desc:
@@ -299,7 +300,7 @@ class ActionModule(ActionBase):
299
300
  self._connection.reset()
300
301
  except AnsibleConnectionFailure:
301
302
  pass
302
- # Use exponential backoff with a max timout, plus a little bit of randomness
303
+ # Use exponential backoff with a max timeout, plus a little bit of randomness
303
304
  random_int = random.randint(0, 1000) / 1000
304
305
  fail_sleep = 2 ** fail_count + random_int
305
306
  if fail_sleep > max_fail_sleep:
@@ -310,14 +311,18 @@ class ActionModule(ActionBase):
310
311
  error = to_text(e).splitlines()[-1]
311
312
  except IndexError as e:
312
313
  error = to_text(e)
313
- display.debug("{action}: {desc} fail '{err}', retrying in {sleep:.4} seconds...".format(
314
- action=self._task.action,
315
- desc=action_desc,
316
- err=error,
317
- sleep=fail_sleep))
314
+ last_error_msg = f"{self._task.action}: {action_desc} fail '{error}'"
315
+ msg = f"{last_error_msg}, retrying in {fail_sleep:.4f} seconds..."
316
+
317
+ display.debug(msg)
318
+ display.vvv(msg)
318
319
  fail_count += 1
319
320
  time.sleep(fail_sleep)
320
321
 
322
+ if last_error_msg:
323
+ msg = f"Last error message before the timeout exception - {last_error_msg}"
324
+ display.debug(msg)
325
+ display.vvv(msg)
321
326
  raise TimedOutException('Timed out waiting for {desc} (timeout={timeout})'.format(desc=action_desc, timeout=reboot_timeout))
322
327
 
323
328
  def perform_reboot(self, task_vars, distribution):
@@ -336,7 +341,7 @@ class ActionModule(ActionBase):
336
341
  display.debug('{action}: AnsibleConnectionFailure caught and handled: {error}'.format(action=self._task.action, error=to_text(e)))
337
342
  reboot_result['rc'] = 0
338
343
 
339
- result['start'] = datetime.utcnow()
344
+ result['start'] = datetime.now(timezone.utc)
340
345
 
341
346
  if reboot_result['rc'] != 0:
342
347
  result['failed'] = True
@@ -406,7 +411,7 @@ class ActionModule(ActionBase):
406
411
  self._supports_check_mode = True
407
412
  self._supports_async = True
408
413
 
409
- # If running with local connection, fail so we don't reboot ourself
414
+ # If running with local connection, fail so we don't reboot ourselves
410
415
  if self._connection.transport == 'local':
411
416
  msg = 'Running {0} with local connection would reboot the control node.'.format(self._task.action)
412
417
  return {'changed': False, 'elapsed': 0, 'rebooted': False, 'failed': True, 'msg': msg}
@@ -447,7 +452,7 @@ class ActionModule(ActionBase):
447
452
 
448
453
  if reboot_result['failed']:
449
454
  result = reboot_result
450
- elapsed = datetime.utcnow() - reboot_result['start']
455
+ elapsed = datetime.now(timezone.utc) - reboot_result['start']
451
456
  result['elapsed'] = elapsed.seconds
452
457
  return result
453
458
 
@@ -459,7 +464,7 @@ class ActionModule(ActionBase):
459
464
  # Make sure reboot was successful
460
465
  result = self.validate_reboot(distribution, original_connection_timeout, action_kwargs={'previous_boot_time': previous_boot_time})
461
466
 
462
- elapsed = datetime.utcnow() - reboot_result['start']
467
+ elapsed = datetime.now(timezone.utc) - reboot_result['start']
463
468
  result['elapsed'] = elapsed.seconds
464
469
 
465
470
  return result
@@ -23,7 +23,7 @@ import shlex
23
23
 
24
24
  from ansible.errors import AnsibleError, AnsibleAction, _AnsibleActionDone, AnsibleActionFail, AnsibleActionSkip
25
25
  from ansible.executor.powershell import module_manifest as ps_manifest
26
- from ansible.module_utils._text import to_bytes, to_native, to_text
26
+ from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
27
27
  from ansible.plugins.action import ActionBase
28
28
 
29
29
 
@@ -40,11 +40,25 @@ class ActionModule(ActionBase):
40
40
  if task_vars is None:
41
41
  task_vars = dict()
42
42
 
43
+ validation_result, new_module_args = self.validate_argument_spec(
44
+ argument_spec={
45
+ '_raw_params': {},
46
+ 'cmd': {'type': 'str'},
47
+ 'creates': {'type': 'str'},
48
+ 'removes': {'type': 'str'},
49
+ 'chdir': {'type': 'str'},
50
+ 'executable': {'type': 'str'},
51
+ },
52
+ required_one_of=[
53
+ ['_raw_params', 'cmd']
54
+ ]
55
+ )
56
+
43
57
  result = super(ActionModule, self).run(tmp, task_vars)
44
58
  del tmp # tmp no longer has any effect
45
59
 
46
60
  try:
47
- creates = self._task.args.get('creates')
61
+ creates = new_module_args['creates']
48
62
  if creates:
49
63
  # do not run the command if the line contains creates=filename
50
64
  # and the filename already exists. This allows idempotence
@@ -52,7 +66,7 @@ class ActionModule(ActionBase):
52
66
  if self._remote_file_exists(creates):
53
67
  raise AnsibleActionSkip("%s exists, matching creates option" % creates)
54
68
 
55
- removes = self._task.args.get('removes')
69
+ removes = new_module_args['removes']
56
70
  if removes:
57
71
  # do not run the command if the line contains removes=filename
58
72
  # and the filename does not exist. This allows idempotence
@@ -62,7 +76,7 @@ class ActionModule(ActionBase):
62
76
 
63
77
  # The chdir must be absolute, because a relative path would rely on
64
78
  # remote node behaviour & user config.
65
- chdir = self._task.args.get('chdir')
79
+ chdir = new_module_args['chdir']
66
80
  if chdir:
67
81
  # Powershell is the only Windows-path aware shell
68
82
  if getattr(self._connection._shell, "_IS_WINDOWS", False) and \
@@ -75,13 +89,14 @@ class ActionModule(ActionBase):
75
89
  # Split out the script as the first item in raw_params using
76
90
  # shlex.split() in order to support paths and files with spaces in the name.
77
91
  # Any arguments passed to the script will be added back later.
78
- raw_params = to_native(self._task.args.get('_raw_params', ''), errors='surrogate_or_strict')
92
+ raw_params = to_native(new_module_args.get('_raw_params', ''), errors='surrogate_or_strict')
79
93
  parts = [to_text(s, errors='surrogate_or_strict') for s in shlex.split(raw_params.strip())]
80
94
  source = parts[0]
81
95
 
82
96
  # Support executable paths and files with spaces in the name.
83
- executable = to_native(self._task.args.get('executable', ''), errors='surrogate_or_strict')
84
-
97
+ executable = new_module_args['executable']
98
+ if executable:
99
+ executable = to_native(new_module_args['executable'], errors='surrogate_or_strict')
85
100
  try:
86
101
  source = self._loader.get_real_file(self._find_needle('files', source), decrypt=self._task.args.get('decrypt', True))
87
102
  except AnsibleError as e:
@@ -90,7 +105,7 @@ class ActionModule(ActionBase):
90
105
  if self._task.check_mode:
91
106
  # check mode is supported if 'creates' or 'removes' are provided
92
107
  # the task has already been skipped if a change would not occur
93
- if self._task.args.get('creates') or self._task.args.get('removes'):
108
+ if new_module_args['creates'] or new_module_args['removes']:
94
109
  result['changed'] = True
95
110
  raise _AnsibleActionDone(result=result)
96
111
  # If the script doesn't return changed in the result, it defaults to True,
@@ -30,6 +30,7 @@ import ansible.constants as C
30
30
  class ActionModule(ActionBase):
31
31
 
32
32
  TRANSFERS_FILES = False
33
+ _requires_connection = False
33
34
 
34
35
  def run(self, tmp=None, task_vars=None):
35
36
  if task_vars is None:
@@ -27,6 +27,7 @@ class ActionModule(ActionBase):
27
27
 
28
28
  TRANSFERS_FILES = False
29
29
  _VALID_ARGS = frozenset(('aggregate', 'data', 'per_host'))
30
+ _requires_connection = False
30
31
 
31
32
  # TODO: document this in non-empty set_stats.py module
32
33
  def run(self, tmp=None, task_vars=None):
@@ -4,6 +4,7 @@
4
4
  from __future__ import (absolute_import, division, print_function)
5
5
  __metaclass__ = type
6
6
 
7
+ from ansible.errors import AnsibleActionFail
7
8
  from ansible.plugins.action import ActionBase
8
9
 
9
10
 
@@ -15,6 +16,11 @@ class ActionModule(ActionBase):
15
16
  # Shell module is implemented via command with a special arg
16
17
  self._task.args['_uses_shell'] = True
17
18
 
19
+ # Shell shares the same module code as command. Fail if command
20
+ # specific options are set.
21
+ if "expand_argument_vars" in self._task.args:
22
+ raise AnsibleActionFail(f"Unsupported parameters for ({self._task.action}) module: expand_argument_vars")
23
+
18
24
  command_action = self._shared_loader_obj.action_loader.get('ansible.legacy.command',
19
25
  task=self._task,
20
26
  connection=self._connection,
@@ -22,7 +22,7 @@ from jinja2.defaults import (
22
22
  from ansible import constants as C
23
23
  from ansible.config.manager import ensure_type
24
24
  from ansible.errors import AnsibleError, AnsibleFileNotFound, AnsibleAction, AnsibleActionFail
25
- from ansible.module_utils._text import to_bytes, to_text, to_native
25
+ from ansible.module_utils.common.text.converters import to_bytes, to_text, to_native
26
26
  from ansible.module_utils.parsing.convert_bool import boolean
27
27
  from ansible.module_utils.six import string_types
28
28
  from ansible.plugins.action import ActionBase
@@ -21,7 +21,7 @@ __metaclass__ = type
21
21
  import os
22
22
 
23
23
  from ansible.errors import AnsibleError, AnsibleAction, AnsibleActionFail, AnsibleActionSkip
24
- from ansible.module_utils._text import to_text
24
+ from ansible.module_utils.common.text.converters import to_text
25
25
  from ansible.module_utils.parsing.convert_bool import boolean
26
26
  from ansible.plugins.action import ActionBase
27
27
 
@@ -10,7 +10,7 @@ __metaclass__ = type
10
10
  import os
11
11
 
12
12
  from ansible.errors import AnsibleError, AnsibleAction, _AnsibleActionDone, AnsibleActionFail
13
- from ansible.module_utils._text import to_native
13
+ from ansible.module_utils.common.text.converters import to_native
14
14
  from ansible.module_utils.common.collections import Mapping, MutableMapping
15
15
  from ansible.module_utils.parsing.convert_bool import boolean
16
16
  from ansible.plugins.action import ActionBase
@@ -14,6 +14,7 @@ class ActionModule(ActionBase):
14
14
  ''' Validate an arg spec'''
15
15
 
16
16
  TRANSFERS_FILES = False
17
+ _requires_connection = False
17
18
 
18
19
  def get_args_from_task_vars(self, argument_spec, task_vars):
19
20
  '''
@@ -20,9 +20,9 @@ from __future__ import (absolute_import, division, print_function)
20
20
  __metaclass__ = type
21
21
 
22
22
  import time
23
- from datetime import datetime, timedelta
23
+ from datetime import datetime, timedelta, timezone
24
24
 
25
- from ansible.module_utils._text import to_text
25
+ from ansible.module_utils.common.text.converters import to_text
26
26
  from ansible.plugins.action import ActionBase
27
27
  from ansible.utils.display import Display
28
28
 
@@ -43,10 +43,10 @@ class ActionModule(ActionBase):
43
43
  DEFAULT_TIMEOUT = 600
44
44
 
45
45
  def do_until_success_or_timeout(self, what, timeout, connect_timeout, what_desc, sleep=1):
46
- max_end_time = datetime.utcnow() + timedelta(seconds=timeout)
46
+ max_end_time = datetime.now(timezone.utc) + timedelta(seconds=timeout)
47
47
 
48
48
  e = None
49
- while datetime.utcnow() < max_end_time:
49
+ while datetime.now(timezone.utc) < max_end_time:
50
50
  try:
51
51
  what(connect_timeout)
52
52
  if what_desc:
@@ -12,7 +12,7 @@ from string import ascii_lowercase
12
12
  from gettext import dgettext
13
13
 
14
14
  from ansible.errors import AnsibleError
15
- from ansible.module_utils._text import to_bytes
15
+ from ansible.module_utils.common.text.converters import to_bytes
16
16
  from ansible.plugins import AnsiblePlugin
17
17
 
18
18
 
@@ -94,7 +94,7 @@ DOCUMENTATION = """
94
94
  import re
95
95
  import shlex
96
96
 
97
- from ansible.module_utils._text import to_bytes
97
+ from ansible.module_utils.common.text.converters import to_bytes
98
98
  from ansible.plugins.become import BecomeBase
99
99
 
100
100
 
@@ -29,7 +29,7 @@ from collections.abc import MutableMapping
29
29
 
30
30
  from ansible import constants as C
31
31
  from ansible.errors import AnsibleError
32
- from ansible.module_utils._text import to_bytes, to_text
32
+ from ansible.module_utils.common.text.converters import to_bytes, to_text
33
33
  from ansible.plugins import AnsiblePlugin
34
34
  from ansible.plugins.loader import cache_loader
35
35
  from ansible.utils.collection_loader import resource_from_fqcr
@@ -88,7 +88,7 @@ import time
88
88
  import re
89
89
 
90
90
  from ansible import constants as C
91
- from ansible.module_utils._text import to_bytes, to_text
91
+ from ansible.module_utils.common.text.converters import to_bytes, to_text
92
92
  from ansible.plugins.callback import CallbackBase
93
93
  from ansible.utils._junit_xml import (
94
94
  TestCase,
@@ -12,7 +12,7 @@ DOCUMENTATION = '''
12
12
  short_description: oneline Ansible screen output
13
13
  version_added: historical
14
14
  description:
15
- - This is the output callback used by the -o/--one-line command line option.
15
+ - This is the output callback used by the C(-o)/C(--one-line) command line option.
16
16
  '''
17
17
 
18
18
  from ansible.plugins.callback import CallbackBase
@@ -31,7 +31,7 @@ DOCUMENTATION = '''
31
31
  import os
32
32
 
33
33
  from ansible.constants import TREE_DIR
34
- from ansible.module_utils._text import to_bytes, to_text
34
+ from ansible.module_utils.common.text.converters import to_bytes, to_text
35
35
  from ansible.plugins.callback import CallbackBase
36
36
  from ansible.utils.path import makedirs_safe, unfrackpath
37
37
 
@@ -24,7 +24,7 @@ from functools import wraps
24
24
 
25
25
  from ansible.plugins import AnsiblePlugin
26
26
  from ansible.errors import AnsibleError, AnsibleConnectionFailure
27
- from ansible.module_utils._text import to_bytes, to_text
27
+ from ansible.module_utils.common.text.converters import to_bytes, to_text
28
28
 
29
29
  try:
30
30
  from scp import SCPClient
@@ -276,7 +276,7 @@ class CliconfBase(AnsiblePlugin):
276
276
  'diff_replace': [list of supported replace values],
277
277
  'output': [list of supported command output format]
278
278
  }
279
- :return: capability as json string
279
+ :return: capability as dict
280
280
  """
281
281
  result = {}
282
282
  result['rpc'] = self.get_base_rpc()