From 18d91e2419f9f5ef02f4d0cdd138d2fb0c812b28 Mon Sep 17 00:00:00 2001 From: Tatjana Dehler Date: Mon, 25 Jun 2018 16:19:41 +0200 Subject: [PATCH] mgr/dashboard: add backend method to create config options Fixes: http://tracker.ceph.com/issues/24455 Signed-off-by: Tatjana Dehler --- .../dashboard/test_cluster_configuration.py | 101 ++++++++++++++++++ .../controllers/cluster_configuration.py | 18 +++- 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/qa/tasks/mgr/dashboard/test_cluster_configuration.py b/qa/tasks/mgr/dashboard/test_cluster_configuration.py index 89cc4f14dda..223f8f907ef 100644 --- a/qa/tasks/mgr/dashboard/test_cluster_configuration.py +++ b/qa/tasks/mgr/dashboard/test_cluster_configuration.py @@ -43,6 +43,96 @@ class ClusterConfigurationTest(DashboardTestCase): if orig_value: self._ceph_cmd(['config', 'set', 'mon', config_name, orig_value[0]['value']]) + def test_create(self): + config_name = 'debug_ms' + orig_value = self._get_config_by_name(config_name) + + # remove all existing settings for equal preconditions + self._clear_all_values_for_config_option(config_name) + + expected_result = [{'section': 'mon', 'value': '0/3'}] + + self._post('/api/cluster_conf', { + 'name': config_name, + 'value': expected_result + }) + self.assertStatus(201) + result = self._wait_for_expected_get_result(self._get_config_by_name, config_name, + expected_result) + self.assertEqual(result, expected_result) + + # reset original value + self._clear_all_values_for_config_option(config_name) + self._reset_original_values(config_name, orig_value) + + def test_create_two_values(self): + config_name = 'debug_ms' + orig_value = self._get_config_by_name(config_name) + + # remove all existing settings for equal preconditions + self._clear_all_values_for_config_option(config_name) + + expected_result = [{'section': 'mon', 'value': '0/3'}, + {'section': 'osd', 'value': '0/5'}] + + self._post('/api/cluster_conf', { + 'name': config_name, + 'value': expected_result + }) + self.assertStatus(201) + result = self._wait_for_expected_get_result(self._get_config_by_name, config_name, + expected_result) + self.assertEqual(result, expected_result) + + # reset original value + self._clear_all_values_for_config_option(config_name) + self._reset_original_values(config_name, orig_value) + + def test_create_can_handle_none_values(self): + config_name = 'debug_ms' + orig_value = self._get_config_by_name(config_name) + + # remove all existing settings for equal preconditions + self._clear_all_values_for_config_option(config_name) + + self._post('/api/cluster_conf', { + 'name': config_name, + 'value': [{'section': 'mon', 'value': '0/3'}, + {'section': 'osd', 'value': None}] + }) + self.assertStatus(201) + + expected_result = [{'section': 'mon', 'value': '0/3'}] + result = self._wait_for_expected_get_result(self._get_config_by_name, config_name, + expected_result) + self.assertEqual(result, expected_result) + + # reset original value + self._clear_all_values_for_config_option(config_name) + self._reset_original_values(config_name, orig_value) + + def test_create_can_handle_boolean_values(self): + config_name = 'mon_allow_pool_delete' + orig_value = self._get_config_by_name(config_name) + + # remove all existing settings for equal preconditions + self._clear_all_values_for_config_option(config_name) + + expected_result = [{'section': 'mon', 'value': 'true'}] + + self._post('/api/cluster_conf', { + 'name': config_name, + 'value': [{'section': 'mon', 'value': True}]}) + self.assertStatus(201) + + result = self._wait_for_expected_get_result(self._get_config_by_name, config_name, + expected_result) + self.assertEqual(result, expected_result) + + # reset original value + self._clear_all_values_for_config_option(config_name) + self._reset_original_values(config_name, orig_value) + def _validate_single(self, data): self.assertIn('name', data) self.assertIn('daemon_default', data) @@ -83,3 +173,14 @@ class ClusterConfigurationTest(DashboardTestCase): if 'value' in data: return data['value'] return None + + def _clear_all_values_for_config_option(self, config_name): + values = self._get_config_by_name(config_name) + if values: + for value in values: + self._ceph_cmd(['config', 'rm', value['section'], config_name]) + + def _reset_original_values(self, config_name, orig_values): + if orig_values: + for value in orig_values: + self._ceph_cmd(['config', 'set', value['section'], config_name, value['value']]) diff --git a/src/pybind/mgr/dashboard/controllers/cluster_configuration.py b/src/pybind/mgr/dashboard/controllers/cluster_configuration.py index 03597d5afbb..8ac52e5fede 100644 --- a/src/pybind/mgr/dashboard/controllers/cluster_configuration.py +++ b/src/pybind/mgr/dashboard/controllers/cluster_configuration.py @@ -5,10 +5,11 @@ import cherrypy from . import ApiController, RESTController from .. import mgr +from ..security import Scope from ..services.ceph_service import CephService -@ApiController('/cluster_conf') +@ApiController('/cluster_conf', Scope.CONFIG_OPT) class ClusterConfiguration(RESTController): def _append_config_option_values(self, options): @@ -39,3 +40,18 @@ class ClusterConfiguration(RESTController): return self._append_config_option_values([option])[0] raise cherrypy.HTTPError(404) + + def create(self, name, value): + availSections = ['global', 'mon', 'mgr', 'osd', 'mds', 'client'] + + for section in availSections: + for entry in value: + if not entry['value']: + break + + if entry['section'] == section: + CephService.send_command('mon', 'config set', who=section, name=name, + value=str(entry['value'])) + break + else: + CephService.send_command('mon', 'config rm', who=section, name=name) -- 2.39.5