ansible-core 2.16.10__py3-none-any.whl → 2.16.11__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/executor/task_executor.py +9 -5
- ansible/module_utils/ansible_release.py +1 -1
- ansible/module_utils/basic.py +5 -1
- ansible/module_utils/common/respawn.py +1 -1
- ansible/parsing/dataloader.py +4 -5
- ansible/playbook/task.py +5 -0
- ansible/playbook/task_include.py +1 -1
- ansible/plugins/__init__.py +10 -3
- ansible/plugins/connection/psrp.py +22 -17
- ansible/plugins/connection/ssh.py +1 -1
- ansible/plugins/lookup/csvfile.py +20 -0
- ansible/plugins/shell/powershell.py +43 -8
- ansible/plugins/strategy/__init__.py +1 -5
- ansible/plugins/strategy/free.py +5 -1
- ansible/release.py +1 -1
- ansible/utils/version.py +1 -0
- {ansible_core-2.16.10.dist-info → ansible_core-2.16.11.dist-info}/METADATA +1 -1
- {ansible_core-2.16.10.dist-info → ansible_core-2.16.11.dist-info}/RECORD +24 -24
- ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py +3 -1
- {ansible_core-2.16.10.data → ansible_core-2.16.11.data}/scripts/ansible-test +0 -0
- {ansible_core-2.16.10.dist-info → ansible_core-2.16.11.dist-info}/COPYING +0 -0
- {ansible_core-2.16.10.dist-info → ansible_core-2.16.11.dist-info}/WHEEL +0 -0
- {ansible_core-2.16.10.dist-info → ansible_core-2.16.11.dist-info}/entry_points.txt +0 -0
- {ansible_core-2.16.10.dist-info → ansible_core-2.16.11.dist-info}/top_level.txt +0 -0
|
@@ -32,7 +32,7 @@ from ansible.utils.listify import listify_lookup_plugin_terms
|
|
|
32
32
|
from ansible.utils.unsafe_proxy import to_unsafe_text, wrap_var
|
|
33
33
|
from ansible.vars.clean import namespace_facts, clean_facts
|
|
34
34
|
from ansible.utils.display import Display
|
|
35
|
-
from ansible.utils.vars import combine_vars
|
|
35
|
+
from ansible.utils.vars import combine_vars
|
|
36
36
|
|
|
37
37
|
display = Display()
|
|
38
38
|
|
|
@@ -333,6 +333,13 @@ class TaskExecutor:
|
|
|
333
333
|
(self._task, tmp_task) = (tmp_task, self._task)
|
|
334
334
|
(self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)
|
|
335
335
|
res = self._execute(variables=task_vars)
|
|
336
|
+
|
|
337
|
+
if self._task.register:
|
|
338
|
+
# Ensure per loop iteration results are registered in case `_execute()`
|
|
339
|
+
# returns early (when conditional, failure, ...).
|
|
340
|
+
# This is needed in case the registered variable is used in the loop label template.
|
|
341
|
+
task_vars[self._task.register] = res
|
|
342
|
+
|
|
336
343
|
task_fields = self._task.dump_attrs()
|
|
337
344
|
(self._task, tmp_task) = (tmp_task, self._task)
|
|
338
345
|
(self._play_context, tmp_play_context) = (tmp_play_context, self._play_context)
|
|
@@ -658,9 +665,6 @@ class TaskExecutor:
|
|
|
658
665
|
# update the local copy of vars with the registered value, if specified,
|
|
659
666
|
# or any facts which may have been generated by the module execution
|
|
660
667
|
if self._task.register:
|
|
661
|
-
if not isidentifier(self._task.register):
|
|
662
|
-
raise AnsibleError("Invalid variable name in 'register' specified: '%s'" % self._task.register)
|
|
663
|
-
|
|
664
668
|
vars_copy[self._task.register] = result
|
|
665
669
|
|
|
666
670
|
if self._task.async_val > 0:
|
|
@@ -1049,7 +1053,7 @@ class TaskExecutor:
|
|
|
1049
1053
|
# add extras if plugin supports them
|
|
1050
1054
|
if getattr(self._connection, 'allow_extras', False):
|
|
1051
1055
|
for k in variables:
|
|
1052
|
-
if k.startswith('ansible_%s_' % self._connection.
|
|
1056
|
+
if k.startswith('ansible_%s_' % self._connection.extras_prefix) and k not in options:
|
|
1053
1057
|
options['_extras'][k] = templar.template(variables[k])
|
|
1054
1058
|
|
|
1055
1059
|
task_keys = self._task.dump_attrs()
|
ansible/module_utils/basic.py
CHANGED
|
@@ -1759,8 +1759,12 @@ class AnsibleModule(object):
|
|
|
1759
1759
|
umask = os.umask(0)
|
|
1760
1760
|
os.umask(umask)
|
|
1761
1761
|
os.chmod(b_dest, DEFAULT_PERM & ~umask)
|
|
1762
|
+
dest_dir_stat = os.stat(os.path.dirname(b_dest))
|
|
1762
1763
|
try:
|
|
1763
|
-
|
|
1764
|
+
if dest_dir_stat.st_mode & stat.S_ISGID:
|
|
1765
|
+
os.chown(b_dest, os.geteuid(), dest_dir_stat.st_gid)
|
|
1766
|
+
else:
|
|
1767
|
+
os.chown(b_dest, os.geteuid(), os.getegid())
|
|
1764
1768
|
except OSError:
|
|
1765
1769
|
# We're okay with trying our best here. If the user is not
|
|
1766
1770
|
# root (or old Unices) they won't be able to chown.
|
|
@@ -92,6 +92,6 @@ if __name__ == '__main__':
|
|
|
92
92
|
runpy.run_module(module_fqn, init_globals=dict(_respawned=True), run_name='__main__', alter_sys=True)
|
|
93
93
|
'''
|
|
94
94
|
|
|
95
|
-
respawn_code = respawn_code_template.format(module_fqn=module_fqn, modlib_path=modlib_path, smuggled_args=smuggled_args.strip())
|
|
95
|
+
respawn_code = respawn_code_template.format(module_fqn=module_fqn, modlib_path=modlib_path, smuggled_args=to_bytes(smuggled_args).strip())
|
|
96
96
|
|
|
97
97
|
return respawn_code
|
ansible/parsing/dataloader.py
CHANGED
|
@@ -318,11 +318,10 @@ class DataLoader:
|
|
|
318
318
|
if (is_role or self._is_role(path)) and b_pb_base_dir.endswith(b'/tasks'):
|
|
319
319
|
search.append(os.path.join(os.path.dirname(b_pb_base_dir), b_dirname, b_source))
|
|
320
320
|
search.append(os.path.join(b_pb_base_dir, b_source))
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
search.append(os.path.join(b_upath, b_source))
|
|
321
|
+
# don't add dirname if user already is using it in source
|
|
322
|
+
if b_source.split(b'/')[0] != dirname:
|
|
323
|
+
search.append(os.path.join(b_upath, b_dirname, b_source))
|
|
324
|
+
search.append(os.path.join(b_upath, b_source))
|
|
326
325
|
|
|
327
326
|
# always append basedir as last resort
|
|
328
327
|
# don't add dirname if user already is using it in source
|
ansible/playbook/task.py
CHANGED
|
@@ -39,6 +39,7 @@ from ansible.playbook.taggable import Taggable
|
|
|
39
39
|
from ansible.utils.collection_loader import AnsibleCollectionConfig
|
|
40
40
|
from ansible.utils.display import Display
|
|
41
41
|
from ansible.utils.sentinel import Sentinel
|
|
42
|
+
from ansible.utils.vars import isidentifier
|
|
42
43
|
|
|
43
44
|
__all__ = ['Task']
|
|
44
45
|
|
|
@@ -276,6 +277,10 @@ class Task(Base, Conditional, Taggable, CollectionSearch, Notifiable, Delegatabl
|
|
|
276
277
|
if not isinstance(value, list):
|
|
277
278
|
setattr(self, name, [value])
|
|
278
279
|
|
|
280
|
+
def _validate_register(self, attr, name, value):
|
|
281
|
+
if value is not None and not isidentifier(value):
|
|
282
|
+
raise AnsibleParserError(f"Invalid variable name in 'register' specified: '{value}'")
|
|
283
|
+
|
|
279
284
|
def post_validate(self, templar):
|
|
280
285
|
'''
|
|
281
286
|
Override of base class post_validate, to also do final validation on
|
ansible/playbook/task_include.py
CHANGED
|
@@ -76,7 +76,7 @@ class TaskInclude(Task):
|
|
|
76
76
|
if not task.args.get('_raw_params'):
|
|
77
77
|
task.args['_raw_params'] = task.args.pop('file', None)
|
|
78
78
|
if not task.args['_raw_params']:
|
|
79
|
-
raise AnsibleParserError('No file specified for %s' % task.action)
|
|
79
|
+
raise AnsibleParserError('No file specified for %s' % task.action, obj=data)
|
|
80
80
|
|
|
81
81
|
apply_attrs = task.args.get('apply', {})
|
|
82
82
|
if apply_attrs and task.action not in C._ACTION_INCLUDE_TASKS:
|
ansible/plugins/__init__.py
CHANGED
|
@@ -52,16 +52,23 @@ def get_plugin_class(obj):
|
|
|
52
52
|
|
|
53
53
|
class AnsiblePlugin(ABC):
|
|
54
54
|
|
|
55
|
-
# allow extra passthrough parameters
|
|
56
|
-
allow_extras = False
|
|
57
|
-
|
|
58
55
|
# Set by plugin loader
|
|
59
56
|
_load_name: str
|
|
60
57
|
|
|
58
|
+
# allow extra passthrough parameters
|
|
59
|
+
allow_extras: bool = False
|
|
60
|
+
_extras_prefix: str | None = None
|
|
61
|
+
|
|
61
62
|
def __init__(self):
|
|
62
63
|
self._options = {}
|
|
63
64
|
self._defs = None
|
|
64
65
|
|
|
66
|
+
@property
|
|
67
|
+
def extras_prefix(self):
|
|
68
|
+
if not self._extras_prefix:
|
|
69
|
+
self._extras_prefix = self._load_name.split('.')[-1]
|
|
70
|
+
return self._extras_prefix
|
|
71
|
+
|
|
65
72
|
def matches_name(self, possible_names):
|
|
66
73
|
possible_fqcns = set()
|
|
67
74
|
for name in possible_names:
|
|
@@ -633,39 +633,41 @@ end {
|
|
|
633
633
|
buffer_size = max_b64_size - (max_b64_size % 1024)
|
|
634
634
|
|
|
635
635
|
# setup the file stream with read only mode
|
|
636
|
-
setup_script = '''$
|
|
637
|
-
$
|
|
636
|
+
setup_script = '''param([string]$Path)
|
|
637
|
+
$ErrorActionPreference = "Stop"
|
|
638
638
|
|
|
639
|
-
if (Test-Path -
|
|
639
|
+
if (Test-Path -LiteralPath $path -PathType Leaf) {
|
|
640
640
|
$fs = New-Object -TypeName System.IO.FileStream -ArgumentList @(
|
|
641
641
|
$path,
|
|
642
642
|
[System.IO.FileMode]::Open,
|
|
643
643
|
[System.IO.FileAccess]::Read,
|
|
644
644
|
[System.IO.FileShare]::Read
|
|
645
645
|
)
|
|
646
|
-
$buffer_size = %d
|
|
647
646
|
} elseif (Test-Path -Path $path -PathType Container) {
|
|
648
647
|
Write-Output -InputObject "[DIR]"
|
|
649
648
|
} else {
|
|
650
649
|
Write-Error -Message "$path does not exist"
|
|
651
650
|
$host.SetShouldExit(1)
|
|
652
|
-
}'''
|
|
651
|
+
}'''
|
|
653
652
|
|
|
654
653
|
# read the file stream at the offset and return the b64 string
|
|
655
|
-
read_script = '''$
|
|
656
|
-
$
|
|
657
|
-
$
|
|
658
|
-
$
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
654
|
+
read_script = '''param([int64]$Offset, [int]$BufferSize)
|
|
655
|
+
$ErrorActionPreference = "Stop"
|
|
656
|
+
$fs.Seek($Offset, [System.IO.SeekOrigin]::Begin) > $null
|
|
657
|
+
$buffer = New-Object -TypeName byte[] -ArgumentList $BufferSize
|
|
658
|
+
$read = $fs.Read($buffer, 0, $buffer.Length)
|
|
659
|
+
|
|
660
|
+
if ($read -gt 0) {
|
|
661
|
+
[System.Convert]::ToBase64String($buffer, 0, $read)
|
|
663
662
|
}'''
|
|
664
663
|
|
|
665
664
|
# need to run the setup script outside of the local scope so the
|
|
666
665
|
# file stream stays active between fetch operations
|
|
667
|
-
rc, stdout, stderr = self._exec_psrp_script(
|
|
668
|
-
|
|
666
|
+
rc, stdout, stderr = self._exec_psrp_script(
|
|
667
|
+
setup_script,
|
|
668
|
+
use_local_scope=False,
|
|
669
|
+
arguments=[in_path],
|
|
670
|
+
)
|
|
669
671
|
if rc != 0:
|
|
670
672
|
raise AnsibleError("failed to setup file stream for fetch '%s': %s"
|
|
671
673
|
% (out_path, to_native(stderr)))
|
|
@@ -680,7 +682,10 @@ if ($bytes_read -gt 0) {
|
|
|
680
682
|
while True:
|
|
681
683
|
display.vvvvv("PSRP FETCH %s to %s (offset=%d" %
|
|
682
684
|
(in_path, out_path, offset), host=self._psrp_host)
|
|
683
|
-
rc, stdout, stderr = self._exec_psrp_script(
|
|
685
|
+
rc, stdout, stderr = self._exec_psrp_script(
|
|
686
|
+
read_script,
|
|
687
|
+
arguments=[offset, buffer_size],
|
|
688
|
+
)
|
|
684
689
|
if rc != 0:
|
|
685
690
|
raise AnsibleError("failed to transfer file to '%s': %s"
|
|
686
691
|
% (out_path, to_native(stderr)))
|
|
@@ -814,7 +819,7 @@ if ($bytes_read -gt 0) {
|
|
|
814
819
|
script: str,
|
|
815
820
|
input_data: bytes | str | t.Iterable | None = None,
|
|
816
821
|
use_local_scope: bool = True,
|
|
817
|
-
arguments: t.Iterable[
|
|
822
|
+
arguments: t.Iterable[t.Any] | None = None,
|
|
818
823
|
) -> tuple[int, bytes, bytes]:
|
|
819
824
|
# Check if there's a command on the current pipeline that still needs to be closed.
|
|
820
825
|
if self._last_pipeline:
|
|
@@ -1286,7 +1286,7 @@ class Connection(ConnectionBase):
|
|
|
1286
1286
|
if sftp_action == 'get':
|
|
1287
1287
|
# we pass sudoable=False to disable pty allocation, which
|
|
1288
1288
|
# would end up mixing stdout/stderr and screwing with newlines
|
|
1289
|
-
(returncode, stdout, stderr) = self.exec_command('dd if=%s bs=%s' % (in_path, BUFSIZE), sudoable=False)
|
|
1289
|
+
(returncode, stdout, stderr) = self.exec_command('dd if=%s bs=%s' % (self._shell.quote(in_path), BUFSIZE), sudoable=False)
|
|
1290
1290
|
with open(to_bytes(out_path, errors='surrogate_or_strict'), 'wb+') as out_file:
|
|
1291
1291
|
out_file.write(stdout)
|
|
1292
1292
|
else:
|
|
@@ -13,6 +13,7 @@ DOCUMENTATION = r"""
|
|
|
13
13
|
- The csvfile lookup reads the contents of a file in CSV (comma-separated value) format.
|
|
14
14
|
The lookup looks for the row where the first column matches keyname (which can be multiple words)
|
|
15
15
|
and returns the value in the O(col) column (default 1, which indexed from 0 means the second column in the file).
|
|
16
|
+
- At least one keyname is required, provided as a positional argument(s) to the lookup.
|
|
16
17
|
options:
|
|
17
18
|
col:
|
|
18
19
|
description: column to return (0 indexed).
|
|
@@ -59,6 +60,22 @@ EXAMPLES = """
|
|
|
59
60
|
vars:
|
|
60
61
|
csvline: "{{ lookup('ansible.builtin.csvfile', bgp_neighbor_ip, file='bgp_neighbors.csv', delimiter=',') }}"
|
|
61
62
|
delegate_to: localhost
|
|
63
|
+
|
|
64
|
+
# Contents of debug.csv
|
|
65
|
+
# test1 ret1.1 ret2.1
|
|
66
|
+
# test2 ret1.2 ret2.2
|
|
67
|
+
# test3 ret1.3 ret2.3
|
|
68
|
+
|
|
69
|
+
- name: "Lookup multiple keynames in the first column (index 0), returning the values from the second column (index 1)"
|
|
70
|
+
debug:
|
|
71
|
+
msg: "{{ lookup('csvfile', 'test1', 'test2', file='debug.csv', delimiter=' ') }}"
|
|
72
|
+
|
|
73
|
+
- name: Lookup multiple keynames using old style syntax
|
|
74
|
+
debug:
|
|
75
|
+
msg: "{{ lookup('csvfile', term1, term2) }}"
|
|
76
|
+
vars:
|
|
77
|
+
term1: "test1 file=debug.csv delimiter=' '"
|
|
78
|
+
term2: "test2 file=debug.csv delimiter=' '"
|
|
62
79
|
"""
|
|
63
80
|
|
|
64
81
|
RETURN = """
|
|
@@ -146,6 +163,9 @@ class LookupModule(LookupBase):
|
|
|
146
163
|
# populate options
|
|
147
164
|
paramvals = self.get_options()
|
|
148
165
|
|
|
166
|
+
if not terms:
|
|
167
|
+
raise AnsibleError('Search key is required but was not found')
|
|
168
|
+
|
|
149
169
|
for term in terms:
|
|
150
170
|
kv = parse_kv(term)
|
|
151
171
|
|
|
@@ -26,35 +26,70 @@ import ntpath
|
|
|
26
26
|
from ansible.module_utils.common.text.converters import to_bytes, to_text
|
|
27
27
|
from ansible.plugins.shell import ShellBase
|
|
28
28
|
|
|
29
|
+
# This is weird, we are matching on byte sequences that match the utf-16-be
|
|
30
|
+
# matches for '_x(a-fA-F0-9){4}_'. The \x00 and {8} will match the hex sequence
|
|
31
|
+
# when it is encoded as utf-16-be.
|
|
32
|
+
_STRING_DESERIAL_FIND = re.compile(rb"\x00_\x00x([\x00(a-fA-F0-9)]{8})\x00_")
|
|
29
33
|
|
|
30
34
|
_common_args = ['PowerShell', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Unrestricted']
|
|
31
35
|
|
|
32
36
|
|
|
33
|
-
def _parse_clixml(data, stream="Error"):
|
|
37
|
+
def _parse_clixml(data: bytes, stream: str = "Error") -> bytes:
|
|
34
38
|
"""
|
|
35
39
|
Takes a byte string like '#< CLIXML\r\n<Objs...' and extracts the stream
|
|
36
40
|
message encoded in the XML data. CLIXML is used by PowerShell to encode
|
|
37
41
|
multiple objects in stderr.
|
|
38
42
|
"""
|
|
39
|
-
lines = []
|
|
43
|
+
lines: list[str] = []
|
|
44
|
+
|
|
45
|
+
# A serialized string will serialize control chars and surrogate pairs as
|
|
46
|
+
# _xDDDD_ values where DDDD is the hex representation of a big endian
|
|
47
|
+
# UTF-16 code unit. As a surrogate pair uses 2 UTF-16 code units, we need
|
|
48
|
+
# to operate our text replacement on the utf-16-be byte encoding of the raw
|
|
49
|
+
# text. This allows us to replace the _xDDDD_ values with the actual byte
|
|
50
|
+
# values and then decode that back to a string from the utf-16-be bytes.
|
|
51
|
+
def rplcr(matchobj: re.Match) -> bytes:
|
|
52
|
+
match_hex = matchobj.group(1)
|
|
53
|
+
hex_string = match_hex.decode("utf-16-be")
|
|
54
|
+
return base64.b16decode(hex_string.upper())
|
|
40
55
|
|
|
41
56
|
# There are some scenarios where the stderr contains a nested CLIXML element like
|
|
42
57
|
# '<# CLIXML\r\n<# CLIXML\r\n<Objs>...</Objs><Objs>...</Objs>'.
|
|
43
58
|
# Parse each individual <Objs> element and add the error strings to our stderr list.
|
|
44
59
|
# https://github.com/ansible/ansible/issues/69550
|
|
45
60
|
while data:
|
|
46
|
-
|
|
47
|
-
|
|
61
|
+
start_idx = data.find(b"<Objs ")
|
|
62
|
+
end_idx = data.find(b"</Objs>")
|
|
63
|
+
if start_idx == -1 or end_idx == -1:
|
|
64
|
+
break
|
|
65
|
+
|
|
66
|
+
end_idx += 7
|
|
67
|
+
current_element = data[start_idx:end_idx]
|
|
48
68
|
data = data[end_idx:]
|
|
49
69
|
|
|
50
70
|
clixml = ET.fromstring(current_element)
|
|
51
71
|
namespace_match = re.match(r'{(.*)}', clixml.tag)
|
|
52
|
-
namespace = "{
|
|
72
|
+
namespace = f"{{{namespace_match.group(1)}}}" if namespace_match else ""
|
|
73
|
+
|
|
74
|
+
entries = clixml.findall("./%sS" % namespace)
|
|
75
|
+
if not entries:
|
|
76
|
+
continue
|
|
77
|
+
|
|
78
|
+
# If this is a new CLIXML element, add a newline to separate the messages.
|
|
79
|
+
if lines:
|
|
80
|
+
lines.append("\r\n")
|
|
81
|
+
|
|
82
|
+
for string_entry in entries:
|
|
83
|
+
actual_stream = string_entry.attrib.get('S', None)
|
|
84
|
+
if actual_stream != stream:
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
b_line = (string_entry.text or "").encode("utf-16-be")
|
|
88
|
+
b_escaped = re.sub(_STRING_DESERIAL_FIND, rplcr, b_line)
|
|
53
89
|
|
|
54
|
-
|
|
55
|
-
lines.extend([e.text.replace('_x000D__x000A_', '') for e in strings if e.attrib.get('S') == stream])
|
|
90
|
+
lines.append(b_escaped.decode("utf-16-be", errors="surrogatepass"))
|
|
56
91
|
|
|
57
|
-
return to_bytes('
|
|
92
|
+
return to_bytes(''.join(lines), errors="surrogatepass")
|
|
58
93
|
|
|
59
94
|
|
|
60
95
|
class ShellModule(ShellBase):
|
|
@@ -56,7 +56,7 @@ from ansible.utils.display import Display
|
|
|
56
56
|
from ansible.utils.fqcn import add_internal_fqcns
|
|
57
57
|
from ansible.utils.unsafe_proxy import wrap_var
|
|
58
58
|
from ansible.utils.sentinel import Sentinel
|
|
59
|
-
from ansible.utils.vars import combine_vars
|
|
59
|
+
from ansible.utils.vars import combine_vars
|
|
60
60
|
from ansible.vars.clean import strip_internal_keys, module_response_deepcopy
|
|
61
61
|
|
|
62
62
|
display = Display()
|
|
@@ -775,10 +775,6 @@ class StrategyBase:
|
|
|
775
775
|
|
|
776
776
|
# register final results
|
|
777
777
|
if original_task.register:
|
|
778
|
-
|
|
779
|
-
if not isidentifier(original_task.register):
|
|
780
|
-
raise AnsibleError("Invalid variable name in 'register' specified: '%s'" % original_task.register)
|
|
781
|
-
|
|
782
778
|
host_list = self.get_task_hosts(iterator, original_host, original_task)
|
|
783
779
|
|
|
784
780
|
clean_copy = strip_internal_keys(module_response_deepcopy(task_result._result))
|
ansible/plugins/strategy/free.py
CHANGED
|
@@ -97,6 +97,7 @@ class StrategyModule(StrategyBase):
|
|
|
97
97
|
|
|
98
98
|
# try and find an unblocked host with a task to run
|
|
99
99
|
host_results = []
|
|
100
|
+
meta_task_dummy_results_count = 0
|
|
100
101
|
while True:
|
|
101
102
|
host = hosts_left[last_host]
|
|
102
103
|
display.debug("next free host: %s" % host)
|
|
@@ -183,6 +184,9 @@ class StrategyModule(StrategyBase):
|
|
|
183
184
|
continue
|
|
184
185
|
|
|
185
186
|
if task.action in C._ACTION_META:
|
|
187
|
+
if self._host_pinned:
|
|
188
|
+
meta_task_dummy_results_count += 1
|
|
189
|
+
workers_free -= 1
|
|
186
190
|
self._execute_meta(task, play_context, iterator, target_host=host)
|
|
187
191
|
self._blocked_hosts[host_name] = False
|
|
188
192
|
else:
|
|
@@ -222,7 +226,7 @@ class StrategyModule(StrategyBase):
|
|
|
222
226
|
host_results.extend(results)
|
|
223
227
|
|
|
224
228
|
# each result is counted as a worker being free again
|
|
225
|
-
workers_free += len(results)
|
|
229
|
+
workers_free += len(results) + meta_task_dummy_results_count
|
|
226
230
|
|
|
227
231
|
self.update_active_connections(results)
|
|
228
232
|
|
ansible/release.py
CHANGED
ansible/utils/version.py
CHANGED
|
@@ -192,6 +192,7 @@ class SemanticVersion(Version):
|
|
|
192
192
|
raise ValueError("invalid semantic version '%s'" % vstring)
|
|
193
193
|
|
|
194
194
|
(major, minor, patch, prerelease, buildmetadata) = match.group(1, 2, 3, 4, 5)
|
|
195
|
+
self.vstring = vstring
|
|
195
196
|
self.major = int(major)
|
|
196
197
|
self.minor = int(minor)
|
|
197
198
|
self.patch = int(patch)
|
|
@@ -3,7 +3,7 @@ ansible/__main__.py,sha256=IvyRvY64pT0on94qCLibxgDJ0-7_2CRoaZ5kfGOl54Q,1395
|
|
|
3
3
|
ansible/constants.py,sha256=FvX7PDG0GWV91Vszb5-DFKvkR8O2OTpBmIbQk-d51sc,9193
|
|
4
4
|
ansible/context.py,sha256=OzSlaA_GgGRyyf5I209sy19_eGOX6HXn441W9w_FcvU,2018
|
|
5
5
|
ansible/keyword_desc.yml,sha256=vE9joFgSeHR4Djl7Bd-HHVCrGByRCrTUmWYZ8LKPZKk,7412
|
|
6
|
-
ansible/release.py,sha256=
|
|
6
|
+
ansible/release.py,sha256=NAME6V7qTVQNucrPjMtMWzqbweKU0gyo8dhFlokygxQ,916
|
|
7
7
|
ansible/_vendor/__init__.py,sha256=wJRKH7kI9OzYVY9hgSchOsTNTmTnugpPLGYj9Y5akX0,2086
|
|
8
8
|
ansible/cli/__init__.py,sha256=6jaX6SS-UBM7pjiUlDsC0y07k3klUjxTR5ZEnDiCmP8,28706
|
|
9
9
|
ansible/cli/adhoc.py,sha256=suzo4QnsaMjJBk5JlAUd-cpQLs8Ckj6A55CiG9Y8Gns,8247
|
|
@@ -37,7 +37,7 @@ ansible/executor/module_common.py,sha256=GjRWM0L9Y4iDPa3ffhxjpy07i9e6ozpvvPnSLxZ
|
|
|
37
37
|
ansible/executor/play_iterator.py,sha256=7Lk3Zxh3gAzLR8cyHmmFbbbT0C-JyeCK-vquKZyPBY0,30511
|
|
38
38
|
ansible/executor/playbook_executor.py,sha256=RYYgI82wviDOE1o8zrIB5WWsSEg13KdxEVMXLGPKK7A,15098
|
|
39
39
|
ansible/executor/stats.py,sha256=757UK8wDzLCXq4ltI9PqpoMNAdtRsd9D9-GS-5Al_Hs,3264
|
|
40
|
-
ansible/executor/task_executor.py,sha256=
|
|
40
|
+
ansible/executor/task_executor.py,sha256=Pl2oXRQH6T9ux9X-EaDFMs3UDXn1A-jplJxzKVgs3x4,60605
|
|
41
41
|
ansible/executor/task_queue_manager.py,sha256=DUWwK8RZuUJPY66to8kplFBFcUPAJwLB3kW8vfl1IOM,18724
|
|
42
42
|
ansible/executor/task_result.py,sha256=DvshMci5i9-qCXs0m_vScSa6BJMbPwwNQBV7L2DTCzE,5748
|
|
43
43
|
ansible/executor/discovery/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -140,9 +140,9 @@ ansible/inventory/host.py,sha256=7RZjLiB7M74bejFRflOTa8XPHxMC334qhSo_5VmZrKI,512
|
|
|
140
140
|
ansible/inventory/manager.py,sha256=ZwmEF3E2BKOJi9SMVQNz83A2f3raQn6Nyo-rfSNMn2k,29507
|
|
141
141
|
ansible/module_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
142
142
|
ansible/module_utils/_text.py,sha256=F_YfeaxhwmTI16HICAzQS9ZmlKgBDdQ4mqR-Kh--okg,597
|
|
143
|
-
ansible/module_utils/ansible_release.py,sha256=
|
|
143
|
+
ansible/module_utils/ansible_release.py,sha256=NAME6V7qTVQNucrPjMtMWzqbweKU0gyo8dhFlokygxQ,916
|
|
144
144
|
ansible/module_utils/api.py,sha256=BTo7stVOANbtd-ngZslaqx70r9t5gfvo44cKyu5SFjU,5837
|
|
145
|
-
ansible/module_utils/basic.py,sha256=
|
|
145
|
+
ansible/module_utils/basic.py,sha256=i_lL7YrkhtBewM21t4uIfAgqrGqStyCWwjYiUyqRBi0,87706
|
|
146
146
|
ansible/module_utils/connection.py,sha256=9Us-d-y1bhC3zNnziQxvYNT4umIaN0OYv8zPaUSdEf0,8447
|
|
147
147
|
ansible/module_utils/errors.py,sha256=LYv9EWkvBRAmYW6qQY4Vz2hMULqkAGkMG2Opf86Ep4M,3396
|
|
148
148
|
ansible/module_utils/json_utils.py,sha256=IR_bSwrYK1Ie36dCQSHyN4mahkrZkzIIkH3DdwtIi6Q,3456
|
|
@@ -164,7 +164,7 @@ ansible/module_utils/common/locale.py,sha256=2M82y05BjDP38Rz_vpMCoZNx2cjF9P8wPez
|
|
|
164
164
|
ansible/module_utils/common/network.py,sha256=PMSOzC8zzq5ZwAFNOtJuPvKcw6cptlskvqPEqGFEepg,4278
|
|
165
165
|
ansible/module_utils/common/parameters.py,sha256=zn7G8ihk38YHSh7INiYsmuZxt9UqBjAH_lXLQ4Qyrh4,37201
|
|
166
166
|
ansible/module_utils/common/process.py,sha256=AMjgRaJVcaE1gBuAkrV8ZYLFlTJQkTnpwFJ21W0erwA,1870
|
|
167
|
-
ansible/module_utils/common/respawn.py,sha256=
|
|
167
|
+
ansible/module_utils/common/respawn.py,sha256=3BKO1QBwWL_kLEXY58PrOoUXfh4ygTKyqkFDY-MUsRo,3838
|
|
168
168
|
ansible/module_utils/common/sys_info.py,sha256=k5gQ1gV541JteH_KpeyqvPmWEQOPDEsQZicgowmsef4,5487
|
|
169
169
|
ansible/module_utils/common/validation.py,sha256=i_AZ8wRLYnoIwtRzSzC1npaVcv5QTtBWtQcAhPDb3mM,19143
|
|
170
170
|
ansible/module_utils/common/warnings.py,sha256=adpOS7elfs518cpjd5x467V8YbVfBKnPLVxaO4QHnTs,1416
|
|
@@ -350,7 +350,7 @@ ansible/modules/yum.py,sha256=ss7Ikm2R0hfXoIcPsIF5atwbhsKnCpvqS4drU_mLLmQ,74057
|
|
|
350
350
|
ansible/modules/yum_repository.py,sha256=36uZERU09bfvTTsmr3Qx4p1TWZ8V4fQ64LLLOlxL1gs,24957
|
|
351
351
|
ansible/parsing/__init__.py,sha256=fPEa2N1Z4mjQHwps752TC-vhKA1CkCoEcAjh0YkfM5Y,826
|
|
352
352
|
ansible/parsing/ajson.py,sha256=CZ3s2arKLvMWz5rzRIhzutRGSx73aS6fDg4C94HAHVA,1338
|
|
353
|
-
ansible/parsing/dataloader.py,sha256=
|
|
353
|
+
ansible/parsing/dataloader.py,sha256=sQg0YJDBoSlE8idZQjs3ict7tKys1crodf_E7rT1WUQ,20428
|
|
354
354
|
ansible/parsing/mod_args.py,sha256=b72Oj7iW8JJiRRznEyOKZM_asu1hryn_Q7fbyCYHQ7E,14462
|
|
355
355
|
ansible/parsing/plugin_docs.py,sha256=JdK4OiFa7lSu9_-ztKQ7RPJs2FrmZejhE3YLESe-41Y,8714
|
|
356
356
|
ansible/parsing/quoting.py,sha256=OsrBXkTzgn8PHH7VGA0kqnz6jBejdoQymDqsOYxTF-M,1141
|
|
@@ -383,14 +383,14 @@ ansible/playbook/play_context.py,sha256=vocmas7gJXDlJB8Hm5CLdCSEbE6eCRhor4sskA1l
|
|
|
383
383
|
ansible/playbook/playbook_include.py,sha256=M0CZ7nGCvCNQuZQXwNHSXi9IhKXJLV74Bd9YvcarrZ4,7577
|
|
384
384
|
ansible/playbook/role_include.py,sha256=9IsYSolvScuzBREoDh2lg-S6mN7_WAF-usQMZvVX2dQ,7968
|
|
385
385
|
ansible/playbook/taggable.py,sha256=QpIS7BXQ9N48Vu1HW96OdSMyrQHckYtCgsVL9-mv-Ts,3249
|
|
386
|
-
ansible/playbook/task.py,sha256=
|
|
387
|
-
ansible/playbook/task_include.py,sha256=
|
|
386
|
+
ansible/playbook/task.py,sha256=MU7Mz38zvgxwGvKGlLsXMUF7Js6g3_8VChIcnrWJNXE,21838
|
|
387
|
+
ansible/playbook/task_include.py,sha256=b1_XpsiYQYMuTttjGwWNb0NgsABcJ2TKJfSMSu6xG0s,5328
|
|
388
388
|
ansible/playbook/role/__init__.py,sha256=ZPASFccReB6DaJtZZ5UT_0IXtZjLTzdEQoP9ebiIom0,29781
|
|
389
389
|
ansible/playbook/role/definition.py,sha256=MGvEmAsOUYj2geHD5H7JG4N5O3wCxQwmtlH7IpgZqfk,9634
|
|
390
390
|
ansible/playbook/role/include.py,sha256=Vq5ywSkMeIAHYgEH0M9B-HOOTSq2AkyU5tksmHyKc9k,2426
|
|
391
391
|
ansible/playbook/role/metadata.py,sha256=5rWZ3ET9-xUCxHL2371o8nRS2aYTn4Ni8fU5_T09Evg,5158
|
|
392
392
|
ansible/playbook/role/requirement.py,sha256=T_PljD0hgVstV325iALyCUKkAZxzLLlcQjpp-yuWBXg,4257
|
|
393
|
-
ansible/plugins/__init__.py,sha256=
|
|
393
|
+
ansible/plugins/__init__.py,sha256=WrYYCde_H0lbf8sPV7zCtNUXy4R6Zw-KQYhdIqPxn64,5595
|
|
394
394
|
ansible/plugins/list.py,sha256=r_ai9G1ERwTigM2ZyhLtJK8BYRh4_hUNvAuqDlVS5ZI,8979
|
|
395
395
|
ansible/plugins/loader.py,sha256=A_8sGZYgDLY-7fq4PjLC-dfcZrrdG5Xj290mTLy5htk,75723
|
|
396
396
|
ansible/plugins/action/__init__.py,sha256=G6IVJe6hA6oJyOLN-0pCPc1A1GtRQ6WMBrqg-BflDdo,68697
|
|
@@ -441,8 +441,8 @@ ansible/plugins/cliconf/__init__.py,sha256=hjwVXkBPenYCSCF5-7HmylUFFO1L2itrvwpKX
|
|
|
441
441
|
ansible/plugins/connection/__init__.py,sha256=87RA8bIaaS0LGZCZQpdJJEgAjDd2DPJgXebCMjYrTxE,18011
|
|
442
442
|
ansible/plugins/connection/local.py,sha256=RFIZEyZjXQ_AcynPiYfmgZbHDNpgV6GiKb9qeXGxwoA,8437
|
|
443
443
|
ansible/plugins/connection/paramiko_ssh.py,sha256=gMaVa1GqhymC7EHdtvp_rBN7MilHGDLYAgxs-l1_AAc,30111
|
|
444
|
-
ansible/plugins/connection/psrp.py,sha256=
|
|
445
|
-
ansible/plugins/connection/ssh.py,sha256=
|
|
444
|
+
ansible/plugins/connection/psrp.py,sha256=6E0zZ56JjrPDcPdLg3AcmD892RyyNa7qaXp_geIqcYw,36828
|
|
445
|
+
ansible/plugins/connection/ssh.py,sha256=RAvdE7PGlUk8IbwjdhOdvt0W_X1ChXxVNUForWqZFnM,64412
|
|
446
446
|
ansible/plugins/connection/winrm.py,sha256=xk7IGA9rnhlg8gwiUI7FK19UFut_KzqKS6glRPJJFFA,40666
|
|
447
447
|
ansible/plugins/doc_fragments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
448
448
|
ansible/plugins/doc_fragments/action_common_attributes.py,sha256=ouV8CMIP0TkfkxN4p_pLbPvRSC5wu6w0Y6ScONOg-c4,2449
|
|
@@ -551,7 +551,7 @@ ansible/plugins/inventory/toml.py,sha256=-x-PFHoqKrBFqjp0ZP3kZ9xQYm5hjG4b--_rjoK
|
|
|
551
551
|
ansible/plugins/inventory/yaml.py,sha256=uAUIGNLLJ8V56RbS5IQwH9FpcAcf9N-iT631p-P_biY,7468
|
|
552
552
|
ansible/plugins/lookup/__init__.py,sha256=b6ZrYYaYa4M7h09WtRl5QcspqRF17tvHdnhaOiT46A0,4764
|
|
553
553
|
ansible/plugins/lookup/config.py,sha256=wTreKdYRLEOcjRbAs-E-bBT1vVSncqKHgG7wJcEq4ck,6413
|
|
554
|
-
ansible/plugins/lookup/csvfile.py,sha256=
|
|
554
|
+
ansible/plugins/lookup/csvfile.py,sha256=4YbDjHi40k-lDRBzjrEieKEn5wH4tyZ8Mgu_2byGj4I,7142
|
|
555
555
|
ansible/plugins/lookup/dict.py,sha256=44P9TxDwzxd5yTFP1VRf8KINCzikw6VmSEPGmpdSQwo,2250
|
|
556
556
|
ansible/plugins/lookup/env.py,sha256=OB5bMBZb7qsCAYfm_TDO-RYL628nNjQTbQZf8_t7rtk,2731
|
|
557
557
|
ansible/plugins/lookup/file.py,sha256=r-1xyg9B4nf3zOzvlzCyxN4plgd_UU-KTCa2tIjeex8,3324
|
|
@@ -578,11 +578,11 @@ ansible/plugins/lookup/vars.py,sha256=3YJ6wGXkOa4Of_0ngL-2_ZMOG7lG_f0ozpkgFs57WI
|
|
|
578
578
|
ansible/plugins/netconf/__init__.py,sha256=yNiWM9PZHi2h2jJ0oV4QD6GuUvz-60_rcqsfefZEz7k,17147
|
|
579
579
|
ansible/plugins/shell/__init__.py,sha256=207VqtEpJsvwHGG2HkCtvA9JpeAWscUnwEM-ohJxWck,9575
|
|
580
580
|
ansible/plugins/shell/cmd.py,sha256=vQcWC8CGmnSEyUVmX0X1QSObBbkmqePmLRLvv7Mj_5s,2223
|
|
581
|
-
ansible/plugins/shell/powershell.py,sha256=
|
|
581
|
+
ansible/plugins/shell/powershell.py,sha256=hXAfwfOa_vEGz_gH4lypadIMRcVBXUdQrV29sVNSRhY,12933
|
|
582
582
|
ansible/plugins/shell/sh.py,sha256=1nhiMv0_c8zu2MaDHvOCr--dG8b-iUVEPPnpMh_Hx8I,3952
|
|
583
|
-
ansible/plugins/strategy/__init__.py,sha256=
|
|
583
|
+
ansible/plugins/strategy/__init__.py,sha256=LqNlxylwsr4NlJTr-jG9bnqwzeYNhvwSI-CMTkM7xQQ,56905
|
|
584
584
|
ansible/plugins/strategy/debug.py,sha256=GxUS0bSiaWInIK8zgB7rMREEqvgrZhVlFUzOCJtnjFo,1258
|
|
585
|
-
ansible/plugins/strategy/free.py,sha256=
|
|
585
|
+
ansible/plugins/strategy/free.py,sha256=mPhduX1-EnfCVoHRV8C5LU0QG1O31sgtVJdjYvFyHJ8,16142
|
|
586
586
|
ansible/plugins/strategy/host_pinned.py,sha256=3-q5l-tpheMlU-BXGm6ZQNgHvQv5IMvOCDZBLibl1L4,1959
|
|
587
587
|
ansible/plugins/strategy/linear.py,sha256=odF0fAYcG4JbfYoJOEy_obx1FsMhbk64nkTmX4ezmZU,18772
|
|
588
588
|
ansible/plugins/terminal/__init__.py,sha256=Pgzb8SsOGE2irgrv4f--4rfTDNxDFURzToWOatDg8J4,4472
|
|
@@ -670,7 +670,7 @@ ansible/utils/ssh_functions.py,sha256=GWySu84yXZR_L8DkZWPZBpWoRiojVCEtpyD_DeYKez
|
|
|
670
670
|
ansible/utils/unicode.py,sha256=5NoXNgXD4zP1cRJKoaN0h-qoX03yt8sfsAF1x9CGl5Y,1184
|
|
671
671
|
ansible/utils/unsafe_proxy.py,sha256=bpeNRwWfcxLkVoMc4fpUMWuOrHM1k41ik_V_kEDPh0c,12750
|
|
672
672
|
ansible/utils/vars.py,sha256=UCxzbkjeXkZM27QAfUDd78K0c3W-r2Q5J4ostcTdws0,9952
|
|
673
|
-
ansible/utils/version.py,sha256=
|
|
673
|
+
ansible/utils/version.py,sha256=w-HTErqE6TnGPnnrif-G2KNSlvsLWEN8bQfrDK148Kg,7820
|
|
674
674
|
ansible/utils/collection_loader/__init__.py,sha256=l6gUbk5MzfUXlySWrj4xi4IF9UBIrOrEpRQ52-xfGsA,1118
|
|
675
675
|
ansible/utils/collection_loader/_collection_config.py,sha256=aQRueIQj0XzpFuooDjYNvUaxGDtoN0Kf3u26pu636bg,3147
|
|
676
676
|
ansible/utils/collection_loader/_collection_finder.py,sha256=RMsbsNE1y2QgxH-4pZCZi-fOjT2d5KczsXLlCMdwEyM,56637
|
|
@@ -682,7 +682,7 @@ ansible/vars/hostvars.py,sha256=xd9TRpqvqMoZxrzQpbBHV_EAii_CdzSBzCg5Y5kpJr8,5202
|
|
|
682
682
|
ansible/vars/manager.py,sha256=lIfISTPyRcNfJVWJhhNof36Zmk6xSMUkf9sFxrzCzcI,38180
|
|
683
683
|
ansible/vars/plugins.py,sha256=RsRU9fiLcJwPIAyTYnmVZglsiEOMCIgQskflavE-XnE,4546
|
|
684
684
|
ansible/vars/reserved.py,sha256=FBD7n2dnA0CW4I0J1LtWwk2hQqvGW0KTRPcxaRtMKWo,2615
|
|
685
|
-
ansible_core-2.16.
|
|
685
|
+
ansible_core-2.16.11.data/scripts/ansible-test,sha256=CYIYL99IxWdVTtDIj3avilIJXhGAmtjuKPPWNuLWuc8,1690
|
|
686
686
|
ansible_test/__init__.py,sha256=6e721yAyyyocRKzbCKtQXloAfFP7Aqv0L3zG70uh-4A,190
|
|
687
687
|
ansible_test/_data/ansible.cfg,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
688
688
|
ansible_test/_data/coveragerc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -926,7 +926,7 @@ ansible_test/_util/controller/sanity/code-smell/no-unicode-literals.py,sha256=-5
|
|
|
926
926
|
ansible_test/_util/controller/sanity/code-smell/replace-urlopen.json,sha256=w9--s9c-2F26o7JBJbTJjVGPnvlwGNfSu7KNDSmL9Qw,179
|
|
927
927
|
ansible_test/_util/controller/sanity/code-smell/replace-urlopen.py,sha256=PSLEuYW5SBrcC7YIt8jdvJ3arxLL7SK7Mxbsvz1UfXc,624
|
|
928
928
|
ansible_test/_util/controller/sanity/code-smell/runtime-metadata.json,sha256=H2E2-01YXLlSWjvLJT5Vtj3Gn4zB6xhPXsDJh4a7EH0,225
|
|
929
|
-
ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py,sha256=
|
|
929
|
+
ansible_test/_util/controller/sanity/code-smell/runtime-metadata.py,sha256=ozoaAQCTZM-0Hnl--jSUwbZS0mBrs6FGWbP6_esODzk,12233
|
|
930
930
|
ansible_test/_util/controller/sanity/code-smell/shebang.json,sha256=3vtNzoowM53gi2KZi9peIKVIU79ulQY3FE0jYcSP77M,63
|
|
931
931
|
ansible_test/_util/controller/sanity/code-smell/shebang.py,sha256=AKCti3RCgZy0GWB3bXgimr_OhqfVPOp_I7345UN_DV8,4672
|
|
932
932
|
ansible_test/_util/controller/sanity/code-smell/symlinks.json,sha256=JkalgX52aKGUKqjKG5P-68F0tXmUMgldPrNAknMN2Fk,96
|
|
@@ -1001,9 +1001,9 @@ ansible_test/config/cloud-config-vultr.ini.template,sha256=XLKHk3lg_8ReQMdWfZzhh
|
|
|
1001
1001
|
ansible_test/config/config.yml,sha256=wb3knoBmZewG3GWOMnRHoVPQWW4vPixKLPMNS6vJmTc,2620
|
|
1002
1002
|
ansible_test/config/inventory.networking.template,sha256=bFNSk8zNQOaZ_twaflrY0XZ9mLwUbRLuNT0BdIFwvn4,1335
|
|
1003
1003
|
ansible_test/config/inventory.winrm.template,sha256=1QU8W-GFLnYEw8yY9bVIvUAVvJYPM3hyoijf6-M7T00,1098
|
|
1004
|
-
ansible_core-2.16.
|
|
1005
|
-
ansible_core-2.16.
|
|
1006
|
-
ansible_core-2.16.
|
|
1007
|
-
ansible_core-2.16.
|
|
1008
|
-
ansible_core-2.16.
|
|
1009
|
-
ansible_core-2.16.
|
|
1004
|
+
ansible_core-2.16.11.dist-info/COPYING,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
1005
|
+
ansible_core-2.16.11.dist-info/METADATA,sha256=otIBNFrGtP65i5Bs4T0QblqR4H4QNRKnrZ8ePzEZ7yM,6906
|
|
1006
|
+
ansible_core-2.16.11.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
1007
|
+
ansible_core-2.16.11.dist-info/entry_points.txt,sha256=0mpmsrIhODChxKl3eS-NcVQCaMetBn8KdPLtVxQgR64,453
|
|
1008
|
+
ansible_core-2.16.11.dist-info/top_level.txt,sha256=IFbRLjAvih1DYzJWg3_F6t4sCzEMxRO7TOMNs6GkYHo,21
|
|
1009
|
+
ansible_core-2.16.11.dist-info/RECORD,,
|
|
@@ -123,7 +123,9 @@ def get_collection_version():
|
|
|
123
123
|
# noinspection PyBroadException
|
|
124
124
|
try:
|
|
125
125
|
result = collection_detail.read_manifest_json('.') or collection_detail.read_galaxy_yml('.')
|
|
126
|
-
|
|
126
|
+
version = SemanticVersion()
|
|
127
|
+
version.parse(result['version'])
|
|
128
|
+
return version
|
|
127
129
|
except Exception: # pylint: disable=broad-except
|
|
128
130
|
# We do not care why it fails, in case we cannot get the version
|
|
129
131
|
# just return None to indicate "we don't know".
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|