3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 from cmdatahandlers.api import configerror
16 from cmdatahandlers.api import config
19 class Config(config.Config):
20 def __init__(self, confman):
21 super(Config, self).__init__(confman)
22 self.ROOT = 'cloud.storage'
23 self.DOMAIN = 'storage'
30 self._validate_storage_backends()
32 def _validate_storage_backends(self):
33 backends = self.get_storage_backends()
34 for backend in backends:
36 self._validate_ceph_backend()
37 elif backend == 'external_ceph':
38 self._validate_external_ceph_backend()
39 elif backend == 'lvm':
40 self._validate_lvm_backend()
42 raise configerror.ConfigError('Invalid backend %s specified' % backend)
44 def _validate_ceph_backend(self):
45 self.is_ceph_enabled()
46 osdpoolsize = self.get_ceph_osd_pool_size()
48 raise configerror.ConfigError('Invalid osd pool size configured %d' % osdpoolsize)
50 def _validate_external_ceph_backend(self):
51 self.is_external_ceph_enabled()
52 self.get_ext_ceph_fsid()
53 self.get_ext_ceph_mon_hosts()
54 self.get_ext_ceph_ceph_s3_endpoint()
55 self.get_ext_ceph_ceph_s3_keystone_user()
56 self.get_ext_ceph_ceph_s3_keystone_adminpw()
57 self.get_ext_ceph_ceph_user()
58 self.get_ext_ceph_ceph_user_key()
59 self.get_ext_ceph_cinder_pool()
60 self.get_ext_ceph_glance_pool()
61 self.get_ext_ceph_nova_pool()
62 self.get_ext_ceph_platform_pool()
63 self.get_ext_ceph_cidr()
65 def _validate_lvm_backend(self):
68 def _set_hostlist(self, key, value):
71 raise configerror.ConfigError('The host list for {} is empty'.format(key))
72 self.config[self.ROOT][key] = value
74 def get_storage_backends(self):
75 """ get the list of backends
79 A list of backend names
83 ConfigError in-case of an error
87 if 'backends' not in self.config[self.ROOT]:
88 raise configerror.ConfigError('No backends configured')
90 return self.config[self.ROOT]['backends'].keys()
92 def get_ceph_osd_pool_size(self):
93 """ get the ceph osd pool size
97 The ceph osd pool size
101 ConfigError in-case of an error
104 backends = self.get_storage_backends()
106 if 'ceph' not in backends:
107 raise configerror.ConfigError('No ceph backend configured')
109 if 'osd_pool_default_size' not in self.config[self.ROOT]['backends']['ceph']:
110 raise configerror.ConfigError('No ceph osd configuration found')
112 return self.config[self.ROOT]['backends']['ceph']['osd_pool_default_size']
114 def is_lvm_enabled(self):
115 """ Is lvm enabled or not.
118 True if lvm is enabled otherwise False.
120 return self.is_backend_enabled('lvm')
122 def is_ceph_enabled(self):
123 """ Is ceph enabled or not.
126 True if ceph is enabled otherwise False.
128 return self.is_backend_enabled('ceph')
130 def is_external_ceph_enabled(self):
131 """ Is external ceph enabled or not.
134 True if external ceph is enabled otherwise False.
136 return self.is_backend_enabled('external_ceph')
138 def is_backend_enabled(self, backend):
139 """ Is the given backend enabled.
145 True if the backend is enabled otherwise False.
151 backends = self.get_storage_backends()
153 if backend not in backends:
156 if 'enabled' not in self.config[self.ROOT]['backends'][backend]:
157 raise configerror.ConfigError(
158 'The enabled parameter not configured for {}'.format(backend))
160 return self.config[self.ROOT]['backends'][backend]['enabled']
162 def get_enabled_backends(self):
163 """ Gets enabled storage backends.
169 List of enabled backends.
171 return [backend for backend, values in self.config[self.ROOT]['backends'].iteritems()
172 if values.get('enabled', False)]
174 def set_mons(self, hosts):
175 """ Set the ceph monitors
179 A list of ceph monitor hosts.
183 ConfigError in-case of an error
185 self._set_hostlist('mons', hosts)
187 def set_ceph_mons(self, hosts):
188 """ Set the ceph monitors for openstack-ansible.
192 A list of ceph monitor hosts.
196 ConfigError in-case of an error
198 self._set_hostlist('ceph_mons', hosts)
200 def set_osds(self, hosts):
201 """ Set the ceph osds
205 A list of ceph osd hosts.
209 ConfigError in-case of an error
211 self._set_hostlist('osds', hosts)
213 def _get_external_ceph_attribute(self, attribute):
214 return self._get_backends_attribute('external_ceph', attribute)
216 def _is_valid_backend(self, backend):
218 if backend not in self.config[self.ROOT]['backends']:
219 raise configerror.ConfigError(
220 'The cloud.storage.backends does not have the '
221 'backend {} configured'.format(backend))
223 def _is_valid_backends_attribute(self, backend, attribute):
225 if attribute not in self.config[self.ROOT]['backends'][backend]:
226 raise configerror.ConfigError(
227 'The cloud.storage.backends.{} does not have '
228 'the attribute {} configured'.format(backend, attribute))
230 def _get_backends_attribute(self, backend, attribute):
232 self._is_valid_backend(backend)
233 self._is_valid_backends_attribute(backend, attribute)
234 return self.config[self.ROOT]['backends'][backend][attribute]
236 def get_ext_ceph_fsid(self):
237 """ Get the file system id of the external ceph cluster.
240 The fsid of the external ceph cluster.
243 ConfigError in-case of an error
245 return self._get_external_ceph_attribute('fsid')
247 def get_ext_ceph_mon_hosts(self):
248 """ Get the monitor hosts of the external ceph system.
251 A list of monitor hosts.
254 ConfigError in-case of an error
256 return self._get_external_ceph_attribute('mon_hosts')
258 def get_ext_ceph_ceph_s3_endpoint(self):
259 """ Get the ceph s3 endpoint. The endpoint consists of a
260 service name and port.
263 A ceph s3 endpoint in format: <service>:<port>
266 ConfigError in-case of an error
268 return self._get_external_ceph_attribute('ceph_s3_endpoint')
270 def get_ext_ceph_ceph_s3_keystone_user(self):
271 """ Get the ceph s3 endpoint user.
274 The external ceph s3 keystone user.
277 ConfigError in-case of an error.
279 return self._get_external_ceph_attribute('ceph_s3_keystone_user')
281 def get_ext_ceph_ceph_s3_keystone_adminpw(self):
282 """ Get the ceph s3 endpoint adminpw.
285 The external ceph s3 keystone adminpw.
288 ConfigError in-case of an error.
290 return self._get_external_ceph_attribute('ceph_s3_keystone_adminpw')
292 def get_ext_ceph_ceph_user(self):
293 """ Get the ceph user of the external ceph server.
296 The external ceph user.
299 ConfigError in-case of an error
301 return self._get_external_ceph_attribute('ceph_user')
303 def get_ext_ceph_ceph_user_key(self):
304 """ Get the external ceph server ceph user key.
307 The external ceph user key.
310 ConfigError in-case of an error
312 return self._get_external_ceph_attribute('ceph_user_key')
314 def get_ext_ceph_cinder_pool(self):
315 """ Get the external ceph server cinder pool name.
318 External ceph server cinder pool name.
321 ConfigError in-case of an error
323 return self._get_external_ceph_attribute('cinder_pool')
325 def get_ext_ceph_glance_pool(self):
326 """ Get the external ceph server glance pool name.
329 External ceph server glance pool name.
332 ConfigError in-case of an error
334 return self._get_external_ceph_attribute('glance_pool')
336 def get_ext_ceph_nova_pool(self):
337 """ Get the external ceph server nova pool name.
340 External ceph server nova pool name.
343 ConfigError in-case of an error
345 return self._get_external_ceph_attribute('nova_pool')
347 def get_ext_ceph_platform_pool(self):
348 """ Get the external ceph server platform pool name.
351 External ceph server platform pool name.
354 ConfigError in-case of an error
356 return self._get_external_ceph_attribute('platform_pool')
358 def get_ext_ceph_cidr(self):
359 """ Get the external ceph cidr.
365 ConfigError in-case of an error
367 return self._get_external_ceph_attribute('cidr')
369 def set_ceph_enabled(self):
370 """ Set the ceph enabled
374 ConfigError in-case of an error
377 if 'backends' not in self.config[self.ROOT]:
378 raise configerror.ConfigError('No backends configured')
380 if 'external_ceph' in self.config[self.ROOT]['backends']:
383 if self.is_lvm_enabled():
387 self.is_ceph_enabled()
388 except configerror.ConfigError:
389 self.config[self.ROOT]['backends']['ceph'].update({"enabled": True})
391 def mask_sensitive_data(self):
392 if 'external_ceph' in self.get_storage_backends():
393 self.config[self.ROOT]['backends']['external_ceph']['ceph_user_key'] = self.MASK
394 self.config[self.ROOT]['backends']['external_ceph']['ceph_s3_keystone_adminpw'] = self.MASK