]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Avoid extra queries when retrieving routers
authorEugene Nikanorov <enikanorov@mirantis.com>
Mon, 6 May 2013 11:28:09 +0000 (15:28 +0400)
committerEugene Nikanorov <enikanorov@mirantis.com>
Wed, 8 May 2013 11:25:22 +0000 (15:25 +0400)
fixes bug 1160333

Instead of making N additional sql requests,
use relationship and joined query.

Change-Id: I8f650691916a252bf2a525343bfa0521ff6fbe43

quantum/db/extraroute_db.py
quantum/db/l3_db.py
quantum/extensions/l3.py

index e11c165716b50ba8ffc106afdb4eecee38580f75..b8dfcd87867b68269701fe26a2313c4d17a56dd8 100644 (file)
 import netaddr
 from oslo.config import cfg
 import sqlalchemy as sa
+from sqlalchemy import orm
 
 from quantum.common import utils
+from quantum.db import db_base_plugin_v2
 from quantum.db import l3_db
 from quantum.db import model_base
 from quantum.db import models_v2
 from quantum.extensions import extraroute
+from quantum.extensions import l3
 from quantum.openstack.common import log as logging
 
 
@@ -44,9 +47,24 @@ class RouterRoute(model_base.BASEV2, models_v2.Route):
                                         ondelete="CASCADE"),
                           primary_key=True)
 
+    router = orm.relationship(l3_db.Router,
+                              backref=orm.backref("route_list",
+                                                  lazy='joined',
+                                                  cascade='delete'))
+
 
 class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin):
     """Mixin class to support extra route configuration on router."""
+
+    def _extend_router_dict_extraroute(self, router_res, router_db):
+        router_res['routes'] = (ExtraRoute_db_mixin.
+                                _make_extra_route_list(
+                                    router_db['route_list']
+                                ))
+
+    db_base_plugin_v2.QuantumDbPluginV2.register_dict_extend_funcs(
+        l3.ROUTERS, [_extend_router_dict_extraroute])
+
     def update_router(self, context, id, router):
         r = router['router']
         with context.session.begin(subtransactions=True):
@@ -123,7 +141,8 @@ class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin):
                                   destination=route['destination'],
                                   nexthop=route['nexthop']).delete()
 
-    def _make_extra_route_list(self, extra_routes):
+    @staticmethod
+    def _make_extra_route_list(extra_routes):
         return [{'destination': route['destination'],
                  'nexthop': route['nexthop']}
                 for route in extra_routes]
@@ -137,8 +156,6 @@ class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin):
         with context.session.begin(subtransactions=True):
             router = super(ExtraRoute_db_mixin, self).get_router(
                 context, id, fields)
-            router['routes'] = self._get_extra_routes_by_router_id(
-                context, id)
             return router
 
     def get_routers(self, context, filters=None, fields=None,
@@ -148,9 +165,6 @@ class ExtraRoute_db_mixin(l3_db.L3_NAT_db_mixin):
             routers = super(ExtraRoute_db_mixin, self).get_routers(
                 context, filters, fields, sorts=sorts, limit=limit,
                 marker=marker, page_reverse=page_reverse)
-            for router in routers:
-                router['routes'] = self._get_extra_routes_by_router_id(
-                    context, router['id'])
             return routers
 
     def _confirm_router_interface_not_in_use(self, context, router_id,
index 09703f7659189a3ed41475b0294b3a395d43df63..278037e478c30575d2c7bcd8ce7113034b6222c5 100644 (file)
@@ -127,7 +127,8 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
             raise l3.RouterNotFound(router_id=id)
         return router
 
-    def _make_router_dict(self, router, fields=None):
+    def _make_router_dict(self, router, fields=None,
+                          process_extensions=True):
         res = {'id': router['id'],
                'name': router['name'],
                'tenant_id': router['tenant_id'],
@@ -138,6 +139,9 @@ class L3_NAT_db_mixin(l3.RouterPluginBase):
         if router['gw_port_id']:
             nw_id = router.gw_port['network_id']
             res['external_gateway_info'] = {'network_id': nw_id}
+        if process_extensions:
+            for func in self._dict_extend_functions.get(l3.ROUTERS, []):
+                func(self, res, router)
         return self._fields(res, fields)
 
     def create_router(self, context, router):
index d91cde1036ade401b495599ba6816befc7b6a21a..99691b1bf327f3c718ac641ba7893775a4a1b96d 100644 (file)
@@ -87,10 +87,11 @@ class RouterExternalGatewayInUseByFloatingIp(qexception.InUse):
                 "gateway to external network %(net_id)s is required by one or "
                 "more floating IPs.")
 
+ROUTERS = 'routers'
 
 # Attribute Map
 RESOURCE_ATTRIBUTE_MAP = {
-    'routers': {
+    ROUTERS: {
         'id': {'allow_post': False, 'allow_put': False,
                'validate': {'type:uuid': None},
                'is_visible': True,