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
@@ -28,7 +28,7 @@ import time
28
28
  from multiprocessing import cpu_count
29
29
  from multiprocessing.pool import ThreadPool
30
30
 
31
- from ansible.module_utils._text import to_text
31
+ from ansible.module_utils.common.text.converters import to_text
32
32
  from ansible.module_utils.common.locale import get_best_parsable_locale
33
33
  from ansible.module_utils.common.process import get_bin_path
34
34
  from ansible.module_utils.common.text.formatters import bytes_to_human
@@ -550,7 +550,7 @@ class LinuxHardware(Hardware):
550
550
  # start threads to query each mount
551
551
  results = {}
552
552
  pool = ThreadPool(processes=min(len(mtab_entries), cpu_count()))
553
- maxtime = globals().get('GATHER_TIMEOUT') or timeout.DEFAULT_GATHER_TIMEOUT
553
+ maxtime = timeout.GATHER_TIMEOUT or timeout.DEFAULT_GATHER_TIMEOUT
554
554
  for fields in mtab_entries:
555
555
  # Transform octal escape sequences
556
556
  fields = [self._replace_octal_escapes(field) for field in fields]
@@ -19,7 +19,7 @@ __metaclass__ = type
19
19
  import re
20
20
  import time
21
21
 
22
- from ansible.module_utils._text import to_text
22
+ from ansible.module_utils.common.text.converters import to_text
23
23
 
24
24
  from ansible.module_utils.facts.hardware.base import Hardware, HardwareCollector
25
25
  from ansible.module_utils.facts import timeout
@@ -89,11 +89,11 @@ class LinuxNetwork(Network):
89
89
  locally_reachable_ips['ipv4'].append(address)
90
90
 
91
91
  args = [ip_path, '-4', 'route', 'show', 'table', 'local']
92
- rc, routes, _ = self.module.run_command(args)
92
+ rc, routes, dummy = self.module.run_command(args)
93
93
  if rc == 0:
94
94
  parse_locally_reachable_ips(routes)
95
95
  args = [ip_path, '-6', 'route', 'show', 'table', 'local']
96
- rc, routes, _ = self.module.run_command(args)
96
+ rc, routes, dummy = self.module.run_command(args)
97
97
  if rc == 0:
98
98
  parse_locally_reachable_ips(routes)
99
99
 
@@ -274,7 +274,7 @@ class LinuxNetwork(Network):
274
274
  elif words[0] == 'inet6':
275
275
  if 'peer' == words[2]:
276
276
  address = words[1]
277
- _, prefix = words[3].split('/')
277
+ dummy, prefix = words[3].split('/')
278
278
  scope = words[5]
279
279
  else:
280
280
  address, prefix = words[1].split('/')
@@ -1,17 +1,5 @@
1
- # This file is part of Ansible
2
- #
3
- # Ansible is free software: you can redistribute it and/or modify
4
- # it under the terms of the GNU General Public License as published by
5
- # the Free Software Foundation, either version 3 of the License, or
6
- # (at your option) any later version.
7
- #
8
- # Ansible is distributed in the hope that it will be useful,
9
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- # GNU General Public License for more details.
12
- #
13
- # You should have received a copy of the GNU General Public License
14
- # along with Ansible. If not, see <http://www.gnu.org/licenses/>.
1
+ # Copyright (c) 2023 Ansible Project
2
+ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
15
3
 
16
4
  from __future__ import (absolute_import, division, print_function)
17
5
  __metaclass__ = type
@@ -21,7 +9,6 @@ import json
21
9
  import ansible.module_utils.compat.typing as t
22
10
 
23
11
  from ansible.module_utils.facts.namespace import PrefixFactNamespace
24
-
25
12
  from ansible.module_utils.facts.collector import BaseFactCollector
26
13
 
27
14
 
@@ -49,6 +36,12 @@ class FacterFactCollector(BaseFactCollector):
49
36
  # if facter is installed, and we can use --json because
50
37
  # ruby-json is ALSO installed, include facter data in the JSON
51
38
  rc, out, err = module.run_command(facter_path + " --puppet --json")
39
+
40
+ # for some versions of facter, --puppet returns an error if puppet is not present,
41
+ # try again w/o it, other errors should still appear and be sent back
42
+ if rc != 0:
43
+ rc, out, err = module.run_command(facter_path + " --json")
44
+
52
45
  return rc, out, err
53
46
 
54
47
  def get_facter_output(self, module):
@@ -18,7 +18,7 @@ __metaclass__ = type
18
18
 
19
19
  import re
20
20
 
21
- from ansible.module_utils._text import to_text
21
+ from ansible.module_utils.common.text.converters import to_text
22
22
 
23
23
 
24
24
  def get_sysctl(module, prefixes):
@@ -22,8 +22,8 @@ import datetime
22
22
  import time
23
23
 
24
24
  import ansible.module_utils.compat.typing as t
25
-
26
25
  from ansible.module_utils.facts.collector import BaseFactCollector
26
+ from ansible.module_utils.compat.datetime import utcfromtimestamp
27
27
 
28
28
 
29
29
  class DateTimeFactCollector(BaseFactCollector):
@@ -37,7 +37,7 @@ class DateTimeFactCollector(BaseFactCollector):
37
37
  # Store the timestamp once, then get local and UTC versions from that
38
38
  epoch_ts = time.time()
39
39
  now = datetime.datetime.fromtimestamp(epoch_ts)
40
- utcnow = datetime.datetime.utcfromtimestamp(epoch_ts)
40
+ utcnow = utcfromtimestamp(epoch_ts).replace(tzinfo=None)
41
41
 
42
42
  date_time_facts['year'] = now.strftime('%Y')
43
43
  date_time_facts['month'] = now.strftime('%m')
@@ -524,7 +524,7 @@ class Distribution(object):
524
524
  'Solaris': ['Solaris', 'Nexenta', 'OmniOS', 'OpenIndiana', 'SmartOS'],
525
525
  'Slackware': ['Slackware'],
526
526
  'Altlinux': ['Altlinux'],
527
- 'SGML': ['SGML'],
527
+ 'SMGL': ['SMGL'],
528
528
  'Gentoo': ['Gentoo', 'Funtoo'],
529
529
  'Alpine': ['Alpine'],
530
530
  'AIX': ['AIX'],
@@ -23,9 +23,10 @@ import stat
23
23
 
24
24
  import ansible.module_utils.compat.typing as t
25
25
 
26
- from ansible.module_utils._text import to_text
26
+ from ansible.module_utils.common.text.converters import to_text
27
27
  from ansible.module_utils.facts.utils import get_file_content
28
28
  from ansible.module_utils.facts.collector import BaseFactCollector
29
+ from ansible.module_utils.six import PY3
29
30
  from ansible.module_utils.six.moves import configparser, StringIO
30
31
 
31
32
 
@@ -91,7 +92,10 @@ class LocalFactCollector(BaseFactCollector):
91
92
  # if that fails read it with ConfigParser
92
93
  cp = configparser.ConfigParser()
93
94
  try:
94
- cp.readfp(StringIO(out))
95
+ if PY3:
96
+ cp.read_file(StringIO(out))
97
+ else:
98
+ cp.readfp(StringIO(out))
95
99
  except configparser.Error:
96
100
  fact = "error loading facts as JSON or ini - please check content: %s" % fn
97
101
  module.warn(fact)
@@ -85,14 +85,19 @@ class PkgMgrFactCollector(BaseFactCollector):
85
85
  break
86
86
 
87
87
  try:
88
- distro_major_ver = int(collected_facts['ansible_distribution_major_version'])
88
+ major_version = collected_facts['ansible_distribution_major_version']
89
+ if collected_facts['ansible_distribution'] == 'Kylin Linux Advanced Server':
90
+ major_version = major_version.lstrip('V')
91
+ distro_major_ver = int(major_version)
89
92
  except ValueError:
90
93
  # a non integer magical future version
91
94
  return self._default_unknown_pkg_mgr
92
95
 
93
96
  if (
94
97
  (collected_facts['ansible_distribution'] == 'Fedora' and distro_major_ver < 23)
98
+ or (collected_facts['ansible_distribution'] == 'Kylin Linux Advanced Server' and distro_major_ver < 10)
95
99
  or (collected_facts['ansible_distribution'] == 'Amazon' and distro_major_ver < 2022)
100
+ or (collected_facts['ansible_distribution'] == 'TencentOS' and distro_major_ver < 3)
96
101
  or distro_major_ver < 8 # assume RHEL or a clone
97
102
  ) and any(pm for pm in PKG_MGRS if pm['name'] == 'yum' and os.path.exists(pm['path'])):
98
103
  pkg_mgr_name = 'yum'
@@ -24,7 +24,7 @@ import re
24
24
 
25
25
  import ansible.module_utils.compat.typing as t
26
26
 
27
- from ansible.module_utils._text import to_native
27
+ from ansible.module_utils.common.text.converters import to_native
28
28
 
29
29
  from ansible.module_utils.facts.utils import get_file_content
30
30
  from ansible.module_utils.facts.collector import BaseFactCollector
@@ -47,7 +47,7 @@ class ServiceMgrFactCollector(BaseFactCollector):
47
47
  # tools must be installed
48
48
  if module.get_bin_path('systemctl'):
49
49
 
50
- # this should show if systemd is the boot init system, if checking init faild to mark as systemd
50
+ # this should show if systemd is the boot init system, if checking init failed to mark as systemd
51
51
  # these mirror systemd's own sd_boot test http://www.freedesktop.org/software/systemd/man/sd_booted.html
52
52
  for canary in ["/run/systemd/system/", "/dev/.run/systemd/", "/dev/.systemd/"]:
53
53
  if os.path.exists(canary):
@@ -131,6 +131,8 @@ class ServiceMgrFactCollector(BaseFactCollector):
131
131
  service_mgr_name = 'smf'
132
132
  elif collected_facts.get('ansible_distribution') == 'OpenWrt':
133
133
  service_mgr_name = 'openwrt_init'
134
+ elif collected_facts.get('ansible_distribution') == 'SMGL':
135
+ service_mgr_name = 'simpleinit_msb'
134
136
  elif collected_facts.get('ansible_system') == 'Linux':
135
137
  # FIXME: mv is_systemd_managed
136
138
  if self.is_systemd_managed(module=module):
@@ -5,7 +5,7 @@ from __future__ import (absolute_import, division, print_function)
5
5
  __metaclass__ = type
6
6
 
7
7
  from ansible.module_utils.six import binary_type, text_type
8
- from ansible.module_utils._text import to_text
8
+ from ansible.module_utils.common.text.converters import to_text
9
9
 
10
10
 
11
11
  BOOLEANS_TRUE = frozenset(('y', 'yes', 'on', '1', 'true', 't', 1, 1.0, True))
@@ -39,7 +39,7 @@ import subprocess
39
39
  import traceback
40
40
 
41
41
  from ansible.module_utils.six import PY2, b
42
- from ansible.module_utils._text import to_bytes, to_text
42
+ from ansible.module_utils.common.text.converters import to_bytes, to_text
43
43
 
44
44
 
45
45
  def sysv_is_enabled(name, runlevel=None):
@@ -207,17 +207,20 @@ def daemonize(module, cmd):
207
207
  p = subprocess.Popen(run_cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE, preexec_fn=lambda: os.close(pipe[1]))
208
208
  fds = [p.stdout, p.stderr]
209
209
 
210
- # loop reading output till its done
210
+ # loop reading output till it is done
211
211
  output = {p.stdout: b(""), p.stderr: b("")}
212
212
  while fds:
213
213
  rfd, wfd, efd = select.select(fds, [], fds, 1)
214
- if (rfd + wfd + efd) or p.poll():
214
+ if (rfd + wfd + efd) or p.poll() is None:
215
215
  for out in list(fds):
216
216
  if out in rfd:
217
217
  data = os.read(out.fileno(), chunk)
218
- if not data:
218
+ if data:
219
+ output[out] += to_bytes(data, errors=errors)
220
+ else:
219
221
  fds.remove(out)
220
- output[out] += b(data)
222
+ else:
223
+ break
221
224
 
222
225
  # even after fds close, we might want to wait for pid to die
223
226
  p.wait()
@@ -246,7 +249,7 @@ def daemonize(module, cmd):
246
249
  data = os.read(pipe[0], chunk)
247
250
  if not data:
248
251
  break
249
- return_data += b(data)
252
+ return_data += to_bytes(data, errors=errors)
250
253
 
251
254
  # Note: no need to specify encoding on py3 as this module sends the
252
255
  # pickle to itself (thus same python interpreter so we aren't mixing
@@ -88,7 +88,7 @@ from ansible.module_utils.common.collections import Mapping, is_sequence
88
88
  from ansible.module_utils.six import PY2, PY3, string_types
89
89
  from ansible.module_utils.six.moves import cStringIO
90
90
  from ansible.module_utils.basic import get_distribution, missing_required_lib
