ansible-core 2.18.0b1__py3-none-any.whl → 2.18.0rc2__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/errors/__init__.py +6 -2
- ansible/executor/play_iterator.py +18 -0
- ansible/executor/task_executor.py +2 -2
- ansible/galaxy/collection/concrete_artifact_manager.py +8 -3
- ansible/module_utils/ansible_release.py +1 -1
- ansible/module_utils/facts/system/distribution.py +1 -1
- ansible/module_utils/facts/timeout.py +1 -1
- ansible/modules/debconf.py +16 -13
- ansible/modules/dnf5.py +9 -1
- ansible/modules/user.py +18 -3
- ansible/playbook/base.py +5 -5
- ansible/plugins/action/dnf.py +7 -5
- ansible/plugins/action/include_vars.py +2 -1
- ansible/plugins/action/package.py +5 -4
- ansible/plugins/filter/unique.yml +28 -0
- ansible/plugins/strategy/__init__.py +2 -0
- ansible/plugins/strategy/linear.py +1 -13
- ansible/release.py +1 -1
- ansible/utils/galaxy.py +1 -1
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/METADATA +1 -1
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/RECORD +41 -41
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/WHEEL +1 -1
- ansible_test/_data/completion/docker.txt +3 -3
- ansible_test/_data/requirements/sanity.pylint.txt +4 -4
- ansible_test/_internal/docker_util.py +9 -1
- ansible_test/_internal/encoding.py +4 -4
- ansible_test/_internal/util.py +16 -8
- ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg +5 -0
- ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg +5 -0
- ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg +5 -0
- ansible_test/_util/controller/sanity/pylint/config/collection.cfg +5 -0
- ansible_test/_util/controller/sanity/pylint/config/default.cfg +5 -0
- ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py +3 -4
- ansible_test/_util/target/setup/requirements.py +4 -4
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/Apache-License.txt +0 -0
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/COPYING +0 -0
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/MIT-license.txt +0 -0
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/PSF-license.txt +0 -0
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/simplified_bsd.txt +0 -0
- {ansible_core-2.18.0b1.dist-info → ansible_core-2.18.0rc2.dist-info}/top_level.txt +0 -0
ansible/errors/__init__.py
CHANGED
|
@@ -66,14 +66,18 @@ class AnsibleError(Exception):
|
|
|
66
66
|
from ansible.parsing.yaml.objects import AnsibleBaseYAMLObject
|
|
67
67
|
|
|
68
68
|
message = [self._message]
|
|
69
|
+
|
|
70
|
+
# Add from previous exceptions
|
|
71
|
+
if self.orig_exc:
|
|
72
|
+
message.append('. %s' % to_native(self.orig_exc))
|
|
73
|
+
|
|
74
|
+
# Add from yaml to give specific file/line no
|
|
69
75
|
if isinstance(self.obj, AnsibleBaseYAMLObject):
|
|
70
76
|
extended_error = self._get_extended_error()
|
|
71
77
|
if extended_error and not self._suppress_extended_error:
|
|
72
78
|
message.append(
|
|
73
79
|
'\n\n%s' % to_native(extended_error)
|
|
74
80
|
)
|
|
75
|
-
elif self.orig_exc:
|
|
76
|
-
message.append('. %s' % to_native(self.orig_exc))
|
|
77
81
|
|
|
78
82
|
return ''.join(message)
|
|
79
83
|
|
|
@@ -447,6 +447,24 @@ class PlayIterator:
|
|
|
447
447
|
|
|
448
448
|
# if something above set the task, break out of the loop now
|
|
449
449
|
if task:
|
|
450
|
+
# skip implicit flush_handlers if there are no handlers notified
|
|
451
|
+
if (
|
|
452
|
+
task.implicit
|
|
453
|
+
and task.action in C._ACTION_META
|
|
454
|
+
and task.args.get('_raw_params', None) == 'flush_handlers'
|
|
455
|
+
and (
|
|
456
|
+
# the state store in the `state` variable could be a nested state,
|
|
457
|
+
# notifications are always stored in the top level state, get it here
|
|
458
|
+
not self.get_state_for_host(host.name).handler_notifications
|
|
459
|
+
# in case handlers notifying other handlers, the notifications are not
|
|
460
|
+
# saved in `handler_notifications` and handlers are notified directly
|
|
461
|
+
# to prevent duplicate handler runs, so check whether any handler
|
|
462
|
+
# is notified
|
|
463
|
+
and all(not h.notified_hosts for h in self.handlers)
|
|
464
|
+
)
|
|
465
|
+
):
|
|
466
|
+
continue
|
|
467
|
+
|
|
450
468
|
break
|
|
451
469
|
|
|
452
470
|
return (state, task)
|
|
@@ -684,8 +684,8 @@ class TaskExecutor:
|
|
|
684
684
|
self._handler.cleanup()
|
|
685
685
|
display.debug("handler run complete")
|
|
686
686
|
|
|
687
|
-
#
|
|
688
|
-
result["_ansible_no_log"] = no_log
|
|
687
|
+
# propagate no log to result- the action can set this, so only overwrite it with the task's value if missing or falsey
|
|
688
|
+
result["_ansible_no_log"] = bool(no_log or result.get('_ansible_no_log', False))
|
|
689
689
|
|
|
690
690
|
if self._task.action not in C._ACTION_WITH_CLEAN_FACTS:
|
|
691
691
|
result = wrap_var(result)
|
|
@@ -10,6 +10,7 @@ import os
|
|
|
10
10
|
import tarfile
|
|
11
11
|
import subprocess
|
|
12
12
|
import typing as t
|
|
13
|
+
import yaml
|
|
13
14
|
|
|
14
15
|
from contextlib import contextmanager
|
|
15
16
|
from hashlib import sha256
|
|
@@ -24,6 +25,7 @@ if t.TYPE_CHECKING:
|
|
|
24
25
|
)
|
|
25
26
|
from ansible.galaxy.token import GalaxyToken
|
|
26
27
|
|
|
28
|
+
from ansible import context
|
|
27
29
|
from ansible.errors import AnsibleError
|
|
28
30
|
from ansible.galaxy import get_collections_galaxy_meta_info
|
|
29
31
|
from ansible.galaxy.api import should_retry_error
|
|
@@ -38,7 +40,7 @@ from ansible.module_utils.urls import open_url
|
|
|
38
40
|
from ansible.utils.display import Display
|
|
39
41
|
from ansible.utils.sentinel import Sentinel
|
|
40
42
|
|
|
41
|
-
import
|
|
43
|
+
import ansible.constants as C
|
|
42
44
|
|
|
43
45
|
|
|
44
46
|
display = Display()
|
|
@@ -425,11 +427,14 @@ def _extract_collection_from_git(repo_url, coll_ver, b_path):
|
|
|
425
427
|
|
|
426
428
|
# Perform a shallow clone if simply cloning HEAD
|
|
427
429
|
if version == 'HEAD':
|
|
428
|
-
git_clone_cmd = git_executable, 'clone', '--depth=1', git_url, to_text(b_checkout_path)
|
|
430
|
+
git_clone_cmd = [git_executable, 'clone', '--depth=1', git_url, to_text(b_checkout_path)]
|
|
429
431
|
else:
|
|
430
|
-
git_clone_cmd = git_executable, 'clone', git_url, to_text(b_checkout_path)
|
|
432
|
+
git_clone_cmd = [git_executable, 'clone', git_url, to_text(b_checkout_path)]
|
|
431
433
|
# FIXME: '--branch', version
|
|
432
434
|
|
|
435
|
+
if context.CLIARGS['ignore_certs'] or C.GALAXY_IGNORE_CERTS:
|
|
436
|
+
git_clone_cmd.extend(['-c', 'http.sslVerify=false'])
|
|
437
|
+
|
|
433
438
|
try:
|
|
434
439
|
subprocess.check_call(git_clone_cmd)
|
|
435
440
|
except subprocess.CalledProcessError as proc_err:
|
|
@@ -30,7 +30,7 @@ def get_uname(module, flags=('-v')):
|
|
|
30
30
|
|
|
31
31
|
def _file_exists(path, allow_empty=False):
|
|
32
32
|
# not finding the file, exit early
|
|
33
|
-
if not os.path.
|
|
33
|
+
if not os.path.isfile(path):
|
|
34
34
|
return False
|
|
35
35
|
|
|
36
36
|
# if just the path needs to exists (ie, it can be empty) we are done
|
|
@@ -48,7 +48,7 @@ def timeout(seconds=None, error_message="Timer expired"):
|
|
|
48
48
|
return res.get(timeout_value)
|
|
49
49
|
except multiprocessing.TimeoutError:
|
|
50
50
|
# This is an ansible.module_utils.common.facts.timeout.TimeoutError
|
|
51
|
-
raise TimeoutError('
|
|
51
|
+
raise TimeoutError(f'{error_message} after {timeout_value} seconds')
|
|
52
52
|
finally:
|
|
53
53
|
pool.terminate()
|
|
54
54
|
|
ansible/modules/debconf.py
CHANGED
|
@@ -134,21 +134,24 @@ def get_password_value(module, pkg, question, vtype):
|
|
|
134
134
|
cmd = [getsel]
|
|
135
135
|
rc, out, err = module.run_command(cmd)
|
|
136
136
|
if rc != 0:
|
|
137
|
-
module.fail_json(msg="Failed to get the value '
|
|
137
|
+
module.fail_json(msg=f"Failed to get the value '{question}' from '{pkg}': {err}")
|
|
138
138
|
|
|
139
|
-
desired_line = None
|
|
140
139
|
for line in out.split("\n"):
|
|
141
|
-
if line.startswith(pkg):
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
140
|
+
if not line.startswith(pkg):
|
|
141
|
+
continue
|
|
142
|
+
|
|
143
|
+
# line is a collection of tab separated values
|
|
144
|
+
fields = line.split('\t')
|
|
145
|
+
if len(fields) <= 3:
|
|
146
|
+
# No password found, return a blank password
|
|
147
|
+
return ''
|
|
148
|
+
try:
|
|
149
|
+
if fields[1] == question and fields[2] == vtype:
|
|
150
|
+
# If correct question and question type found, return password value
|
|
151
|
+
return fields[3]
|
|
152
|
+
except IndexError:
|
|
153
|
+
# Fail safe
|
|
154
|
+
return ''
|
|
152
155
|
|
|
153
156
|
|
|
154
157
|
def get_selections(module, pkg):
|
ansible/modules/dnf5.py
CHANGED
|
@@ -451,7 +451,15 @@ class Dnf5Module(YumDnf):
|
|
|
451
451
|
|
|
452
452
|
def fail_on_non_existing_plugins(self, base):
|
|
453
453
|
# https://github.com/rpm-software-management/dnf5/issues/1460
|
|
454
|
-
|
|
454
|
+
try:
|
|
455
|
+
plugin_names = [p.get_name() for p in base.get_plugins_info()]
|
|
456
|
+
except AttributeError:
|
|
457
|
+
# plugins functionality requires python3-libdnf5 5.2.0.0+
|
|
458
|
+
# silently ignore here, the module will fail later when
|
|
459
|
+
# base.enable_disable_plugins is attempted to be used if
|
|
460
|
+
# user specifies enable_plugin/disable_plugin
|
|
461
|
+
return
|
|
462
|
+
|
|
455
463
|
msg = []
|
|
456
464
|
if enable_unmatched := set(self.enable_plugin).difference(plugin_names):
|
|
457
465
|
msg.append(
|
ansible/modules/user.py
CHANGED
|
@@ -1220,9 +1220,11 @@ class User(object):
|
|
|
1220
1220
|
overwrite = None
|
|
1221
1221
|
try:
|
|
1222
1222
|
ssh_key_file = self.get_ssh_key_path()
|
|
1223
|
+
pub_file = f'{ssh_key_file}.pub'
|
|
1223
1224
|
except Exception as e:
|
|
1224
1225
|
return (1, '', to_native(e))
|
|
1225
1226
|
ssh_dir = os.path.dirname(ssh_key_file)
|
|
1227
|
+
|
|
1226
1228
|
if not os.path.exists(ssh_dir):
|
|
1227
1229
|
if self.module.check_mode:
|
|
1228
1230
|
return (0, '', '')
|
|
@@ -1231,12 +1233,23 @@ class User(object):
|
|
|
1231
1233
|
os.chown(ssh_dir, info[2], info[3])
|
|
1232
1234
|
except OSError as e:
|
|
1233
1235
|
return (1, '', 'Failed to create %s: %s' % (ssh_dir, to_native(e)))
|
|
1236
|
+
|
|
1234
1237
|
if os.path.exists(ssh_key_file):
|
|
1235
1238
|
if self.force:
|
|
1236
|
-
|
|
1239
|
+
self.module.warn(f'Overwriting existing ssh key private file "{ssh_key_file}"')
|
|
1237
1240
|
overwrite = 'y'
|
|
1238
1241
|
else:
|
|
1242
|
+
self.module.warn(f'Found existing ssh key private file "{ssh_key_file}", no force, so skipping ssh-keygen generation')
|
|
1239
1243
|
return (None, 'Key already exists, use "force: yes" to overwrite', '')
|
|
1244
|
+
|
|
1245
|
+
if os.path.exists(pub_file):
|
|
1246
|
+
if self.force:
|
|
1247
|
+
self.module.warn(f'Overwriting existing ssh key public file "{pub_file}"')
|
|
1248
|
+
os.unlink(pub_file)
|
|
1249
|
+
else:
|
|
1250
|
+
self.module.warn(f'Found existing ssh key public file "{pub_file}", no force, so skipping ssh-keygen generation')
|
|
1251
|
+
return (None, 'Public key already exists, use "force: yes" to overwrite', '')
|
|
1252
|
+
|
|
1240
1253
|
cmd = [self.module.get_bin_path('ssh-keygen', True)]
|
|
1241
1254
|
cmd.append('-t')
|
|
1242
1255
|
cmd.append(self.ssh_type)
|
|
@@ -1303,7 +1316,7 @@ class User(object):
|
|
|
1303
1316
|
# If the keys were successfully created, we should be able
|
|
1304
1317
|
# to tweak ownership.
|
|
1305
1318
|
os.chown(ssh_key_file, info[2], info[3])
|
|
1306
|
-
os.chown(
|
|
1319
|
+
os.chown(pub_file, info[2], info[3])
|
|
1307
1320
|
return (rc, out, err)
|
|
1308
1321
|
|
|
1309
1322
|
def ssh_key_fingerprint(self):
|
|
@@ -1375,7 +1388,9 @@ class User(object):
|
|
|
1375
1388
|
for d in dirs:
|
|
1376
1389
|
os.chown(os.path.join(root, d), uid, gid)
|
|
1377
1390
|
for f in files:
|
|
1378
|
-
os.
|
|
1391
|
+
full_path = os.path.join(root, f)
|
|
1392
|
+
if not os.path.islink(full_path):
|
|
1393
|
+
os.chown(full_path, uid, gid)
|
|
1379
1394
|
except OSError as e:
|
|
1380
1395
|
self.module.exit_json(failed=True, msg="%s" % to_native(e))
|
|
1381
1396
|
|
ansible/playbook/base.py
CHANGED
|
@@ -19,7 +19,7 @@ from ansible import context
|
|
|
19
19
|
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable, AnsibleAssertionError
|
|
20
20
|
from ansible.module_utils.six import string_types
|
|
21
21
|
from ansible.module_utils.parsing.convert_bool import boolean
|
|
22
|
-
from ansible.module_utils.common.text.converters import to_text
|
|
22
|
+
from ansible.module_utils.common.text.converters import to_text
|
|
23
23
|
from ansible.parsing.dataloader import DataLoader
|
|
24
24
|
from ansible.playbook.attribute import Attribute, FieldAttribute, ConnectionFieldAttribute, NonInheritableFieldAttribute
|
|
25
25
|
from ansible.plugins.loader import module_loader, action_loader
|
|
@@ -567,14 +567,14 @@ class FieldAttributeBase:
|
|
|
567
567
|
setattr(self, name, value)
|
|
568
568
|
except (TypeError, ValueError) as e:
|
|
569
569
|
value = getattr(self, name)
|
|
570
|
-
raise AnsibleParserError("the field '
|
|
571
|
-
|
|
570
|
+
raise AnsibleParserError(f"the field '{name}' has an invalid value ({value!r}), and could not be converted to {attribute.isa}.",
|
|
571
|
+
obj=self.get_ds(), orig_exc=e)
|
|
572
572
|
except (AnsibleUndefinedVariable, UndefinedError) as e:
|
|
573
573
|
if templar._fail_on_undefined_errors and name != 'name':
|
|
574
574
|
if name == 'args':
|
|
575
|
-
msg = "The task includes an option with an undefined variable.
|
|
575
|
+
msg = "The task includes an option with an undefined variable."
|
|
576
576
|
else:
|
|
577
|
-
msg = "The field '
|
|
577
|
+
msg = f"The field '{name}' has an invalid value, which includes an undefined variable."
|
|
578
578
|
raise AnsibleParserError(msg, obj=self.get_ds(), orig_exc=e)
|
|
579
579
|
|
|
580
580
|
self._finalized = True
|
ansible/plugins/action/dnf.py
CHANGED
|
@@ -41,6 +41,13 @@ class ActionModule(ActionBase):
|
|
|
41
41
|
facts = self._execute_module(
|
|
42
42
|
module_name="ansible.legacy.setup", module_args=dict(filter="ansible_pkg_mgr", gather_subset="!all"),
|
|
43
43
|
task_vars=task_vars)
|
|
44
|
+
|
|
45
|
+
if facts.get("failed", False):
|
|
46
|
+
raise AnsibleActionFail(
|
|
47
|
+
f"Failed to fetch ansible_pkg_mgr to determine the dnf action backend: {facts.get('msg')}",
|
|
48
|
+
result=facts,
|
|
49
|
+
)
|
|
50
|
+
|
|
44
51
|
display.debug("Facts %s" % facts)
|
|
45
52
|
module = facts.get("ansible_facts", {}).get("ansible_pkg_mgr", "auto")
|
|
46
53
|
if (not self._task.delegate_to or self._task.delegate_facts) and module != 'auto':
|
|
@@ -75,9 +82,4 @@ class ActionModule(ActionBase):
|
|
|
75
82
|
result.update(self._execute_module(
|
|
76
83
|
module_name=module, module_args=new_module_args, task_vars=task_vars, wrap_async=self._task.async_val))
|
|
77
84
|
|
|
78
|
-
# Cleanup
|
|
79
|
-
if not self._task.async_val:
|
|
80
|
-
# remove a temporary path we created
|
|
81
|
-
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
82
|
-
|
|
83
85
|
return result
|
|
@@ -237,7 +237,8 @@ class ActionModule(ActionBase):
|
|
|
237
237
|
b_data, show_content = self._loader._get_file_contents(filename)
|
|
238
238
|
data = to_text(b_data, errors='surrogate_or_strict')
|
|
239
239
|
|
|
240
|
-
self.show_content
|
|
240
|
+
self.show_content &= show_content # mask all results if any file was encrypted
|
|
241
|
+
|
|
241
242
|
data = self._loader.load(data, file_name=filename, show_content=show_content)
|
|
242
243
|
if not data:
|
|
243
244
|
data = dict()
|
|
@@ -68,6 +68,11 @@ class ActionModule(ActionBase):
|
|
|
68
68
|
module_args=dict(filter='ansible_pkg_mgr', gather_subset='!all'),
|
|
69
69
|
task_vars=task_vars,
|
|
70
70
|
)
|
|
71
|
+
if facts.get("failed", False):
|
|
72
|
+
raise AnsibleActionFail(
|
|
73
|
+
f"Failed to fetch ansible_pkg_mgr to determine the package action backend: {facts.get('msg')}",
|
|
74
|
+
result=facts,
|
|
75
|
+
)
|
|
71
76
|
pmgr = 'ansible_pkg_mgr'
|
|
72
77
|
|
|
73
78
|
try:
|
|
@@ -103,9 +108,5 @@ class ActionModule(ActionBase):
|
|
|
103
108
|
|
|
104
109
|
except AnsibleAction as e:
|
|
105
110
|
result.update(e.result)
|
|
106
|
-
finally:
|
|
107
|
-
if not self._task.async_val:
|
|
108
|
-
# remove a temporary path we created
|
|
109
|
-
self._remove_tmp_path(self._connection._shell.tmpdir)
|
|
110
111
|
|
|
111
112
|
return result
|
|
@@ -10,6 +10,13 @@ DOCUMENTATION:
|
|
|
10
10
|
description: A list.
|
|
11
11
|
type: list
|
|
12
12
|
required: true
|
|
13
|
+
case_sensitive:
|
|
14
|
+
description: Whether to consider case when comparing elements.
|
|
15
|
+
default: false
|
|
16
|
+
type: bool
|
|
17
|
+
attribute:
|
|
18
|
+
description: Filter objects with unique values for this attribute.
|
|
19
|
+
type: str
|
|
13
20
|
seealso:
|
|
14
21
|
- plugin_type: filter
|
|
15
22
|
plugin: ansible.builtin.difference
|
|
@@ -24,6 +31,27 @@ EXAMPLES: |
|
|
|
24
31
|
# list1: [1, 2, 5, 1, 3, 4, 10]
|
|
25
32
|
{{ list1 | unique }}
|
|
26
33
|
# => [1, 2, 5, 3, 4, 10]
|
|
34
|
+
|
|
35
|
+
# return case sensitive unique elements
|
|
36
|
+
{{ ['a', 'A', 'a'] | unique(case_sensitive='true') }}
|
|
37
|
+
# => ['a', 'A']
|
|
38
|
+
|
|
39
|
+
# return case insensitive unique elements
|
|
40
|
+
{{ ['b', 'B', 'b'] | unique() }}
|
|
41
|
+
# => ['b']
|
|
42
|
+
|
|
43
|
+
# return unique elements of list based on attribute
|
|
44
|
+
# => [{"age": 12, "name": "a" }, { "age": 14, "name": "b"}]
|
|
45
|
+
- debug:
|
|
46
|
+
msg: "{{ sample | unique(attribute='age') }}"
|
|
47
|
+
vars:
|
|
48
|
+
sample:
|
|
49
|
+
- name: a
|
|
50
|
+
age: 12
|
|
51
|
+
- name: b
|
|
52
|
+
age: 14
|
|
53
|
+
- name: c
|
|
54
|
+
age: 14
|
|
27
55
|
RETURN:
|
|
28
56
|
_value:
|
|
29
57
|
description: A list with unique elements, also known as a set.
|
|
@@ -926,6 +926,8 @@ class StrategyBase:
|
|
|
926
926
|
meta_action = task.args.get('_raw_params')
|
|
927
927
|
|
|
928
928
|
def _evaluate_conditional(h):
|
|
929
|
+
if not task.when:
|
|
930
|
+
return True
|
|
929
931
|
all_vars = self._variable_manager.get_vars(play=iterator._play, host=h, task=task,
|
|
930
932
|
_hosts=self._hosts_cache, _hosts_all=self._hosts_cache_all)
|
|
931
933
|
templar = Templar(loader=self._loader, variables=all_vars)
|
|
@@ -34,7 +34,6 @@ from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserErr
|
|
|
34
34
|
from ansible.module_utils.common.text.converters import to_text
|
|
35
35
|
from ansible.playbook.handler import Handler
|
|
36
36
|
from ansible.playbook.included_file import IncludedFile
|
|
37
|
-
from ansible.playbook.task import Task
|
|
38
37
|
from ansible.plugins.loader import action_loader
|
|
39
38
|
from ansible.plugins.strategy import StrategyBase
|
|
40
39
|
from ansible.template import Templar
|
|
@@ -51,12 +50,6 @@ class StrategyModule(StrategyBase):
|
|
|
51
50
|
be a noop task to keep the iterator in lock step across
|
|
52
51
|
all hosts.
|
|
53
52
|
'''
|
|
54
|
-
noop_task = Task()
|
|
55
|
-
noop_task.action = 'meta'
|
|
56
|
-
noop_task.args['_raw_params'] = 'noop'
|
|
57
|
-
noop_task.implicit = True
|
|
58
|
-
noop_task.set_loader(iterator._play._loader)
|
|
59
|
-
|
|
60
53
|
state_task_per_host = {}
|
|
61
54
|
for host in hosts:
|
|
62
55
|
state, task = iterator.get_next_task_for_host(host, peek=True)
|
|
@@ -64,7 +57,7 @@ class StrategyModule(StrategyBase):
|
|
|
64
57
|
state_task_per_host[host] = state, task
|
|
65
58
|
|
|
66
59
|
if not state_task_per_host:
|
|
67
|
-
return [
|
|
60
|
+
return []
|
|
68
61
|
|
|
69
62
|
task_uuids = {t._uuid for s, t in state_task_per_host.values()}
|
|
70
63
|
_loop_cnt = 0
|
|
@@ -90,8 +83,6 @@ class StrategyModule(StrategyBase):
|
|
|
90
83
|
if cur_task._uuid == task._uuid:
|
|
91
84
|
iterator.set_state_for_host(host.name, state)
|
|
92
85
|
host_tasks.append((host, task))
|
|
93
|
-
else:
|
|
94
|
-
host_tasks.append((host, noop_task))
|
|
95
86
|
|
|
96
87
|
if cur_task.action in C._ACTION_META and cur_task.args.get('_raw_params') == 'flush_handlers':
|
|
97
88
|
iterator.all_tasks[iterator.cur_task:iterator.cur_task] = [h for b in iterator._play.handlers for h in b.block]
|
|
@@ -133,9 +124,6 @@ class StrategyModule(StrategyBase):
|
|
|
133
124
|
|
|
134
125
|
results = []
|
|
135
126
|
for (host, task) in host_tasks:
|
|
136
|
-
if not task:
|
|
137
|
-
continue
|
|
138
|
-
|
|
139
127
|
if self._tqm._terminated:
|
|
140
128
|
break
|
|
141
129
|
|
ansible/release.py
CHANGED
ansible/utils/galaxy.py
CHANGED
|
@@ -64,7 +64,7 @@ def scm_archive_resource(src, scm='git', name=None, version='HEAD', keep_scm_met
|
|
|
64
64
|
clone_cmd = [scm_path, 'clone']
|
|
65
65
|
|
|
66
66
|
# Add specific options for ignoring certificates if requested
|
|
67
|
-
ignore_certs = context.CLIARGS['ignore_certs']
|
|
67
|
+
ignore_certs = context.CLIARGS['ignore_certs'] or C.GALAXY_IGNORE_CERTS
|
|
68
68
|
|
|
69
69
|
if ignore_certs:
|
|
70
70
|
if scm == 'git':
|
|
@@ -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=
|
|
6
|
+
ansible/release.py,sha256=gXhvjcTPfQX0uSeFezLYafifTwn4dkgfRceZe8lieM4,839
|
|
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
|
|
@@ -28,16 +28,16 @@ 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
30
|
ansible/config/manager.py,sha256=27_GXGb3SxX0Shqf5YtHvDSoycinzsDAjaPqwPsbY5o,29132
|
|
31
|
-
ansible/errors/__init__.py,sha256=
|
|
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
|
|
34
34
|
ansible/executor/action_write_locks.py,sha256=Up2n3cwFCr4T4IvttHpe3QOxRBF_9NgWJ1tFm9CHpfM,1915
|
|
35
35
|
ansible/executor/interpreter_discovery.py,sha256=z0ekwq9rND1wAZChHOYNfav7ycTvnkgVFPEek8aXj-I,9975
|
|
36
36
|
ansible/executor/module_common.py,sha256=4pVfjMgCle9ttAZTeuwSx3Kdi0rljagyHC11i4VnCl4,65755
|
|
37
|
-
ansible/executor/play_iterator.py,sha256=
|
|
37
|
+
ansible/executor/play_iterator.py,sha256=Oazd9aWy4zB67uy27sYg4BveFx_Uf_tIsbhD76hMc28,32496
|
|
38
38
|
ansible/executor/playbook_executor.py,sha256=qurZBiWjAWWRYcHb3ti4sBI8_WotOYvTRDar4JC3leE,14764
|
|
39
39
|
ansible/executor/stats.py,sha256=gcBhJQrZTgE95737d6lArJ3FpTlbAfVt6GMhEqs5ZPU,3180
|
|
40
|
-
ansible/executor/task_executor.py,sha256=
|
|
40
|
+
ansible/executor/task_executor.py,sha256=1kc49j7Iwf2UZm4DuSwgihJ51Wzuey2vcQZlBwWeGK4,61280
|
|
41
41
|
ansible/executor/task_queue_manager.py,sha256=fC404XkveICb7hRwIVu4PvRNgFkFLCNihsGsUDHVFzg,18640
|
|
42
42
|
ansible/executor/task_result.py,sha256=48zZWpxCiM0Z_MVG9zGQGCxHLNzs1horT68Qmfa-v_8,5696
|
|
43
43
|
ansible/executor/discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -61,7 +61,7 @@ ansible/galaxy/role.py,sha256=jTIXiyhgFq25vWnVU18LoWIzUdhqHSArKTvYC9uGFRg,21132
|
|
|
61
61
|
ansible/galaxy/token.py,sha256=U6U4-jcsjZKdD4iuALGh3AQPc81N3_fhqfSpRwUOAJY,6573
|
|
62
62
|
ansible/galaxy/user_agent.py,sha256=_Vr4ZJV8HNXhSbhw_dvUr378OjFdyhtLRHyywCjGU6g,760
|
|
63
63
|
ansible/galaxy/collection/__init__.py,sha256=sWIZ6agsjWptmmlS4ZAsgKu3jZTynSfHlvwZeJ26qOs,79010
|
|
64
|
-
ansible/galaxy/collection/concrete_artifact_manager.py,sha256=
|
|
64
|
+
ansible/galaxy/collection/concrete_artifact_manager.py,sha256=tOnqzBVdFatkTN44tifEPsCIZGwfieN5G1bjTEIX9M0,29476
|
|
65
65
|
ansible/galaxy/collection/galaxy_api_proxy.py,sha256=ir_JnTxH5CTvmgnswPkaqbEgMEgaZzW3F11t_NrhWsc,7805
|
|
66
66
|
ansible/galaxy/collection/gpg.py,sha256=m4_AtZPZyM_D72ARZqAKa-Her9XWICb4ie6KcEh52M8,7540
|
|
67
67
|
ansible/galaxy/data/COPYING,sha256=vy2E-bFAhZlTU_NCyMSIACNWl7yJSECGdWrRncQ1NWs,1005
|
|
@@ -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=
|
|
144
|
+
ansible/module_utils/ansible_release.py,sha256=gXhvjcTPfQX0uSeFezLYafifTwn4dkgfRceZe8lieM4,839
|
|
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
|
|
@@ -200,7 +200,7 @@ ansible/module_utils/facts/default_collectors.py,sha256=iKefVeINbQuhXok28HxuT-MN
|
|
|
200
200
|
ansible/module_utils/facts/namespace.py,sha256=EAzWToQ7tP54GodzmFdtEvzyQrc-2deWhOUQ5lGsoCk,2313
|
|
201
201
|
ansible/module_utils/facts/packages.py,sha256=V_95aIcw3ZavcVxNCRaqcLY6Rv2gYG3l0RZagIh6Apg,4410
|
|
202
202
|
ansible/module_utils/facts/sysctl.py,sha256=5G3MFADNgY-KvmFJLtCOXMVqnUYFBLZm9WTv6YS6i5I,2035
|
|
203
|
-
ansible/module_utils/facts/timeout.py,sha256=
|
|
203
|
+
ansible/module_utils/facts/timeout.py,sha256=rGOnkMaLIvrCDKfCJeQ8ref9jah4tsDzd24KZ-BFPS8,2453
|
|
204
204
|
ansible/module_utils/facts/utils.py,sha256=cKka93JV5LdMQ_Uec77p7DzyPfSBhitX1AfR0m5v7Dk,3419
|
|
205
205
|
ansible/module_utils/facts/hardware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
206
206
|
ansible/module_utils/facts/hardware/aix.py,sha256=r9rb_Qz-dPYDeZDDo49gqHQrf6HumHLnxZI6CkGgVxA,10681
|
|
@@ -239,7 +239,7 @@ ansible/module_utils/facts/system/caps.py,sha256=ymoLYx8RFh75dX4ODEcd5aGcpQhYcWj
|
|
|
239
239
|
ansible/module_utils/facts/system/chroot.py,sha256=KBBOXOZOAvsXLCAYiD24k2vKv8x-vRPYHAFH8Km-bdQ,1517
|
|
240
240
|
ansible/module_utils/facts/system/cmdline.py,sha256=rStcOy2NX5as62oRlwU-OS0QGWC-a1iDLJNJwuDmFWk,2637
|
|
241
241
|
ansible/module_utils/facts/system/date_time.py,sha256=oDeUy493BIQzp3JVBkoD1DHtu_m-oTWKdxcR4C_db-Q,3125
|
|
242
|
-
ansible/module_utils/facts/system/distribution.py,sha256=
|
|
242
|
+
ansible/module_utils/facts/system/distribution.py,sha256=fJZ6xM5vj1xxYF0wPiGLGXj8pOrqYclwJoPFTccd16k,32759
|
|
243
243
|
ansible/module_utils/facts/system/dns.py,sha256=_UaIcGLEaSt5Dd51O-JTR82ST1exgTm_DppCaZJnhSc,2692
|
|
244
244
|
ansible/module_utils/facts/system/env.py,sha256=LPPTxo46aaf30o-uMGetD19v6XWsaPJJgGWwxijn2rc,1185
|
|
245
245
|
ansible/module_utils/facts/system/fips.py,sha256=g9gbq_bHg25kbvRLewOn1boxXsb5newi_Hhj-D2KZv4,1353
|
|
@@ -293,10 +293,10 @@ ansible/modules/command.py,sha256=dxhIvyeOwQG_SkVSHN0h652z6a3sTAR532HB_zwM4hc,13
|
|
|
293
293
|
ansible/modules/copy.py,sha256=2A1rh9Mpl8oFgTeS7xmVSUZ1v920I60jMEgrkwfBwyg,32106
|
|
294
294
|
ansible/modules/cron.py,sha256=qR5ePdI3GZQeBSCn9YqxTxWlNEblCaTFnBRZqLjtnPo,26353
|
|
295
295
|
ansible/modules/deb822_repository.py,sha256=SLJM8bBLc70WYu3-OA67wd5hMft3pznYAMIidYOtmUU,15791
|
|
296
|
-
ansible/modules/debconf.py,sha256=
|
|
296
|
+
ansible/modules/debconf.py,sha256=Y49U5pM6UpKvYAvDbOhYe6kmQFAaxjl7YoYnPrOaGGU,9362
|
|
297
297
|
ansible/modules/debug.py,sha256=BFbzrU_vl-Try5DuLV20_sLgqxEJlPV9uOrgAtby2e8,2908
|
|
298
298
|
ansible/modules/dnf.py,sha256=rsb28kjMMnTu-rPW0Pdnbs2RPyvfdhWgXeUORUSgzEI,52288
|
|
299
|
-
ansible/modules/dnf5.py,sha256=
|
|
299
|
+
ansible/modules/dnf5.py,sha256=9nM6v8C4icI0vQ_5HIpmCY_XtYPOGHUhBwKabt7pz2Q,28230
|
|
300
300
|
ansible/modules/dpkg_selections.py,sha256=lTWBhmVFrf6PsV4_BoR23wVTJOloCH1YNPcAn0m7DTY,2805
|
|
301
301
|
ansible/modules/expect.py,sha256=O4emRoJ09i3OLmVX5j84WHkGKWg6bMytYpZlExOrSmc,9369
|
|
302
302
|
ansible/modules/fail.py,sha256=95z8jFyVaizwwupSce04kj1wwnOmbM0ooUX7mXluoyU,1659
|
|
@@ -347,7 +347,7 @@ ansible/modules/tempfile.py,sha256=lA9e8lyFXf9J5ud0R6Jkt8sIFyRcOwzhc9Jz-5_HOZQ,3
|
|
|
347
347
|
ansible/modules/template.py,sha256=D1sm36GB_mEimH0CfWq1cJ4w1eRvpcsHwZ-ufVzC_Gs,4537
|
|
348
348
|
ansible/modules/unarchive.py,sha256=wdSOFKhZqbAFq5j_tBZtUSamfr_EEW6_cTZDw-erMjs,45405
|
|
349
349
|
ansible/modules/uri.py,sha256=rhybLSwlciwEvTbxTOvgRTZgdrCrmPaLSfoSdiIu0Xo,28390
|
|
350
|
-
ansible/modules/user.py,sha256=
|
|
350
|
+
ansible/modules/user.py,sha256=w0RVtz89EA2JpAhwav_J-2mGFKnEfW7MxCTKeug-r14,123301
|
|
351
351
|
ansible/modules/validate_argument_spec.py,sha256=XbWlUr4ElgLfdxo3qCN7M-IES_X2iTl3AgawzCOMQpo,3042
|
|
352
352
|
ansible/modules/wait_for.py,sha256=VXFFcYG88EJVXnrJfa0fzh9rD_2luSty__qdzRuTAQE,27322
|
|
353
353
|
ansible/modules/wait_for_connection.py,sha256=8ySz5bhK7LGSaT_7Jzk3jvACcnngyR2g_ziyFLKk6Rk,3367
|
|
@@ -371,7 +371,7 @@ ansible/parsing/yaml/loader.py,sha256=S3sAX3n2e62yPf0vioedaH5Zxn0Yhypnzh2H2dowte
|
|
|
371
371
|
ansible/parsing/yaml/objects.py,sha256=PQHwPCp-K6-Ad_ytO8NCzogowCFodYd4i5Id_GbIM5o,10456
|
|
372
372
|
ansible/playbook/__init__.py,sha256=Gm8oIkn9z9zSBLYXVJiPcXnfLjk1lJXuHP3vRJdQF5U,4740
|
|
373
373
|
ansible/playbook/attribute.py,sha256=dMrZEhRqwZPU2TbWnEtO3_9tglbO3CEidbVjd7YgluQ,7649
|
|
374
|
-
ansible/playbook/base.py,sha256=
|
|
374
|
+
ansible/playbook/base.py,sha256=t_A35l6DLJmJHqAUm1SDFh1_JISaEwD3R8XDur7_y4w,33522
|
|
375
375
|
ansible/playbook/block.py,sha256=ZQgbwzqh6QcxKbjQkWtVII-kSiWeAMPlIh_U75H-TD0,16515
|
|
376
376
|
ansible/playbook/collectionsearch.py,sha256=tJN4E9m8dRc_6UNki21htiitiVOMj8T4GR1RCArRMqI,2601
|
|
377
377
|
ansible/playbook/conditional.py,sha256=yqv1fjQEr01myNW7lejWKfCl496IEtvsIUoJ3-eU_XU,4882
|
|
@@ -405,14 +405,14 @@ ansible/plugins/action/async_status.py,sha256=Cv6dLt94Z6YIPZpPIDhS_yC7yqKtT13HyD
|
|
|
405
405
|
ansible/plugins/action/command.py,sha256=N09Vf2QypBMZ6NSptQGbf6EAN-kfqLCROGPkOSgV3SY,1069
|
|
406
406
|
ansible/plugins/action/copy.py,sha256=5gEcEtSkZ3FXljZY9lldsS_g6e1DgAyEXTgHjNnlvn0,27446
|
|
407
407
|
ansible/plugins/action/debug.py,sha256=vPmHIfMAbuqpHb2aq0QS7M_g7Fu5pFTwMoYjCKCAa2E,3472
|
|
408
|
-
ansible/plugins/action/dnf.py,sha256=
|
|
408
|
+
ansible/plugins/action/dnf.py,sha256=N10UXOlFgqzwQgoQfzlqpXIAgHB69OZvfwoC-m2-geM,3667
|
|
409
409
|
ansible/plugins/action/fail.py,sha256=_1JuS0Z8Y8EB4FKG1u7KdP6xMuLobRHJsmtzmvN2CkU,1457
|
|
410
410
|
ansible/plugins/action/fetch.py,sha256=cQAmUWEGMDjfVfHGviNtsT4i06rnoubL3EgrOlUZbLw,10188
|
|
411
411
|
ansible/plugins/action/gather_facts.py,sha256=JFkrn3_78A7eUw0I3DsfUoe3Pu3wVLkhLUiOJ7Oyk0A,7863
|
|
412
412
|
ansible/plugins/action/group_by.py,sha256=97d4TF9o7vS5y0s1HfGgvh70l2gkQ2uUGxy0knlok5Y,1894
|
|
413
|
-
ansible/plugins/action/include_vars.py,sha256=
|
|
413
|
+
ansible/plugins/action/include_vars.py,sha256=_xPrP_BeGqbhvpJYQFDUkREL9UzZ6Y4q_AnCshvsn1A,11573
|
|
414
414
|
ansible/plugins/action/normal.py,sha256=cCHrZ3z2kB_wnnSNkmJHJWcJNRgdoxnLUNeHex-P8DE,1854
|
|
415
|
-
ansible/plugins/action/package.py,sha256=
|
|
415
|
+
ansible/plugins/action/package.py,sha256=UWk7T-hG6GoqixgUzz1iDT16hUQ2-bM26IZ-w52xoS4,5014
|
|
416
416
|
ansible/plugins/action/pause.py,sha256=A_U8FhGeFdaOXUadEM-Mv42v9lwsjnxPOE7ExvEfl1s,5674
|
|
417
417
|
ansible/plugins/action/raw.py,sha256=4kmANddcBwXFRhu8zIwBu392QE-p7WReO4DWD1YDnGU,1762
|
|
418
418
|
ansible/plugins/action/reboot.py,sha256=EFTn8KtawFI4E38COh55_ygDe0vkpI_vMdHDNBKB5ao,22032
|
|
@@ -530,7 +530,7 @@ ansible/plugins/filter/to_uuid.yml,sha256=bUQBkaXfpLXVmF6RbGG12FI7RNO01bWjIPhhdz
|
|
|
530
530
|
ansible/plugins/filter/to_yaml.yml,sha256=F4f1WmvPNrBtgG7JzrvW7WNP-uml_f_tAj7RXITSPtM,1672
|
|
531
531
|
ansible/plugins/filter/type_debug.yml,sha256=xrs13AsR9lV9hRmqsUg4U6zApJpYGCMspUI3or2AdYk,508
|
|
532
532
|
ansible/plugins/filter/union.yml,sha256=qBIbwRisbsImGixrLj6YDYXJSUGziZkjt_4aJsbhcj0,1018
|
|
533
|
-
ansible/plugins/filter/unique.yml,sha256=
|
|
533
|
+
ansible/plugins/filter/unique.yml,sha256=aip4HWd5ZCgg7wYFB6CUqLK0ldrY7qd2Wb_MlTtee3M,1592
|
|
534
534
|
ansible/plugins/filter/unvault.yml,sha256=GBpNWkLs5sg66PHmrEAR_NsMphuxsWm8dgeVUchbZPI,1069
|
|
535
535
|
ansible/plugins/filter/urldecode.yml,sha256=zPEvZ6HGc59figLfFMJHISqKCgR1ymdsNYe_nZjTJ_k,716
|
|
536
536
|
ansible/plugins/filter/urls.py,sha256=b2Zmy1iQuDc4ybU4QqRRAw2HL5xeG5D2kQrT2bybiPM,457
|
|
@@ -583,11 +583,11 @@ ansible/plugins/shell/__init__.py,sha256=8pc3ab91OGbnvzk3oQ-sU8uXMXNoNbjtdCbdXmZ
|
|
|
583
583
|
ansible/plugins/shell/cmd.py,sha256=kPCSKrJJFH5XTkmteEI3P1Da6WfPSXxDnV39VFpgD-A,2170
|
|
584
584
|
ansible/plugins/shell/powershell.py,sha256=-AR5n5Yr2HPM-V5ogAwvLeLehfc1XrrhqmX85ZtXHFU,13134
|
|
585
585
|
ansible/plugins/shell/sh.py,sha256=wblaY2EGdA2O00gNuTVZVgVV08RH0e_g4V_AkE50Iws,3884
|
|
586
|
-
ansible/plugins/strategy/__init__.py,sha256=
|
|
586
|
+
ansible/plugins/strategy/__init__.py,sha256=v-aMyfOUmBSULxmtqxwMCb8Uu_VKdM6XcpAtepAkKG4,57493
|
|
587
587
|
ansible/plugins/strategy/debug.py,sha256=yMmfT-lQHfR2y9bQcqrSPzqHuWZMo7V9y4ZWOXoboRE,1205
|
|
588
588
|
ansible/plugins/strategy/free.py,sha256=WNrpfg2B8fVcYC5qvBhn4uEH0Cc1-UmFzBH6Hhs3u_I,16728
|
|
589
589
|
ansible/plugins/strategy/host_pinned.py,sha256=GrDDQCtohmmJn3t9VOPb0lUZK_nUWy0s__z5Tq_rHfI,1875
|
|
590
|
-
ansible/plugins/strategy/linear.py,sha256=
|
|
590
|
+
ansible/plugins/strategy/linear.py,sha256=syZPVmCr2hlHBAzdpUtoajIz4Zs3ycXzcvlUGyQl5_0,17997
|
|
591
591
|
ansible/plugins/terminal/__init__.py,sha256=EqeJpMokRzuUMO66yYErPSyninjqNX0_5r55CEkTc4o,4420
|
|
592
592
|
ansible/plugins/test/__init__.py,sha256=m-XTUgWU-qSLJoZvHN3A85igElMjhaBJrzCTDrU7zhs,418
|
|
593
593
|
ansible/plugins/test/abs.yml,sha256=lZA0XP1oBNg___Du6SqNOkDeQC9xIcZpROYV5XJG9bg,764
|
|
@@ -657,7 +657,7 @@ ansible/utils/context_objects.py,sha256=vYulSJkzR3zxsQF_6_AqbPCCMy8WGC5dSqLFXJZq
|
|
|
657
657
|
ansible/utils/display.py,sha256=PlgOUgJRZAcbV4rXtHQaLZcgql5wmaDammItkWs4oPU,32856
|
|
658
658
|
ansible/utils/encrypt.py,sha256=MU0teLATt7qtTwk-y809H5HApafSl2QMW1INWIUL3T4,7221
|
|
659
659
|
ansible/utils/fqcn.py,sha256=Jx5SwYzlbMZ-SlkjyKkM4pCe5jIyXeeo62BU1msUunU,1215
|
|
660
|
-
ansible/utils/galaxy.py,sha256=
|
|
660
|
+
ansible/utils/galaxy.py,sha256=Un3XgXhx8FoC6tkp1cZ33rmiAaRg634exKruwOVhtdQ,3855
|
|
661
661
|
ansible/utils/hashing.py,sha256=RKJSXjZ5dgnTdqC4NOqOKYm_r7F4vw5ToW9YgxIt8QU,2837
|
|
662
662
|
ansible/utils/helpers.py,sha256=GECErEAio6-mOcUrMtPWRvegTNfCBToBdmHXrGXYBbc,1759
|
|
663
663
|
ansible/utils/jsonrpc.py,sha256=NyVItx9-ppCCsnn856VGoeSeRdu--e8ieZ6WzrD-4CI,3806
|
|
@@ -690,7 +690,7 @@ ansible/vars/reserved.py,sha256=kZiQMPvaFin35006gLwDpX16w-9xlu6EaL4LSTKP40U,2531
|
|
|
690
690
|
ansible_test/__init__.py,sha256=20VPOj11c6Ut1Av9RaurgwJvFhMqkWG3vAvcCbecNKw,66
|
|
691
691
|
ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
692
692
|
ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
693
|
-
ansible_test/_data/completion/docker.txt,sha256=
|
|
693
|
+
ansible_test/_data/completion/docker.txt,sha256=Z5pvUK4XUkJV5qBW8QuBPk8BzuEnvYFQU7W_ULwycGE,648
|
|
694
694
|
ansible_test/_data/completion/network.txt,sha256=BxVN0UxlVkRUrPi9MBArQOe6nR8exaow0oCAznUdfKQ,100
|
|
695
695
|
ansible_test/_data/completion/remote.txt,sha256=qnV9FcKHL9hETVB3iVMoSX_Lo560bN_9MrpAMotuxV4,921
|
|
696
696
|
ansible_test/_data/completion/windows.txt,sha256=T67veSrF2tqHC1W6Ddsq3LCBwMCBUmp9LoZBy1QlXOo,238
|
|
@@ -725,7 +725,7 @@ ansible_test/_data/requirements/sanity.pep8.in,sha256=rHbIEiXmvsJ016mFcLVcF_d-dK
|
|
|
725
725
|
ansible_test/_data/requirements/sanity.pep8.txt,sha256=oH7ycSz_RCrlX0J7_Y0GHn8P3g76rlkdxVmq4jmRwY4,113
|
|
726
726
|
ansible_test/_data/requirements/sanity.pslint.ps1,sha256=JoDUUNLXQ4xDXUB5_W00q9o-gZ1oW1oShLp--f5OEIE,1624
|
|
727
727
|
ansible_test/_data/requirements/sanity.pylint.in,sha256=CqgyF_s4K3o41RSc6KZVicBlhrb4twRm9zbp-HBwFeE,49
|
|
728
|
-
ansible_test/_data/requirements/sanity.pylint.txt,sha256=
|
|
728
|
+
ansible_test/_data/requirements/sanity.pylint.txt,sha256=HoN0oqhHfFAWFNRf0dVAW9D30dBd4ebuPJGAJ-WwPmk,216
|
|
729
729
|
ansible_test/_data/requirements/sanity.runtime-metadata.in,sha256=QzOCB5QxVHYuXHXQvkUsa5MwRQzPhI-ZDD-M2htj36s,18
|
|
730
730
|
ansible_test/_data/requirements/sanity.runtime-metadata.txt,sha256=ZTrFKxqX5TCmxWv-jXBz1S0RpOOfIyGmUsNNA9AdQ9A,150
|
|
731
731
|
ansible_test/_data/requirements/sanity.validate-modules.in,sha256=OVQi9h1QurdF-wa3-TkBuztXIs-QnyY2g8iYtOpo2cw,117
|
|
@@ -751,8 +751,8 @@ ansible_test/_internal/coverage_util.py,sha256=_SPR0sqkgPoGw2bzuRS5gr4XOyIU8MQ4a
|
|
|
751
751
|
ansible_test/_internal/data.py,sha256=OFDpRa47yqBqQO1aSvTZVQQpScHvBHsr861586MQEUI,11184
|
|
752
752
|
ansible_test/_internal/delegation.py,sha256=D8hluDQf_YN3DtVG_8HW0iumRBY3gjp_zP-rlc3VNY4,13418
|
|
753
753
|
ansible_test/_internal/diff.py,sha256=qfzSL7BtoW7bLLgzF0-m--jthVDpUQSr9aBw1fCMIHk,7310
|
|
754
|
-
ansible_test/_internal/docker_util.py,sha256=
|
|
755
|
-
ansible_test/_internal/encoding.py,sha256=
|
|
754
|
+
ansible_test/_internal/docker_util.py,sha256=laK-q6qdKYBuOO5oVpgfBiD_XJzCpmgFC68YAYCiBHQ,38220
|
|
755
|
+
ansible_test/_internal/encoding.py,sha256=4GAcVhcswUJW77XSBTLRIP7ll6kT9J-yIBtVsFXiw2g,1379
|
|
756
756
|
ansible_test/_internal/executor.py,sha256=KW5yI-f-giErQ077MTj707fTtFkf_Kr8IV_Nr36NNmc,2959
|
|
757
757
|
ansible_test/_internal/git.py,sha256=njtciWq2DlzZ1DAkQi08HRRP-TgH0mgeGZsWcsJGctI,4366
|
|
758
758
|
ansible_test/_internal/host_configs.py,sha256=ElAo2t3kSyb7bShqBENiHH0oEe-8Am8JXG9xY5l7HY4,18634
|
|
@@ -773,7 +773,7 @@ ansible_test/_internal/target.py,sha256=Whtb_n0jn4zbiMmX7je5jewgzsRczfXRm_ndYtjT
|
|
|
773
773
|
ansible_test/_internal/test.py,sha256=znQmGjKACqDU8T0EAPqcv2qyy0J7M2w4OmyYhwHLqT0,14515
|
|
774
774
|
ansible_test/_internal/thread.py,sha256=WQoZ2q2ljmEkKHRDkIqwxW7eZbkCKDrG3YZfcaxHzHw,2596
|
|
775
775
|
ansible_test/_internal/timeout.py,sha256=X8LxoMSU85lw4MszfEljaG6V7Aff4Btveg3r89Fe25U,4052
|
|
776
|
-
ansible_test/_internal/util.py,sha256=
|
|
776
|
+
ansible_test/_internal/util.py,sha256=iv1RD99PvhMixH0wxinwqkaM0POv-zrVxwbkbruHEDI,38868
|
|
777
777
|
ansible_test/_internal/util_common.py,sha256=wSygjQRWlkFNpqQnPSSXnz_3Cr0pWrPvCP-6lMdfuAk,17490
|
|
778
778
|
ansible_test/_internal/venv.py,sha256=k7L9_Ocpsdwp4kQFLF59BVguymd2nqJ-bLHH1NlMET0,5521
|
|
779
779
|
ansible_test/_internal/ci/__init__.py,sha256=QOaC_8_wUzqFEbsFCXYAnElWoUo6gB40CXvP9RJ-Iyo,7738
|
|
@@ -925,13 +925,13 @@ ansible_test/_util/controller/sanity/integration-aliases/yaml_to_json.py,sha256=
|
|
|
925
925
|
ansible_test/_util/controller/sanity/pep8/current-ignore.txt,sha256=9VSaFOsdxN4_8GJVhnmpl5kXos2TPU3M08eC_NRI2Ks,196
|
|
926
926
|
ansible_test/_util/controller/sanity/pslint/pslint.ps1,sha256=h0fLdkwF7JhGGjApvqAsCU87BKy0E_UiFJ_O7MARz6U,1089
|
|
927
927
|
ansible_test/_util/controller/sanity/pslint/settings.psd1,sha256=QJnOH39HTVkJbPhhVo29olmQ_ftvzYpNa8uQ-figgws,1869
|
|
928
|
-
ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg,sha256=
|
|
929
|
-
ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg,sha256=
|
|
930
|
-
ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg,sha256=
|
|
931
|
-
ansible_test/_util/controller/sanity/pylint/config/collection.cfg,sha256=
|
|
932
|
-
ansible_test/_util/controller/sanity/pylint/config/default.cfg,sha256=
|
|
928
|
+
ansible_test/_util/controller/sanity/pylint/config/ansible-test-target.cfg,sha256=D-p9gji_fJQRiWiI4Hxm5xoPbt4L9WKa3oj0J0naBPQ,2036
|
|
929
|
+
ansible_test/_util/controller/sanity/pylint/config/ansible-test.cfg,sha256=awNl5xOX76hgqu4B7rIZZ4rkIfVN7I3ultwsRpnHtRs,2100
|
|
930
|
+
ansible_test/_util/controller/sanity/pylint/config/code-smell.cfg,sha256=iZUVNd9h0GOQcaqpvaHBrjRdsKzSgIwqZrxsanqPFyY,1872
|
|
931
|
+
ansible_test/_util/controller/sanity/pylint/config/collection.cfg,sha256=s6Ls4YnyMXzNOGWcTnUM1Zh03kL8EgSC-w5yjyw53mw,4680
|
|
932
|
+
ansible_test/_util/controller/sanity/pylint/config/default.cfg,sha256=xW5e7oIxI1gl1gHw7NUV2I3VZJ99x4v-IHxa1YoD5qE,4186
|
|
933
933
|
ansible_test/_util/controller/sanity/pylint/plugins/deprecated.py,sha256=-tt6FknJaM_SjNKB0FXBofYsO8bESTLd1BlM199csxM,18008
|
|
934
|
-
ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py,sha256=
|
|
934
|
+
ansible_test/_util/controller/sanity/pylint/plugins/hide_unraisable.py,sha256=Fua0oKX3ONMELx4UrmWDJOx-KBP9ZkvuSq-EgqHedtE,835
|
|
935
935
|
ansible_test/_util/controller/sanity/pylint/plugins/string_format.py,sha256=hAX_9P0VR5ngilRKxN5NOgS4vJmoeGCgLJ2mMI8IliA,2626
|
|
936
936
|
ansible_test/_util/controller/sanity/pylint/plugins/unwanted.py,sha256=9ZS9CiTARriKsHw807pO4Wp9FGg01xQqWJXwD9MeiJ8,9061
|
|
937
937
|
ansible_test/_util/controller/sanity/shellcheck/exclude.txt,sha256=8U3ZTe1A1YRCXUB1AIAIgcd33ejBhzelBPkVdOJnhj8,21
|
|
@@ -963,7 +963,7 @@ ansible_test/_util/target/setup/bootstrap.sh,sha256=QjJcNCUBRMeBaYwQtO1Ue8Om79AN
|
|
|
963
963
|
ansible_test/_util/target/setup/check_systemd_cgroup_v1.sh,sha256=Aq0T62x_KLtkGaWzYqWjvhchTqYFflrTbQET3h6xrT0,395
|
|
964
964
|
ansible_test/_util/target/setup/probe_cgroups.py,sha256=wUHvjW_GXpcyMGw308w26T09cOtBW5EU7i9WagGDQ7o,659
|
|
965
965
|
ansible_test/_util/target/setup/quiet_pip.py,sha256=d3bvh9k2XI_z8-vb3ZoI4lwL8LaFkwvjJE7PpApBlcw,1979
|
|
966
|
-
ansible_test/_util/target/setup/requirements.py,sha256=
|
|
966
|
+
ansible_test/_util/target/setup/requirements.py,sha256=PHiCVcdharSp0zKUMO1L_o7JWkRt871neWaXp35guws,13698
|
|
967
967
|
ansible_test/_util/target/tools/virtualenvcheck.py,sha256=GvSiTu41y9exgrGw_pfgB46XClxLOIv5S3tP7XDY50c,465
|
|
968
968
|
ansible_test/_util/target/tools/yamlcheck.py,sha256=3pUXIByD4lKdHmKgC8sKvPWiDGhan9lij6dCwPoFqEc,311
|
|
969
969
|
ansible_test/config/cloud-config-aws.ini.template,sha256=XRzB9pG9aRS_fxLMcOcbyb9NeUHpcTZVXvceIl2GNy8,1280
|
|
@@ -980,13 +980,13 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
|
|
|
980
980
|
ansible_test/config/config.yml,sha256=1zdGucnIl6nIecZA7ISIANvqXiHWqq6Dthsk_6MUwNc,2642
|
|
981
981
|
ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
|
|
982
982
|
ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
|
|
983
|
-
ansible_core-2.18.
|
|
984
|
-
ansible_core-2.18.
|
|
985
|
-
ansible_core-2.18.
|
|
986
|
-
ansible_core-2.18.
|
|
987
|
-
ansible_core-2.18.
|
|
988
|
-
ansible_core-2.18.
|
|
989
|
-
ansible_core-2.18.
|
|
990
|
-
ansible_core-2.18.
|
|
991
|
-
ansible_core-2.18.
|
|
992
|
-
ansible_core-2.18.
|
|
983
|
+
ansible_core-2.18.0rc2.dist-info/Apache-License.txt,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
|
|
984
|
+
ansible_core-2.18.0rc2.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
985
|
+
ansible_core-2.18.0rc2.dist-info/METADATA,sha256=yJz_cgLahyCU3CiI1tgxw-XLtVulnaw8B87804oNu_s,7674
|
|
986
|
+
ansible_core-2.18.0rc2.dist-info/MIT-license.txt,sha256=jLXp2XurnyZKbye40g9tfmLGtVlxh3pPD4n8xNqX8xc,1023
|
|
987
|
+
ansible_core-2.18.0rc2.dist-info/PSF-license.txt,sha256=g7BC_H1qyg8Q1o5F76Vrm8ChSWYI5-dyj-CdGlNKBUo,2484
|
|
988
|
+
ansible_core-2.18.0rc2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
|
989
|
+
ansible_core-2.18.0rc2.dist-info/entry_points.txt,sha256=S9yJij5Im6FgRQxzkqSCnPQokC7PcWrDW_NSygZczJU,451
|
|
990
|
+
ansible_core-2.18.0rc2.dist-info/simplified_bsd.txt,sha256=8R5R7R7sOa0h1Fi6RNgFgHowHBfun-OVOMzJ4rKAk2w,1237
|
|
991
|
+
ansible_core-2.18.0rc2.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
|
|
992
|
+
ansible_core-2.18.0rc2.dist-info/RECORD,,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
base image=quay.io/ansible/base-test-container:7.
|
|
2
|
-
default image=quay.io/ansible/default-test-container:10.
|
|
3
|
-
default image=quay.io/ansible/ansible-core-test-container:10.
|
|
1
|
+
base image=quay.io/ansible/base-test-container:7.7.0 python=3.13,3.8,3.9,3.10,3.11,3.12
|
|
2
|
+
default image=quay.io/ansible/default-test-container:10.9.0 python=3.13,3.8,3.9,3.10,3.11,3.12 context=collection
|
|
3
|
+
default image=quay.io/ansible/ansible-core-test-container:10.9.0 python=3.13,3.8,3.9,3.10,3.11,3.12 context=ansible-core
|
|
4
4
|
alpine320 image=quay.io/ansible/alpine320-test-container:8.1.0 python=3.12 cgroup=none audit=none
|
|
5
5
|
fedora40 image=quay.io/ansible/fedora40-test-container:8.1.0 python=3.12
|
|
6
6
|
ubuntu2204 image=quay.io/ansible/ubuntu2204-test-container:8.1.0 python=3.10
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# edit "sanity.pylint.in" and generate with: hacking/update-sanity-requirements.py --test pylint
|
|
2
|
-
astroid==3.
|
|
3
|
-
dill==0.3.
|
|
2
|
+
astroid==3.3.5
|
|
3
|
+
dill==0.3.9
|
|
4
4
|
isort==5.13.2
|
|
5
5
|
mccabe==0.7.0
|
|
6
|
-
platformdirs==4.3.
|
|
7
|
-
pylint==3.
|
|
6
|
+
platformdirs==4.3.6
|
|
7
|
+
pylint==3.3.1
|
|
8
8
|
PyYAML==6.0.2
|
|
9
9
|
tomlkit==0.13.2
|
|
@@ -20,6 +20,8 @@ from .util import (
|
|
|
20
20
|
SubprocessError,
|
|
21
21
|
cache,
|
|
22
22
|
OutputStream,
|
|
23
|
+
InternalError,
|
|
24
|
+
format_command_output,
|
|
23
25
|
)
|
|
24
26
|
|
|
25
27
|
from .util_common import (
|
|
@@ -300,7 +302,7 @@ def detect_host_properties(args: CommonConfig) -> ContainerHostProperties:
|
|
|
300
302
|
options = ['--volume', '/sys/fs/cgroup:/probe:ro']
|
|
301
303
|
cmd = ['sh', '-c', ' && echo "-" && '.join(multi_line_commands)]
|
|
302
304
|
|
|
303
|
-
stdout = run_utility_container(args, 'ansible-test-probe', cmd, options)
|
|
305
|
+
stdout, stderr = run_utility_container(args, 'ansible-test-probe', cmd, options)
|
|
304
306
|
|
|
305
307
|
if args.explain:
|
|
306
308
|
return ContainerHostProperties(
|
|
@@ -313,6 +315,12 @@ def detect_host_properties(args: CommonConfig) -> ContainerHostProperties:
|
|
|
313
315
|
|
|
314
316
|
blocks = stdout.split('\n-\n')
|
|
315
317
|
|
|
318
|
+
if len(blocks) != len(multi_line_commands):
|
|
319
|
+
message = f'Unexpected probe output. Expected {len(multi_line_commands)} blocks but found {len(blocks)}.\n'
|
|
320
|
+
message += format_command_output(stdout, stderr)
|
|
321
|
+
|
|
322
|
+
raise InternalError(message.strip())
|
|
323
|
+
|
|
316
324
|
values = blocks[0].split('\n')
|
|
317
325
|
|
|
318
326
|
audit_parts = values[0].split(' ', 1)
|
|
@@ -6,17 +6,17 @@ import typing as t
|
|
|
6
6
|
ENCODING = 'utf-8'
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
def to_optional_bytes(value: t.Optional[
|
|
9
|
+
def to_optional_bytes(value: t.Optional[str | bytes], errors: str = 'strict') -> t.Optional[bytes]:
|
|
10
10
|
"""Return the given value as bytes encoded using UTF-8 if not already bytes, or None if the value is None."""
|
|
11
11
|
return None if value is None else to_bytes(value, errors)
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def to_optional_text(value: t.Optional[
|
|
14
|
+
def to_optional_text(value: t.Optional[str | bytes], errors: str = 'strict') -> t.Optional[str]:
|
|
15
15
|
"""Return the given value as text decoded using UTF-8 if not already text, or None if the value is None."""
|
|
16
16
|
return None if value is None else to_text(value, errors)
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
def to_bytes(value:
|
|
19
|
+
def to_bytes(value: str | bytes, errors: str = 'strict') -> bytes:
|
|
20
20
|
"""Return the given value as bytes encoded using UTF-8 if not already bytes."""
|
|
21
21
|
if isinstance(value, bytes):
|
|
22
22
|
return value
|
|
@@ -27,7 +27,7 @@ def to_bytes(value: t.AnyStr, errors: str = 'strict') -> bytes:
|
|
|
27
27
|
raise Exception('value is not bytes or text: %s' % type(value))
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def to_text(value:
|
|
30
|
+
def to_text(value: str | bytes, errors: str = 'strict') -> str:
|
|
31
31
|
"""Return the given value as text decoded using UTF-8 if not already text."""
|
|
32
32
|
if isinstance(value, bytes):
|
|
33
33
|
return value.decode(ENCODING, errors)
|
ansible_test/_internal/util.py
CHANGED
|
@@ -970,14 +970,7 @@ class SubprocessError(ApplicationError):
|
|
|
970
970
|
error_callback: t.Optional[c.Callable[[SubprocessError], None]] = None,
|
|
971
971
|
) -> None:
|
|
972
972
|
message = 'Command "%s" returned exit status %s.\n' % (shlex.join(cmd), status)
|
|
973
|
-
|
|
974
|
-
if stderr:
|
|
975
|
-
message += '>>> Standard Error\n'
|
|
976
|
-
message += '%s%s\n' % (stderr.strip(), Display.clear)
|
|
977
|
-
|
|
978
|
-
if stdout:
|
|
979
|
-
message += '>>> Standard Output\n'
|
|
980
|
-
message += '%s%s\n' % (stdout.strip(), Display.clear)
|
|
973
|
+
message += format_command_output(stdout, stderr)
|
|
981
974
|
|
|
982
975
|
self.cmd = cmd
|
|
983
976
|
self.message = message
|
|
@@ -1021,6 +1014,21 @@ class HostConnectionError(ApplicationError):
|
|
|
1021
1014
|
self._callback()
|
|
1022
1015
|
|
|
1023
1016
|
|
|
1017
|
+
def format_command_output(stdout: str, stderr: str) -> str:
|
|
1018
|
+
"""Return a formatted string containing the given stdout and stderr (if any)."""
|
|
1019
|
+
message = ''
|
|
1020
|
+
|
|
1021
|
+
if stderr := stderr.strip():
|
|
1022
|
+
message += '>>> Standard Error\n'
|
|
1023
|
+
message += f'{stderr}{Display.clear}\n'
|
|
1024
|
+
|
|
1025
|
+
if stdout := stdout.strip():
|
|
1026
|
+
message += '>>> Standard Output\n'
|
|
1027
|
+
message += f'{stdout}{Display.clear}\n'
|
|
1028
|
+
|
|
1029
|
+
return message
|
|
1030
|
+
|
|
1031
|
+
|
|
1024
1032
|
def retry(func: t.Callable[..., TValue], ex_type: t.Type[BaseException] = SubprocessError, sleep: int = 10, attempts: int = 10, warn: bool = True) -> TValue:
|
|
1025
1033
|
"""Retry the specified function on failure."""
|
|
1026
1034
|
for dummy in range(1, attempts):
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
disable=
|
|
4
4
|
consider-using-f-string, # Python 2.x support still required
|
|
5
5
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
|
6
|
+
deprecated-argument, # results vary by Python version
|
|
7
|
+
deprecated-attribute, # results vary by Python version
|
|
8
|
+
deprecated-class, # results vary by Python version
|
|
9
|
+
deprecated-decorator, # results vary by Python version
|
|
6
10
|
deprecated-method, # results vary by Python version
|
|
7
11
|
deprecated-module, # results vary by Python version
|
|
8
12
|
duplicate-code, # consistent results require running with --jobs 1 and testing all files
|
|
@@ -20,6 +24,7 @@ disable=
|
|
|
20
24
|
too-many-nested-blocks,
|
|
21
25
|
too-many-return-statements,
|
|
22
26
|
too-many-statements,
|
|
27
|
+
too-many-positional-arguments,
|
|
23
28
|
use-dict-literal, # ignoring as a common style issue
|
|
24
29
|
useless-return, # complains about returning None when the return type is optional
|
|
25
30
|
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
disable=
|
|
4
4
|
consider-using-f-string, # many occurrences
|
|
5
5
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
|
6
|
+
deprecated-argument, # results vary by Python version
|
|
7
|
+
deprecated-attribute, # results vary by Python version
|
|
8
|
+
deprecated-class, # results vary by Python version
|
|
9
|
+
deprecated-decorator, # results vary by Python version
|
|
6
10
|
deprecated-method, # results vary by Python version
|
|
7
11
|
deprecated-module, # results vary by Python version
|
|
8
12
|
duplicate-code, # consistent results require running with --jobs 1 and testing all files
|
|
@@ -18,6 +22,7 @@ disable=
|
|
|
18
22
|
too-many-nested-blocks,
|
|
19
23
|
too-many-return-statements,
|
|
20
24
|
too-many-statements,
|
|
25
|
+
too-many-positional-arguments,
|
|
21
26
|
use-dict-literal, # ignoring as a common style issue
|
|
22
27
|
unspecified-encoding, # always run with UTF-8 encoding enforced
|
|
23
28
|
useless-return, # complains about returning None when the return type is optional
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
disable=
|
|
4
4
|
consider-using-f-string, # many occurrences
|
|
5
5
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
|
6
|
+
deprecated-argument, # results vary by Python version
|
|
7
|
+
deprecated-attribute, # results vary by Python version
|
|
8
|
+
deprecated-class, # results vary by Python version
|
|
9
|
+
deprecated-decorator, # results vary by Python version
|
|
6
10
|
deprecated-method, # results vary by Python version
|
|
7
11
|
deprecated-module, # results vary by Python version
|
|
8
12
|
duplicate-code, # consistent results require running with --jobs 1 and testing all files
|
|
@@ -17,6 +21,7 @@ disable=
|
|
|
17
21
|
too-many-nested-blocks,
|
|
18
22
|
too-many-return-statements,
|
|
19
23
|
too-many-statements,
|
|
24
|
+
too-many-positional-arguments,
|
|
20
25
|
use-dict-literal, # ignoring as a common style issue
|
|
21
26
|
unspecified-encoding, # always run with UTF-8 encoding enforced
|
|
22
27
|
useless-return, # complains about returning None when the return type is optional
|
|
@@ -30,7 +30,11 @@ disable=
|
|
|
30
30
|
consider-using-max-builtin,
|
|
31
31
|
consider-using-min-builtin,
|
|
32
32
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
|
33
|
+
deprecated-argument, # results vary by Python version
|
|
34
|
+
deprecated-attribute, # results vary by Python version
|
|
35
|
+
deprecated-class, # results vary by Python version
|
|
33
36
|
deprecated-comment, # custom plugin only used by ansible-core, not collections
|
|
37
|
+
deprecated-decorator, # results vary by Python version
|
|
34
38
|
deprecated-method, # results vary by Python version
|
|
35
39
|
deprecated-module, # results vary by Python version
|
|
36
40
|
duplicate-code, # consistent results require running with --jobs 1 and testing all files
|
|
@@ -98,6 +102,7 @@ disable=
|
|
|
98
102
|
too-many-public-methods,
|
|
99
103
|
too-many-return-statements,
|
|
100
104
|
too-many-statements,
|
|
105
|
+
too-many-positional-arguments,
|
|
101
106
|
try-except-raise,
|
|
102
107
|
unbalanced-tuple-unpacking,
|
|
103
108
|
undefined-loop-variable,
|
|
@@ -28,6 +28,10 @@ disable=
|
|
|
28
28
|
consider-using-max-builtin,
|
|
29
29
|
consider-using-min-builtin,
|
|
30
30
|
cyclic-import, # consistent results require running with --jobs 1 and testing all files
|
|
31
|
+
deprecated-argument, # results vary by Python version
|
|
32
|
+
deprecated-attribute, # results vary by Python version
|
|
33
|
+
deprecated-class, # results vary by Python version
|
|
34
|
+
deprecated-decorator, # results vary by Python version
|
|
31
35
|
deprecated-method, # results vary by Python version
|
|
32
36
|
deprecated-module, # results vary by Python version
|
|
33
37
|
duplicate-code, # consistent results require running with --jobs 1 and testing all files
|
|
@@ -91,6 +95,7 @@ disable=
|
|
|
91
95
|
too-many-public-methods,
|
|
92
96
|
too-many-return-statements,
|
|
93
97
|
too-many-statements,
|
|
98
|
+
too-many-positional-arguments,
|
|
94
99
|
try-except-raise,
|
|
95
100
|
unbalanced-tuple-unpacking,
|
|
96
101
|
undefined-loop-variable,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Temporary plugin to prevent stdout noise pollution from finalization of abandoned generators
|
|
1
|
+
"""Temporary plugin to prevent stdout noise pollution from finalization of abandoned generators."""
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
4
|
import sys
|
|
@@ -10,7 +10,7 @@ if t.TYPE_CHECKING:
|
|
|
10
10
|
|
|
11
11
|
def _mask_finalizer_valueerror(ur: t.Any) -> None:
|
|
12
12
|
"""Mask only ValueErrors from finalizing abandoned generators; delegate everything else"""
|
|
13
|
-
# work around
|
|
13
|
+
# work around Python finalizer issue that sometimes spews this error message to stdout
|
|
14
14
|
# see https://github.com/pylint-dev/pylint/issues/9138
|
|
15
15
|
if ur.exc_type is ValueError and 'generator already executing' in str(ur.exc_value):
|
|
16
16
|
return
|
|
@@ -20,5 +20,4 @@ def _mask_finalizer_valueerror(ur: t.Any) -> None:
|
|
|
20
20
|
|
|
21
21
|
def register(linter: PyLinter) -> None: # pylint: disable=unused-argument
|
|
22
22
|
"""PyLint plugin registration entrypoint"""
|
|
23
|
-
|
|
24
|
-
sys.unraisablehook = _mask_finalizer_valueerror
|
|
23
|
+
sys.unraisablehook = _mask_finalizer_valueerror
|
|
@@ -363,17 +363,17 @@ def open_binary_file(path, mode='rb'): # type: (str, str) -> t.IO[bytes]
|
|
|
363
363
|
return io.open(to_bytes(path), mode) # pylint: disable=consider-using-with,unspecified-encoding
|
|
364
364
|
|
|
365
365
|
|
|
366
|
-
def to_optional_bytes(value, errors='strict'): # type: (t.Optional[
|
|
366
|
+
def to_optional_bytes(value, errors='strict'): # type: (t.Optional[str | bytes], str) -> t.Optional[bytes]
|
|
367
367
|
"""Return the given value as bytes encoded using UTF-8 if not already bytes, or None if the value is None."""
|
|
368
368
|
return None if value is None else to_bytes(value, errors)
|
|
369
369
|
|
|
370
370
|
|
|
371
|
-
def to_optional_text(value, errors='strict'): # type: (t.Optional[
|
|
371
|
+
def to_optional_text(value, errors='strict'): # type: (t.Optional[str | bytes], str) -> t.Optional[t.Text]
|
|
372
372
|
"""Return the given value as text decoded using UTF-8 if not already text, or None if the value is None."""
|
|
373
373
|
return None if value is None else to_text(value, errors)
|
|
374
374
|
|
|
375
375
|
|
|
376
|
-
def to_bytes(value, errors='strict'): # type: (
|
|
376
|
+
def to_bytes(value, errors='strict'): # type: (str | bytes, str) -> bytes
|
|
377
377
|
"""Return the given value as bytes encoded using UTF-8 if not already bytes."""
|
|
378
378
|
if isinstance(value, bytes):
|
|
379
379
|
return value
|
|
@@ -384,7 +384,7 @@ def to_bytes(value, errors='strict'): # type: (t.AnyStr, str) -> bytes
|
|
|
384
384
|
raise Exception('value is not bytes or text: %s' % type(value))
|
|
385
385
|
|
|
386
386
|
|
|
387
|
-
def to_text(value, errors='strict'): # type: (
|
|
387
|
+
def to_text(value, errors='strict'): # type: (str | bytes, str) -> t.Text
|
|
388
388
|
"""Return the given value as text decoded using UTF-8 if not already text."""
|
|
389
389
|
if isinstance(value, bytes):
|
|
390
390
|
return value.decode(ENCODING, errors)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|