blob: a5c7d425480072b07fd728d3a4d9ce89069157d4 [file] [log] [blame]
Jiri Broulik47aa6b32017-07-10 18:39:15 +02001# -*- coding: utf-8 -*-
2import logging
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +03003
Jiri Broulik47aa6b32017-07-10 18:39:15 +02004LOG = logging.getLogger(__name__)
5
6# Import third party libs
7HAS_CINDER = False
8try:
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +03009 from cinderclient.client import Client
Jiri Broulik47aa6b32017-07-10 18:39:15 +020010 HAS_CINDER = True
11except ImportError:
12 pass
13
14__opts__ = {}
15
16
17def __virtual__():
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030018 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020019 Only load this module if cinder
20 is installed on this minion.
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030021 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020022 if HAS_CINDER:
23 return 'cinderng'
24 return False
25
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030026
Jiri Broulik47aa6b32017-07-10 18:39:15 +020027def _authng(profile=None):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030028 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020029 Set up cinder credentials
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030030 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020031 credentials = {
32 'username': profile['user'],
33 'password': profile['password'],
34 'project_id': profile['project_id'],
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030035 'auth_url': "{}://{}:{}/v2.0".format(
36 profile['protocol'],
37 profile['host'],
38 profile['port']
39 ),
Jiri Broulik47aa6b32017-07-10 18:39:15 +020040 'endpoint_type': profile['endpoint_type'],
41 'certificate': profile['certificate'],
42 'region_name': profile['region_name']
43 }
44 return credentials
45
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030046
Jiri Broulik47aa6b32017-07-10 18:39:15 +020047def create_conn(cred=None):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030048 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020049 create connection
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030050 """
51 nt = Client(
52 '2',
53 username=cred['username'],
54 api_key=cred['password'],
55 project_id=cred['project_id'],
56 auth_url=cred['auth_url'],
57 endpoint_type=cred['endpoint_type'],
58 cacert=cred['certificate'],
59 region_name=cred['region_name']
60 )
Jiri Broulik47aa6b32017-07-10 18:39:15 +020061 return nt
62
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030063
Jiri Broulik47aa6b32017-07-10 18:39:15 +020064def list_volumes(profile=None, **kwargs):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030065 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020066 Return list of cinder volumes.
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030067 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020068 cred = _authng(profile)
69 nt = create_conn(cred)
70 return nt.volumes.list()
71
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030072
Jiri Broulik47aa6b32017-07-10 18:39:15 +020073def list_volume_type(profile=None, **kwargs):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030074 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020075 Return list of volume types
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030076 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020077 cred = _authng(profile)
78 nt = create_conn(cred)
79 return nt.volume_types.list()
80
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030081
Jiri Broulik47aa6b32017-07-10 18:39:15 +020082def get_volume_type(type_name, profile=None, **kwargs):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030083 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020084 Returns id of the specified volume type name
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030085 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +020086 vt_id = None
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +030087 vt_list = list_volume_type(profile)
Jiri Broulik47aa6b32017-07-10 18:39:15 +020088 for vt in vt_list:
89 if vt.name == type_name:
90 vt_id = vt.id
91
92 if vt_id:
93 cred = _authng(profile)
94 nt = create_conn(cred)
95 try:
96 vt = nt.volume_types.get(vt_id)
97 return vt
98 except:
99 return
100 else:
101 return
102
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300103
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200104def create_volume_type(type_name, profile=None, **kwargs):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300105 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200106 Create cinder volume type
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300107 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200108 vt = get_volume_type(type_name, profile)
109 if not vt:
110 cred = _authng(profile)
111 nt = create_conn(cred)
112 try:
113 nt.volume_types.create(type_name)
114 return 'created'
115 except:
116 return 'failed'
117 else:
118 return 'exists'
119
120
121def get_keys_volume_type(type_name, profile=None, **kwargs):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300122 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200123 Return extra specs of the specified volume type.
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300124 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200125
126 vt = get_volume_type(type_name, profile)
127 if vt:
128 try:
129 return vt.get_keys()
130 except:
131 return 'failed'
132 else:
133 return
134
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300135
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200136def set_keys_volume_type(type_name, keys={}, profile=None, **kwargs):
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300137 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200138 Set extra specs of the specified volume type.
Denis V. Meltsaykin6b1fa432017-09-18 16:49:53 +0300139 """
Jiri Broulik47aa6b32017-07-10 18:39:15 +0200140 set_keys = False
141 vt = get_volume_type(type_name, profile)
142 if vt:
143 k = get_keys_volume_type(type_name, profile)
144 if not k:
145 set_keys = True
146 elif k:
147 for key in keys:
148 if k.get(key) != keys[key]:
149 set_keys = True
150 elif len(k) != len(keys):
151 set_keys = True
152 else:
153 return
154
155 if set_keys:
156 try:
157 vt.set_keys(keys)
158 return 'updated'
159 except:
160 return 'failed'
161 else:
162 return 'exist'
163 else:
164 return 'not found'