91
- from ansible.module_utils._text import to_bytes, to_native, to_text
91
+ from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
92
92
 
93
93
  try:
94
94
  # python3
@@ -129,13 +129,13 @@ if not HAS_SSLCONTEXT:
129
129
  try:
130
130
  from urllib3.contrib.pyopenssl import PyOpenSSLContext
131
131
  except Exception:
132
- from requests.packages.urllib3.contrib.pyopenssl import PyOpenSSLContext
132
+ from requests.packages.urllib3.contrib.pyopenssl import PyOpenSSLContext # type: ignore[no-redef]
133
133
  HAS_URLLIB3_PYOPENSSLCONTEXT = True
134
134
  except Exception:
135
135
  # urllib3<1.15,>=1.6
136
136
  try:
137
137
  try:
138
- from urllib3.contrib.pyopenssl import ssl_wrap_socket
138
+ from urllib3.contrib.pyopenssl import ssl_wrap_socket # type: ignore[attr-defined]
139
139
  except Exception:
140
140
  from requests.packages.urllib3.contrib.pyopenssl import ssl_wrap_socket
141
141
  HAS_URLLIB3_SSL_WRAP_SOCKET = True
@@ -771,6 +771,18 @@ def extract_pem_certs(b_data):
771
771
  yield match.group(0)
772
772
 
773
773
 
774
+ def _py2_get_param(headers, param, header='content-type'):
775
+ m = httplib.HTTPMessage(io.StringIO())
776
+ cd = headers.getheader(header) or ''
777
+ try:
778
+ m.plisttext = cd[cd.index(';'):]
779
+ m.parseplist()
780
+ except ValueError:
781
+ return None
782
+
783
+ return m.getparam(param)
784
+
785
+
774
786
  def get_response_filename(response):
775
787
  url = response.geturl()
776
788
  path = urlparse(url)[2]
@@ -778,7 +790,12 @@ def get_response_filename(response):
778
790
  if filename:
779
791
  filename = unquote(filename)
780
792
 
781
- return response.headers.get_param('filename', header='content-disposition') or filename
793
+ if PY2:
794
+ get_param = functools.partial(_py2_get_param, response.headers)
795
+ else:
796
+ get_param = response.headers.get_param
797
+
798
+ return get_param('filename', header='content-disposition') or filename
782
799
 
783
800
 
784
801
  def parse_content_type(response):
@@ -865,7 +882,7 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True, ca_path=N
865
882
  to determine how redirects should be handled in urllib2.
