summaryrefslogtreecommitdiff
path: root/lib/ansible/module_utils/hwc_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/module_utils/hwc_utils.py')
-rw-r--r--lib/ansible/module_utils/hwc_utils.py438
1 files changed, 0 insertions, 438 deletions
diff --git a/lib/ansible/module_utils/hwc_utils.py b/lib/ansible/module_utils/hwc_utils.py
deleted file mode 100644
index 52b5cb5cf8..0000000000
--- a/lib/ansible/module_utils/hwc_utils.py
+++ /dev/null
@@ -1,438 +0,0 @@
-# Copyright (c), Google Inc, 2017
-# Simplified BSD License (see licenses/simplified_bsd.txt or
-# https://opensource.org/licenses/BSD-2-Clause)
-
-import re
-import time
-import traceback
-
-THIRD_LIBRARIES_IMP_ERR = None
-try:
- from keystoneauth1.adapter import Adapter
- from keystoneauth1.identity import v3
- from keystoneauth1 import session
- HAS_THIRD_LIBRARIES = True
-except ImportError:
- THIRD_LIBRARIES_IMP_ERR = traceback.format_exc()
- HAS_THIRD_LIBRARIES = False
-
-from ansible.module_utils.basic import (AnsibleModule, env_fallback,
- missing_required_lib)
-from ansible.module_utils._text import to_text
-
-
-class HwcModuleException(Exception):
- def __init__(self, message):
- super(HwcModuleException, self).__init__()
-
- self._message = message
-
- def __str__(self):
- return "[HwcClientException] message=%s" % self._message
-
-
-class HwcClientException(Exception):
- def __init__(self, code, message):
- super(HwcClientException, self).__init__()
-
- self._code = code
- self._message = message
-
- def __str__(self):
- msg = " code=%s," % str(self._code) if self._code != 0 else ""
- return "[HwcClientException]%s message=%s" % (
- msg, self._message)
-
-
-class HwcClientException404(HwcClientException):
- def __init__(self, message):
- super(HwcClientException404, self).__init__(404, message)
-
- def __str__(self):
- return "[HwcClientException404] message=%s" % self._message
-
-
-def session_method_wrapper(f):
- def _wrap(self, url, *args, **kwargs):
- try:
- url = self.endpoint + url
- r = f(self, url, *args, **kwargs)
- except Exception as ex:
- raise HwcClientException(
- 0, "Sending request failed, error=%s" % ex)
-
- result = None
- if r.content:
- try:
- result = r.json()
- except Exception as ex:
- raise HwcClientException(
- 0, "Parsing response to json failed, error: %s" % ex)
-
- code = r.status_code
- if code not in [200, 201, 202, 203, 204, 205, 206, 207, 208, 226]:
- msg = ""
- for i in ['message', 'error.message']:
- try:
- msg = navigate_value(result, i)
- break
- except Exception:
- pass
- else:
- msg = str(result)
-
- if code == 404:
- raise HwcClientException404(msg)
-
- raise HwcClientException(code, msg)
-
- return result
-
- return _wrap
-
-
-class _ServiceClient(object):
- def __init__(self, client, endpoint, product):
- self._client = client
- self._endpoint = endpoint
- self._default_header = {
- 'User-Agent': "Huawei-Ansible-MM-%s" % product,
- 'Accept': 'application/json',
- }
-
- @property
- def endpoint(self):
- return self._endpoint
-
- @endpoint.setter
- def endpoint(self, e):
- self._endpoint = e
-
- @session_method_wrapper
- def get(self, url, body=None, header=None, timeout=None):
- return self._client.get(url, json=body, timeout=timeout,
- headers=self._header(header))
-
- @session_method_wrapper
- def post(self, url, body=None, header=None, timeout=None):
- return self._client.post(url, json=body, timeout=timeout,
- headers=self._header(header))
-
- @session_method_wrapper
- def delete(self, url, body=None, header=None, timeout=None):
- return self._client.delete(url, json=body, timeout=timeout,
- headers=self._header(header))
-
- @session_method_wrapper
- def put(self, url, body=None, header=None, timeout=None):
- return self._client.put(url, json=body, timeout=timeout,
- headers=self._header(header))
-
- def _header(self, header):
- if header and isinstance(header, dict):
- for k, v in self._default_header.items():
- if k not in header:
- header[k] = v
- else:
- header = self._default_header
-
- return header
-
-
-class Config(object):
- def __init__(self, module, product):
- self._project_client = None
- self._domain_client = None
- self._module = module
- self._product = product
- self._endpoints = {}
-
- self._validate()
- self._gen_provider_client()
-
- @property
- def module(self):
- return self._module
-
- def client(self, region, service_type, service_level):
- c = self._project_client
- if service_level == "domain":
- c = self._domain_client
-
- e = self._get_service_endpoint(c, service_type, region)
-
- return _ServiceClient(c, e, self._product)
-
- def _gen_provider_client(self):
- m = self._module
- p = {
- "auth_url": m.params['identity_endpoint'],
- "password": m.params['password'],
- "username": m.params['user'],
- "project_name": m.params['project'],
- "user_domain_name": m.params['domain'],
- "reauthenticate": True
- }
-
- self._project_client = Adapter(
- session.Session(auth=v3.Password(**p)),
- raise_exc=False)
-
- p.pop("project_name")
- self._domain_client = Adapter(
- session.Session(auth=v3.Password(**p)),
- raise_exc=False)
-
- def _get_service_endpoint(self, client, service_type, region):
- k = "%s.%s" % (service_type, region if region else "")
-
- if k in self._endpoints:
- return self._endpoints.get(k)
-
- url = None
- try:
- url = client.get_endpoint(service_type=service_type,
- region_name=region, interface="public")
- except Exception as ex:
- raise HwcClientException(
- 0, "Getting endpoint failed, error=%s" % ex)
-
- if url == "":
- raise HwcClientException(
- 0, "Can not find the enpoint for %s" % service_type)
-
- if url[-1] != "/":
- url += "/"
-
- self._endpoints[k] = url
- return url
-
- def _validate(self):
- if not HAS_THIRD_LIBRARIES:
- self.module.fail_json(
- msg=missing_required_lib('keystoneauth1'),
- exception=THIRD_LIBRARIES_IMP_ERR)
-
-
-class HwcModule(AnsibleModule):
- def __init__(self, *args, **kwargs):
- arg_spec = kwargs.setdefault('argument_spec', {})
-
- arg_spec.update(
- dict(
- identity_endpoint=dict(
- required=True, type='str',
- fallback=(env_fallback, ['ANSIBLE_HWC_IDENTITY_ENDPOINT']),
- ),
- user=dict(
- required=True, type='str',
- fallback=(env_fallback, ['ANSIBLE_HWC_USER']),
- ),
- password=dict(
- required=True, type='str', no_log=True,
- fallback=(env_fallback, ['ANSIBLE_HWC_PASSWORD']),
- ),
- domain=dict(
- required=True, type='str',
- fallback=(env_fallback, ['ANSIBLE_HWC_DOMAIN']),
- ),
- project=dict(
- required=True, type='str',
- fallback=(env_fallback, ['ANSIBLE_HWC_PROJECT']),
- ),
- region=dict(
- type='str',
- fallback=(env_fallback, ['ANSIBLE_HWC_REGION']),
- ),
- id=dict(type='str')
- )
- )
-
- super(HwcModule, self).__init__(*args, **kwargs)
-
-
-class _DictComparison(object):
- ''' This class takes in two dictionaries `a` and `b`.
- These are dictionaries of arbitrary depth, but made up of standard
- Python types only.
- This differ will compare all values in `a` to those in `b`.
- If value in `a` is None, always returns True, indicating
- this value is no need to compare.
- Note: On all lists, order does matter.
- '''
-
- def __init__(self, request):
- self.request = request
-
- def __eq__(self, other):
- return self._compare_dicts(self.request, other.request)
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def _compare_dicts(self, dict1, dict2):
- if dict1 is None:
- return True
-
- if set(dict1.keys()) != set(dict2.keys()):
- return False
-
- for k in dict1:
- if not self._compare_value(dict1.get(k), dict2.get(k)):
- return False
-
- return True
-
- def _compare_lists(self, list1, list2):
- """Takes in two lists and compares them."""
- if list1 is None:
- return True
-
- if len(list1) != len(list2):
- return False
-
- for i in range(len(list1)):
- if not self._compare_value(list1[i], list2[i]):
- return False
-
- return True
-
- def _compare_value(self, value1, value2):
- """
- return: True: value1 is same as value2, otherwise False.
- """
- if value1 is None:
- return True
-
- if not (value1 and value2):
- return (not value1) and (not value2)
-
- # Can assume non-None types at this point.
- if isinstance(value1, list) and isinstance(value2, list):
- return self._compare_lists(value1, value2)
-
- elif isinstance(value1, dict) and isinstance(value2, dict):
- return self._compare_dicts(value1, value2)
-
- # Always use to_text values to avoid unicode issues.
- return (to_text(value1, errors='surrogate_or_strict') == to_text(
- value2, errors='surrogate_or_strict'))
-
-
-def wait_to_finish(target, pending, refresh, timeout, min_interval=1, delay=3):
- is_last_time = False
- not_found_times = 0
- wait = 0
-
- time.sleep(delay)
-
- end = time.time() + timeout
- while not is_last_time:
- if time.time() > end:
- is_last_time = True
-
- obj, status = refresh()
-
- if obj is None:
- not_found_times += 1
-
- if not_found_times > 10:
- raise HwcModuleException(
- "not found the object for %d times" % not_found_times)
- else:
- not_found_times = 0
-
- if status in target:
- return obj
-
- if pending and status not in pending:
- raise HwcModuleException(
- "unexpect status(%s) occured" % status)
-
- if not is_last_time:
- wait *= 2
- if wait < min_interval:
- wait = min_interval
- elif wait > 10:
- wait = 10
-
- time.sleep(wait)
-
- raise HwcModuleException("asycn wait timeout after %d seconds" % timeout)
-
-
-def navigate_value(data, index, array_index=None):
- if array_index and (not isinstance(array_index, dict)):
- raise HwcModuleException("array_index must be dict")
-
- d = data
- for n in range(len(index)):
- if d is None:
- return None
-
- if not isinstance(d, dict):
- raise HwcModuleException(
- "can't navigate value from a non-dict object")
-
- i = index[n]
- if i not in d:
- raise HwcModuleException(
- "navigate value failed: key(%s) is not exist in dict" % i)
- d = d[i]
-
- if not array_index:
- continue
-
- k = ".".join(index[: (n + 1)])
- if k not in array_index:
- continue
-
- if d is None:
- return None
-
- if not isinstance(d, list):
- raise HwcModuleException(
- "can't navigate value from a non-list object")
-
- j = array_index.get(k)
- if j >= len(d):
- raise HwcModuleException(
- "navigate value failed: the index is out of list")
- d = d[j]
-
- return d
-
-
-def build_path(module, path, kv=None):
- if kv is None:
- kv = dict()
-
- v = {}
- for p in re.findall(r"{[^/]*}", path):
- n = p[1:][:-1]
-
- if n in kv:
- v[n] = str(kv[n])
-
- else:
- if n in module.params:
- v[n] = str(module.params.get(n))
- else:
- v[n] = ""
-
- return path.format(**v)
-
-
-def get_region(module):
- if module.params['region']:
- return module.params['region']
-
- return module.params['project'].split("_")[0]
-
-
-def is_empty_value(v):
- return (not v)
-
-
-def are_different_dicts(dict1, dict2):
- return _DictComparison(dict1) != _DictComparison(dict2)