ansible-core 2.18.7rc1__py3-none-any.whl → 2.18.8__py3-none-any.whl

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

Potentially problematic release.


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

ansible/config/manager.py CHANGED
@@ -420,13 +420,17 @@ class ConfigManager(object):
420
420
  pass
421
421
 
422
422
  def get_plugin_options(self, plugin_type, name, keys=None, variables=None, direct=None):
423
+ options, dummy = self.get_plugin_options_and_origins(plugin_type, name, keys=keys, variables=variables, direct=direct)
424
+ return options
423
425
 
426
+ def get_plugin_options_and_origins(self, plugin_type, name, keys=None, variables=None, direct=None):
424
427
  options = {}
428
+ origins = {}
425
429
  defs = self.get_configuration_definitions(plugin_type=plugin_type, name=name)
426
430
  for option in defs:
427
- options[option] = self.get_config_value(option, plugin_type=plugin_type, plugin_name=name, keys=keys, variables=variables, direct=direct)
428
-
429
- return options
431
+ options[option], origins[option] = self.get_config_value_and_origin(option, plugin_type=plugin_type, plugin_name=name, keys=keys,
432
+ variables=variables, direct=direct)
433
+ return options, origins
430
434
 
431
435
  def get_plugin_vars(self, plugin_type, name):
432
436
 
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.18.7rc1'
20
+ __version__ = '2.18.8'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "Fool in the Rain"
ansible/modules/meta.py CHANGED
@@ -33,6 +33,7 @@ options:
33
33
  - V(clear_facts) (added in Ansible 2.1) causes the gathered facts for the hosts specified in the play's list of hosts to be cleared,
34
34
  including the fact cache.
35
35
  - V(clear_host_errors) (added in Ansible 2.1) clears the failed state (if any) from hosts specified in the play's list of hosts.
36
+ This will make them available for targetting in subsequent plays, but not continue execution in the current play.
36
37
  - V(end_play) (added in Ansible 2.2) causes the play to end without failing the host(s). Note that this affects all hosts.
37
38
  - V(reset_connection) (added in Ansible 2.3) interrupts a persistent connection (i.e. ssh + control persist)
38
39
  - V(end_host) (added in Ansible 2.8) is a per-host variation of V(end_play). Causes the play to end for the current host without failing it.
@@ -108,7 +109,7 @@ EXAMPLES = r'''
108
109
  - name: Clear gathered facts from all currently targeted hosts
109
110
  ansible.builtin.meta: clear_facts
110
111
 
111
- # Example showing how to continue using a failed target
112
+ # Example showing how to continue using a failed target, for the next play
112
113
  - name: Bring host back to play after failure
113
114
  ansible.builtin.copy:
114
115
  src: file
@@ -59,6 +59,7 @@ class AnsiblePlugin(ABC):
59
59
 
60
60
  def __init__(self):
61
61
  self._options = {}
62
+ self._origins = {}
62
63
  self._defs = None
63
64
 
64
65
  @property
@@ -78,18 +79,22 @@ class AnsiblePlugin(ABC):
78
79
  return bool(possible_fqcns.intersection(set(self.ansible_aliases)))
79
80
 
80
81
  def get_option_and_origin(self, option, hostvars=None):
81
- try:
82
- option_value, origin = C.config.get_config_value_and_origin(option, plugin_type=self.plugin_type, plugin_name=self._load_name, variables=hostvars)
83
- except AnsibleError as e:
84
- raise KeyError(to_native(e))
85
- return option_value, origin
82
+ if option not in self._options:
83
+ try:
84
+ # some plugins don't use set_option(s) and cannot use direct settings, so this populates the local copy for them
85
+ self._options[option], self._origins[option] = C.config.get_config_value_and_origin(option, plugin_type=self.plugin_type,
86
+ plugin_name=self._load_name, variables=hostvars)
87
+ except AnsibleError as e:
88
+ # callers expect key error on missing
89
+ raise KeyError(str(e))
86
90
 
87
- def get_option(self, option, hostvars=None):
91
+ return self._options[option], self._origins[option]
88
92
 
93
+ def get_option(self, option, hostvars=None):
89
94
  if option not in self._options:
90
- option_value, dummy = self.get_option_and_origin(option, hostvars=hostvars)
91
- self.set_option(option, option_value)
92
- return self._options.get(option)
95
+ # let it populate _options
96
+ self.get_option_and_origin(option, hostvars=hostvars)
97
+ return self._options[option]
93
98
 
94
99
  def get_options(self, hostvars=None):
95
100
  options = {}
@@ -100,6 +105,7 @@ class AnsiblePlugin(ABC):
100
105
  def set_option(self, option, value):
101
106
  self._options[option] = C.config.get_config_value(option, plugin_type=self.plugin_type, plugin_name=self._load_name, direct={option: value})
102
107
  C.handle_config_noise(display)
108
+ self._origins[option] = 'Direct'
103
109
 
104
110
  def set_options(self, task_keys=None, var_options=None, direct=None):
105
111
  '''