866
883
  """
867
884
 
868
- def redirect_request(self, req, fp, code, msg, hdrs, newurl):
885
+ def redirect_request(self, req, fp, code, msg, headers, newurl):
869
886
  if not any((HAS_SSLCONTEXT, HAS_URLLIB3_PYOPENSSLCONTEXT)):
870
887
  handler = maybe_add_ssl_handler(newurl, validate_certs, ca_path=ca_path, ciphers=ciphers)
871
888
  if handler:
@@ -873,23 +890,23 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True, ca_path=N
873
890
 
874
891
  # Preserve urllib2 compatibility
875
892
  if follow_redirects == 'urllib2':
876
- return urllib_request.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, hdrs, newurl)
893
+ return urllib_request.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, headers, newurl)
877
894
 
878
895
  # Handle disabled redirects
879
896
  elif follow_redirects in ['no', 'none', False]:
880
- raise urllib_error.HTTPError(newurl, code, msg, hdrs, fp)
897
+ raise urllib_error.HTTPError(newurl, code, msg, headers, fp)
881
898
 
882
899
  method = req.get_method()
883
900
 
884
901
  # Handle non-redirect HTTP status or invalid follow_redirects
885
902
  if follow_redirects in ['all', 'yes', True]:
886
903
  if code < 300 or code >= 400:
887
- raise urllib_error.HTTPError(req.get_full_url(), code, msg, hdrs, fp)
904
+ raise urllib_error.HTTPError(req.get_full_url(), code, msg, headers, fp)
888
905
  elif follow_redirects == 'safe':
889
906
  if code < 300 or code >= 400 or method not in ('GET', 'HEAD'):
890
- raise urllib_error.HTTPError(req.get_full_url(), code, msg, hdrs, fp)
907
+ raise urllib_error.HTTPError(req.get_full_url(), code, msg, headers, fp)
891
908
  else:
892
- raise urllib_error.HTTPError(req.get_full_url(), code, msg, hdrs, fp)
909
+ raise urllib_error.HTTPError(req.get_full_url(), code, msg, headers, fp)
893
910
 
894
911
  try:
895
912
  # Python 2-3.3
@@ -906,12 +923,12 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True, ca_path=N
906
923
  # Support redirect with payload and original headers
907
924
  if code in (307, 308):
908
925
  # Preserve payload and headers
909
- headers = req.headers
926
+ req_headers = req.headers
910
927
  else:
911
928
  # Do not preserve payload and filter headers
912
929
  data = None
913
- headers = dict((k, v) for k, v in req.headers.items()
914
- if k.lower() not in ("content-length", "content-type", "transfer-encoding"))
930
+ req_headers = dict((k, v) for k, v in req.headers.items()
931
+ if k.lower() not in ("content-length", "content-type", "transfer-encoding"))
915
932
 
916
933
  # http://tools.ietf.org/html/rfc7231#section-6.4.4
917
934
  if code == 303 and method != 'HEAD':
@@ -928,7 +945,7 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True, ca_path=N
928
945
 
929
946
  return RequestWithMethod(newurl,
930
947
  method=method,
931
- headers=headers,
948
+ headers=req_headers,
932
949
  data=data,
933
950
  origin_req_host=origin_req_host,
934
951
  unverifiable=True,
@@ -1497,7 +1514,7 @@ class Request:
1497
1514
  login = None
1498
1515
 
1499
1516
  if login:
1500
- username, _, password = login
1517
+ username, dummy, password = login
1501
1518
  if username and password:
1502
1519
  headers["Authorization"] = basic_auth_header(username, password)
1503
1520
 
@@ -1869,12 +1886,8 @@ def fetch_url(module, url, data=None, headers=None, method=None,
1869
1886
  if not HAS_URLPARSE:
1870
1887
  module.fail_json(msg='urlparse is not installed')
1871
1888
 
1872
- if not HAS_GZIP and decompress is True:
1873
- decompress = False
1874
- module.deprecate(
1875
- '%s. "decompress" has been automatically disabled to prevent a failure' % GzipDecodedReader.missing_gzip_error(),
1876
- version='2.16'
1877
- )
1889
+ if not HAS_GZIP:
1890
+ module.fail_json(msg=GzipDecodedReader.missing_gzip_error())
1878
1891
 
1879
1892
  # ensure we use proper tempdir
1880
1893
  old_tempdir = tempfile.tempdir
@@ -1888,7 +1901,7 @@ def fetch_url(module, url, data=None, headers=None, method=None,
1888
1901
 
1889
1902
  username = module.params.get('url_username', '')
1890
1903
  password = module.params.get('url_password', '')
1891
- http_agent = module.params.get('http_agent', 'ansible-httpget')
1904
+ http_agent = module.params.get('http_agent', get_user_agent())
1892
1905
  force_basic_auth = module.params.get('force_basic_auth', '')
1893
1906
 
1894
1907
  follow_redirects = module.params.get('follow_redirects', 'urllib2')
@@ -2072,3 +2085,8 @@ def fetch_file(module, url, data=None, headers=None, method=None,
2072
2085
  except Exception as e:
2073
2086
  module.fail_json(msg="Failure downloading %s, %s" % (url, to_native(e)))
2074
2087
  return fetch_temp_file.name
2088
+
2089
+
2090
+ def get_user_agent():
2091
+ """Returns a user agent used by open_url"""
2092
+ return u"ansible-httpget"
@@ -59,8 +59,8 @@ attributes:
59
59
  platform:
60
60
  platforms: all
61
61
  notes:
62
- - The alias C(host) of the parameter C(name) is only available on Ansible 2.4 and newer.
63
- - Since Ansible 2.4, the C(inventory_dir) variable is now set to C(None) instead of the 'global inventory source',
62
+ - The alias O(host) of the parameter O(name) is only available on Ansible 2.4 and newer.
63
+ - Since Ansible 2.4, the C(inventory_dir) variable is now set to V(None) instead of the 'global inventory source',
64
64
  because you can now have multiple sources. An example was added that shows how to partially restore the previous behaviour.
65
65
  - Though this module does not change the remote host, we do provide 'changed' status as it can be useful for those trying to track inventory changes.
66
66
  - The hosts added will not bypass the C(--limit) from the command line, so both of those need to be in agreement to make them available as play targets.