]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: add backend method to create config options
authorTatjana Dehler <tdehler@suse.com>
Mon, 25 Jun 2018 14:19:41 +0000 (16:19 +0200)
committerTatjana Dehler <tdehler@suse.com>
Tue, 9 Oct 2018 12:50:00 +0000 (14:50 +0200)
Fixes: http://tracker.ceph.com/issues/24455
Signed-off-by: Tatjana Dehler <tdehler@suse.com>
qa/tasks/mgr/dashboard/test_cluster_configuration.py
src/pybind/mgr/dashboard/controllers/cluster_configuration.py

index 89cc4f14dda420b2b0b5c83f671e94e83d8dc65d..223f8f907ef0df81ee474f7b85d6504911b15654 100644 (file)
@@ -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']])
index 03597d5afbbef929c5892d6c0f1cc615aa905714..8ac52e5fededee09444b11e481238a2802a7adb0 100644 (file)
@@ -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)