]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard_v2: Add support for nested controllers
authorPatrick Nawracay <pnawracay@suse.com>
Wed, 7 Feb 2018 14:56:51 +0000 (15:56 +0100)
committerRicardo Dias <rdias@suse.com>
Mon, 5 Mar 2018 13:07:08 +0000 (13:07 +0000)
The `ApiController` decorator is used to define a API endpoints.  This
change will enable to use `/` in paths, so that nested controllers can
be used.

Signed-off-by: Patrick Nawracay <pnawracay@suse.com>
src/pybind/mgr/dashboard_v2/controllers/rgw.py
src/pybind/mgr/dashboard_v2/module.py

index 3ee8fcb9085118ffeea88b33057329f8e08d9d12..900d5b66a5b3fc5392e368de8e0c4236ed5b4b68 100644 (file)
@@ -10,16 +10,13 @@ from .. import logger
 @ApiController('rgw')
 @AuthRequired()
 class Rgw(RESTController):
-
-    def __init__(self):
-        self.daemon = RgwDaemon(self.mgr)
+    pass
 
 
+@ApiController('rgw/daemon')
+@AuthRequired()
 class RgwDaemon(RESTController):
 
-    def __init__(self, mgr):
-        RgwDaemon.mgr = mgr
-
     def list(self):
         daemons = []
         for server in self.mgr.list_servers():
index a9034bd60940d78a7cd7018a4948d47f62eb56f9..dfe11bf6067adc0e155c6706e50c582e29b4ff49 100644 (file)
@@ -154,11 +154,30 @@ class Module(MgrModule):
         def __init__(self, mgrmod):
             self.ctrls = load_controllers(mgrmod)
             logger.debug('Loaded controllers: %s', self.ctrls)
-            for ctrl in self.ctrls:
+
+            first_level_ctrls = [ctrl for ctrl in self.ctrls
+                                 if '/' not in ctrl._cp_path_]
+            multi_level_ctrls = set(self.ctrls).difference(first_level_ctrls)
+
+            for ctrl in first_level_ctrls:
                 logger.info('Adding controller: %s -> /api/%s', ctrl.__name__,
                             ctrl._cp_path_)
-                ins = ctrl()
-                setattr(Module.ApiRoot, ctrl._cp_path_, ins)
+                inst = ctrl()
+                setattr(Module.ApiRoot, ctrl._cp_path_, inst)
+
+            for ctrl in multi_level_ctrls:
+                path_parts = ctrl._cp_path_.split('/')
+                path = '/'.join(path_parts[:-1])
+                key = path_parts[-1]
+                parent_ctrl_classes = [c for c in self.ctrls
+                                       if c._cp_path_ == path]
+                if len(parent_ctrl_classes) != 1:
+                    logger.error('No parent controller found for {}! '
+                                 'Please check your path in the ApiController '
+                                 'decorator!'.format(ctrl))
+                else:
+                    inst = ctrl()
+                    setattr(parent_ctrl_classes[0], key, inst)
 
         @cherrypy.expose
         def index(self):