]> git.proxmox.com Git - ceph.git/blame - ceph/qa/tasks/mgr/dashboard/test_cluster_configuration.py
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / tasks / mgr / dashboard / test_cluster_configuration.py
CommitLineData
11fdf7f2
TL
1from __future__ import absolute_import
2
3import time
4
5from .helper import DashboardTestCase
6
7
8class ClusterConfigurationTest(DashboardTestCase):
9
10 def test_list(self):
11 data = self._get('/api/cluster_conf')
12 self.assertStatus(200)
13 self.assertIsInstance(data, list)
14 self.assertGreater(len(data), 1000)
15 for conf in data:
16 self._validate_single(conf)
17
18 def test_get(self):
19 data = self._get('/api/cluster_conf/admin_socket')
20 self.assertStatus(200)
21 self._validate_single(data)
22 self.assertIn('enum_values', data)
23
24 data = self._get('/api/cluster_conf/fantasy_name')
25 self.assertStatus(404)
26
27 def test_get_specific_db_config_option(self):
28 config_name = 'mon_allow_pool_delete'
29
30 orig_value = self._get_config_by_name(config_name)
31
32 self._ceph_cmd(['config', 'set', 'mon', config_name, 'true'])
33 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
34 [{'section': 'mon', 'value': 'true'}])
35 self.assertEqual(result, [{'section': 'mon', 'value': 'true'}])
36
37 self._ceph_cmd(['config', 'set', 'mon', config_name, 'false'])
38 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
39 [{'section': 'mon', 'value': 'false'}])
40 self.assertEqual(result, [{'section': 'mon', 'value': 'false'}])
41
42 # restore value
43 if orig_value:
44 self._ceph_cmd(['config', 'set', 'mon', config_name, orig_value[0]['value']])
45
46 def test_create(self):
47 config_name = 'debug_ms'
48 orig_value = self._get_config_by_name(config_name)
49
50 # remove all existing settings for equal preconditions
51 self._clear_all_values_for_config_option(config_name)
52
53 expected_result = [{'section': 'mon', 'value': '0/3'}]
54
55 self._post('/api/cluster_conf', {
56 'name': config_name,
57 'value': expected_result
58 })
59 self.assertStatus(201)
60 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
61 expected_result)
62 self.assertEqual(result, expected_result)
63
64 # reset original value
65 self._clear_all_values_for_config_option(config_name)
66 self._reset_original_values(config_name, orig_value)
67
68 def test_create_cant_update_at_runtime(self):
69 config_name = 'clog_to_syslog' # not updatable
70 config_value = [{'section': 'global', 'value': 'true'}]
71 orig_value = self._get_config_by_name(config_name)
72
73 # try to set config option and check if it fails
74 self._post('/api/cluster_conf', {
75 'name': config_name,
76 'value': config_value
77 })
78 self.assertStatus(400)
79 self.assertError(code='config_option_not_updatable_at_runtime',
80 component='cluster_configuration',
81 detail='Config option {} is/are not updatable at runtime'.format(
82 config_name))
83
84 # check if config option value is still the original one
85 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
86 orig_value)
87 self.assertEqual(result, orig_value)
88
89 def test_create_two_values(self):
90 config_name = 'debug_ms'
91 orig_value = self._get_config_by_name(config_name)
92
93 # remove all existing settings for equal preconditions
94 self._clear_all_values_for_config_option(config_name)
95
96 expected_result = [{'section': 'mon', 'value': '0/3'},
97 {'section': 'osd', 'value': '0/5'}]
98
99 self._post('/api/cluster_conf', {
100 'name': config_name,
101 'value': expected_result
102 })
103 self.assertStatus(201)
104 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
105 expected_result)
106 self.assertEqual(result, expected_result)
107
108 # reset original value
109 self._clear_all_values_for_config_option(config_name)
110 self._reset_original_values(config_name, orig_value)
111
112 def test_create_can_handle_none_values(self):
113 config_name = 'debug_ms'
114 orig_value = self._get_config_by_name(config_name)
115
116 # remove all existing settings for equal preconditions
117 self._clear_all_values_for_config_option(config_name)
118
119 self._post('/api/cluster_conf', {
120 'name': config_name,
121 'value': [{'section': 'mon', 'value': '0/3'},
122 {'section': 'osd', 'value': None}]
123 })
124 self.assertStatus(201)
125
126 expected_result = [{'section': 'mon', 'value': '0/3'}]
127 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
128 expected_result)
129 self.assertEqual(result, expected_result)
130
131 # reset original value
132 self._clear_all_values_for_config_option(config_name)
133 self._reset_original_values(config_name, orig_value)
134
135 def test_create_can_handle_boolean_values(self):
136 config_name = 'mon_allow_pool_delete'
137 orig_value = self._get_config_by_name(config_name)
138
139 # remove all existing settings for equal preconditions
140 self._clear_all_values_for_config_option(config_name)
141
142 expected_result = [{'section': 'mon', 'value': 'true'}]
143
144 self._post('/api/cluster_conf', {
145 'name': config_name,
146 'value': [{'section': 'mon', 'value': True}]})
147 self.assertStatus(201)
148
149 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
150 expected_result)
151 self.assertEqual(result, expected_result)
152
153 # reset original value
154 self._clear_all_values_for_config_option(config_name)
155 self._reset_original_values(config_name, orig_value)
156
157 def test_bulk_set(self):
158 expected_result = {
159 'osd_max_backfills': {'section': 'osd', 'value': '1'},
160 'osd_recovery_max_active': {'section': 'osd', 'value': '3'},
161 'osd_recovery_max_single_start': {'section': 'osd', 'value': '1'},
162 'osd_recovery_sleep': {'section': 'osd', 'value': '2.000000'}
163 }
164 orig_values = dict()
165
166 for config_name in expected_result:
167 orig_values[config_name] = self._get_config_by_name(config_name)
168
169 # remove all existing settings for equal preconditions
170 self._clear_all_values_for_config_option(config_name)
171
172 self._put('/api/cluster_conf', {'options': expected_result})
173 self.assertStatus(200)
174
175 for config_name, value in expected_result.items():
176 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
177 [value])
178 self.assertEqual(result, [value])
179
180 # reset original value
181 self._clear_all_values_for_config_option(config_name)
182 self._reset_original_values(config_name, orig_values[config_name])
183
184 def test_bulk_set_cant_update_at_runtime(self):
185 config_options = {
186 'clog_to_syslog': {'section': 'global', 'value': 'true'}, # not updatable
187 'clog_to_graylog': {'section': 'global', 'value': 'true'} # not updatable
188 }
189 orig_values = dict()
190
191 for config_name in config_options:
192 orig_values[config_name] = self._get_config_by_name(config_name)
193
194 # try to set config options and see if it fails
195 self._put('/api/cluster_conf', {'options': config_options})
196 self.assertStatus(400)
197 self.assertError(code='config_option_not_updatable_at_runtime',
198 component='cluster_configuration',
199 detail='Config option {} is/are not updatable at runtime'.format(
200 ', '.join(config_options.keys())))
201
202 # check if config option values are still the original ones
203 for config_name, value in orig_values.items():
204 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
205 value)
206 self.assertEqual(result, value)
207
208 def test_bulk_set_cant_update_at_runtime_partial(self):
209 config_options = {
210 'clog_to_syslog': {'section': 'global', 'value': 'true'}, # not updatable
211 'log_to_stderr': {'section': 'global', 'value': 'true'} # updatable
212 }
213 orig_values = dict()
214
215 for config_name in config_options:
216 orig_values[config_name] = self._get_config_by_name(config_name)
217
218 # try to set config options and see if it fails
219 self._put('/api/cluster_conf', {'options': config_options})
220 self.assertStatus(400)
221 self.assertError(code='config_option_not_updatable_at_runtime',
222 component='cluster_configuration',
223 detail='Config option {} is/are not updatable at runtime'.format(
224 'clog_to_syslog'))
225
226 # check if config option values are still the original ones
227 for config_name, value in orig_values.items():
228 result = self._wait_for_expected_get_result(self._get_config_by_name, config_name,
229 value)
230 self.assertEqual(result, value)
231
232 def _validate_single(self, data):
233 self.assertIn('name', data)
234 self.assertIn('daemon_default', data)
235 self.assertIn('long_desc', data)
236 self.assertIn('level', data)
237 self.assertIn('default', data)
238 self.assertIn('see_also', data)
239 self.assertIn('tags', data)
240 self.assertIn('min', data)
241 self.assertIn('max', data)
242 self.assertIn('services', data)
243 self.assertIn('type', data)
244 self.assertIn('desc', data)
245 self.assertIn(data['type'], ['str', 'bool', 'float', 'int', 'size', 'uint', 'addr', 'uuid',
246 'secs'])
247
248 if 'value' in data:
249 self.assertIn('source', data)
250 self.assertIsInstance(data['value'], list)
251
252 for entry in data['value']:
253 self.assertIsInstance(entry, dict)
254 self.assertIn('section', entry)
255 self.assertIn('value', entry)
256
257 def _wait_for_expected_get_result(self, get_func, get_params, expected_result, max_attempts=30,
258 sleep_time=1):
259 attempts = 0
260 while attempts < max_attempts:
261 get_result = get_func(get_params)
262 if get_result == expected_result:
263 self.assertStatus(200)
264 return get_result
265
266 time.sleep(sleep_time)
267 attempts += 1
268
269 def _get_config_by_name(self, conf_name):
270 data = self._get('/api/cluster_conf/{}'.format(conf_name))
271 if 'value' in data:
272 return data['value']
273 return None
274
275 def _clear_all_values_for_config_option(self, config_name):
276 values = self._get_config_by_name(config_name)
277 if values:
278 for value in values:
279 self._ceph_cmd(['config', 'rm', value['section'], config_name])
280
281 def _reset_original_values(self, config_name, orig_values):
282 if orig_values:
283 for value in orig_values:
284 self._ceph_cmd(['config', 'set', value['section'], config_name, value['value']])