cinder client
Change-Id: I10cf4eaee94154a4acdcf6931d19cbabd3fc1b04
diff --git a/_modules/cinderng.py b/_modules/cinderng.py
new file mode 100644
index 0000000..cd71348
--- /dev/null
+++ b/_modules/cinderng.py
@@ -0,0 +1,144 @@
+# -*- coding: utf-8 -*-
+import logging
+from functools import wraps
+LOG = logging.getLogger(__name__)
+
+# Import third party libs
+HAS_CINDER = False
+try:
+ from cinderclient.v3 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': profile['protocol'] + "://" + profile['host'] + ":" + str(profile['port']) + "/v3",
+ 'endpoint_type': profile['endpoint_type'],
+ 'certificate': profile['certificate'],
+ 'region_name': profile['region_name']
+ }
+ return credentials
+
+def create_conn(cred=None):
+ '''
+ create connection
+ '''
+ nt = client.Client(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'])
+ return nt
+
+def list_volumes(profile=None, **kwargs):
+ '''
+ Return list of cinder volumes.
+ '''
+ cred = _authng(profile)
+ nt = create_conn(cred)
+ return nt.volumes.list()
+
+def list_volume_type(profile=None, **kwargs):
+ '''
+ Return list of volume types
+ '''
+ cred = _authng(profile)
+ nt = create_conn(cred)
+ return nt.volume_types.list()
+
+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
+
+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'
+
+
+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
+
+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'