Initial commit
[ta/config-manager.git] / cmdatahandlers / src / cmdatahandlers / storage / config.py
1 # Copyright 2019 Nokia
2
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
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 from cmdatahandlers.api import configerror
16 from cmdatahandlers.api import config
17
18
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'
24
25     def init(self):
26         pass
27
28     def validate(self):
29         self.validate_root()
30         self._validate_storage_backends()
31
32     def _validate_storage_backends(self):
33         backends = self.get_storage_backends()
34         for backend in backends:
35             if backend == 'ceph':
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()
41             else:
42                 raise configerror.ConfigError('Invalid backend %s specified' % backend)
43
44     def _validate_ceph_backend(self):
45         self.is_ceph_enabled()
46         osdpoolsize = self.get_ceph_osd_pool_size()
47         if osdpoolsize <= 1:
48             raise configerror.ConfigError('Invalid osd pool size configured %d' % osdpoolsize)
49
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()
64
65     def _validate_lvm_backend(self):
66         self.is_lvm_enabled()
67
68     def _set_hostlist(self, key, value):
69         self.validate_root()
70         if len(value) <= 0:
71             raise configerror.ConfigError('The host list for {} is empty'.format(key))
72         self.config[self.ROOT][key] = value
73
74     def get_storage_backends(self):
75         """ get the list of backends
76
77             Return:
78
79             A list of backend names
80
81             Raise:
82
83             ConfigError in-case of an error
84         """
85         self.validate_root()
86
87         if 'backends' not in self.config[self.ROOT]:
88             raise configerror.ConfigError('No backends configured')
89
90         return self.config[self.ROOT]['backends'].keys()
91
92     def get_ceph_osd_pool_size(self):
93         """ get the ceph osd pool size
94
95             Return:
96
97             The ceph osd pool size
98
99             Raise:
100
101             ConfigError in-case of an error
102         """
103         self.validate_root()
104         backends = self.get_storage_backends()
105
106         if 'ceph' not in backends:
107             raise configerror.ConfigError('No ceph backend configured')
108
109         if 'osd_pool_default_size' not in self.config[self.ROOT]['backends']['ceph']:
110             raise configerror.ConfigError('No ceph osd configuration found')
111
112         return self.config[self.ROOT]['backends']['ceph']['osd_pool_default_size']
113
114     def is_lvm_enabled(self):
115         """ Is lvm enabled or not.
116
117             Return:
118                 True if lvm is enabled otherwise False.
119         """
120         return self.is_backend_enabled('lvm')
121
122     def is_ceph_enabled(self):
123         """ Is ceph enabled or not.
124
125             Return:
126                 True if ceph is enabled otherwise False.
127         """
128         return self.is_backend_enabled('ceph')
129
130     def is_external_ceph_enabled(self):
131         """ Is external ceph enabled or not.
132
133             Return:
134                 True if external ceph is enabled otherwise False.
135         """
136         return self.is_backend_enabled('external_ceph')
137
138     def is_backend_enabled(self, backend):
139         """ Is the given backend enabled.
140
141             Argument:
142                 The storage backend.
143
144             Return:
145                 True if the backend is enabled otherwise False.
146
147             Raise:
148                 -
149         """
150         self.validate_root()
151         backends = self.get_storage_backends()
152
153         if backend not in backends:
154             return False
155
156         if 'enabled' not in self.config[self.ROOT]['backends'][backend]:
157             raise configerror.ConfigError(
158                 'The enabled parameter not configured for {}'.format(backend))
159
160         return self.config[self.ROOT]['backends'][backend]['enabled']
161
162     def get_enabled_backends(self):
163         """ Gets enabled storage backends.
164
165             Argument:
166                 The storage backend.
167
168             Return:
169                 List of enabled backends.
170         """
171         return [backend for backend, values in self.config[self.ROOT]['backends'].iteritems()
172                 if values.get('enabled', False)]
173
174     def set_mons(self, hosts):
175         """ Set the ceph monitors
176
177             Argument:
178
179             A list of ceph monitor hosts.
180
181             Raise:
182
183             ConfigError in-case of an error
184         """
185         self._set_hostlist('mons', hosts)
186
187     def set_ceph_mons(self, hosts):
188         """ Set the ceph monitors for openstack-ansible.
189
190             Argument:
191
192             A list of ceph monitor hosts.
193
194             Raise:
195
196             ConfigError in-case of an error
197         """
198         self._set_hostlist('ceph_mons', hosts)
199
200     def set_osds(self, hosts):
201         """ Set the ceph osds
202
203             Argument:
204
205             A list of ceph osd hosts.
206
207             Raise:
208
209             ConfigError in-case of an error
210         """
211         self._set_hostlist('osds', hosts)
212
213     def _get_external_ceph_attribute(self, attribute):
214         return self._get_backends_attribute('external_ceph', attribute)
215
216     def _is_valid_backend(self, backend):
217         self.validate_root()
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))
222
223     def _is_valid_backends_attribute(self, backend, attribute):
224         self.validate_root()
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))
229
230     def _get_backends_attribute(self, backend, attribute):
231         self.validate_root()
232         self._is_valid_backend(backend)
233         self._is_valid_backends_attribute(backend, attribute)
234         return self.config[self.ROOT]['backends'][backend][attribute]
235
236     def get_ext_ceph_fsid(self):
237         """ Get the file system id of the external ceph cluster.
238
239             Return:
240                 The fsid of the external ceph cluster.
241
242             Raise:
243                 ConfigError in-case of an error
244         """
245         return self._get_external_ceph_attribute('fsid')
246
247     def get_ext_ceph_mon_hosts(self):
248         """ Get the monitor hosts of the external ceph system.
249
250             Return:
251                 A list of monitor hosts.
252
253             Raise:
254                 ConfigError in-case of an error
255         """
256         return self._get_external_ceph_attribute('mon_hosts')
257
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.
261
262             Return:
263                 A ceph s3 endpoint in format: <service>:<port>
264
265             Raise:
266                 ConfigError in-case of an error
267         """
268         return self._get_external_ceph_attribute('ceph_s3_endpoint')
269
270     def get_ext_ceph_ceph_s3_keystone_user(self):
271         """ Get the ceph s3 endpoint user.
272
273             Return:
274                 The external ceph s3 keystone user.
275
276             Raise:
277                 ConfigError in-case of an error.
278         """
279         return self._get_external_ceph_attribute('ceph_s3_keystone_user')
280
281     def get_ext_ceph_ceph_s3_keystone_adminpw(self):
282         """ Get the ceph s3 endpoint adminpw.
283
284             Return:
285                 The external ceph s3 keystone adminpw.
286
287             Raise:
288                 ConfigError in-case of an error.
289         """
290         return self._get_external_ceph_attribute('ceph_s3_keystone_adminpw')
291
292     def get_ext_ceph_ceph_user(self):
293         """ Get the ceph user of the external ceph server.
294
295             Return:
296                 The external ceph user.
297
298             Raise:
299                 ConfigError in-case of an error
300         """
301         return self._get_external_ceph_attribute('ceph_user')
302
303     def get_ext_ceph_ceph_user_key(self):
304         """ Get the external ceph server ceph user key.
305
306             Return:
307                 The external ceph user key.
308
309             Raise:
310                 ConfigError in-case of an error
311         """
312         return self._get_external_ceph_attribute('ceph_user_key')
313
314     def get_ext_ceph_cinder_pool(self):
315         """ Get the external ceph server cinder pool name.
316
317             Return:
318                 External ceph server cinder pool name.
319
320             Raise:
321                 ConfigError in-case of an error
322         """
323         return self._get_external_ceph_attribute('cinder_pool')
324
325     def get_ext_ceph_glance_pool(self):
326         """ Get the external ceph server glance pool name.
327
328             Return:
329                 External ceph server glance pool name.
330
331             Raise:
332                 ConfigError in-case of an error
333         """
334         return self._get_external_ceph_attribute('glance_pool')
335
336     def get_ext_ceph_nova_pool(self):
337         """ Get the external ceph server nova pool name.
338
339             Return:
340                 External ceph server nova pool name.
341
342             Raise:
343                 ConfigError in-case of an error
344         """
345         return self._get_external_ceph_attribute('nova_pool')
346
347     def get_ext_ceph_platform_pool(self):
348         """ Get the external ceph server platform pool name.
349
350             Return:
351                 External ceph server platform pool name.
352
353             Raise:
354                 ConfigError in-case of an error
355         """
356         return self._get_external_ceph_attribute('platform_pool')
357
358     def get_ext_ceph_cidr(self):
359         """ Get the external ceph cidr.
360
361             Return:
362                 External ceph cidr.
363
364             Raise:
365                 ConfigError in-case of an error
366         """
367         return self._get_external_ceph_attribute('cidr')
368
369     def set_ceph_enabled(self):
370         """ Set the ceph enabled
371
372             Raise:
373
374             ConfigError in-case of an error
375         """
376
377         if 'backends' not in self.config[self.ROOT]:
378             raise configerror.ConfigError('No backends configured')
379
380         if 'external_ceph' in self.config[self.ROOT]['backends']:
381             return
382
383         if self.is_lvm_enabled():
384             return
385
386         try:
387             self.is_ceph_enabled()
388         except configerror.ConfigError:
389             self.config[self.ROOT]['backends']['ceph'].update({"enabled": True})
390
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