blob: aaed6fd0a86aef0d05c714cc2315277042e23f4d [file] [log] [blame]
# -*- coding: utf-8 -*-
import logging
import time
import functools
LOG = logging.getLogger(__name__)
# Import third party libs
HAS_CINDER = False
try:
from cinderclient.client import Client
HAS_CINDER = True
except ImportError:
pass
__opts__ = {}
def __virtual__():
"""
Only load this module if cinder
is installed on this minion.
"""
if HAS_CINDER:
return 'cinderng'
return False
def _authng(profile=None):
"""
Set up cinder credentials
"""
credentials = {
'username': profile['user'],
'password': profile['password'],
'project_id': profile['project_id'],
'auth_url': "{}://{}:{}/{}".format(
profile['protocol'],
profile['host'],
profile['port'],
profile.get('api_version', 'v3')
),
'endpoint_type': profile['endpoint_type'],
'certificate': profile['certificate'],
'region_name': profile['region_name'],
'retries': profile.get('retries', 5)
}
return credentials
def retries(func):
@functools.wraps(func)
def func_wrapper(*args, **kwargs):
retries = kwargs.get('retries', 5)
timeout = kwargs.get('timeout', 5)
res = None
for i in range(retries):
try:
return func(*args, **kwargs)
except Exception as e:
if i == retries - 1:
raise e
else:
time.sleep(timeout)
return func_wrapper
def create_conn(cred=None):
"""
create connection
"""
nt = Client(
'2',
username=cred['username'],
api_key=cred['password'],
project_id=cred['project_id'],
auth_url=cred['auth_url'],
endpoint_type=cred['endpoint_type'],
cacert=cred['certificate'],
region_name=cred['region_name'],
retries=cred['retries']
)
return nt
@retries
def list_volumes(profile=None, **kwargs):
"""
Return list of cinder volumes.
"""
cred = _authng(profile)
nt = create_conn(cred)
return nt.volumes.list()
@retries
def list_volume_type(profile=None, **kwargs):
"""
Return list of volume types
"""
cred = _authng(profile)
nt = create_conn(cred)
return nt.volume_types.list()
@retries
def get_volume_type(type_name, profile=None, **kwargs):
"""
Returns id of the specified volume type name
"""
vt_id = None
vt_list = list_volume_type(profile)
for vt in vt_list:
if vt.name == type_name:
vt_id = vt.id
if vt_id:
cred = _authng(profile)
nt = create_conn(cred)
try:
vt = nt.volume_types.get(vt_id)
return vt
except:
return
else:
return
@retries
def create_volume_type(type_name, profile=None, **kwargs):
"""
Create cinder volume type
"""
vt = get_volume_type(type_name, profile)
if not vt:
cred = _authng(profile)
nt = create_conn(cred)
try:
nt.volume_types.create(type_name)
return 'created'
except:
return 'failed'
else:
return 'exists'
@retries
def get_keys_volume_type(type_name, profile=None, **kwargs):
"""
Return extra specs of the specified volume type.
"""
vt = get_volume_type(type_name, profile)
if vt:
try:
return vt.get_keys()
except:
return 'failed'
else:
return
@retries
def set_keys_volume_type(type_name, keys={}, profile=None, **kwargs):
"""
Set extra specs of the specified volume type.
"""
set_keys = False
vt = get_volume_type(type_name, profile)
if vt:
k = get_keys_volume_type(type_name, profile)
if not k:
set_keys = True
elif k:
for key in keys:
if k.get(key) != keys[key]:
set_keys = True
elif len(k) != len(keys):
set_keys = True
else:
return
if set_keys:
try:
vt.set_keys(keys)
return 'updated'
except:
return 'failed'
else:
return 'exist'
else:
return 'not found'