From 4ea23726ef81ee93a3b56ffb3d8601771807ed86 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Wed, 21 Mar 2018 17:13:51 +0100 Subject: [PATCH] mgr/dashboard: Changed `@RESTController.args_from_json` It now allows any keyword arguments. This is needed for ECP and Pool creation. Signed-off-by: Sebastian Wagner --- src/pybind/mgr/dashboard/tests/test_tools.py | 12 +++++++++--- src/pybind/mgr/dashboard/tools.py | 15 ++------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/pybind/mgr/dashboard/tests/test_tools.py b/src/pybind/mgr/dashboard/tests/test_tools.py index ca4d9040c3c08..4621d5a97db12 100644 --- a/src/pybind/mgr/dashboard/tests/test_tools.py +++ b/src/pybind/mgr/dashboard/tests/test_tools.py @@ -38,8 +38,8 @@ class FooResource(RESTController): class FooArgs(RESTController): @RESTController.args_from_json - def set(self, code, name): - return {'code': code, 'name': name} + def set(self, code, name, opt1=None, opt2=None): + return {'code': code, 'name': name, 'opt1': opt1, 'opt2': opt2} # pylint: disable=C0102 @@ -93,7 +93,13 @@ class RESTControllerTest(ControllerTestCase): def test_args_from_json(self): self._put("/fooargs/hello", {'name': 'world'}) - self.assertJsonBody({'code': 'hello', 'name': 'world'}) + self.assertJsonBody({'code': 'hello', 'name': 'world', 'opt1': None, 'opt2': None}) + + self._put("/fooargs/hello", {'name': 'world', 'opt1': 'opt1'}) + self.assertJsonBody({'code': 'hello', 'name': 'world', 'opt1': 'opt1', 'opt2': None}) + + self._put("/fooargs/hello", {'name': 'world', 'opt2': 'opt2'}) + self.assertJsonBody({'code': 'hello', 'name': 'world', 'opt1': None, 'opt2': 'opt2'}) def test_detail_route(self): self._get('/foo/1/detail') diff --git a/src/pybind/mgr/dashboard/tools.py b/src/pybind/mgr/dashboard/tools.py index 8775a708730a2..719c640b176ec 100644 --- a/src/pybind/mgr/dashboard/tools.py +++ b/src/pybind/mgr/dashboard/tools.py @@ -358,19 +358,8 @@ class RESTController(BaseController): raise cherrypy.HTTPError(400, 'Failed to decode JSON: {}' .format(str(e))) if hasattr(func, '_args_from_json_'): - if sys.version_info > (3, 0): - f_args = list(inspect.signature(func).parameters.keys()) - else: - f_args = inspect.getargspec(func).args[1:] - n_args = [] - for arg in args: - n_args.append(arg) - for arg in f_args: - if arg in data: - n_args.append(data[arg]) - data.pop(arg) - kwargs.update(data) - return func(*n_args, **kwargs) + kwargs.update(data.items()) + return func(*args, **kwargs) return func(data, *args, **kwargs) return inner -- 2.39.5