]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Changed filter field to router_id
authorTu Hong Jun <tuhongj@cn.ibm.com>
Thu, 20 Aug 2015 06:08:07 +0000 (14:08 +0800)
committerArmando Migliaccio <armamig@gmail.com>
Fri, 4 Sep 2015 01:16:32 +0000 (01:16 +0000)
The get_sync_interfaces query will always return all router ports
from database even it is supposed to query specific ones that
belong to a certain router. In large L3 scale environment with
number of route ports in place, this would lag the response time
for adding router interface and router L3 agent binding.

Closes-Bug: #1489671
Change-Id: Ib78ca766f91783ad2ecca5b728c31602b4ed15d8

neutron/db/l3_db.py
neutron/tests/unit/extensions/test_l3.py

index ebd7465e8b18cc3da4fd2e9fff830c0d337d63d6..99eba12d217c0bff2aa0c808e052c58bb03557e4 100644 (file)
@@ -1173,7 +1173,7 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase):
             return []
         qry = context.session.query(RouterPort)
         qry = qry.filter(
-            Router.id.in_(router_ids),
+            RouterPort.router_id.in_(router_ids),
             RouterPort.port_type.in_(device_owners)
         )
 
index 77e55682b9773d1d8af45696b6c31a9aeaab424d..5a4ba441f774514e7d492a3e8f610ca6d588929b 100644 (file)
@@ -2501,6 +2501,42 @@ class L3AgentDbTestCaseBase(L3NatTestCaseMixin):
                 wanted_subnetid = p['port']['fixed_ips'][0]['subnet_id']
                 self.assertEqual(wanted_subnetid, subnet_id)
 
+    def test_l3_agent_sync_interfaces(self):
+        """Test L3 interfaces query return valid result"""
+        with self.router() as router1, self.router() as router2:
+            with self.port() as port1, self.port() as port2:
+                self._router_interface_action('add',
+                                              router1['router']['id'],
+                                              None,
+                                              port1['port']['id'])
+                self._router_interface_action('add',
+                                              router2['router']['id'],
+                                              None,
+                                              port2['port']['id'])
+                admin_ctx = context.get_admin_context()
+                router1_id = router1['router']['id']
+                router2_id = router2['router']['id']
+
+                # Verify if router1 pass in, return only interface from router1
+                ifaces = self.plugin._get_sync_interfaces(admin_ctx,
+                                                          [router1_id])
+                self.assertEqual(1, len(ifaces))
+                self.assertEqual(router1_id,
+                                 ifaces[0]['device_id'])
+
+                # Verify if router1 and router2 pass in, return both interfaces
+                ifaces = self.plugin._get_sync_interfaces(admin_ctx,
+                                                          [router1_id,
+                                                           router2_id])
+                self.assertEqual(2, len(ifaces))
+                device_list = [i['device_id'] for i in ifaces]
+                self.assertIn(router1_id, device_list)
+                self.assertIn(router2_id, device_list)
+
+                #Verify if no router pass in, return empty list
+                ifaces = self.plugin._get_sync_interfaces(admin_ctx, None)
+                self.assertEqual(0, len(ifaces))
+
     def test_l3_agent_routers_query_ignore_interfaces_with_moreThanOneIp(self):
         with self.router() as r:
             with self.subnet(cidr='9.0.1.0/24') as subnet: