mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-26 20:31:27 -07:00
Final round of moving modules to new import error msg (#51852)
* Final round of moving modules to new import error msg * readd URL to jenkins install guide * fix unit tests
This commit is contained in:
parent
ffbc9d99de
commit
a39c4ad464
42 changed files with 292 additions and 150 deletions
|
@ -27,7 +27,9 @@
|
|||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import os
|
||||
import traceback
|
||||
|
||||
TOWER_CLI_IMP_ERR = None
|
||||
try:
|
||||
import tower_cli.utils.exceptions as exc
|
||||
from tower_cli.utils import parser
|
||||
|
@ -35,9 +37,10 @@ try:
|
|||
|
||||
HAS_TOWER_CLI = True
|
||||
except ImportError:
|
||||
TOWER_CLI_IMP_ERR = traceback.format_exc()
|
||||
HAS_TOWER_CLI = False
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
||||
|
||||
|
||||
def tower_auth_config(module):
|
||||
|
@ -105,4 +108,5 @@ class TowerModule(AnsibleModule):
|
|||
super(TowerModule, self).__init__(argument_spec=args, **kwargs)
|
||||
|
||||
if not HAS_TOWER_CLI:
|
||||
self.fail_json(msg='ansible-tower-cli required for this module')
|
||||
self.fail_json(msg=missing_required_lib('ansible-tower-cli'),
|
||||
exception=TOWER_CLI_IMP_ERR)
|
||||
|
|
|
@ -64,7 +64,7 @@ import traceback
|
|||
from functools import wraps
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.module_utils.ec2 import HAS_BOTO3, camel_dict_to_snake_dict, ec2_argument_spec, boto3_conn, get_aws_connection_info
|
||||
|
||||
|
@ -114,7 +114,7 @@ class AnsibleAWSModule(object):
|
|||
|
||||
if local_settings["check_boto3"] and not HAS_BOTO3:
|
||||
self._module.fail_json(
|
||||
msg='Python modules "botocore" or "boto3" are missing, please install both')
|
||||
msg=missing_required_lib('botocore or boto3'))
|
||||
|
||||
self.check_mode = self._module.check_mode
|
||||
self._diff = self._module._diff
|
||||
|
|
|
@ -13,7 +13,7 @@ import json
|
|||
|
||||
from os.path import expanduser
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
||||
from ansible.module_utils.ansible_release import __version__ as ANSIBLE_VERSION
|
||||
from ansible.module_utils.six.moves import configparser
|
||||
import ansible.module_utils.six.moves.urllib.parse as urlparse
|
||||
|
@ -99,6 +99,7 @@ AZURE_FAILED_STATE = "Failed"
|
|||
HAS_AZURE = True
|
||||
HAS_AZURE_EXC = None
|
||||
HAS_AZURE_CLI_CORE = True
|
||||
HAS_AZURE_CLI_CORE_EXC = None
|
||||
|
||||
HAS_MSRESTAZURE = True
|
||||
HAS_MSRESTAZURE_EXC = None
|
||||
|
@ -114,16 +115,16 @@ try:
|
|||
from packaging.version import Version
|
||||
HAS_PACKAGING_VERSION = True
|
||||
HAS_PACKAGING_VERSION_EXC = None
|
||||
except ImportError as exc:
|
||||
except ImportError:
|
||||
Version = None
|
||||
HAS_PACKAGING_VERSION = False
|
||||
HAS_PACKAGING_VERSION_EXC = exc
|
||||
HAS_PACKAGING_VERSION_EXC = traceback.format_exc()
|
||||
|
||||
# NB: packaging issue sometimes cause msrestazure not to be installed, check it separately
|
||||
try:
|
||||
from msrest.serialization import Serializer
|
||||
except ImportError as exc:
|
||||
HAS_MSRESTAZURE_EXC = exc
|
||||
except ImportError:
|
||||
HAS_MSRESTAZURE_EXC = traceback.format_exc()
|
||||
HAS_MSRESTAZURE = False
|
||||
|
||||
try:
|
||||
|
@ -161,7 +162,7 @@ try:
|
|||
from azure.mgmt.containerregistry import ContainerRegistryManagementClient
|
||||
from azure.mgmt.containerinstance import ContainerInstanceManagementClient
|
||||
except ImportError as exc:
|
||||
HAS_AZURE_EXC = exc
|
||||
HAS_AZURE_EXC = traceback.format_exc()
|
||||
HAS_AZURE = False
|
||||
|
||||
try:
|
||||
|
@ -170,6 +171,7 @@ try:
|
|||
from azure.common.cloud import get_cli_active_cloud
|
||||
except ImportError:
|
||||
HAS_AZURE_CLI_CORE = False
|
||||
HAS_AZURE_CLI_CORE_EXC = None
|
||||
CLIError = Exception
|
||||
|
||||
|
||||
|
@ -266,16 +268,16 @@ class AzureRMModuleBase(object):
|
|||
required_if=merged_required_if)
|
||||
|
||||
if not HAS_PACKAGING_VERSION:
|
||||
self.fail("Do you have packaging installed? Try `pip install packaging`"
|
||||
"- {0}".format(HAS_PACKAGING_VERSION_EXC))
|
||||
self.fail(msg=missing_required_lib('packaging'),
|
||||
exception=HAS_PACKAGING_VERSION_EXC)
|
||||
|
||||
if not HAS_MSRESTAZURE:
|
||||
self.fail("Do you have msrestazure installed? Try `pip install msrestazure`"
|
||||
"- {0}".format(HAS_MSRESTAZURE_EXC))
|
||||
self.fail(msg=missing_required_lib('msrestazure'),
|
||||
exception=HAS_MSRESTAZURE_EXC)
|
||||
|
||||
if not HAS_AZURE:
|
||||
self.fail("Do you have azure>={1} installed? Try `pip install ansible[azure]`"
|
||||
"- {0}".format(HAS_AZURE_EXC, AZURE_MIN_RELEASE))
|
||||
self.fail(msg=missing_required_lib('ansible[azure] (azure >= {0})'.format(AZURE_MIN_RELEASE)),
|
||||
exception=HAS_AZURE_EXC)
|
||||
|
||||
self._network_client = None
|
||||
self._storage_client = None
|
||||
|
@ -1146,7 +1148,8 @@ class AzureRMAuth(object):
|
|||
|
||||
if auth_source == 'cli':
|
||||
if not HAS_AZURE_CLI_CORE:
|
||||
self.fail("Azure auth_source is `cli`, but azure-cli package is not available. Try `pip install azure-cli --upgrade`")
|
||||
self.fail(msg=missing_required_lib('azure-cli', reason='for `cli` auth_source'),
|
||||
exception=HAS_AZURE_CLI_CORE_EXC)
|
||||
try:
|
||||
self.log('Retrieving credentials from Azure CLI profile')
|
||||
cli_credentials = self._get_azure_cli_credentials()
|
||||
|
|
|
@ -729,11 +729,13 @@ def jsonify(data, **kwargs):
|
|||
raise UnicodeError('Invalid unicode encoding encountered')
|
||||
|
||||
|
||||
def missing_required_lib(library, reason=None):
|
||||
def missing_required_lib(library, reason=None, url=None):
|
||||
hostname = platform.node()
|
||||
msg = "Failed to import the required Python library (%s) on %s's Python %s." % (library, hostname, sys.executable)
|
||||
if reason:
|
||||
msg += " This is required %s." % reason
|
||||
if url:
|
||||
msg += " See %s for more info." % url
|
||||
|
||||
return msg + " Please read module documentation and install in the appropriate location"
|
||||
|
||||
|
|
|
@ -9,13 +9,17 @@ __metaclass__ = type
|
|||
import os
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
|
||||
from ansible.module_utils._text import to_text, to_native
|
||||
from ansible.module_utils.basic import missing_required_lib
|
||||
|
||||
CS_IMP_ERR = None
|
||||
try:
|
||||
from cs import CloudStack, CloudStackException, read_config
|
||||
HAS_LIB_CS = True
|
||||
except ImportError:
|
||||
CS_IMP_ERR = traceback.format_exc()
|
||||
HAS_LIB_CS = False
|
||||
|
||||
CS_HYPERVISORS = [
|
||||
|
@ -53,7 +57,7 @@ class AnsibleCloudStack:
|
|||
|
||||
def __init__(self, module):
|
||||
if not HAS_LIB_CS:
|
||||
module.fail_json(msg="python library cs required: pip install cs")
|
||||
module.fail_json(msg=missing_required_lib('cs'), exception=CS_IMP_ERR)
|
||||
|
||||
self.result = {
|
||||
'changed': False,
|
||||
|
|
|
@ -24,12 +24,14 @@
|
|||
|
||||
import os
|
||||
import re
|
||||
import traceback
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
||||
from ansible.module_utils.six.moves import configparser
|
||||
from os.path import expanduser
|
||||
from uuid import UUID
|
||||
|
||||
LIBCLOUD_IMP_ERR = None
|
||||
try:
|
||||
from libcloud.common.dimensiondata import API_ENDPOINTS, DimensionDataAPIException, DimensionDataStatus
|
||||
from libcloud.compute.base import Node, NodeLocation
|
||||
|
@ -40,6 +42,7 @@ try:
|
|||
|
||||
HAS_LIBCLOUD = True
|
||||
except ImportError:
|
||||
LIBCLOUD_IMP_ERR = traceback.format_exc()
|
||||
HAS_LIBCLOUD = False
|
||||
|
||||
# MCP 2.x version patten for location (datacenter) names.
|
||||
|
@ -69,7 +72,7 @@ class DimensionDataModule(object):
|
|||
self.module = module
|
||||
|
||||
if not HAS_LIBCLOUD:
|
||||
self.module.fail_json(msg='libcloud is required for this module.')
|
||||
self.module.fail_json(msg=missing_required_lib('libcloud'), exception=LIBCLOUD_IMP_ERR)
|
||||
|
||||
# Credentials are common to all Dimension Data modules.
|
||||
credentials = self.get_credentials()
|
||||
|
|
|
@ -28,8 +28,10 @@
|
|||
|
||||
import os
|
||||
import re
|
||||
import traceback
|
||||
|
||||
from ansible.module_utils.ansible_release import __version__
|
||||
from ansible.module_utils.basic import missing_required_lib
|
||||
from ansible.module_utils._text import to_native, to_text
|
||||
from ansible.module_utils.cloud import CloudRetry
|
||||
from ansible.module_utils.six import string_types, binary_type, text_type
|
||||
|
@ -38,18 +40,22 @@ from ansible.module_utils.common.dict_transformations import (
|
|||
_camel_to_snake, _snake_to_camel,
|
||||
)
|
||||
|
||||
BOTO_IMP_ERR = None
|
||||
try:
|
||||
import boto
|
||||
import boto.ec2 # boto does weird import stuff
|
||||
HAS_BOTO = True
|
||||
except ImportError:
|
||||
BOTO_IMP_ERR = traceback.format_exc()
|
||||
HAS_BOTO = False
|
||||
|
||||
BOTO3_IMP_ERR = None
|
||||
try:
|
||||
import boto3
|
||||
import botocore
|
||||
HAS_BOTO3 = True
|
||||
except Exception:
|
||||
BOTO3_IMP_ERR = traceback.format_exc()
|
||||
HAS_BOTO3 = False
|
||||
|
||||
try:
|
||||
|
@ -253,7 +259,7 @@ def get_aws_connection_info(module, boto3=False):
|
|||
if not region:
|
||||
region = boto.config.get('Boto', 'ec2_region')
|
||||
else:
|
||||
module.fail_json(msg="boto is required for this module. Please install boto and try again")
|
||||
module.fail_json(msg=missing_required_lib('boto'), exception=BOTO_IMP_ERR)
|
||||
elif HAS_BOTO3:
|
||||
# here we don't need to make an additional call, will default to 'us-east-1' if the below evaluates to None.
|
||||
try:
|
||||
|
@ -261,7 +267,7 @@ def get_aws_connection_info(module, boto3=False):
|
|||
except botocore.exceptions.ProfileNotFound as e:
|
||||
pass
|
||||
else:
|
||||
module.fail_json(msg="Boto3 is required for this module. Please install boto3 and try again")
|
||||
module.fail_json(msg=missing_required_lib('boto3'), exception=BOTO3_IMP_ERR)
|
||||
|
||||
if not security_token:
|
||||
if os.environ.get('AWS_SECURITY_TOKEN'):
|
||||
|
|
|
@ -4,14 +4,17 @@
|
|||
from __future__ import absolute_import, division, print_function
|
||||
__metaclass__ = type
|
||||
|
||||
from ansible.module_utils.basic import env_fallback
|
||||
import traceback
|
||||
|
||||
from ansible.module_utils.basic import env_fallback, missing_required_lib
|
||||
|
||||
HAS_HEROKU = False
|
||||
HEROKU_IMP_ERR = None
|
||||
try:
|
||||
import heroku3
|
||||
HAS_HEROKU = True
|
||||
except ImportError:
|
||||
pass
|
||||
HEROKU_IMP_ERR = traceback.format_exc()
|
||||
|
||||
|
||||
class HerokuHelper():
|
||||
|
@ -22,7 +25,7 @@ class HerokuHelper():
|
|||
|
||||
def check_lib(self):
|
||||
if not HAS_HEROKU:
|
||||
self.module.fail_json(msg='heroku3 library required for this module (pip install heroku3)')
|
||||
self.module.fail_json(msg=missing_required_lib('heroku3'), exception=HEROKU_IMP_ERR)
|
||||
|
||||
@staticmethod
|
||||
def heroku_argument_spec():
|
||||
|
|
|
@ -6,13 +6,18 @@
|
|||
from __future__ import absolute_import, division, print_function
|
||||
__metaclass__ = type
|
||||
|
||||
import traceback
|
||||
|
||||
from functools import wraps
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.module_utils.basic import missing_required_lib
|
||||
|
||||
PYXCLI_INSTALLED = True
|
||||
PYXCLI_IMP_ERR = None
|
||||
try:
|
||||
from pyxcli import client, errors
|
||||
except ImportError:
|
||||
PYXCLI_IMP_ERR = traceback.format_exc()
|
||||
PYXCLI_INSTALLED = False
|
||||
|
||||
AVAILABLE_PYXCLI_FIELDS = ['pool', 'size', 'snapshot_size',
|
||||
|
@ -83,6 +88,5 @@ def build_pyxcli_command(fields):
|
|||
|
||||
def is_pyxcli_installed(module):
|
||||
if not PYXCLI_INSTALLED:
|
||||
module.fail_json(
|
||||
msg='pyxcli is required, use \'pip install pyxcli\' '
|
||||
'in order to install it.')
|
||||
module.fail_json(msg=missing_required_lib('pyxcli'),
|
||||
exception=PYXCLI_IMP_ERR)
|
||||
|
|
|
@ -15,14 +15,17 @@
|
|||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import traceback
|
||||
|
||||
PYVCLOUD_IMP_ERR = None
|
||||
try:
|
||||
from pyvcloud.vcloudair import VCA
|
||||
HAS_PYVCLOUD = True
|
||||
except ImportError:
|
||||
PYVCLOUD_IMP_ERR = traceback.format_exc()
|
||||
HAS_PYVCLOUD = False
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
||||
|
||||
SERVICE_MAP = {'vca': 'ondemand', 'vchs': 'subscription', 'vcd': 'vcd'}
|
||||
LOGIN_HOST = {'vca': 'vca.vmware.com', 'vchs': 'vchs.vmware.com'}
|
||||
|
@ -64,7 +67,8 @@ class VcaAnsibleModule(AnsibleModule):
|
|||
super(VcaAnsibleModule, self).__init__(*args, **kwargs)
|
||||
|
||||
if not HAS_PYVCLOUD:
|
||||
self.fail("python module pyvcloud is required for this module")
|
||||
self.fail(missing_required_lib('pyvcloud'),
|
||||
exception=PYVCLOUD_IMP_ERR)
|
||||
|
||||
self._vca = self.create_instance()
|
||||
self.login()
|
||||
|
@ -212,7 +216,8 @@ VCD_REQ_ARGS = []
|
|||
|
||||
def _validate_module(module):
|
||||
if not HAS_PYVCLOUD:
|
||||
module.fail_json(msg="python module pyvcloud is needed for this module")
|
||||
module.fail_json(msg=missing_required_lib("pyvcloud"),
|
||||
exception=PYVCLOUD_IMP_ERR)
|
||||
|
||||
service_type = module.params.get('service_type', DEFAULT_SERVICE_TYPE)
|
||||
|
||||
|
|
|
@ -11,25 +11,30 @@ import os
|
|||
import re
|
||||
import ssl
|
||||
import time
|
||||
import traceback
|
||||
from random import randint
|
||||
|
||||
REQUESTS_IMP_ERR = None
|
||||
try:
|
||||
# requests is required for exception handling of the ConnectionError
|
||||
import requests
|
||||
HAS_REQUESTS = True
|
||||
except ImportError:
|
||||
REQUESTS_IMP_ERR = traceback.format_exc()
|
||||
HAS_REQUESTS = False
|
||||
|
||||
PYVMOMI_IMP_ERR = None
|
||||
try:
|
||||
from pyVim import connect
|
||||
from pyVmomi import vim, vmodl
|
||||
HAS_PYVMOMI = True
|
||||
except ImportError:
|
||||
PYVMOMI_IMP_ERR = traceback.format_exc()
|
||||
HAS_PYVMOMI = False
|
||||
|
||||
from ansible.module_utils._text import to_text, to_native
|
||||
from ansible.module_utils.six import integer_types, iteritems, string_types, raise_from
|
||||
from ansible.module_utils.basic import env_fallback
|
||||
from ansible.module_utils.basic import env_fallback, missing_required_lib
|
||||
|
||||
|
||||
class TaskError(Exception):
|
||||
|
@ -776,11 +781,12 @@ class PyVmomi(object):
|
|||
Constructor
|
||||
"""
|
||||
if not HAS_REQUESTS:
|
||||
module.fail_json(msg="Unable to find 'requests' Python library which is required."
|
||||
" Please install using 'pip install requests'")
|
||||
module.fail_json(msg=missing_required_lib('requests'),
|
||||
exception=REQUESTS_IMP_ERR)
|
||||
|
||||
if not HAS_PYVMOMI:
|
||||
module.fail_json(msg='PyVmomi Python module required. Install using "pip install PyVmomi"')
|
||||
module.fail_json(msg=missing_required_lib('PyVmomi'),
|
||||
exception=PYVMOMI_IMP_ERR)
|
||||
|
||||
self.module = module
|
||||
self.params = module.params
|
||||
|
|
|
@ -6,19 +6,26 @@
|
|||
from __future__ import absolute_import, division, print_function
|
||||
__metaclass__ = type
|
||||
|
||||
import traceback
|
||||
|
||||
REQUESTS_IMP_ERR = None
|
||||
try:
|
||||
import requests
|
||||
HAS_REQUESTS = True
|
||||
except ImportError:
|
||||
REQUESTS_IMP_ERR = traceback.format_exc()
|
||||
HAS_REQUESTS = False
|
||||
|
||||
PYVMOMI_IMP_ERR = None
|
||||
try:
|
||||
from pyVim import connect
|
||||
from pyVmomi import vim, vmodl
|
||||
HAS_PYVMOMI = True
|
||||
except ImportError:
|
||||
PYVMOMI_IMP_ERR = traceback.format_exc()
|
||||
HAS_PYVMOMI = False
|
||||
|
||||
VCLOUD_IMP_ERR = None
|
||||
try:
|
||||
from vmware.vapi.lib.connect import get_requests_connector
|
||||
from vmware.vapi.security.session import create_session_security_context
|
||||
|
@ -27,16 +34,19 @@ try:
|
|||
from com.vmware.vapi.std_client import DynamicID
|
||||
HAS_VCLOUD = True
|
||||
except ImportError:
|
||||
VCLOUD_IMP_ERR = traceback.format_exc()
|
||||
HAS_VCLOUD = False
|
||||
|
||||
VSPHERE_IMP_ERR = None
|
||||
try:
|
||||
from vmware.vapi.stdlib.client.factories import StubConfigurationFactory
|
||||
HAS_VSPHERE = True
|
||||
except ImportError:
|
||||
VSPHERE_IMP_ERR = traceback.format_exc()
|
||||
HAS_VSPHERE = False
|
||||
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.module_utils.basic import env_fallback
|
||||
from ansible.module_utils.basic import env_fallback, missing_required_lib
|
||||
|
||||
|
||||
class VmwareRestClient(object):
|
||||
|
@ -56,18 +66,21 @@ class VmwareRestClient(object):
|
|||
|
||||
"""
|
||||
if not HAS_REQUESTS:
|
||||
self.module.fail_json(msg="Unable to find 'requests' Python library which is required."
|
||||
" Please install using 'pip install requests'")
|
||||
self.module.fail_json(msg=missing_required_lib('requests'),
|
||||
exception=REQUESTS_IMP_ERR)
|
||||
if not HAS_PYVMOMI:
|
||||
self.module.fail_json(msg="PyVmomi Python module required. Install using 'pip install PyVmomi'")
|
||||
self.module.fail_json(msg=missing_required_lib('PyVmomi'),
|
||||
exception=PYVMOMI_IMP_ERR)
|
||||
if not HAS_VSPHERE:
|
||||
self.module.fail_json(msg="Unable to find 'vSphere Automation SDK' Python library which is required."
|
||||
" Please refer this URL for installation steps"
|
||||
" - https://code.vmware.com/web/sdk/65/vsphere-automation-python")
|
||||
self.module.fail_json(
|
||||
msg=missing_required_lib('vSphere Automation SDK',
|
||||
url='https://code.vmware.com/web/sdk/65/vsphere-automation-python'),
|
||||
exception=VSPHERE_IMP_ERR)
|
||||
if not HAS_VCLOUD:
|
||||
self.module.fail_json(msg="Unable to find 'vCloud Suite SDK' Python library which is required."
|
||||
" Please refer this URL for installation steps"
|
||||
" - https://code.vmware.com/web/sdk/60/vcloudsuite-python")
|
||||
self.module.fail_json(
|
||||
msg=missing_required_lib('vCloud Suite SDK',
|
||||
url='https://code.vmware.com/web/sdk/60/vcloudsuite-python'),
|
||||
exception=VCLOUD_IMP_ERR)
|
||||
|
||||
def connect_to_rest(self):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue