cinder client

Change-Id: I10cf4eaee94154a4acdcf6931d19cbabd3fc1b04
diff --git a/_states/cinderng.py b/_states/cinderng.py
new file mode 100644
index 0000000..e39a4d0
--- /dev/null
+++ b/_states/cinderng.py
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+'''
+Management of Cinder resources
+===============================
+:depends:   - cinderclient Python module
+'''
+import ast
+import logging
+from functools import wraps
+LOG = logging.getLogger(__name__)
+
+
+def __virtual__():
+    '''
+    Only load if python-cinderclient is present in __salt__
+    '''
+    return 'cinderng'
+
+def volume_type_present(name=None, profile=None):
+    '''
+    Ensures that the specified volume type is present.
+    '''
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Volume type "{0}" already exists'.format(name)}
+    signal = __salt__['cinderng.create_volume_type'](name, profile)
+    if 'exists' in signal:
+        pass
+    elif 'created' in signal:
+        ret['comment'] = 'Volume type {0} has been created'.format(name)
+        ret['changes']['Volume type'] = 'Created'
+    elif 'failed' in signal:
+        ret = {'name': name,
+               'changes': {},
+               'result': False,
+               'comment': 'Volume type "{0}" failed to create'.format(name)}
+    return ret
+
+def volume_type_key_present(name=None, key=None, value=None, profile=None):
+    '''
+    Ensures that the extra specs are present on a volume type.
+    '''
+    keys = "{u'" + key + "': u'" + value + "'}"
+    keys = ast.literal_eval(keys)
+    ret = {'name': name,
+           'changes': {},
+           'result': True,
+           'comment': 'Volume type keys "{0}" in volume type "{1}" already exist'.format(keys, name)}
+    signal = __salt__['cinderng.set_keys_volume_type'](name, keys, profile)
+    if 'exist' in signal:
+        pass
+    elif 'updated' in signal:
+        ret['comment'] = 'Volume type keys "{0}" in volume type "{1}" have been updated'.format(keys, name)
+        ret['changes']['Volume type keys'] = 'Updated'
+    elif 'failed' in signal:
+        ret = {'name': name,
+               'changes': {},
+               'result': False,
+               'comment': 'Volume type keys "{0}" in volume type "{1}" failed to update'.format(keys, name)}
+    elif 'not found' in signal:
+        ret = {'name': name,
+               'changes': {},
+               'result': False,
+               'comment': 'Volume type "{0}" was not found'.format(name)}
+    return ret
+
+
+def _already_exists(name, resource):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'result': True}
+    changes_dict['comment'] = \
+        '{0} {1} already exists'.format(resource, name)
+    return changes_dict
+
+
+def _created(name, resource, resource_definition):
+    changes_dict = {'name': name,
+                    'changes': resource_definition,
+                    'result': True,
+                    'comment': '{0} {1} created'.format(resource, name)}
+    return changes_dict
+
+def _updated(name, resource, resource_definition):
+    changes_dict = {'name': name,
+                    'changes': resource_definition,
+                    'result': True,
+                    'comment': '{0} {1} tenant was updated'.format(resource, name)}
+    return changes_dict
+
+def _update_failed(name, resource):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'comment': '{0} {1} failed to update'.format(resource, name),
+                    'result': False}
+    return changes_dict
+
+def _no_change(name, resource, test=False):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'result': True}
+    if test:
+        changes_dict['comment'] = \
+            '{0} {1} will be {2}'.format(resource, name, test)
+    else:
+        changes_dict['comment'] = \
+            '{0} {1} is in correct state'.format(resource, name)
+    return changes_dict