@@ -109,12 +115,14 @@ class AnsiblePlugin(ABC):
109
115
  :arg var_options: Dict with either 'connection variables'
110
116
  :arg direct: Dict with 'direct assignment'
111
117
  '''
112
- self._options = C.config.get_plugin_options(self.plugin_type, self._load_name, keys=task_keys, variables=var_options, direct=direct)
118
+ self._options, self._origins = C.config.get_plugin_options_and_origins(self.plugin_type, self._load_name, keys=task_keys,
119
+ variables=var_options, direct=direct)
113
120
 
114
121
  # allow extras/wildcards from vars that are not directly consumed in configuration
115
122
  # this is needed to support things like winrm that can have extended protocol options we don't directly handle
116
123
  if self.allow_extras and var_options and '_extras' in var_options:
117
124
  # these are largely unvalidated passthroughs, either plugin or underlying API will validate
125
+ # TODO: deprecate and remove, most plugins that needed this don't use this facility anymore
118
126
  self._options['_extras'] = var_options['_extras']
119
127
  C.handle_config_noise(display)
120
128
 
@@ -172,17 +172,25 @@ class CallbackBase(AnsiblePlugin):
172
172
 
173
173
  def set_option(self, k, v):
174
174
  self._plugin_options[k] = C.config.get_config_value(k, plugin_type=self.plugin_type, plugin_name=self._load_name, direct={k: v})
175
+ self._origins[k] = 'direct'
175
176
 
176
177
  def get_option(self, k):
177
178
  return self._plugin_options[k]
178
179
 
180
+ def get_option_and_origin(self, k, hostvars=None):
181
+ return self._plugin_options[k], self._origins[k]
182
+
183
+ def has_option(self, option):
184
+ return (option in self._plugin_options)
185
+
179
186
  def set_options(self, task_keys=None, var_options=None, direct=None):
180
187
  ''' This is different than the normal plugin method as callbacks get called early and really don't accept keywords.
181
188
  Also _options was already taken for CLI args and callbacks use _plugin_options instead.
