]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Use a joined relationship for AZ info on routers
authorKevin Benton <blak111@gmail.com>
Wed, 16 Dec 2015 06:49:50 +0000 (22:49 -0800)
committerKevin Benton <blak111@gmail.com>
Wed, 16 Dec 2015 07:29:47 +0000 (23:29 -0800)
This patch adds a joined relationship from the routers
to the agent table to prevent excessive DB lookups of the
agent availability zones during router listings.

This fix is the same as the one for networks here:
I908ceb1a68e0eed7c304e3ff82279ad6fa406167

A follow-up patch will add an AZ table so this doesn't
have to join directly to the agents table.

Change-Id: I808f8ff0c581478b2ea1144e297d83af599a32f2
Closes-Bug: #1526644

neutron/db/availability_zone/router.py
neutron/db/l3_agentschedulers_db.py
neutron/db/l3_db.py
neutron/extensions/router_availability_zone.py

index ccb7244f49c16ab73b01ab9b31a44d012f05c3c2..1f3aad493c432b9d10039050a0d8614c29b7c80e 100644 (file)
@@ -29,7 +29,7 @@ class RouterAvailabilityZoneMixin(l3_attrs_db.ExtraAttributesMixin):
         router_res[az_ext.AZ_HINTS] = az_ext.convert_az_string_to_list(
             router_res[az_ext.AZ_HINTS])
         router_res['availability_zones'] = (
-            self.get_router_availability_zones(router_db['id']))
+            self.get_router_availability_zones(router_db))
 
     def _process_extra_attr_router_create(
         self, context, router_db, router_req):
index b61de7b7561e272e5340f1350f34780776b24dfc..ff0010c8b1ba634fd0a3e3eb4b76a0b99281b911 100644 (file)
@@ -31,7 +31,6 @@ from neutron.common import utils as n_utils
 from neutron import context as n_ctx
 from neutron.db import agents_db
 from neutron.db import agentschedulers_db
-from neutron.db import api as db_api
 from neutron.db import l3_attrs_db
 from neutron.db import model_base
 from neutron.extensions import l3agentscheduler
@@ -563,12 +562,5 @@ class AZL3AgentSchedulerDbMixin(L3AgentSchedulerDbMixin,
                                 router_az.RouterAvailabilityZonePluginBase):
     """Mixin class to add availability_zone supported l3 agent scheduler."""
 
-    def get_router_availability_zones(self, router_id):
-        session = db_api.get_session()
-        with session.begin():
-            query = session.query(agents_db.Agent.availability_zone)
-            query = query.join(RouterL3AgentBinding)
-            query = query.filter(
-                RouterL3AgentBinding.router_id == router_id)
-            query = query.group_by(agents_db.Agent.availability_zone)
-            return [item[0] for item in query]
+    def get_router_availability_zones(self, router):
+        return list({agent.availability_zone for agent in router.l3_agents})
index d27a62dc54332fc1af0df1416d06fdb8dc78ac9e..4c900998709b8afde47aabf6f018442079b3ad1b 100644 (file)
@@ -91,6 +91,8 @@ class Router(model_base.HasStandardAttributes, model_base.BASEV2,
         RouterPort,
         backref='router',
         lazy='dynamic')
+    l3_agents = orm.relationship('Agent', lazy='joined', viewonly=True,
+                                 secondary='routerl3agentbindings')
 
 
 class FloatingIP(model_base.HasStandardAttributes, model_base.BASEV2,
index f7d2d92bc89ce223f7f542eb515160d941be55d6..3e09bb302c3d75a79b40d283a8a8caf20e3d88e3 100644 (file)
@@ -64,5 +64,5 @@ class Router_availability_zone(extensions.ExtensionDescriptor):
 class RouterAvailabilityZonePluginBase(object):
 
     @abc.abstractmethod
-    def get_router_availability_zones(self, router_id):
+    def get_router_availability_zones(self, router):
         """Return availability zones which a router belongs to."""