From 4f25435cd2e354dad2e6cb165a867eda3ac9dd78 Mon Sep 17 00:00:00 2001 From: Pilou Date: Fri, 24 May 2019 15:27:48 +0000 Subject: [PATCH] Handle openstacksdk < 0.10.0: fix AttributeError (#50285) * openstacksdk < 0.10.0: fix AttributeError `openstack.version.__version__` expression raises an `AttributeError` exception when openstacksdk < 0.10.0 is used. `openstack.version` is now imported as a module, which works for all openstacksdk versions. Error was: The full traceback is: Traceback (most recent call last): File "$HOME/.ansible/tmp/ansible-tmp-1545612308.8-46792777824159/AnsiballZ_os_security_group.py", line 113, in _ansiballz_main() File "$HOME/.ansible/tmp/ansible-tmp-1545612308.8-46792777824159/AnsiballZ_os_security_group.py", line 105, in _ansiballz_main invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS) File "$HOME/.ansible/tmp/ansible-tmp-1545612308.8-46792777824159/AnsiballZ_os_security_group.py", line 48, in invoke_module imp.load_module('__main__', mod, module, MOD_DESC) File "/tmp/ansible_os_security_group_payload_keFTIJ/__main__.py", line 163, in File "/tmp/ansible_os_security_group_payload_keFTIJ/__main__.py", line 115, in main File "/tmp/ansible_os_security_group_payload_keFTIJ/ansible_os_security_group_payload.zip/ansible/module_utils/openstack.py", line 121, in openstack_cloud_from_module AttributeError: 'module' object has no attribute 'version' * Add missing space & dot in error message * Always require openstacksdk >= 0.12 --- lib/ansible/module_utils/openstack.py | 15 ++++++++++----- lib/ansible/plugins/doc_fragments/openstack.py | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/ansible/module_utils/openstack.py b/lib/ansible/module_utils/openstack.py index 9a74890ba59..87570c6b710 100644 --- a/lib/ansible/module_utils/openstack.py +++ b/lib/ansible/module_utils/openstack.py @@ -114,15 +114,20 @@ def openstack_cloud_from_module(module, min_version='0.12.0'): # Due to the name shadowing we should import other way import importlib sdk = importlib.import_module('openstack') + sdk_version = importlib.import_module('openstack.version') except ImportError: module.fail_json(msg='openstacksdk is required for this module') if min_version: - if StrictVersion(sdk.version.__version__) < StrictVersion(min_version): - module.fail_json( - msg="To utilize this module, the installed version of" - "the openstacksdk library MUST be >={min_version}".format( - min_version=min_version)) + min_version = max(StrictVersion('0.12.0'), StrictVersion(min_version)) + else: + min_version = StrictVersion('0.12.0') + + if StrictVersion(sdk_version.__version__) < min_version: + module.fail_json( + msg="To utilize this module, the installed version of " + "the openstacksdk library MUST be >={min_version}.".format( + min_version=min_version)) cloud_config = module.params.pop('cloud', None) try: diff --git a/lib/ansible/plugins/doc_fragments/openstack.py b/lib/ansible/plugins/doc_fragments/openstack.py index 3451c3f85fa..746c1fed8ca 100644 --- a/lib/ansible/plugins/doc_fragments/openstack.py +++ b/lib/ansible/plugins/doc_fragments/openstack.py @@ -88,7 +88,7 @@ options: version_added: "2.3" requirements: - python >= 2.7 - - openstacksdk + - openstacksdk >= 0.12.0 notes: - The standard OpenStack environment variables, such as C(OS_USERNAME) may be used instead of providing explicit values.