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'