From: Eugene Nikanorov Date: Tue, 19 Mar 2013 09:13:37 +0000 (+0400) Subject: Fix DB query returning ready devices in LoadBalancerCallbacks X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=0096ce10390af7a6a2fa3501c55cfbe447eb9ba8;p=openstack-build%2Fneutron-build.git Fix DB query returning ready devices in LoadBalancerCallbacks fixes bug 1156782 Change-Id: I6efdb32955c1b1f8f3dec7b3b1581e97ea0af4d8 --- diff --git a/quantum/plugins/services/agent_loadbalancer/plugin.py b/quantum/plugins/services/agent_loadbalancer/plugin.py index 748669aa1..a656ca8d6 100644 --- a/quantum/plugins/services/agent_loadbalancer/plugin.py +++ b/quantum/plugins/services/agent_loadbalancer/plugin.py @@ -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): diff --git a/quantum/tests/unit/services/agent_loadbalancer/test_plugin.py b/quantum/tests/unit/services/agent_loadbalancer/test_plugin.py index 081830dc0..56bfbfd8c 100644 --- a/quantum/tests/unit/services/agent_loadbalancer/test_plugin.py +++ b/quantum/tests/unit/services/agent_loadbalancer/test_plugin.py @@ -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: