Add manila module
This commit adds only two handlers to allow creating and listing the
default share type. It is needed for the basic tests from manila
tempest plugin to pass.
Related-PROD: https://mirantis.jira.com/browse/PROD-18221
Change-Id: I92d04e7d672c2d1f62c723329bf8f36e6483e553
diff --git a/_modules/manilang.py b/_modules/manilang.py
new file mode 100644
index 0000000..633e363
--- /dev/null
+++ b/_modules/manilang.py
@@ -0,0 +1,121 @@
+import logging
+
+
+try:
+ import os_client_config
+ from keystoneauth1 import exceptions as ka_exceptions
+ REQUIREMENTS_MET = True
+except ImportError:
+ REQUIREMENTS_MET = False
+
+
+def __virtual__():
+ """Only load manilang if requirements are available."""
+ if REQUIREMENTS_MET:
+ return 'manilang'
+ else:
+ return False, ("The manilang execution module cannot be loaded: "
+ "os_client_config or keystoneauth are unavailable.")
+
+
+log = logging.getLogger(__name__)
+
+
+class ManilaException(Exception):
+
+ _msg = "Manila module exception occured."
+
+ def __init__(self, message=None, **kwargs):
+ super(ManilaException, self).__init__(message or self._msg)
+
+
+class NoManilaEndpoint(ManilaException):
+ _msg = "Manila endpoint not found in keystone catalog."
+
+
+class NoAuthPluginConfigured(ManilaException):
+ _msg = ("You are using keystoneauth auth plugin that does not support "
+ "fetching endpoint list from token (noauth or admin_token).")
+
+
+class NoCredentials(ManilaException):
+ _msg = "Please provide cloud name present in clouds.yaml."
+
+
+def _get_raw_client(cloud_name):
+ service_type = 'sharev2'
+ adapter = os_client_config.make_rest_client(service_type,
+ cloud=cloud_name)
+ try:
+ access_info = adapter.session.auth.get_access(adapter.session)
+ endpoints = access_info.service_catalog.get_endpoints()
+ except (AttributeError, ValueError):
+ e = NoAuthPluginConfigured()
+ log.error('%s' % e)
+ raise e
+ if service_type not in endpoints:
+ service_type = None
+ for possible_type in ('share', 'shared-file-system'):
+ if possible_type in endpoints:
+ service_type = possible_type
+ break
+ if not service_type:
+ e = NoManilaEndpoint()
+ log.error('%s' % e)
+ raise e
+ adapter = os_client_config.make_rest_client(service_type,
+ cloud=cloud_name)
+ log.debug("Using manila endpoint with type %s." % service_type)
+ return adapter
+
+
+def _add_microversion_header(microversion, headers):
+ if microversion:
+ headers.setdefault('X-OpenStack-Manila-API-Version', microversion)
+
+
+def create_adapter(fun):
+ def inner(*args, **kwargs):
+ headers = kwargs.pop('headers', {})
+ _add_microversion_header(kwargs.get('microversion'), headers)
+ cloud_name = kwargs.get('cloud_name')
+ if not cloud_name:
+ e = NoCredentials()
+ log.error('%s' % e)
+ raise e
+ adapter = _get_raw_client(cloud_name)
+ return fun(*args, adapter=adapter, headers=headers, **kwargs)
+ return inner
+
+
+@create_adapter
+def get_default_share_types(**kwargs):
+ adapter = kwargs.get('adapter')
+ try:
+ response = adapter.get('/types/default',
+ headers=kwargs.get('headers', {}))
+ except ka_exceptions.NotFound:
+ log.debug("No default share type found.")
+ return None
+ return response.json()
+
+
+@create_adapter
+def create_share_type(name, driver_handles_share_servers, extra_specs=None,
+ is_public=True, **kwargs):
+ adapter = kwargs.get('adapter')
+ extra_specs = extra_specs or {}
+ extra_specs['driver_handles_share_servers'] = driver_handles_share_servers
+ post_data = {
+ 'share_type': {
+ 'extra_specs': extra_specs, 'name': name,
+ 'os-share-type-access:is_public': is_public}}
+ # NOTE: passing share_type dictionary in kwargs will override anything
+ # that was constructed from function arguments. Use with caution.
+ # is_public attribute is special, as os-share-type-access:is_public
+ # always overrides share_type_access:is_public, no matter what
+ # microversion used (sic!).
+ post_data['share_type'].update(kwargs.get('share_type', {}))
+ response = adapter.post('/types', json=post_data,
+ headers=kwargs.get('headers', {}))
+ return response.json()['share_type']