182
189
  '''
183
190
 
184
191
  # load from config
185
- self._plugin_options = C.config.get_plugin_options(self.plugin_type, self._load_name, keys=task_keys, variables=var_options, direct=direct)
192
+ self._plugin_options, self._origins = C.config.get_plugin_options_and_origins(self.plugin_type, self._load_name,
193
+ keys=task_keys, variables=var_options, direct=direct)
186
194
 
187
195
  @staticmethod
188
196
  def host_label(result):
ansible/release.py CHANGED
@@ -17,6 +17,6 @@
17
17
 
18
18
  from __future__ import annotations
19
19
 
20
- __version__ = '2.18.7rc1'
20
+ __version__ = '2.18.8'
21
21
  __author__ = 'Ansible, Inc.'
22
22
  __codename__ = "Fool in the Rain"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ansible-core
3
- Version: 2.18.7rc1
3
+ Version: 2.18.8
4
4
  Summary: Radically simple IT automation
5
5
  Author: Ansible Project
6
6
  Project-URL: Homepage, https://ansible.com/
@@ -3,7 +3,7 @@ ansible/__main__.py,sha256=24j-7-YT4lZ2fmV80JD-VRoYBnxR7YoP_VP-orJtDt0,796
3
3
  ansible/constants.py,sha256=dSgbrzNsmhYc4GQOWZvRm4XKgf--_MUWcMa_9_7l5Pc,9757
4
4
  ansible/context.py,sha256=oKYyfjfWpy8vDeProtqfnqSmuij_t75_5e5t0U_hQ1g,1933
5
5
  ansible/keyword_desc.yml,sha256=xD-MRMB8mSRaj2ADwRnjIEbOwJKbc6BYadouGPfS0mI,7462
6
- ansible/release.py,sha256=a7G-qx9nCeL0-I7clLg3J0H00YPmsnBx6zdhVXg_9A8,839
6
+ ansible/release.py,sha256=9gq7Q1GbBxC3GTVQHdxbwP6GkRpZWnuB_EVmsfq6wVc,836
7
7
  ansible/_vendor/__init__.py,sha256=2QBeBwT7uG7M3Aw-pIdCpt6XPtHMCpbEKfACYKA7xIg,2033
8
8
  ansible/cli/__init__.py,sha256=e0KjeLfG1Ketbwl-uOmQ-zXoq3_El80LnHTGu80d1gs,28111
9
9
  ansible/cli/adhoc.py,sha256=quJ9WzRzf3dz_dtDGmahNMffqyNVy1jzQCMo21YL5Qg,8194
@@ -27,7 +27,7 @@ ansible/compat/selectors.py,sha256=pbI2QH2fT2WAOtmEBbd6Cp2yXyCBbb5TLR7iitqnAkU,1
27
27
  ansible/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  ansible/config/ansible_builtin_runtime.yml,sha256=nwL_-rqEEmpuSHxZH70pJBiEosDKOPkYIboH3_7LVEY,376076
29
29
  ansible/config/base.yml,sha256=uC0ApG7cA5evjjINIMH49362fhMI_p2--Bp_aRbELj4,87253
30
- ansible/config/manager.py,sha256=27_GXGb3SxX0Shqf5YtHvDSoycinzsDAjaPqwPsbY5o,29132
30
+ ansible/config/manager.py,sha256=NZc0A5Rc14BOCSVPPQS1RI3xbC1Yo1a1OM0uy2f9Za4,29524
31
31
  ansible/errors/__init__.py,sha256=Dd-jh7JVwfweicHg6irB9ugrK66vHATv9eiRbEep4dM,14943
32
32
  ansible/errors/yaml_strings.py,sha256=fKfgD3rC017dyMackTpu-LkvbsdnsfBAKCxMH-fDtIg,3858
33
33
  ansible/executor/__init__.py,sha256=mRvbCJPA-_veSG5ka3v04G5vsarLVDeB3EWFsu6geSI,749
@@ -141,7 +141,7 @@ ansible/inventory/host.py,sha256=PDb5OTplhfpUIvdHiP2BckUOB1gUl302N-3sW0_sTyg,503
141
141
  ansible/inventory/manager.py,sha256=45mHgZTAkQ3IjAtrgsNzJXvynC-HIEor-JJE-V3xXN4,29454
142
142
  ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
143
  ansible/module_utils/_text.py,sha256=VkWgAnSNVCbTQqZgllUObBFsH3uM4EUW5srl1UR9t1g,544
144
- ansible/module_utils/ansible_release.py,sha256=a7G-qx9nCeL0-I7clLg3J0H00YPmsnBx6zdhVXg_9A8,839
144
+ ansible/module_utils/ansible_release.py,sha256=9gq7Q1GbBxC3GTVQHdxbwP6GkRpZWnuB_EVmsfq6wVc,836
145
145
  ansible/module_utils/api.py,sha256=r4wd6XZGhUnxMF416Ry6ebgq8BIhjCPSPOvO2ZtrYxE,5785
146
146
  ansible/module_utils/basic.py,sha256=fogfpo_l7JtS34WvgwwOebmPfMhFjQaJN5CwjKgUJVE,86291
147
147
  ansible/module_utils/connection.py,sha256=8TviwCucQ7d_JILwaUHE4tCuNfR3U1WFkmxLMxWa8Rw,7671
@@ -319,7 +319,7 @@ ansible/modules/include_vars.py,sha256=IyLjhjIpwCPes9ytQ7bzGsLgJRQuiOFqt8nzTUhcn
319
319
  ansible/modules/iptables.py,sha256=8An92NU65l8Lswj5Ptf4FYqmE7ZC4bFkTPIPmGDWCTk,34708
320
320
  ansible/modules/known_hosts.py,sha256=QPDEQgoVHSLAZrfv4zrvTUa65w5DIvwSGaOcw9SPTG8,14439
321
321
  ansible/modules/lineinfile.py,sha256=ZAUoZQJYJe4HMItmeLmrGTWKOoT_Q0kuOPGEU9Yr2Yk,23734
322
- ansible/modules/meta.py,sha256=DQlvH4rQGBvRI3zvF3rHJ7lSXPEjwJyDrlqITrhfrOE,7121
322
+ ansible/modules/meta.py,sha256=7MzbqALa-o74TFkNEnjnuj5cTVNSwQ93E3RlSzpqt-I,7264
323
323
  ansible/modules/mount_facts.py,sha256=TbRFvz55BU473OI5SFt8cSQRVXfu6-MJ5ka7on46EkY,25997
324
324
  ansible/modules/package.py,sha256=oJRsLK4U9oxsW4WNALMeGmPhWpZW9NsMgswwz3ad8xM,3748
325
325
  ansible/modules/package_facts.py,sha256=3u_DOU57hyp7y1qcsTfBf-oWG1kqU29T-G9OQxdiwqo,16806
@@ -394,7 +394,7 @@ ansible/playbook/role/definition.py,sha256=ZKs9FI3kqJETFHMh-8lOH6xGY_g2siuTxYgQj
394
394
  ansible/playbook/role/include.py,sha256=9e4IvnD3JXqJUV-hB7riGgq0SjrqQGQHDg-cuJ1vTlo,2342
395
395
  ansible/playbook/role/metadata.py,sha256=HUuR5wCKAw-6urkAR4DKxUeOVsqFflSDHjZuWdBCmxo,5074
396
396
  ansible/playbook/role/requirement.py,sha256=CNgLa0J6zZk2YQ_aeALnjQvehkkFXhrK8LQQZs7Ztzc,4173
397
- ansible/plugins/__init__.py,sha256=Duv86JIZPu6-ln-MPzBbq08Ex0s6OuK7nPzohm0cMPU,5803
397
+ ansible/plugins/__init__.py,sha256=xshUMIDPfZKglEb2aqGZoJIPz1auHPdlosOVPyoC4tw,6425
398
398
  ansible/plugins/list.py,sha256=Ymy3NjZd8HJQU_yyZgjgHDFSYL9JxEI_pzdGocapflM,9055
399
399
  ansible/plugins/loader.py,sha256=musEPf-GJK7lpHugJQyaMOaIP5ls3zU90Qn20DBjnQc,75153
400
400
  ansible/plugins/action/__init__.py,sha256=SwQ7kbw9Z_KvruDnejEhlAvILGnYOjNjxGjDKMJ1bfw,69013
@@ -434,7 +434,7 @@ ansible/plugins/cache/__init__.py,sha256=ZyBCeued8L_VhjsmYTYnZdZVvB3yYvapLw51I2B
434
434
  ansible/plugins/cache/base.py,sha256=gMJllsSxBALsnp8mn8ZpBw6Ik0z_xwKD4W7fDDhCBhY,907
435
435
  ansible/plugins/cache/jsonfile.py,sha256=XaoBGwupkJ_c7wE-PtzeEIx8UXWrPhITEr5mOvUQVi4,1901
436
436
  ansible/plugins/cache/memory.py,sha256=0YyktJWL1o9E9JdU-lM1frgamanG-uGOo_Tcii7nD9A,1218
437
- ansible/plugins/callback/__init__.py,sha256=wHH9SWmnJXjUiH5KUcM-S6sxEoenjpDyfc8HF8mBHqU,25652
437
+ ansible/plugins/callback/__init__.py,sha256=9TDTyg_zdtTWu8DFPDPEXXA4mfQFIFuXh2C2YBUwxrU,25997
438
438
  ansible/plugins/callback/default.py,sha256=pC9Qbw-4-Q8NFHl4lvH9jr6jNop01b6tjxmOWGy5fmU,16883
439
439
  ansible/plugins/callback/junit.py,sha256=SEcfuWxBqm3SpeZlZbno8Uh-1C0NnmPXscUWgYtCyIQ,13773
440
440
  ansible/plugins/callback/minimal.py,sha256=51pTYXwnCAm4Z4TYbWTu-wq8gKpYCeq1AuSD8PC0hSo,3008
@@ -687,17 +687,17 @@ ansible/vars/hostvars.py,sha256=o11xrzDVYn23renGbb3lx3R-nH9qOjLFju5IYJanDxg,5324
687
687
  ansible/vars/manager.py,sha256=JF2KTL4iYSbcdnFNjhQPktwH05YhWJhTWtjSlF0qg9E,31260
688
688
  ansible/vars/plugins.py,sha256=PocWZPMqFl1LoNgWlGFNxwg9nZnUzhQmlXO4g7bcP2A,4503
689
689
  ansible/vars/reserved.py,sha256=Tsc4m2UwVce3dOvSWrjT2wB3lpNJtUyNZn45zNhsW0I,2869
690
- ansible_core-2.18.7rc1.dist-info/licenses/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
691
- ansible_core-2.18.7rc1.dist-info/licenses/licenses/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
692
- ansible_core-2.18.7rc1.dist-info/licenses/licenses/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
693
- ansible_core-2.18.7rc1.dist-info/licenses/licenses/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
694
- ansible_core-2.18.7rc1.dist-info/licenses/licenses/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
690
+ ansible_core-2.18.8.dist-info/licenses/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
691
+ ansible_core-2.18.8.dist-info/licenses/licenses/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
692
+ ansible_core-2.18.8.dist-info/licenses/licenses/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
693
+ ansible_core-2.18.8.dist-info/licenses/licenses/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
694
+ ansible_core-2.18.8.dist-info/licenses/licenses/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
695
695
  ansible_test/__init__.py,sha256=20VPOj11c6Ut1Av9RaurgwJvFhMqkWG3vAvcCbecNKw,66
696
696
  ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
697
697
  ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
698
698
  ansible_test/_data/completion/docker.txt,sha256=Z5pvUK4XUkJV5qBW8QuBPk8BzuEnvYFQU7W_ULwycGE,648
699
699
  ansible_test/_data/completion/network.txt,sha256=BxVN0UxlVkRUrPi9MBArQOe6nR8exaow0oCAznUdfKQ,100
700
- ansible_test/_data/completion/remote.txt,sha256=GcYgad_3SBIcndWmWmmWKQ4697XmSiVxak26HSFQe50,980
700
+ ansible_test/_data/completion/remote.txt,sha256=62SqbrjJqRVgqthMObjcMelGRNjWYqQUddRLJo9e3Jw,976
701
701
  ansible_test/_data/completion/windows.txt,sha256=T67veSrF2tqHC1W6Ddsq3LCBwMCBUmp9LoZBy1QlXOo,238
702
702
  ansible_test/_data/playbooks/posix_coverage_setup.yml,sha256=PgQNVzVTsNmfnu0sT2SAYiWtkMSOppfmh0oVmAsb7TQ,594
703
703
  ansible_test/_data/playbooks/posix_coverage_teardown.yml,sha256=xHci5QllwJymFtig-hsOXm-Wdrxz063JH14aIyRXhyc,212
@@ -752,7 +752,7 @@ ansible_test/_internal/constants.py,sha256=Zwgp8wtUuge_8xMPg0pDUt58fBd9KA7YEPTQq
752
752
  ansible_test/_internal/containers.py,sha256=TrkHL4ntmb7HrmD55BzSdqF35s7oFKu0vCywpWfRt-k,34137
753
753
  ansible_test/_internal/content_config.py,sha256=QKR_XVBgYRNZL-XawF2pN2ERTZ6lSm1AJg9ZQRD6IHE,5588
754
754
  ansible_test/_internal/core_ci.py,sha256=pyiwFG_TgDSQw34qW-PG8T2VYS6XxiF0zOEWGYXRRek,17309
755
- ansible_test/_internal/coverage_util.py,sha256=_SPR0sqkgPoGw2bzuRS5gr4XOyIU8MQ4a9U8FgyWHho,9283
755
+ ansible_test/_internal/coverage_util.py,sha256=6SFmRqRPiv5l5Aj3VV1PtnHIgM5CNVvsWrilUch1NtY,9407
756
756
  ansible_test/_internal/data.py,sha256=OFDpRa47yqBqQO1aSvTZVQQpScHvBHsr861586MQEUI,11184
757
757
  ansible_test/_internal/delegation.py,sha256=D8hluDQf_YN3DtVG_8HW0iumRBY3gjp_zP-rlc3VNY4,13418
758
758
  ansible_test/_internal/diff.py,sha256=qfzSL7BtoW7bLLgzF0-m--jthVDpUQSr9aBw1fCMIHk,7310
@@ -844,7 +844,7 @@ ansible_test/_internal/commands/coverage/analyze/targets/generate.py,sha256=UFy_
844
844
  ansible_test/_internal/commands/coverage/analyze/targets/missing.py,sha256=iqntMFk1nwhxxKgABtHTGLHJPJYMeMEa80Ey5dvBkCc,3894
845
845
  ansible_test/_internal/commands/env/__init__.py,sha256=ZJZlU1ufO_8R6tufyQXttI072YLQgy1VlwgN-ceOzP4,5165
846
846
  ansible_test/_internal/commands/integration/__init__.py,sha256=CB2v0kQqNfSaSuXXwM9Rq9oNewkFiJRh5mEZJUjugpQ,36888
847
- ansible_test/_internal/commands/integration/coverage.py,sha256=BAdVMGPTP-QKys6uecxEWM7Ipr-TpVbrlP3vpLxjVMc,15578
847
+ ansible_test/_internal/commands/integration/coverage.py,sha256=cGAwo0RF2-5Nyi-ocLyp1NNhTwP2I9grUwkBL3xqoiM,15560
848
848
  ansible_test/_internal/commands/integration/filters.py,sha256=OntBnxm9gnP57yFaiN49Wtk0wA4LJ0jKBY4e4vc0fko,12168
849
849
  ansible_test/_internal/commands/integration/network.py,sha256=TvZmcJ1JEZPytj4Eqb3n98zrhZdcTX8PjIshE94Qv7Q,2417
850
850
  ansible_test/_internal/commands/integration/posix.py,sha256=eyJg1tpmaVXl2wylN0gOqqLGF3RA1YZeKIZpQg59pM0,1444
@@ -964,7 +964,7 @@ ansible_test/_util/target/pytest/plugins/ansible_pytest_collections.py,sha256=vn
964
964
  ansible_test/_util/target/pytest/plugins/ansible_pytest_coverage.py,sha256=A6HawT60Q8Bz0WWajO8AS-HcTpGtm_YxMNASwaYvVH0,1998
965
965
  ansible_test/_util/target/sanity/compile/compile.py,sha256=iTRgiZHNO8DwjSqHBw8gPBbFtWnr-Zbd_ybymeazdtA,1302
966
966
  ansible_test/_util/target/sanity/import/importer.py,sha256=SGIu5uHzbw7vTItX3fzOEnim5pgtM1tz6UFoZyNzqc8,25149
967
- ansible_test/_util/target/setup/bootstrap.sh,sha256=T7Yx32uT8rcxLM6yNfmlrozFzpYeU2aaNddQarjxy-A,12991
967
+ ansible_test/_util/target/setup/bootstrap.sh,sha256=vM_2K1_nZLHckIhf4tj7o1IH0AUGltIHEM2CARWtFI8,12540
968
968
  ansible_test/_util/target/setup/check_systemd_cgroup_v1.sh,sha256=Aq0T62x_KLtkGaWzYqWjvhchTqYFflrTbQET3h6xrT0,395
969
969
  ansible_test/_util/target/setup/probe_cgroups.py,sha256=wUHvjW_GXpcyMGw308w26T09cOtBW5EU7i9WagGDQ7o,659
970
970
  ansible_test/_util/target/setup/quiet_pip.py,sha256=d3bvh9k2XI_z8-vb3ZoI4lwL8LaFkwvjJE7PpApBlcw,1979
@@ -985,8 +985,8 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
985
985
  ansible_test/config/config.yml,sha256=1zdGucnIl6nIecZA7ISIANvqXiHWqq6Dthsk_6MUwNc,2642
986
986
  ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
987
987
  ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
988
- ansible_core-2.18.7rc1.dist-info/METADATA,sha256=CkrRlXIiu4vjqwkG5iZ8c8GBnlrEhFvq3kI8fH31Onw,7693
989
- ansible_core-2.18.7rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
990
- ansible_core-2.18.7rc1.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
991
- ansible_core-2.18.7rc1.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
992
- ansible_core-2.18.7rc1.dist-info/RECORD,,
988
+ ansible_core-2.18.8.dist-info/METADATA,sha256=syPAmnkZT9EKQc_Kgn9-d4RDe6MjgwGvtVdi9IdsIeg,7690
989
+ ansible_core-2.18.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
990
+ ansible_core-2.18.8.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
991
+ ansible_core-2.18.8.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
992
+ ansible_core-2.18.8.dist-info/RECORD,,
@@ -2,7 +2,7 @@ alpine/3.20 python=3.12 become=doas_sudo provider=aws arch=x86_64
2
2
  alpine become=doas_sudo provider=aws arch=x86_64
3
3
  fedora/40 python=3.12 become=sudo provider=aws arch=x86_64
4
4
  fedora become=sudo provider=aws arch=x86_64
5
- freebsd/13.3 python=3.9,3.11 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
5
+ freebsd/13.5 python=3.11 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
6
6
  freebsd/14.1 python=3.9,3.11 python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
7
7
  freebsd python_dir=/usr/local/bin become=su_sudo provider=aws arch=x86_64
8
8
  macos/14.3 python=3.11 python_dir=/usr/local/bin become=sudo provider=parallels arch=x86_64
@@ -165,7 +165,7 @@ class PosixCoverageHandler(CoverageHandler[PosixConfig]):
165
165
  coverage_config_path = os.path.join(self.common_temp_path, COVERAGE_CONFIG_NAME)
166
166
  coverage_output_path = os.path.join(self.common_temp_path, ResultType.COVERAGE.name)
167
167
 
168
- coverage_config = generate_coverage_config(self.args)
168
+ coverage_config = generate_coverage_config()
169
169
 
170
170
  write_text_file(coverage_config_path, coverage_config, create_directories=True)
171
171
 
@@ -254,7 +254,7 @@ class PosixCoverageHandler(CoverageHandler[PosixConfig]):
254
254
  """Return a dictionary of variables for setup and teardown of POSIX coverage."""
255
255
  return dict(
256
256
  common_temp_dir=self.common_temp_path,
257
- coverage_config=generate_coverage_config(self.args),
257
+ coverage_config=generate_coverage_config(),
258
258
  coverage_config_path=os.path.join(self.common_temp_path, COVERAGE_CONFIG_NAME),
259
259
  coverage_output_path=os.path.join(self.common_temp_path, ResultType.COVERAGE.name),
260
260
  mode_directory=f'{MODE_DIRECTORY:04o}',
@@ -5,11 +5,10 @@ import dataclasses
5
5
  import os
6
6
  import sqlite3
7
7
  import tempfile
8
+ import textwrap
8
9
  import typing as t
9
10
 
10
11
  from .config import (
11
- IntegrationConfig,
12
- SanityConfig,
13
12
  TestConfig,
14
13
  )
15
14
 
@@ -216,7 +215,7 @@ def get_coverage_config(args: TestConfig) -> str:
216
215
  except AttributeError:
217
216
  pass
218
217
 
219
- coverage_config = generate_coverage_config(args)
218
+ coverage_config = generate_coverage_config()
220
219
 
221
220
  if args.explain:
222
221
  temp_dir = '/tmp/coverage-temp-dir'
@@ -234,10 +233,10 @@ def get_coverage_config(args: TestConfig) -> str:
234
233
  return path
235
234
 
236
235
 
237
- def generate_coverage_config(args: TestConfig) -> str:
236
+ def generate_coverage_config() -> str:
238
237
  """Generate code coverage configuration for tests."""
239
238
  if data_context().content.collection:
240
- coverage_config = generate_collection_coverage_config(args)
239
+ coverage_config = generate_collection_coverage_config()
241
240
  else:
242
241
  coverage_config = generate_ansible_coverage_config()
243
242
 
@@ -264,12 +263,29 @@ omit =
264
263
  */test/results/*
265
264
  '''
