Avoid extra queries when retrieving routers
fixes bug 1160333 Instead of making N additional sql requests, use relationship and joined query. Change-Id: I8f650691916a252bf2a525343bfa0521ff6fbe43
This commit is contained in:
parent
817cec6d56
commit
a00dd1325d
@ -18,12 +18,15 @@
|
||||
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,
|
||||
|
@ -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):
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user