Merge pull request #878 from moreati/ci-version-comparisons

ci: Fix version comparisons involving double digits
pull/882/head
Alex Willmer 3 years ago committed by GitHub
commit 4c02ea659e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -31,7 +31,8 @@ Stable names for PluginLoader instances across Ansible versions.
""" """
from __future__ import absolute_import from __future__ import absolute_import
import distutils.version
import ansible_mitogen.utils
__all__ = [ __all__ = [
'action_loader', 'action_loader',
@ -42,7 +43,6 @@ __all__ = [
'strategy_loader', 'strategy_loader',
] ]
import ansible
ANSIBLE_VERSION_MIN = (2, 10) ANSIBLE_VERSION_MIN = (2, 10)
ANSIBLE_VERSION_MAX = (2, 11) ANSIBLE_VERSION_MAX = (2, 11)
@ -68,10 +68,7 @@ def assert_supported_release():
Throw AnsibleError with a descriptive message in case of being loaded into Throw AnsibleError with a descriptive message in case of being loaded into
an unsupported Ansible release. an unsupported Ansible release.
""" """
v = ansible.__version__ v = ansible_mitogen.utils.ansible_version
if not isinstance(v, tuple):
v = tuple(distutils.version.LooseVersion(v).version)
if v[:2] < ANSIBLE_VERSION_MIN: if v[:2] < ANSIBLE_VERSION_MIN:
raise ansible.errors.AnsibleError( raise ansible.errors.AnsibleError(
OLD_VERSION_MSG % (v, ANSIBLE_VERSION_MIN) OLD_VERSION_MSG % (v, ANSIBLE_VERSION_MIN)

@ -53,6 +53,8 @@ import mitogen.utils
import ansible_mitogen.connection import ansible_mitogen.connection
import ansible_mitogen.planner import ansible_mitogen.planner
import ansible_mitogen.target import ansible_mitogen.target
import ansible_mitogen.utils
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
try: try:
@ -226,7 +228,7 @@ class ActionModuleMixin(ansible.plugins.action.ActionBase):
with a pipelined call to :func:`ansible_mitogen.target.prune_tree`. with a pipelined call to :func:`ansible_mitogen.target.prune_tree`.
""" """
LOG.debug('_remove_tmp_path(%r)', tmp_path) LOG.debug('_remove_tmp_path(%r)', tmp_path)
if tmp_path is None and ansible.__version__ > '2.6': if tmp_path is None and ansible_mitogen.utils.ansible_version[:2] >= (2, 6):
tmp_path = self._connection._shell.tmpdir # 06f73ad578d tmp_path = self._connection._shell.tmpdir # 06f73ad578d
if tmp_path is not None: if tmp_path is not None:
self._connection.get_chain().call_no_reply( self._connection.get_chain().call_no_reply(
@ -335,7 +337,7 @@ class ActionModuleMixin(ansible.plugins.action.ActionBase):
def _set_temp_file_args(self, module_args, wrap_async): def _set_temp_file_args(self, module_args, wrap_async):
# Ansible>2.5 module_utils reuses the action's temporary directory if # Ansible>2.5 module_utils reuses the action's temporary directory if
# one exists. Older versions error if this key is present. # one exists. Older versions error if this key is present.
if ansible.__version__ > '2.5': if ansible_mitogen.utils.ansible_version[:2] >= (2, 5):
if wrap_async: if wrap_async:
# Sharing is not possible with async tasks, as in that case, # Sharing is not possible with async tasks, as in that case,
# the directory must outlive the action plug-in. # the directory must outlive the action plug-in.
@ -346,7 +348,7 @@ class ActionModuleMixin(ansible.plugins.action.ActionBase):
# If _ansible_tmpdir is unset, Ansible>2.6 module_utils will use # If _ansible_tmpdir is unset, Ansible>2.6 module_utils will use
# _ansible_remote_tmp as the location to create the module's temporary # _ansible_remote_tmp as the location to create the module's temporary
# directory. Older versions error if this key is present. # directory. Older versions error if this key is present.
if ansible.__version__ > '2.6': if ansible_mitogen.utils.ansible_version[:2] >= (2, 6):
module_args['_ansible_remote_tmp'] = ( module_args['_ansible_remote_tmp'] = (
self._connection.get_good_temp_dir() self._connection.get_good_temp_dir()
) )
@ -393,7 +395,7 @@ class ActionModuleMixin(ansible.plugins.action.ActionBase):
) )
) )
if tmp and ansible.__version__ < '2.5' and delete_remote_tmp: if tmp and delete_remote_tmp and ansible_mitogen.utils.ansible_version[:2] < (2, 5):
# Built-in actions expected tmpdir to be cleaned up automatically # Built-in actions expected tmpdir to be cleaned up automatically
# on _execute_module(). # on _execute_module().
self._remove_tmp_path(tmp) self._remove_tmp_path(tmp)

@ -45,17 +45,11 @@ import ansible_mitogen.connection
import ansible_mitogen.loaders import ansible_mitogen.loaders
_class = ansible_mitogen.loaders.connection_loader__get( _get_result = ansible_mitogen.loaders.connection_loader__get(
'kubectl', 'kubectl',
class_only=True, class_only=True,
) )
if _class:
kubectl = sys.modules[_class.__module__]
del _class
else:
kubectl = None
class Connection(ansible_mitogen.connection.Connection): class Connection(ansible_mitogen.connection.Connection):
transport = 'kubectl' transport = 'kubectl'
@ -66,13 +60,19 @@ class Connection(ansible_mitogen.connection.Connection):
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
if kubectl is None: if not _get_result:
raise AnsibleConnectionFailure(self.not_supported_msg) raise AnsibleConnectionFailure(self.not_supported_msg)
super(Connection, self).__init__(*args, **kwargs) super(Connection, self).__init__(*args, **kwargs)
def get_extra_args(self): def get_extra_args(self):
try:
# Ansible < 2.10, _get_result is the connection class
connection_options = _get_result.connection_options
except AttributeError:
# Ansible >= 2.10, _get_result is a get_with_context_result
connection_options = _get_result.object.connection_options
parameters = [] parameters = []
for key, option in iteritems(kubectl.CONNECTION_OPTIONS): for key, option in iteritems(connection_options):
if self.get_task_var('ansible_' + key) is not None: if self.get_task_var('ansible_' + key) is not None:
parameters += [ option, self.get_task_var('ansible_' + key) ] parameters += [ option, self.get_task_var('ansible_' + key) ]

@ -144,7 +144,7 @@ def subprocess__Popen__close_fds(self, but):
if ( if (
sys.platform.startswith(u'linux') and sys.platform.startswith(u'linux') and
sys.version < u'3.0' and sys.version_info < (3,) and
hasattr(subprocess.Popen, u'_close_fds') and hasattr(subprocess.Popen, u'_close_fds') and
not mitogen.is_master not mitogen.is_master
): ):

@ -0,0 +1,13 @@
from __future__ import absolute_import
import distutils.version
import ansible
__all__ = [
'ansible_version',
]
ansible_version = tuple(distutils.version.LooseVersion(ansible.__version__).version)
del distutils
del ansible

@ -27,6 +27,8 @@ v0.3.1.dev0 (unreleased)
* :gh:issue:`860` Add initial support for podman connection (w/o Ansible support yet) * :gh:issue:`860` Add initial support for podman connection (w/o Ansible support yet)
* :gh:issue:`873` `python -c ...` first stage no longer uses :py:mod:`platform`` to detect the macOS release * :gh:issue:`873` `python -c ...` first stage no longer uses :py:mod:`platform`` to detect the macOS release
* :gh:issue:`876` `python -c ...` first stage no longer contains tab characters, to reduce size * :gh:issue:`876` `python -c ...` first stage no longer contains tab characters, to reduce size
* :gh:issue:`878` Continuous Integration tests now correctly perform comparisons of 2 digit versions
* :gh:issue:`878` Kubectl connector fixed with Ansible 2.10 and above
v0.3.0 (2021-11-24) v0.3.0 (2021-11-24)

@ -46,7 +46,8 @@
that: that:
- async_out.invocation.module_args.stdin == None - async_out.invocation.module_args.stdin == None
fail_msg: async_out={{async_out}} fail_msg: async_out={{async_out}}
when: ansible_version.full > '2.4' when:
- ansible_version.full is version('2.4', '>=', strict=True)
vars: vars:
async_out: "{{result.content|b64decode|from_json}}" async_out: "{{result.content|b64decode|from_json}}"
tags: tags:

@ -41,9 +41,9 @@
- result1.changed == True - result1.changed == True
# ansible/b72e989e1837ccad8dcdc926c43ccbc4d8cdfe44 # ansible/b72e989e1837ccad8dcdc926c43ccbc4d8cdfe44
- | - |
(ansible_version.full is version('2.8', ">=") and (ansible_version.full is version('2.8', ">=", strict=True) and
result1.cmd == "echo alldone;\nsleep 1;\n") or result1.cmd == "echo alldone;\nsleep 1;\n") or
(ansible_version.full is version('2.8', '<') and (ansible_version.full is version('2.8', '<', strict=True) and
result1.cmd == "echo alldone;\n sleep 1;") result1.cmd == "echo alldone;\n sleep 1;")
- result1.delta|length == 14 - result1.delta|length == 14
- result1.start|length == 26 - result1.start|length == 26
@ -58,12 +58,14 @@
- result1.stdout == "alldone" - result1.stdout == "alldone"
- result1.stdout_lines == ["alldone"] - result1.stdout_lines == ["alldone"]
fail_msg: result1={{result1}} fail_msg: result1={{result1}}
when: ansible_version.full is version('2.8', '>') # ansible#51393 when:
- ansible_version.full is version('2.8', '>', strict=True) # ansible#51393
- assert: - assert:
that: that:
- result1.failed == False - result1.failed == False
fail_msg: result1={{result1}} fail_msg: result1={{result1}}
when: ansible_version.full is version('2.4', '>') when:
- ansible_version.full is version('2.4', '>', strict=True)
tags: tags:
- runner_one_job - runner_one_job

@ -62,6 +62,7 @@
that: that:
- result2.stdout == 'im_alive' - result2.stdout == 'im_alive'
fail_msg: result2={{result2}} fail_msg: result2={{result2}}
when: ansible_version.full > '2.8' # ansible#51393 when:
- ansible_version.full is version('2.8', '>=', strict=True) # ansible#51393
tags: tags:
- runner_two_simultaneous_jobs - runner_two_simultaneous_jobs

@ -10,10 +10,12 @@
when: not is_mitogen when: not is_mitogen
- debug: msg="reset.yml skipped on Ansible<2.5.6" - debug: msg="reset.yml skipped on Ansible<2.5.6"
when: ansible_version.full < '2.5.6' when:
- ansible_version.full is version('2.5.6', '<', strict=True)
- meta: end_play - meta: end_play
when: ansible_version.full < '2.5.6' when:
- ansible_version.full is version('2.5.6', '<', strict=True)
- custom_python_detect_environment: - custom_python_detect_environment:
register: out register: out

@ -6,10 +6,12 @@
gather_facts: false gather_facts: false
tasks: tasks:
- debug: msg="reset_become.yml skipped on Ansible<2.5.6" - debug: msg="reset_become.yml skipped on Ansible<2.5.6"
when: ansible_version.full < '2.5.6' when:
- ansible_version.full is version('2.5.6', '<', strict=True)
- meta: end_play - meta: end_play
when: ansible_version.full < '2.5.6' when:
- ansible_version.full is version('2.5.6', '<', strict=True)
- name: save pid of the become acct - name: save pid of the become acct
custom_python_detect_environment: custom_python_detect_environment:

@ -20,7 +20,8 @@
when: not is_mitogen when: not is_mitogen
- meta: end_play - meta: end_play
when: ansible_version.full < '2.4' when:
- ansible_version.full is version('2.4', '<', strict=True)
- mitogen_get_stack: - mitogen_get_stack:
delegate_to: "{{ physical_host }}" delegate_to: "{{ physical_host }}"

@ -9,7 +9,8 @@
when: not is_mitogen when: not is_mitogen
- meta: end_play - meta: end_play
when: ansible_version.full < '2.5.6' when:
- ansible_version.full is version('2.5.6', '<', strict=True)
# Start with a clean slate. # Start with a clean slate.
- mitogen_shutdown_all: - mitogen_shutdown_all:

@ -8,36 +8,35 @@
vars: vars:
ansible_become_pass: has_sudo_pubkey_password ansible_become_pass: has_sudo_pubkey_password
tasks: tasks:
- mitogen_test_gethostbyname: - mitogen_test_gethostbyname:
name: www.google.com name: www.google.com
register: out register: out
when: | when:
ansible_virtualization_type == "docker" and - ansible_facts.virtualization_type == "docker"
ansible_python_version > "2.5" - ansible_facts.python.version_info[:2] >= [2, 5]
- shell: cp /etc/resolv.conf /tmp/resolv.conf - shell: cp /etc/resolv.conf /tmp/resolv.conf
when: | when:
ansible_virtualization_type == "docker" and - ansible_facts.virtualization_type == "docker"
ansible_python_version > "2.5" - ansible_facts.python.version_info[:2] >= [2, 5]
- shell: echo > /etc/resolv.conf - shell: echo > /etc/resolv.conf
when: | when:
ansible_virtualization_type == "docker" and - ansible_facts.virtualization_type == "docker"
ansible_python_version > "2.5" - ansible_facts.python.version_info[:2] >= [2, 5]
- mitogen_test_gethostbyname: - mitogen_test_gethostbyname:
name: www.google.com name: www.google.com
register: out register: out
ignore_errors: true ignore_errors: true
when: | when:
ansible_virtualization_type == "docker" and - ansible_facts.virtualization_type == "docker"
ansible_python_version > "2.5" - ansible_facts.python.version_info[:2] >= [2, 5]
- shell: cat /tmp/resolv.conf > /etc/resolv.conf - shell: cat /tmp/resolv.conf > /etc/resolv.conf
when: | when:
ansible_virtualization_type == "docker" and - ansible_facts.virtualization_type == "docker"
ansible_python_version > "2.5" - ansible_facts.python.version_info[:2] >= [2, 5]
- assert: - assert:
that: that:
@ -45,8 +44,8 @@
- '"Name or service not known" in out.msg or - '"Name or service not known" in out.msg or
"Temporary failure in name resolution" in out.msg' "Temporary failure in name resolution" in out.msg'
fail_msg: out={{out}} fail_msg: out={{out}}
when: | when:
ansible_virtualization_type == "docker" and - ansible_facts.virtualization_type == "docker"
ansible_python_version > "2.5" - ansible_facts.python.version_info[:2] >= [2, 5]
tags: tags:
- resolv_conf - resolv_conf

@ -132,27 +132,45 @@
that: that:
- auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python3' - auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python3'
fail_msg: auto_out={{auto_out}} fail_msg: auto_out={{auto_out}}
when: distro == 'fedora' and distro_version is version('23', '>=') when:
- distro == 'fedora'
- distro_version is version('23.0', '>=', strict=True)
- name: rhel assertions - name: rhel < 8 assertions
assert: assert:
that: that:
# rhel 6/7 - auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python'
- (auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python' and distro_version is version('8','<')) or distro_version is version('8','>=') fail_msg: auto_out={{auto_out}}
# rhel 8+ when:
- (auto_out.ansible_facts.discovered_interpreter_python == '/usr/libexec/platform-python' and distro_version is version('8','>=')) or distro_version is version('8','<') - distro in ('redhat', 'centos')
- distro_version is version('8.0', '<', strict=true)
- name: rhel 8+ assertions
assert:
that:
- auto_out.ansible_facts.discovered_interpreter_python == '/usr/libexec/platform-python'
fail_msg: auto_out={{auto_out}} fail_msg: auto_out={{auto_out}}
when: distro in ('redhat', 'centos') when:
- distro in ('redhat', 'centos')
- distro_version is version('8.0', '>=', strict=true)
- name: ubuntu assertions - name: ubuntu < 16.04 assertions
assert: assert:
that: that:
# ubuntu < 16 - auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python'
- (auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python' and distro_version is version('16.04','<')) or distro_version is version('16.04','>=') fail_msg: auto_out={{auto_out}}
# ubuntu >= 16 when:
- (auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python3' and distro_version is version('16.04','>=')) or distro_version is version('16.04','<') - distro == 'ubuntu'
- distro_version is version('16.04', '<', strict=true)
- name: ubuntu 16.04+ assertions
assert:
that:
- auto_out.ansible_facts.discovered_interpreter_python == '/usr/bin/python3'
fail_msg: auto_out={{auto_out}} fail_msg: auto_out={{auto_out}}
when: distro == 'ubuntu' when:
- distro == 'ubuntu'
- distro_version is version('16.04', '>=', strict=True)
- name: mac assertions - name: mac assertions
assert: assert:
@ -163,6 +181,7 @@
always: always:
- meta: clear_facts - meta: clear_facts
when: ansible_version.full is version_compare('2.8.0', '>=') when:
- ansible_version.full is version_compare('2.8.0', '>=', strict=True)
tags: tags:
- ansible_2_8_tests - ansible_2_8_tests

@ -13,11 +13,12 @@
- out.results[0].message == 'I am a perl script! Here is my input.' - out.results[0].message == 'I am a perl script! Here is my input.'
fail_msg: out={{out}} fail_msg: out={{out}}
- when: ansible_version.full > '2.4' - assert:
assert:
that: that:
- (not out.changed) - (not out.changed)
- (not out.results[0].changed) - (not out.results[0].changed)
fail_msg: out={{out}} fail_msg: out={{out}}
when:
- ansible_version.full is version('2.4', '>=', strict=True)
tags: tags:
- custom_perl_json_args_module - custom_perl_json_args_module

@ -13,11 +13,12 @@
- out.results[0].message == 'I am a want JSON perl script! Here is my input.' - out.results[0].message == 'I am a want JSON perl script! Here is my input.'
fail_msg: out={{out}} fail_msg: out={{out}}
- when: ansible_version.full > '2.4' - assert:
assert:
that: that:
- (not out.changed) - (not out.changed)
- (not out.results[0].changed) - (not out.results[0].changed)
fail_msg: out={{out}} fail_msg: out={{out}}
when:
- ansible_version.full is version('2.4', '>=', strict=True)
tags: tags:
- custom_perl_want_json_module - custom_perl_want_json_module

@ -8,7 +8,8 @@
when: not is_mitogen when: not is_mitogen
- meta: end_play - meta: end_play
when: ansible_version.full < '2.5' when:
- ansible_version.full is version('2.5', '<', strict=True)
- custom_python_detect_environment: - custom_python_detect_environment:
vars: vars:

@ -26,7 +26,15 @@ except NameError:
def main(): def main():
module = AnsibleModule(argument_spec={}) module = AnsibleModule(argument_spec={})
module.exit_json( module.exit_json(
python_version=sys.version[:3], python={
'version': {
'full': '%i.%i.%i' % sys.version_info[:3],
'info': list(sys.version_info),
'major': sys.version_info[0],
'minor': sys.version_info[1],
'patch': sys.version_info[2],
},
},
argv=sys.argv, argv=sys.argv,
__file__=__file__, __file__=__file__,
argv_types_correct=all(type(s) is str for s in sys.argv), argv_types_correct=all(type(s) is str for s in sys.argv),

@ -5,14 +5,22 @@
import ansible import ansible
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
if ansible.__version__ > '2.8': def try_int(s):
try:
return int(s, 10)
except ValueError:
return s
ansible_version = tuple(try_int(s) for s in ansible.__version__.split('.'))
if ansible_version[:2] >= (2, 8):
from ansible.module_utils import distro from ansible.module_utils import distro
else: else:
distro = None distro = None
def main(): def main():
module = AnsibleModule(argument_spec={}) module = AnsibleModule(argument_spec={})
if ansible.__version__ > '2.8': if ansible_version[:2] >= (2, 8):
module.exit_json(info=distro.info()) module.exit_json(info=distro.info())
else: else:
module.exit_json(info={'id': None}) module.exit_json(info={'id': None})

@ -7,7 +7,8 @@
gather_facts: true gather_facts: true
tasks: tasks:
- meta: end_play - meta: end_play
when: ansible_version.full < '2.6' when:
- ansible_version.full is version('2.6', '<', strict=True)
# Copy the naughty 'ansible' into place. # Copy the naughty 'ansible' into place.
- copy: - copy:

@ -9,27 +9,31 @@
# Can't use pip module because it can't create virtualenvs, must call it # Can't use pip module because it can't create virtualenvs, must call it
# directly. # directly.
- shell: virtualenv /tmp/issue_152_virtualenv - shell: virtualenv /tmp/issue_152_virtualenv
when: lout.python_version > '2.6'
environment: environment:
https_proxy: "{{ lookup('env', 'https_proxy')|default('') }}" https_proxy: "{{ lookup('env', 'https_proxy')|default('') }}"
no_proxy: "{{ lookup('env', 'no_proxy')|default('') }}" no_proxy: "{{ lookup('env', 'no_proxy')|default('') }}"
PATH: "{{ lookup('env', 'PATH') }}" PATH: "{{ lookup('env', 'PATH') }}"
when:
- lout.python.version.full is version('2.7', '>=', strict=True)
- custom_python_detect_environment: - custom_python_detect_environment:
vars: vars:
ansible_python_interpreter: /tmp/issue_152_virtualenv/bin/python ansible_python_interpreter: /tmp/issue_152_virtualenv/bin/python
register: out register: out
when: lout.python_version > '2.6' when:
- lout.python.version.full is version('2.7', '>=', strict=True)
- assert: - assert:
that: that:
- out.sys_executable == "/tmp/issue_152_virtualenv/bin/python" - out.sys_executable == "/tmp/issue_152_virtualenv/bin/python"
fail_msg: out={{out}} fail_msg: out={{out}}
when: lout.python_version > '2.6' when:
- lout.python.version.full is version('2.7', '>=', strict=True)
- file: - file:
path: /tmp/issue_152_virtualenv path: /tmp/issue_152_virtualenv
state: absent state: absent
when: lout.python_version > '2.6' when:
- lout.python.version.full is version('2.7', '>=', strict=True)
tags: tags:
- issue_152 - issue_152

@ -2,7 +2,8 @@
- hosts: test-targets - hosts: test-targets
tasks: tasks:
- meta: end_play - meta: end_play
when: ansible_version.full < '2.8' when:
- ansible_version.full is version('2.8', '<', strict=True)
- custom_python_uses_distro: - custom_python_uses_distro:
register: out register: out

Loading…
Cancel
Save