266
265
 
266
+ coverage_config = coverage_config.lstrip()
267
+
267
268
  return coverage_config
268
269
 
269
270
 
270
- def generate_collection_coverage_config(args: TestConfig) -> str:
271
+ def generate_collection_coverage_config() -> str:
271
272
  """Generate code coverage configuration for Ansible Collection tests."""
272
- coverage_config = '''
273
+ include_patterns = [
274
+ # {base}/ansible_collections/{ns}/{col}/*
275
+ os.path.join(data_context().content.root, '*'),
276
+ # */ansible_collections/{ns}/{col}/* (required to pick up AnsiballZ coverage)
277
+ os.path.join('*', data_context().content.collection.directory, '*'),
278
+ ]
279
+
280
+ omit_patterns = [
281
+ # {base}/ansible_collections/{ns}/{col}/tests/output/*
282
+ os.path.join(data_context().content.root, data_context().content.results_path, '*'),
283
+ ]
284
+
285
+ include = textwrap.indent('\n'.join(include_patterns), ' ' * 4)
286
+ omit = textwrap.indent('\n'.join(omit_patterns), ' ' * 4)
287
+
288
+ coverage_config = f"""
273
289
  [run]
274
290
  branch = True
275
291
  concurrency =
@@ -278,28 +294,15 @@ concurrency =
278
294
  parallel = True
279
295
  disable_warnings =
280
296
  no-data-collected
281
- '''
282
297
 
283
- if isinstance(args, IntegrationConfig):
284
- coverage_config += '''
285
- include =
286
- %s/*
287
- */%s/*
288
- ''' % (data_context().content.root, data_context().content.collection.directory)
289
- elif isinstance(args, SanityConfig):
290
- # temporary work-around for import sanity test
291
- coverage_config += '''
292
298
  include =
293
- %s/*
299
+ {include}
294
300
 
295
301
  omit =
296
- %s/*
297
- ''' % (data_context().content.root, os.path.join(data_context().content.root, data_context().content.results_path))
298
- else:
299
- coverage_config += '''
300
- include =
301
- %s/*
302
- ''' % data_context().content.root
302
+ {omit}
303
+ """
304
+
305
+ coverage_config = coverage_config.lstrip()
303
306
 
304
307
  return coverage_config
305
308
 
@@ -2,6 +2,24 @@
2
2
 
3
3
  set -eu
4
4
 
5
+ retry_init()
6
+ {
7
+ attempt=0
8
+ }
9
+
10
+ retry_or_fail()
11
+ {
12
+ attempt=$((attempt + 1))
13
+
14
+ if [ $attempt -gt 5 ]; then
15
+ echo "Failed to install packages. Giving up."
16
+ exit 1
17
+ fi
18
+
19
+ echo "Failed to install packages. Sleeping before trying again..."
20
+ sleep 10
21
+ }
22
+
5
23
  remove_externally_managed_marker()
6
24
  {
7
25
  "${python_interpreter}" -c '
@@ -26,13 +44,13 @@ install_ssh_keys()
26
44
  echo "${ssh_private_key}" > "${ssh_private_key_path}"
27
45
 
28
46
  # add public key to authorized_keys
29
- authoried_keys_path="${HOME}/.ssh/authorized_keys"
47
+ authorized_keys_path="${HOME}/.ssh/authorized_keys"
30
48
 
31
49
  # the existing file is overwritten to avoid conflicts (ex: RHEL on EC2 blocks root login)
32
- cat "${public_key_path}" > "${authoried_keys_path}"
33
- chmod 0600 "${authoried_keys_path}"
50
+ cat "${public_key_path}" > "${authorized_keys_path}"
51
+ chmod 0600 "${authorized_keys_path}"
34
52
 
35
- # add localhost's server keys to known_hosts
53
+ # add localhost server keys to known_hosts
36
54
  known_hosts_path="${HOME}/.ssh/known_hosts"
37
55
 
38
56
  for key in /etc/ssh/ssh_host_*_key.pub; do
@@ -64,13 +82,13 @@ install_pip() {
64
82
  ;;
65
83
  esac
66
84
 
85
+ retry_init
67
86
  while true; do
68
87
  curl --silent --show-error "${pip_bootstrap_url}" -o /tmp/get-pip.py && \
69
88
  "${python_interpreter}" /tmp/get-pip.py --disable-pip-version-check --quiet && \
70
89
  rm /tmp/get-pip.py \
71
90
  && break
72
- echo "Failed to install packages. Sleeping before trying again..."
73
- sleep 10
91
+ retry_or_fail
74
92
  done
75
93
  fi
76
94
  }
@@ -99,21 +117,21 @@ bootstrap_remote_alpine()
99
117
  "
100
118
  fi
101
119
 
120
+ retry_init
102
121
  while true; do
103
122
  # shellcheck disable=SC2086
104
123
  apk add -q ${packages} \
105
124
  && break
106
- echo "Failed to install packages. Sleeping before trying again..."
107
- sleep 10
125
+ retry_or_fail
108
126
  done
109
127
 
110
128
  # Upgrade the `libexpat` package to ensure that an upgraded Python (`pyexpat`) continues to work.
129
+ retry_init
111
130
  while true; do
112
131
  # shellcheck disable=SC2086
113
132
  apk upgrade -q libexpat \
114
133
  && break
115
- echo "Failed to upgrade libexpat. Sleeping before trying again..."
116
- sleep 10
134
+ retry_or_fail
117
135
  done
118
136
  }
119
137
 
@@ -138,12 +156,12 @@ bootstrap_remote_fedora()
138
156
  "
139
157
  fi
140
158
 
159
+ retry_init
141
160
  while true; do
142
161
  # shellcheck disable=SC2086
143
162
  dnf install -q -y ${packages} \
144
163
  && break
145
- echo "Failed to install packages. Sleeping before trying again..."
146
- sleep 10
164
+ retry_or_fail
147
165
  done
148
166
  }
149
167
 
@@ -162,22 +180,14 @@ bootstrap_remote_freebsd()
162
180
  if [ "${controller}" ]; then
163
181
  jinja2_pkg="py${python_package_version}-jinja2"
164
182
  cryptography_pkg="py${python_package_version}-cryptography"
165
- pyyaml_pkg="py${python_package_version}-yaml"
183
+ pyyaml_pkg="py${python_package_version}-pyyaml"
166
184
  packaging_pkg="py${python_package_version}-packaging"
167
185
 
168
186
  # Declare platform/python version combinations which do not have supporting OS packages available.
169
187
  # For these combinations ansible-test will use pip to install the requirements instead.
170
188
  case "${platform_version}/${python_version}" in
171
- 13.3/3.9)
172
- # defaults above 'just work'TM
173
- ;;
174
- 13.3/3.11)
175
- jinja2_pkg="" # not available
176
- cryptography_pkg="" # not available
177
- pyyaml_pkg="" # not available
178
- ;;
179
- 14.1/3.9)
180
- # defaults above 'just work'TM
189
+ 13.5/3.11)
190
+ # defaults available
181
191
  ;;
182
192
  14.1/3.11)
183
193
  cryptography_pkg="" # not available
@@ -203,13 +213,13 @@ bootstrap_remote_freebsd()
203
213
  "
204
214
  fi
205
215
 
216
+ retry_init
206
217
  while true; do
207
218
  # shellcheck disable=SC2086
208
219
  env ASSUME_ALWAYS_YES=YES pkg bootstrap && \
209
220
  pkg install -q -y ${packages} \
210
221
  && break
211
- echo "Failed to install packages. Sleeping before trying again..."
212
- sleep 10
222
+ retry_or_fail
213
223
  done
214
224
 
215
225
  install_pip
@@ -283,12 +293,12 @@ bootstrap_remote_rhel_9()
283
293
  "
284
294
  fi
285
295
 
296
+ retry_init
286
297
  while true; do
287
298
  # shellcheck disable=SC2086
288
299
  dnf install -q -y ${packages} \
289
300
  && break
290
- echo "Failed to install packages. Sleeping before trying again..."
291
- sleep 10
301
+ retry_or_fail
292
302
  done
293
303
  }
294
304
 
@@ -313,12 +323,12 @@ bootstrap_remote_rhel_10()
313
323
  "
314
324
  fi
315
325
 
326
+ retry_init
316
327
  while true; do
317
328
  # shellcheck disable=SC2086
318
329
  dnf install -q -y ${packages} \
319
330
  && break
320
- echo "Failed to install packages. Sleeping before trying again..."
321
- sleep 10
331
+ retry_or_fail
322
332
  done
323
333
  }
324
334
 
@@ -365,13 +375,13 @@ bootstrap_remote_ubuntu()
365
375
  "
366
376
  fi
367
377
 
378
+ retry_init
368
379
  while true; do
369
380
  # shellcheck disable=SC2086
370
381
  apt-get update -qq -y && \
371
382
  DEBIAN_FRONTEND=noninteractive apt-get install -qq -y --no-install-recommends ${packages} \
372
383
  && break
373
- echo "Failed to install packages. Sleeping before trying again..."
374
- sleep 10
384
+ retry_or_fail
375
385
  done
376
386
  }
377
387