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
ansible/modules/user.py CHANGED
@@ -28,11 +28,12 @@ options:
28
28
  comment:
29
29
  description:
30
30
  - Optionally sets the description (aka I(GECOS)) of user account.
31
+ - On macOS, this defaults to the O(name) option.
31
32
  type: str
32
33
  hidden:
33
34
  description:
34
35
  - macOS only, optionally hide the user from the login window and system preferences.
35
- - The default will be C(true) if the I(system) option is used.
36
+ - The default will be V(true) if the O(system) option is used.
36
37
  type: bool
37
38
  version_added: "2.6"
38
39
  non_unique:
@@ -49,28 +50,29 @@ options:
49
50
  group:
50
51
  description:
51
52
  - Optionally sets the user's primary group (takes a group name).
53
+ - On macOS, this defaults to V('staff')
52
54
  type: str
53
55
  groups:
54
56
  description:
55
- - List of groups user will be added to.
56
- - By default, the user is removed from all other groups. Configure C(append) to modify this.
57
- - When set to an empty string C(''),
57
+ - A list of supplementary groups which the user is also a member of.
58
+ - By default, the user is removed from all other groups. Configure O(append) to modify this.
59
+ - When set to an empty string V(''),
58
60
  the user is removed from all groups except the primary group.
59
61
  - Before Ansible 2.3, the only input format allowed was a comma separated string.
60
62
  type: list
61
63
  elements: str
62
64
  append:
63
65
  description:
64
- - If C(true), add the user to the groups specified in C(groups).
65
- - If C(false), user will only be added to the groups specified in C(groups),
66
+ - If V(true), add the user to the groups specified in O(groups).
67
+ - If V(false), user will only be added to the groups specified in O(groups),
66
68
  removing them from all other groups.
67
69
  type: bool
68
70
  default: no
69
71
  shell:
70
72
  description:
71
73
  - Optionally set the user's shell.
72
- - On macOS, before Ansible 2.5, the default shell for non-system users was C(/usr/bin/false).
73
- Since Ansible 2.5, the default shell for non-system users on macOS is C(/bin/bash).
74
+ - On macOS, before Ansible 2.5, the default shell for non-system users was V(/usr/bin/false).
75
+ Since Ansible 2.5, the default shell for non-system users on macOS is V(/bin/bash).
74
76
  - See notes for details on how other operating systems determine the default shell by
75
77
  the underlying tool.
76
78
  type: str
@@ -81,7 +83,7 @@ options:
81
83
  skeleton:
82
84
  description:
83
85
  - Optionally set a home skeleton directory.
84
- - Requires C(create_home) option!
86
+ - Requires O(create_home) option!
85
87
  type: str
86
88
  version_added: "2.0"
87
89
  password:
@@ -90,9 +92,12 @@ options:
90
92
  - B(Linux/Unix/POSIX:) Enter the hashed password as the value.
