Merge "Fix DB query returning ready devices in LoadBalancerCallbacks"
This commit is contained in:
@@ -49,15 +49,15 @@ class LoadBalancerCallbacks(object):
|
|||||||
|
|
||||||
def get_ready_devices(self, context, host=None):
|
def get_ready_devices(self, context, host=None):
|
||||||
with context.session.begin(subtransactions=True):
|
with context.session.begin(subtransactions=True):
|
||||||
qry = context.session.query(
|
qry = (context.session.query(loadbalancer_db.Pool.id).
|
||||||
loadbalancer_db.Vip, loadbalancer_db.Pool
|
join(loadbalancer_db.Vip))
|
||||||
)
|
|
||||||
qry = qry.filter(loadbalancer_db.Vip.status.in_(ACTIVE_PENDING))
|
qry = qry.filter(loadbalancer_db.Vip.status.in_(ACTIVE_PENDING))
|
||||||
qry = qry.filter(loadbalancer_db.Pool.status.in_(ACTIVE_PENDING))
|
qry = qry.filter(loadbalancer_db.Pool.status.in_(ACTIVE_PENDING))
|
||||||
up = True # makes pep8 and sqlalchemy happy
|
up = True # makes pep8 and sqlalchemy happy
|
||||||
qry = qry.filter(loadbalancer_db.Vip.admin_state_up == up)
|
qry = qry.filter(loadbalancer_db.Vip.admin_state_up == up)
|
||||||
qry = qry.filter(loadbalancer_db.Pool.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,
|
def get_logical_device(self, context, pool_id=None, activate=True,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import mock
|
|||||||
|
|
||||||
from quantum import context
|
from quantum import context
|
||||||
from quantum import manager
|
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.common import constants
|
||||||
from quantum.plugins.services.agent_loadbalancer import plugin
|
from quantum.plugins.services.agent_loadbalancer import plugin
|
||||||
from quantum.tests import base
|
from quantum.tests import base
|
||||||
@@ -50,6 +52,54 @@ class TestLoadBalancerCallbacks(TestLoadBalancerPluginBase):
|
|||||||
)
|
)
|
||||||
self.assertEqual(ready, [vip['vip']['pool_id']])
|
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):
|
def test_get_ready_devices_inactive_vip(self):
|
||||||
with self.vip() as vip:
|
with self.vip() as vip:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user