From 07d146945b9408efc16d50b03e751265afb859d0 Mon Sep 17 00:00:00 2001 From: Patrick Nawracay Date: Tue, 29 May 2018 15:43:38 +0200 Subject: [PATCH] mgr/dashboard: Restore defaults of settings This commit introduces a new CLI command to restore the value of settings to their defaults. ceph dashboard reset- Signed-off-by: Patrick Nawracay --- src/pybind/mgr/dashboard/settings.py | 34 ++++++++++++++----- .../mgr/dashboard/tests/test_settings.py | 9 +++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/pybind/mgr/dashboard/settings.py b/src/pybind/mgr/dashboard/settings.py index 3875f268254a9..c9cdfd668c8ca 100644 --- a/src/pybind/mgr/dashboard/settings.py +++ b/src/pybind/mgr/dashboard/settings.py @@ -46,6 +46,10 @@ class SettingsMeta(type): else: setattr(SettingsMeta, attr, value) + def __delattr__(self, attr): + if not attr.startswith('_') and hasattr(Options, attr): + mgr.set_config(attr, None) + # pylint: disable=no-init @add_metaclass(SettingsMeta) @@ -63,8 +67,10 @@ def _options_command_map(): continue key_get = 'dashboard get-{}'.format(option.lower().replace('_', '-')) key_set = 'dashboard set-{}'.format(option.lower().replace('_', '-')) + key_reset = 'dashboard reset-{}'.format(option.lower().replace('_', '-')) cmd_map[key_get] = {'name': option, 'type': None} cmd_map[key_set] = {'name': option, 'type': value[1]} + cmd_map[key_reset] = {'name': option, 'type': None} return cmd_map @@ -85,19 +91,27 @@ def options_command_list(): cmd_list = [] for cmd, opt in _OPTIONS_COMMAND_MAP.items(): - if not opt['type']: + if cmd.startswith('dashboard get'): cmd_list.append({ 'cmd': '{}'.format(cmd), 'desc': 'Get the {} option value'.format(opt['name']), 'perm': 'r' }) - else: + elif cmd.startswith('dashboard set'): cmd_list.append({ 'cmd': '{} name=value,type={}' .format(cmd, py2ceph(opt['type'])), 'desc': 'Set the {} option value'.format(opt['name']), 'perm': 'w' }) + elif cmd.startswith('dashboard reset'): + desc = 'Reset the {} option to its default value'.format( + opt['name']) + cmd_list.append({ + 'cmd': '{}'.format(cmd), + 'desc': desc, + 'perm': 'w' + }) return cmd_list @@ -118,12 +132,14 @@ def options_schema_list(): def handle_option_command(cmd): if cmd['prefix'] not in _OPTIONS_COMMAND_MAP: return (-errno.ENOSYS, '', "Command not found '{}'".format(cmd['prefix'])) - opt = _OPTIONS_COMMAND_MAP[cmd['prefix']] - if not opt['type']: - # get option - return 0, str(getattr(Settings, opt['name'])), '' - # set option - setattr(Settings, opt['name'], opt['type'](cmd['value'])) - return 0, 'Option {} updated'.format(opt['name']), '' + if cmd['prefix'].startswith('dashboard reset'): + delattr(Settings, opt['name']) + return 0, 'Option {} reset to default value "{}"'.format( + opt['name'], getattr(Settings, opt['name'])), '' + elif cmd['prefix'].startswith('dashboard get'): + return 0, str(getattr(Settings, opt['name'])), '' + elif cmd['prefix'].startswith('dashboard set'): + setattr(Settings, opt['name'], opt['type'](cmd['value'])) + return 0, 'Option {} updated'.format(opt['name']), '' diff --git a/src/pybind/mgr/dashboard/tests/test_settings.py b/src/pybind/mgr/dashboard/tests/test_settings.py index 92fcf7ff349e6..13c569e520a39 100644 --- a/src/pybind/mgr/dashboard/tests/test_settings.py +++ b/src/pybind/mgr/dashboard/tests/test_settings.py @@ -58,6 +58,15 @@ class SettingsTest(unittest.TestCase): self.assertEqual(out, 'Option GRAFANA_API_PORT updated') self.assertEqual(err, '') + def test_reset_cmd(self): + r, out, err = handle_option_command( + {'prefix': 'dashboard reset-grafana-enabled'} + ) + self.assertEqual(r, 0) + self.assertEqual(out, 'Option {} reset to default value "{}"'.format( + 'GRAFANA_ENABLED', Settings.GRAFANA_ENABLED)) + self.assertEqual(err, '') + def test_inv_cmd(self): r, out, err = handle_option_command( {'prefix': 'dashboard get-non-existent-option'}) -- 2.39.5