91
93
  - See L(FAQ entry,https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#how-do-i-generate-encrypted-passwords-for-the-user-module)
92
94
  for details on various ways to generate the hash of a password.
93
- - To create an account with a locked/disabled password on Linux systems, set this to C('!') or C('*').
94
- - To create an account with a locked/disabled password on OpenBSD, set this to C('*************').
95
+ - To create an account with a locked/disabled password on Linux systems, set this to V('!') or V('*').
96
+ - To create an account with a locked/disabled password on OpenBSD, set this to V('*************').
95
97
  - B(OS X/macOS:) Enter the cleartext password as the value. Be sure to take relevant security precautions.
98
+ - On macOS, the password specified in the C(password) option will always be set, regardless of whether the user account already exists or not.
99
+ - When the password is passed as an argument, the C(user) module will always return changed to C(true) for macOS systems.
100
+ Since macOS no longer provides access to the hashed passwords directly.
96
101
  type: str
97
102
  state:
98
103
  description:
@@ -104,34 +109,34 @@ options:
104
109
  default: present
105
110
  create_home:
106
111
  description:
107
- - Unless set to C(false), a home directory will be made for the user
112
+ - Unless set to V(false), a home directory will be made for the user
108
113
  when the account is created or if the home directory does not exist.
109
- - Changed from C(createhome) to C(create_home) in Ansible 2.5.
114
+ - Changed from O(createhome) to O(create_home) in Ansible 2.5.
110
115
  type: bool
111
116
  default: yes
112
117
  aliases: [ createhome ]
113
118
  move_home:
114
119
  description:
115
- - "If set to C(true) when used with C(home: ), attempt to move the user's old home
120
+ - "If set to V(true) when used with O(home), attempt to move the user's old home
116
121
  directory to the specified directory if it isn't there already and the old home exists."
117
122
  type: bool
118
123
  default: no
119
124
  system:
120
125
  description:
121
- - When creating an account C(state=present), setting this to C(true) makes the user a system account.
126
+ - When creating an account O(state=present), setting this to V(true) makes the user a system account.
122
127
  - This setting cannot be changed on existing users.
123
128
  type: bool
124
129
  default: no
125
130
  force:
126
131
  description:
127
- - This only affects C(state=absent), it forces removal of the user and associated directories on supported platforms.
132
+ - This only affects O(state=absent), it forces removal of the user and associated directories on supported platforms.
128
133
  - The behavior is the same as C(userdel --force), check the man page for C(userdel) on your system for details and support.
129
- - When used with C(generate_ssh_key=yes) this forces an existing key to be overwritten.
134
+ - When used with O(generate_ssh_key=yes) this forces an existing key to be overwritten.
130
135
  type: bool
131
136
  default: no
132
137
  remove:
133
138
  description:
134
- - This only affects C(state=absent), it attempts to remove directories associated with the user.
139
+ - This only affects O(state=absent), it attempts to remove directories associated with the user.
135
140
  - The behavior is the same as C(userdel --remove), check the man page for details and support.
136
141
  type: bool
137
142
  default: no
@@ -142,7 +147,7 @@ options:
142
147
  generate_ssh_key:
143
148
  description:
144
149
  - Whether to generate a SSH key for the user in question.
145
- - This will B(not) overwrite an existing SSH key unless used with C(force=yes).
150
+ - This will B(not) overwrite an existing SSH key unless used with O(force=yes).
146
151
  type: bool
147
152
  default: no
148
153
  version_added: "0.9"
@@ -164,7 +169,7 @@ options:
164
169
  description:
165
170
  - Optionally specify the SSH key filename.
166
171
  - If this is a relative filename then it will be relative to the user's home directory.
167
- - This parameter defaults to I(.ssh/id_rsa).
172
+ - This parameter defaults to V(.ssh/id_rsa).
168
173
  type: path
169
174
  version_added: "0.9"
170
175
  ssh_key_comment:
@@ -181,8 +186,8 @@ options:
181
186
  version_added: "0.9"
182
187
  update_password:
183
188
  description:
184
- - C(always) will update passwords if they differ.
185
- - C(on_create) will only set the password for newly created users.
189
+ - V(always) will update passwords if they differ.
190
+ - V(on_create) will only set the password for newly created users.
186
191
  type: str
187
192
  choices: [ always, on_create ]
188
193
  default: always
@@ -200,7 +205,7 @@ options:
200
205
  - Lock the password (C(usermod -L), C(usermod -U), C(pw lock)).
201
206
  - Implementation differs by platform. This option does not always mean the user cannot login using other methods.
202
207
  - This option does not disable the user, only lock the password.
203
- - This must be set to C(False) in order to unlock a currently locked password. The absence of this parameter will not unlock a password.
208
+ - This must be set to V(False) in order to unlock a currently locked password. The absence of this parameter will not unlock a password.
204
209
  - Currently supported on Linux, FreeBSD, DragonFlyBSD, NetBSD, OpenBSD.
205
210
  type: bool
206
211
  version_added: "2.6"
@@ -218,28 +223,25 @@ options:
218
223
  profile:
219
224
  description:
220
225
  - Sets the profile of the user.
221
- - Does nothing when used with other platforms.
222
226
  - Can set multiple profiles using comma separation.
223
- - To delete all the profiles, use C(profile='').
224
- - Currently supported on Illumos/Solaris.
227
+ - To delete all the profiles, use O(profile='').
228
+ - Currently supported on Illumos/Solaris. Does nothing when used with other platforms.
225
229
  type: str
226
230
  version_added: "2.8"
227
231
  authorization:
228
232
  description:
229
233
  - Sets the authorization of the user.
230
- - Does nothing when used with other platforms.
231
234
  - Can set multiple authorizations using comma separation.
232
- - To delete all authorizations, use C(authorization='').
233
- - Currently supported on Illumos/Solaris.
235
+ - To delete all authorizations, use O(authorization='').
236
+ - Currently supported on Illumos/Solaris. Does nothing when used with other platforms.
234
237
  type: str
235
238
  version_added: "2.8"
236
239
  role:
237
240
  description:
238
241
  - Sets the role of the user.
239
- - Does nothing when used with other platforms.
240
242
  - Can set multiple roles using comma separation.
241
- - To delete all roles, use C(role='').
242
- - Currently supported on Illumos/Solaris.
243
+ - To delete all roles, use O(role='').
244
+ - Currently supported on Illumos/Solaris. Does nothing when used with other platforms.
243
245
  type: str
244
246
  version_added: "2.8"
245
247
  password_expire_max:
@@ -254,12 +256,17 @@ options:
254
256
  - Supported on Linux only.
255
257
  type: int
256
258
  version_added: "2.11"
259
+ password_expire_warn:
260
+ description:
261
+ - Number of days of warning before password expires.
262
+ - Supported on Linux only.
263
+ type: int
264
+ version_added: "2.16"
257
265
  umask:
258
266
  description:
259
267
  - Sets the umask of the user.
260
- - Does nothing when used with other platforms.
261
- - Currently supported on Linux.
262
- - Requires C(local) is omitted or False.
268
+ - Currently supported on Linux. Does nothing when used with other platforms.
269
+ - Requires O(local) is omitted or V(False).
263
270
  type: str
264
271
  version_added: "2.12"
265
272
  extends_documentation_fragment: action_common_attributes
@@ -340,12 +347,17 @@ EXAMPLES = r'''
340
347
  ansible.builtin.user:
341
348
  name: pushkar15
342
349
  password_expire_min: 5
350
+
351
+ - name: Set number of warning days for password expiration
352
+ ansible.builtin.user:
353
+ name: jane157
354
+ password_expire_warn: 30
343
355
  '''
344
356
 
345
357
  RETURN = r'''
346
358
  append:
347
359
  description: Whether or not to append the user to groups.
348
- returned: When state is C(present) and the user exists
360
+ returned: When O(state) is V(present) and the user exists
349
361
  type: bool
350
362
  sample: True
351
363
  comment:
@@ -360,7 +372,7 @@ create_home:
360
372
  sample: True
361
373
  force:
362
374
  description: Whether or not a user account was forcibly deleted.
363
- returned: When I(state) is C(absent) and user exists
375
+ returned: When O(state) is V(absent) and user exists
364
376
  type: bool
365
377
  sample: False
366
378
  group:
@@ -370,17 +382,17 @@ group:
370
382
  sample: 1001
371
383
  groups:
372
384
  description: List of groups of which the user is a member.
373
- returned: When I(groups) is not empty and I(state) is C(present)
385
+ returned: When O(groups) is not empty and O(state) is V(present)
374
386
  type: str
375
387
  sample: 'chrony,apache'
376
388
  home:
377
389
  description: "Path to user's home directory."
378
- returned: When I(state) is C(present)
390
+ returned: When O(state) is V(present)
379
391
  type: str
380
392
  sample: '/home/asmith'
381
393
  move_home:
382
394
  description: Whether or not to move an existing home directory.
383
- returned: When I(state) is C(present) and user exists
395
+ returned: When O(state) is V(present) and user exists
384
396
  type: bool
385
397
  sample: False
386
398
  name:
@@ -390,32 +402,32 @@ name:
390
402
  sample: asmith
391
403
  password:
392
404
  description: Masked value of the password.
393
- returned: When I(state) is C(present) and I(password) is not empty
405
+ returned: When O(state) is V(present) and O(password) is not empty
394
406
  type: str
395
407
  sample: 'NOT_LOGGING_PASSWORD'
396
408
  remove:
397
409
  description: Whether or not to remove the user account.
398
- returned: When I(state) is C(absent) and user exists
410
+ returned: When O(state) is V(absent) and user exists
399
411
  type: bool
400
412
  sample: True
401
413
  shell:
402
414
  description: User login shell.
403
- returned: When I(state) is C(present)
415
+ returned: When O(state) is V(present)
404
416
  type: str
405
417
  sample: '/bin/bash'
406
418
  ssh_fingerprint:
407
419
  description: Fingerprint of generated SSH key.
408
- returned: When I(generate_ssh_key) is C(True)
420
+ returned: When O(generate_ssh_key) is V(True)
409
421
  type: str
410
422
  sample: '2048 SHA256:aYNHYcyVm87Igh0IMEDMbvW0QDlRQfE0aJugp684ko8 ansible-generated on host (RSA)'
411
423
  ssh_key_file:
412
424
  description: Path to generated SSH private key file.
413
- returned: When I(generate_ssh_key) is C(True)
425
+ returned: When O(generate_ssh_key) is V(True)
414
426
  type: str
415
427
  sample: /home/asmith/.ssh/id_rsa
416
428
  ssh_public_key:
417
429
  description: Generated SSH public key file.
418
- returned: When I(generate_ssh_key) is C(True)
430
+ returned: When O(generate_ssh_key) is V(True)
419
431
  type: str
420
432
  sample: >
421
433
  'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC95opt4SPEC06tOYsJQJIuN23BbLMGmYo8ysVZQc4h2DZE9ugbjWWGS1/pweUGjVstgzMkBEeBCByaEf/RJKNecKRPeGd2Bw9DCj/bn5Z6rGfNENKBmo
@@ -433,12 +445,12 @@ stdout:
433
445
  sample:
434
446
  system:
435
447
  description: Whether or not the account is a system account.
436
- returned: When I(system) is passed to the module and the account does not exist
448
+ returned: When O(system) is passed to the module and the account does not exist
437
449
  type: bool
438
450
  sample: True
439
451
  uid:
440
452
  description: User ID of the user account.
441
- returned: When I(uid) is passed to the module
453
+ returned: When O(uid) is passed to the module
442
454
  type: int
443
455
  sample: 1044
444
456
  '''
@@ -459,7 +471,7 @@ import time
459
471
  import math
460
472
 
461
473
  from ansible.module_utils import distro
462
- from ansible.module_utils._text import to_bytes, to_native, to_text
474
+ from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text
463
475
  from ansible.module_utils.basic import AnsibleModule
464
476
  from ansible.module_utils.common.locale import get_best_parsable_locale
465
477
  from ansible.module_utils.common.sys_info import get_platform_subclass
@@ -564,6 +576,7 @@ class User(object):
564
576
  self.role = module.params['role']
565
577
  self.password_expire_max = module.params['password_expire_max']
566
578
  self.password_expire_min = module.params['password_expire_min']
579
+ self.password_expire_warn = module.params['password_expire_warn']
567
580
  self.umask = module.params['umask']
568
581
 
569
582
  if self.umask is not None and self.local:
@@ -903,7 +916,8 @@ class User(object):
903
916
 
904
917
  if self.expires is not None:
905
918
 
906
- current_expires = int(self.user_password()[1])
919
+ current_expires = self.user_password()[1] or '0'
920
+ current_expires = int(current_expires)
907
921
 
908
922
  if self.expires < time.gmtime(0):
909
923
  if current_expires >= 0:
@@ -1080,6 +1094,7 @@ class User(object):
1080
1094
  def set_password_expire(self):
1081
1095
  min_needs_change = self.password_expire_min is not None
1082
1096
  max_needs_change = self.password_expire_max is not None
1097
+ warn_needs_change = self.password_expire_warn is not None
1083
1098
 
1084
1099
  if HAVE_SPWD:
1085
1100
  try:
@@ -1089,8 +1104,9 @@ class User(object):
1089
1104
 
1090
1105
  min_needs_change &= self.password_expire_min != shadow_info.sp_min
1091
1106
  max_needs_change &= self.password_expire_max != shadow_info.sp_max
1107
+ warn_needs_change &= self.password_expire_warn != shadow_info.sp_warn
1092
1108
 
1093
- if not (min_needs_change or max_needs_change):
1109
+ if not (min_needs_change or max_needs_change or warn_needs_change):
1094
1110
  return (None, '', '') # target state already reached
1095
1111
 
1096
1112
  command_name = 'chage'
@@ -1099,6 +1115,8 @@ class User(object):
1099
1115
  cmd.extend(["-m", self.password_expire_min])
1100
1116
  if max_needs_change:
1101
1117
  cmd.extend(["-M", self.password_expire_max])
1118
+ if warn_needs_change:
1119
+ cmd.extend(["-W", self.password_expire_warn])
1102
1120
  cmd.append(self.name)
1103
1121
 
1104
1122
  return self.execute_command(cmd)
@@ -1273,7 +1291,7 @@ class User(object):
1273
1291
  else:
1274
1292
  skeleton = '/etc/skel'
1275
1293
 
1276
- if os.path.exists(skeleton):
1294
+ if os.path.exists(skeleton) and skeleton != os.devnull:
1277
1295
  try:
1278
1296
  shutil.copytree(skeleton, path, symlinks=True)
1279
1297
  except OSError as e:
@@ -1542,7 +1560,8 @@ class FreeBsdUser(User):
1542
1560
 
1543
1561
  if self.expires is not None:
1544
1562
 
1545
- current_expires = int(self.user_password()[1])
1563
+ current_expires = self.user_password()[1] or '0'
1564
+ current_expires = int(current_expires)
1546
1565
 
1547
1566
  # If expiration is negative or zero and the current expiration is greater than zero, disable expiration.
1548
1567
  # In OpenBSD, setting expiration to zero disables expiration. It does not expire the account.
@@ -2494,6 +2513,14 @@ class DarwinUser(User):
2494
2513
  if rc != 0:
2495
2514
  self.module.fail_json(msg='Cannot create user "%s".' % self.name, err=err, out=out, rc=rc)
2496
2515
 
2516
+ # Make the Gecos (alias display name) default to username
2517
+ if self.comment is None:
2518
+ self.comment = self.name
2519
+
2520
+ # Make user group default to 'staff'
2521
+ if self.group is None:
2522
+ self.group = 'staff'
2523
+
2497
2524
  self._make_group_numerical()
2498
2525
  if self.uid is None:
2499
2526
  self.uid = str(self._get_next_uid(self.system))
@@ -3092,6 +3119,7 @@ def main():
3092
3119
  login_class=dict(type='str'),
3093
3120
  password_expire_max=dict(type='int', no_log=False),
3094
3121
  password_expire_min=dict(type='int', no_log=False),
3122
+ password_expire_warn=dict(type='int', no_log=False),
3095
3123
  # following options are specific to macOS
3096
3124
  hidden=dict(type='bool'),
3097
3125
  # following options are specific to selinux
@@ -12,7 +12,7 @@ DOCUMENTATION = r'''
12
12
  module: wait_for
13
13
  short_description: Waits for a condition before continuing
14
14
  description:
15
- - You can wait for a set amount of time C(timeout), this is the default if nothing is specified or just C(timeout) is specified.
15
+ - You can wait for a set amount of time O(timeout), this is the default if nothing is specified or just O(timeout) is specified.
16
16
  This does not produce an error.
17
17
  - Waiting for a port to become available is useful for when services are not immediately available after their init scripts return
18
18
  which is true of certain Java application servers.
@@ -49,7 +49,7 @@ options:
49
49
  port:
50
50
  description:
51
51
  - Port number to poll.
52
- - C(path) and C(port) are mutually exclusive parameters.
52
+ - O(path) and O(port) are mutually exclusive parameters.
53
53
  type: int
54
54
  active_connection_states:
55
55
  description:
@@ -60,17 +60,17 @@ options:
60
60
  version_added: "2.3"
61
61
  state:
62
62
  description:
63
- - Either C(present), C(started), or C(stopped), C(absent), or C(drained).
64
- - When checking a port C(started) will ensure the port is open, C(stopped) will check that it is closed, C(drained) will check for active connections.
65
- - When checking for a file or a search string C(present) or C(started) will ensure that the file or string is present before continuing,
66
- C(absent) will check that file is absent or removed.
63
+ - Either V(present), V(started), or V(stopped), V(absent), or V(drained).
64
+ - When checking a port V(started) will ensure the port is open, V(stopped) will check that it is closed, V(drained) will check for active connections.
65
+ - When checking for a file or a search string V(present) or V(started) will ensure that the file or string is present before continuing,
66
+ V(absent) will check that file is absent or removed.
67
67
  type: str
68
68
  choices: [ absent, drained, present, started, stopped ]
69
69
  default: started
70
70
  path:
71
71
  description:
72
72
  - Path to a file on the filesystem that must exist before continuing.
73
- - C(path) and C(port) are mutually exclusive parameters.
73
+ - O(path) and O(port) are mutually exclusive parameters.
74
74
  type: path
75
75
  version_added: "1.4"
76
76
  search_regex:
@@ -81,7 +81,7 @@ options:
81
81
  version_added: "1.4"
82
82
  exclude_hosts:
83
83
  description:
84
- - List of hosts or IPs to ignore when looking for active TCP connections for C(drained) state.
84
+ - List of hosts or IPs to ignore when looking for active TCP connections for V(drained) state.
85
85
  type: list
86
86
  elements: str
87
87
  version_added: "1.8"
@@ -238,7 +238,8 @@ import traceback
238
238
 
239
239
  from ansible.module_utils.basic import AnsibleModule, missing_required_lib
240
240
  from ansible.module_utils.common.sys_info import get_platform_subclass
241
- from ansible.module_utils._text import to_bytes
241
+ from ansible.module_utils.common.text.converters import to_bytes
242
+ from ansible.module_utils.compat.datetime import utcnow
242
243
 
243
244
 
244
245
  HAS_PSUTIL = False
@@ -532,7 +533,7 @@ def main():
532
533
  except Exception:
533
534
  module.fail_json(msg="unknown active_connection_state (%s) defined" % _connection_state, elapsed=0)
534
535
 
535
- start = datetime.datetime.utcnow()
536
+ start = utcnow()
536
537
 
537
538
  if delay:
538
539
  time.sleep(delay)
@@ -543,7 +544,7 @@ def main():
543
544
  # first wait for the stop condition
544
545
  end = start + datetime.timedelta(seconds=timeout)
545
546
 
546
- while datetime.datetime.utcnow() < end:
547
+ while utcnow() < end:
547
548
  if path:
548
549
  try:
549
550
  if not os.access(b_path, os.F_OK):
@@ -560,7 +561,7 @@ def main():
560
561
  # Conditions not yet met, wait and try again
561
562
  time.sleep(module.params['sleep'])
562
563
  else:
563
- elapsed = datetime.datetime.utcnow() - start
564
+ elapsed = utcnow() - start
564
565
  if port:
565
566
  module.fail_json(msg=msg or "Timeout when waiting for %s:%s to stop." % (host, port), elapsed=elapsed.seconds)
566
567
  elif path:
@@ -569,14 +570,14 @@ def main():
569
570
  elif state in ['started', 'present']:
570
571
  # wait for start condition
571
572
  end = start + datetime.timedelta(seconds=timeout)
572
- while datetime.datetime.utcnow() < end:
573
+ while utcnow() < end:
573
574
  if path:
574
575
  try:
575
576
  os.stat(b_path)
576
577
  except OSError as e:
577
578
  # If anything except file not present, throw an error
578
579
  if e.errno != 2:
579
- elapsed = datetime.datetime.utcnow() - start
580
+ elapsed = utcnow() - start
580
581
  module.fail_json(msg=msg or "Failed to stat %s, %s" % (path, e.strerror), elapsed=elapsed.seconds)
581
582
  # file doesn't exist yet, so continue
582
583
  else:
@@ -598,7 +599,7 @@ def main():
598
599
  except IOError:
599
600
  pass
600
601
  elif port:
601
- alt_connect_timeout = math.ceil(_timedelta_total_seconds(end - datetime.datetime.utcnow()))
602
+ alt_connect_timeout = math.ceil(_timedelta_total_seconds(end - utcnow()))
602
603
  try:
603
604
  s = socket.create_connection((host, port), min(connect_timeout, alt_connect_timeout))
604
605
  except Exception:
@@ -609,8 +610,8 @@ def main():
609
610
  if b_compiled_search_re:
610
611
  b_data = b''
611
612
  matched = False
612
- while datetime.datetime.utcnow() < end:
613
- max_timeout = math.ceil(_timedelta_total_seconds(end - datetime.datetime.utcnow()))
613
+ while utcnow() < end:
614
+ max_timeout = math.ceil(_timedelta_total_seconds(end - utcnow()))
614
615
  readable = select.select([s], [], [], max_timeout)[0]
615
616
  if not readable:
616
617
  # No new data. Probably means our timeout
@@ -654,7 +655,7 @@ def main():
654
655
 
655
656
  else: # while-else
656
657
  # Timeout expired
657
- elapsed = datetime.datetime.utcnow() - start
658
+ elapsed = utcnow() - start
658
659
  if port:
659
660
  if search_regex:
660
661
  module.fail_json(msg=msg or "Timeout when waiting for search string %s in %s:%s" % (search_regex, host, port), elapsed=elapsed.seconds)
@@ -670,17 +671,17 @@ def main():
670
671
  # wait until all active connections are gone
671
672
  end = start + datetime.timedelta(seconds=timeout)
672
673
  tcpconns = TCPConnectionInfo(module)
673
- while datetime.datetime.utcnow() < end:
674
+ while utcnow() < end:
674
675
  if tcpconns.get_active_connections_count() == 0:
675
676
  break
676
677
 
677
678
  # Conditions not yet met, wait and try again
678
679
  time.sleep(module.params['sleep'])
679
680
  else:
680
- elapsed = datetime.datetime.utcnow() - start
681
+ elapsed = utcnow() - start
681
682
  module.fail_json(msg=msg or "Timeout when waiting for %s:%s to drain" % (host, port), elapsed=elapsed.seconds)
682
683
 
683
- elapsed = datetime.datetime.utcnow() - start
684
+ elapsed = utcnow() - start
684
685
  module.exit_json(state=state, port=port, search_regex=search_regex, match_groups=match_groups, match_groupdict=match_groupdict, path=path,
685
686
  elapsed=elapsed.seconds)
686
687
 
@@ -12,9 +12,9 @@ DOCUMENTATION = r'''
12
12
  module: wait_for_connection
13
13
  short_description: Waits until remote system is reachable/usable
14
14
  description:
15
- - Waits for a total of C(timeout) seconds.
16
- - Retries the transport connection after a timeout of C(connect_timeout).
17
- - Tests the transport connection every C(sleep) seconds.
15
+ - Waits for a total of O(timeout) seconds.
16
+ - Retries the transport connection after a timeout of O(connect_timeout).
17
+ - Tests the transport connection every O(sleep) seconds.
18
18
  - This module makes use of internal ansible transport (and configuration) and the ping/win_ping module to guarantee correct end-to-end functioning.
19
19
  - This module is also supported for Windows targets.
20
20
  version_added: '2.3'
@@ -101,7 +101,7 @@ EXAMPLES = r'''
101
101
  customization:
102
102
  hostname: '{{ vm_shortname }}'
103
103
  runonce:
104
- - powershell.exe -ExecutionPolicy Unrestricted -File C:\Windows\Temp\ConfigureRemotingForAnsible.ps1 -ForceNewSSLCert -EnableCredSSP
104
+ - cmd.exe /c winrm.cmd quickconfig -quiet -force
105
105
  delegate_to: localhost
106
106
 
107
107
  - name: Wait for system to become reachable over WinRM