Merge "LBaaS: make device driver decide whether to deploy instance"

This commit is contained in:
Jenkins 2014-03-27 11:33:25 +00:00 committed by Gerrit Code Review
commit e32a8d4426
4 changed files with 41 additions and 21 deletions

View File

@ -95,12 +95,6 @@ class LoadBalancerCallbacks(object):
qry = context.session.query(loadbalancer_db.Pool) qry = context.session.query(loadbalancer_db.Pool)
qry = qry.filter_by(id=pool_id) qry = qry.filter_by(id=pool_id)
pool = qry.one() pool = qry.one()
if pool.status != constants.ACTIVE:
raise n_exc.Invalid(_('Pool_id %(pool_id)s status ACTIVE '
'is expected but status is %(status)s') %
{'pool_id': pool_id,
'status': pool.status})
retval = {} retval = {}
retval['pool'] = self.plugin._make_pool_dict(pool) retval['pool'] = self.plugin._make_pool_dict(pool)

View File

@ -265,11 +265,15 @@ class HaproxyNSDriver(agent_device_driver.AgentDeviceDriver):
@n_utils.synchronized('haproxy-driver') @n_utils.synchronized('haproxy-driver')
def deploy_instance(self, logical_config): def deploy_instance(self, logical_config):
# do actual deploy only if vip is configured and active # do actual deploy only if vip and pool are configured and active
if ('vip' not in logical_config or if (not logical_config or
'vip' not in logical_config or
(logical_config['vip']['status'] not in (logical_config['vip']['status'] not in
constants.ACTIVE_PENDING_STATUSES) or constants.ACTIVE_PENDING_STATUSES) or
not logical_config['vip']['admin_state_up']): not logical_config['vip']['admin_state_up'] or
(logical_config['pool']['status'] not in
constants.ACTIVE_PENDING_STATUSES) or
not logical_config['pool']['admin_state_up']):
return return
if self.exists(logical_config['pool']['id']): if self.exists(logical_config['pool']['id']):

View File

@ -48,7 +48,8 @@ class TestHaproxyNSDriver(base.BaseTestCase):
self.driver.vif_driver = self.vif_driver self.driver.vif_driver = self.vif_driver
self.fake_config = { self.fake_config = {
'pool': {'id': 'pool_id'}, 'pool': {'id': 'pool_id', 'status': 'ACTIVE',
'admin_state_up': True},
'vip': {'id': 'vip_id', 'port': {'id': 'port_id'}, 'vip': {'id': 'vip_id', 'port': {'id': 'port_id'},
'status': 'ACTIVE', 'admin_state_up': True} 'status': 'ACTIVE', 'admin_state_up': True}
} }
@ -357,6 +358,18 @@ class TestHaproxyNSDriver(base.BaseTestCase):
self.driver.deploy_instance(self.fake_config) self.driver.deploy_instance(self.fake_config)
self.assertFalse(exists.called) self.assertFalse(exists.called)
def test_deploy_instance_pool_status_non_active(self):
with mock.patch.object(self.driver, 'exists') as exists:
self.fake_config['pool']['status'] = 'NON_ACTIVE'
self.driver.deploy_instance(self.fake_config)
self.assertFalse(exists.called)
def test_deploy_instance_pool_admin_state_down(self):
with mock.patch.object(self.driver, 'exists') as exists:
self.fake_config['pool']['admin_state_up'] = False
self.driver.deploy_instance(self.fake_config)
self.assertFalse(exists.called)
def test_refresh_device(self): def test_refresh_device(self):
with mock.patch.object(self.driver, 'deploy_instance') as deploy: with mock.patch.object(self.driver, 'deploy_instance') as deploy:
pool_id = 'pool_id1' pool_id = 'pool_id1'

View File

@ -22,7 +22,6 @@ import mock
from six.moves import xrange from six.moves import xrange
from webob import exc from webob import exc
from neutron.common import exceptions
from neutron import context from neutron import context
from neutron.db.loadbalancer import loadbalancer_db as ldb from neutron.db.loadbalancer import loadbalancer_db as ldb
from neutron.db import servicetype_db as st_db from neutron.db import servicetype_db as st_db
@ -180,15 +179,25 @@ class TestLoadBalancerCallbacks(TestLoadBalancerPluginBase):
) )
self.assertFalse(ready) self.assertFalse(ready)
def test_get_logical_device_inactive(self): def test_get_logical_device_non_active(self):
with self.pool() as pool: with self.pool() as pool:
with self.vip(pool=pool) as vip: ctx = context.get_admin_context()
with self.member(pool_id=vip['vip']['pool_id']): for status in ('INACTIVE', 'PENDING_CREATE', 'PENDING_UPDATE'):
self.assertRaises( self.plugin_instance.update_status(
exceptions.Invalid, ctx, ldb.Pool, pool['pool']['id'], status)
self.callbacks.get_logical_device, pool['pool']['status'] = status
context.get_admin_context(), expected = {
pool['pool']['id']) 'pool': pool['pool'],
'members': [],
'healthmonitors': [],
'driver': 'dummy'
}
logical_config = self.callbacks.get_logical_device(
ctx, pool['pool']['id']
)
self.assertEqual(expected, logical_config)
def test_get_logical_device_active(self): def test_get_logical_device_active(self):
with self.pool() as pool: with self.pool() as pool: