]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: controllers: fix controllers endpoints initialization order
authorRicardo Dias <rdias@suse.com>
Fri, 22 Jun 2018 12:56:34 +0000 (13:56 +0100)
committerRicardo Dias <rdias@suse.com>
Tue, 26 Jun 2018 11:28:55 +0000 (12:28 +0100)
Signed-off-by: Ricardo Dias <rdias@suse.com>
src/pybind/mgr/dashboard/controllers/__init__.py
src/pybind/mgr/dashboard/tests/helper.py

index 23eb6d81eb42397cfc4154167b5224929597ea08..dfdb5fec57218e34d31a0f561993b9ab5d5cb9e4 100644 (file)
@@ -182,45 +182,45 @@ def load_controllers():
 ENDPOINT_MAP = collections.defaultdict(list)
 
 
-def generate_controller_routes(ctrl_class, mapper, base_url):
-    inst = ctrl_class()
-    endp_base_urls = set()
+def generate_controller_routes(endpoint, mapper, base_url):
+    inst = endpoint.inst
+    ctrl_class = endpoint.ctrl
+    endp_base_url = None
 
-    for endpoint in ctrl_class.endpoints():
-        if endpoint.proxy:
-            conditions = None
-        else:
-            conditions = dict(method=[endpoint.method])
+    if endpoint.proxy:
+        conditions = None
+    else:
+        conditions = dict(method=[endpoint.method])
 
-        endp_url = endpoint.url
-        if base_url == "/":
-            base_url = ""
-        if endp_url == "/" and base_url:
-            endp_url = ""
-        url = "{}{}".format(base_url, endp_url)
+    endp_url = endpoint.url
+    if base_url == "/":
+        base_url = ""
+    if endp_url == "/" and base_url:
+        endp_url = ""
+    url = "{}{}".format(base_url, endp_url)
 
-        if '/' in url[len(base_url)+1:]:
-            endp_base_urls.add(url[:len(base_url)+1+endp_url[1:].find('/')])
-        else:
-            endp_base_urls.add(url)
+    if '/' in url[len(base_url)+1:]:
+        endp_base_url = url[:len(base_url)+1+endp_url[1:].find('/')]
+    else:
+        endp_base_url = url
 
-        logger.debug("Mapped [%s] to %s:%s restricted to %s",
-                     url, ctrl_class.__name__, endpoint.action,
-                     endpoint.method)
+    logger.debug("Mapped [%s] to %s:%s restricted to %s",
+                 url, ctrl_class.__name__, endpoint.action,
+                 endpoint.method)
 
-        ENDPOINT_MAP[endpoint.url].append(endpoint)
+    ENDPOINT_MAP[endpoint.url].append(endpoint)
 
-        name = ctrl_class.__name__ + ":" + endpoint.action
-        mapper.connect(name, url, controller=inst, action=endpoint.action,
-                       conditions=conditions)
+    name = ctrl_class.__name__ + ":" + endpoint.action
+    mapper.connect(name, url, controller=inst, action=endpoint.action,
+                   conditions=conditions)
 
-        # adding route with trailing slash
-        name += "/"
-        url += "/"
-        mapper.connect(name, url, controller=inst, action=endpoint.action,
-                       conditions=conditions)
+    # adding route with trailing slash
+    name += "/"
+    url += "/"
+    mapper.connect(name, url, controller=inst, action=endpoint.action,
+                   conditions=conditions)
 
-    return endp_base_urls
+    return endp_base_url
 
 
 def generate_routes(url_prefix):
@@ -228,9 +228,18 @@ def generate_routes(url_prefix):
     ctrls = load_controllers()
 
     parent_urls = set()
+
+    endpoint_list = []
     for ctrl in ctrls:
-        parent_urls.update(generate_controller_routes(ctrl, mapper,
-                                                      "{}".format(url_prefix)))
+        inst = ctrl()
+        for endpoint in ctrl.endpoints():
+            endpoint.inst = inst
+            endpoint_list.append(endpoint)
+
+    endpoint_list = sorted(endpoint_list, key=lambda e: e.url)
+    for endpoint in endpoint_list:
+        parent_urls.add(generate_controller_routes(endpoint, mapper,
+                                                   "{}".format(url_prefix)))
 
     logger.debug("list of parent paths: %s", parent_urls)
     return mapper, parent_urls
@@ -347,6 +356,7 @@ class BaseController(object):
         """
         def __init__(self, ctrl, func):
             self.ctrl = ctrl
+            self.inst = None
             self.func = func
 
             if not self.config['proxy']:
index 45f67bd12a040bcd5c0a679ea25b73d34e4ba9fb..8a0064b90f60a574f44f7b8d7f2c53f64c914463 100644 (file)
@@ -23,8 +23,15 @@ class ControllerTestCase(helper.CPWebCase):
         if not isinstance(ctrl_classes, list):
             ctrl_classes = [ctrl_classes]
         mapper = cherrypy.dispatch.RoutesDispatcher()
+        endpoint_list = []
         for ctrl in ctrl_classes:
-            generate_controller_routes(ctrl, mapper, base_url)
+            inst = ctrl()
+            for endpoint in ctrl.endpoints():
+                endpoint.inst = inst
+                endpoint_list.append(endpoint)
+        endpoint_list = sorted(endpoint_list, key=lambda e: e.url)
+        for endpoint in endpoint_list:
+            generate_controller_routes(endpoint, mapper, base_url)
         if base_url == '':
             base_url = '/'
         cherrypy.tree.mount(None, config={