]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Fix DB query returning ready devices in LoadBalancerCallbacks
authorEugene Nikanorov <enikanorov@mirantis.com>
Tue, 19 Mar 2013 09:13:37 +0000 (13:13 +0400)
committerEugene Nikanorov <enikanorov@mirantis.com>
Wed, 20 Mar 2013 05:19:27 +0000 (09:19 +0400)
fixes bug 1156782

Change-Id: I6efdb32955c1b1f8f3dec7b3b1581e97ea0af4d8

quantum/plugins/services/agent_loadbalancer/plugin.py
quantum/tests/unit/services/agent_loadbalancer/test_plugin.py

index 748669aa116db757823acdd899ba41b01dfd5874..a656ca8d6e08cceb838f31ac4eca33db107a4277 100644 (file)
@@ -49,15 +49,15 @@ class LoadBalancerCallbacks(object):
 
     def get_ready_devices(self, context, host=None):
         with context.session.begin(subtransactions=True):
-            qry = context.session.query(
-                loadbalancer_db.Vip, loadbalancer_db.Pool
-            )
+            qry = (context.session.query(loadbalancer_db.Pool.id).
+                   join(loadbalancer_db.Vip))
+
             qry = qry.filter(loadbalancer_db.Vip.status.in_(ACTIVE_PENDING))
             qry = qry.filter(loadbalancer_db.Pool.status.in_(ACTIVE_PENDING))
             up = True  # makes pep8 and sqlalchemy happy
             qry = qry.filter(loadbalancer_db.Vip.admin_state_up == up)
             qry = qry.filter(loadbalancer_db.Pool.admin_state_up == up)
-            return [p.id for v, p in qry.all()]
+            return [id for id, in qry.all()]
 
     def get_logical_device(self, context, pool_id=None, activate=True,
                            **kwargs):
index 081830dc0d106d84f4dc55c3f20d3290d19f9bd0..56bfbfd8cad99db582d6463d23b74221cb89e5a2 100644 (file)
@@ -21,6 +21,8 @@ import mock
 
 from quantum import context
 from quantum import manager
+from quantum.db.loadbalancer import loadbalancer_db as ldb
+from quantum.openstack.common import uuidutils
 from quantum.plugins.common import constants
 from quantum.plugins.services.agent_loadbalancer import plugin
 from quantum.tests import base
@@ -50,6 +52,54 @@ class TestLoadBalancerCallbacks(TestLoadBalancerPluginBase):
             )
             self.assertEqual(ready, [vip['vip']['pool_id']])
 
+    def test_get_ready_devices_multiple_vips_and_pools(self):
+        ctx = context.get_admin_context()
+
+        # add 3 pools and 2 vips directly to DB
+        # to create 2 "ready" devices and one pool without vip
+        pools = []
+        for i in xrange(0, 3):
+            pools.append(ldb.Pool(id=uuidutils.generate_uuid(),
+                                  subnet_id=self._subnet_id,
+                                  protocol="HTTP",
+                                  lb_method="ROUND_ROBIN",
+                                  status=constants.ACTIVE,
+                                  admin_state_up=True))
+            ctx.session.add(pools[i])
+
+        vip0 = ldb.Vip(id=uuidutils.generate_uuid(),
+                       protocol_port=80,
+                       protocol="HTTP",
+                       pool_id=pools[0].id,
+                       status=constants.ACTIVE,
+                       admin_state_up=True,
+                       connection_limit=3)
+        ctx.session.add(vip0)
+        pools[0].vip_id = vip0.id
+
+        vip1 = ldb.Vip(id=uuidutils.generate_uuid(),
+                       protocol_port=80,
+                       protocol="HTTP",
+                       pool_id=pools[1].id,
+                       status=constants.ACTIVE,
+                       admin_state_up=True,
+                       connection_limit=3)
+        ctx.session.add(vip1)
+        pools[1].vip_id = vip1.id
+
+        ctx.session.flush()
+
+        self.assertEqual(ctx.session.query(ldb.Pool).count(), 3)
+        self.assertEqual(ctx.session.query(ldb.Vip).count(), 2)
+        ready = self.callbacks.get_ready_devices(ctx)
+        self.assertEqual(len(ready), 2)
+        self.assertIn(pools[0].id, ready)
+        self.assertIn(pools[1].id, ready)
+        self.assertNotIn(pools[2].id, ready)
+        # cleanup
+        ctx.session.query(ldb.Pool).delete()
+        ctx.session.query(ldb.Vip).delete()
+
     def test_get_ready_devices_inactive_vip(self):
         with self.vip() as vip: