Handle exception in neutron_v2 module

Partially implements blueprint senlin-exception-handling
Change-Id: I1ab205cbacc223bb5e643d9581682f2a23cf40b2
This commit is contained in:
Haiwei Xu 2015-08-21 15:59:45 +09:00
parent 2c580aa6ab
commit 801baf3724
4 changed files with 273 additions and 392 deletions

View File

@ -16,10 +16,12 @@ import six
from oslo_context import context as oslo_context
from oslo_log import log as logging
from senlin.common import exception
from senlin.common.i18n import _
from senlin.common.i18n import _LE
from senlin.drivers import base
from senlin.drivers.openstack import neutron_v2 as neutronclient
from senlin.engine import event
LOG = logging.getLogger(__name__)
@ -52,7 +54,15 @@ class LoadBalancerDriver(base.DriverBase):
"""
waited = 0
while waited < timeout:
lb = self.nc().loadbalancer_get(lb_id)
try:
lb = self.nc().loadbalancer_get(lb_id)
except exception.InternalError as ex:
msg = _LE('Failed in getting loadbalancer: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self, 'LB_GET',
'ERROR', msg)
return False
if lb is None:
lb_ready = ignore_not_found
else:
@ -83,11 +93,26 @@ class LoadBalancerDriver(base.DriverBase):
result = {}
# Create loadblancer
subnet = self.nc().subnet_get(vip['subnet'])
try:
subnet = self.nc().subnet_get(vip['subnet'])
except exception.InternalError as ex:
msg = _LE('Failed in getting subnet: %s.') % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self, 'SUBNET_GET',
'ERROR', msg)
return False, msg
subnet_id = subnet.id
lb = self.nc().loadbalancer_create(subnet_id,
vip.get('address', None),
vip['admin_state_up'])
try:
lb = self.nc().loadbalancer_create(subnet_id,
vip.get('address', None),
vip['admin_state_up'])
except exception.InternalError as ex:
msg = _LE('Failed in creating loadbalancer: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self, 'LB_CREATE',
'ERROR', msg)
return False, msg
result['loadbalancer'] = lb.id
res = self._wait_for_lb_ready(lb.id)
@ -97,10 +122,19 @@ class LoadBalancerDriver(base.DriverBase):
return False, msg
# Create listener
listener = self.nc().listener_create(lb.id, vip['protocol'],
vip['protocol_port'],
vip.get('connection_limit', None),
vip['admin_state_up'])
try:
listener = self.nc().listener_create(lb.id, vip['protocol'],
vip['protocol_port'],
vip.get('connection_limit',
None),
vip['admin_state_up'])
except exception.InternalError as ex:
msg = _LE('Failed in creating lb listener: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self, 'LISTENER_CREATE',
'ERROR', msg)
return False, msg
result['listener'] = listener.id
res = self._wait_for_lb_ready(lb.id)
if res is False:
@ -109,8 +143,17 @@ class LoadBalancerDriver(base.DriverBase):
return res, msg
# Create pool
pool = self.nc().pool_create(pool['lb_method'], listener.id,
pool['protocol'], pool['admin_state_up'])
try:
pool = self.nc().pool_create(pool['lb_method'], listener.id,
pool['protocol'],
pool['admin_state_up'])
except exception.InternalError as ex:
msg = _LE('Failed in creating lb pool: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self, 'POOL_CREATE',
'ERROR', msg)
return False, msg
result['pool'] = pool.id
res = self._wait_for_lb_ready(lb.id)
if res is False:
@ -130,7 +173,15 @@ class LoadBalancerDriver(base.DriverBase):
healthmonitor_id = kwargs.pop('healthmonitor', None)
if healthmonitor_id:
self.nc().healthmonitor_delete(healthmonitor_id)
try:
self.nc().healthmonitor_delete(healthmonitor_id)
except exception.InternalError as ex:
msg = _LE('Failed in deleting healthmonitor: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self,
'HEALTHMONITOR_DELETE', 'ERROR', msg)
return False, msg
res = self._wait_for_lb_ready(lb_id)
if res is False:
msg = _LE('Failed in deleting healthmonitor '
@ -139,7 +190,15 @@ class LoadBalancerDriver(base.DriverBase):
pool_id = kwargs.pop('pool', None)
if pool_id:
self.nc().pool_delete(pool_id)
try:
self.nc().pool_delete(pool_id)
except exception.InternalError as ex:
msg = _LE('Failed in deleting lb pool: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self, 'POOL_DELETE',
'ERROR', msg)
return False, msg
res = self._wait_for_lb_ready(lb_id)
if res is False:
msg = _LE('Failed in deleting pool (%s).') % pool_id
@ -147,7 +206,15 @@ class LoadBalancerDriver(base.DriverBase):
listener_id = kwargs.pop('listener', None)
if listener_id:
self.nc().listener_delete(listener_id)
try:
self.nc().listener_delete(listener_id)
except exception.InternalError as ex:
msg = _LE('Failed in deleting listener: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self,
'LISTENER_DELETE', 'ERROR', msg)
return False, msg
res = self._wait_for_lb_ready(lb_id)
if res is False:
msg = _LE('Failed in deleting listener (%s).') % listener_id
@ -177,9 +244,18 @@ class LoadBalancerDriver(base.DriverBase):
{'n': node.id})
return None
subnet_obj = self.nc().subnet_get(subnet)
net_id = subnet_obj.network_id
net = self.nc().network_get(net_id)
try:
subnet_obj = self.nc().subnet_get(subnet)
net_id = subnet_obj.network_id
net = self.nc().network_get(net_id)
except exception.InternalError as ex:
resource = 'subnet' if subnet in ex.message else 'network'
msg = _LE('Failed in getting %(resource)s: %(msg)s.'
) % {'resource': resource, 'msg': six.text_type(ex)}
LOG.exception(msg)
event.warning(oslo_context.get_current(), self,
resource.upper()+'_GET', 'ERROR', msg)
return None
net_name = net.name
if net_name not in addresses:
@ -188,8 +264,16 @@ class LoadBalancerDriver(base.DriverBase):
return None
address = addresses[net_name]
member = self.nc().pool_member_create(pool_id, address, port,
subnet_obj.id)
try:
member = self.nc().pool_member_create(pool_id, address, port,
subnet_obj.id)
except exception.InternalError as ex:
msg = _LE('Failed in creating lb pool member: %s.'
) % six.text_type(ex)
LOG.exception(msg)
event.warning(oslo_context.get_current(), self,
'POOL_MEMBER_CREATE', 'ERROR', msg)
return None
res = self._wait_for_lb_ready(lb_id)
if res is False:
LOG.error(_LE('Failed in creating pool member (%s).') % member.id)
@ -207,11 +291,14 @@ class LoadBalancerDriver(base.DriverBase):
"""
try:
self.nc().pool_member_delete(pool_id, member_id)
except Exception as ex:
LOG.error(_LE('Failed in removing member %(m)s from pool %(p)s: '
'%(ex)s'),
{'m': member_id, 'p': pool_id, 'ex': six.text_type(ex)})
return False
except exception.InternalError as ex:
msg = _LE('Failed in removing member %(m)s from pool %(p)s: '
'%(ex)s') % {'m': member_id, 'p': pool_id,
'ex': six.text_type(ex)}
LOG.exception(msg)
event.warning(oslo_context.get_current(), self,
'POOL_MEMBER_DELETE', 'ERROR', msg)
return None
res = self._wait_for_lb_ready(lb_id)
if res is False:
LOG.error(_LE('Failed in deleting pool member (%s).') % member_id)

View File

@ -11,10 +11,7 @@
# under the License.
from oslo_log import log
import six
from senlin.common import exception
from senlin.common.i18n import _
from senlin.drivers import base
from senlin.drivers.openstack import sdk
@ -29,46 +26,19 @@ class NeutronClient(base.DriverBase):
self.conn = sdk.create_connection(params)
def network_get(self, name_or_id):
try:
network = self.conn.network.find_network(name_or_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting network: %s'),
six.text_type(ex))
res = _('network:%s') % name_or_id
raise exception.ResourceNotFound(resource=res)
network = self.conn.network.find_network(name_or_id)
return network
def subnet_get(self, name_or_id):
try:
subnet = self.conn.network.find_subnet(name_or_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting subnet: %s.'),
six.text_type(ex))
res = _('subnet:%s') % name_or_id
raise exception.ResourceNotFound(resource=res)
subnet = self.conn.network.find_subnet(name_or_id)
return subnet
def loadbalancer_get(self, name_or_id):
try:
lb = self.conn.network.find_load_balancer(name_or_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting loadbalancer: %s.'),
six.text_type(ex))
res = _('loadbalancer:%s') % name_or_id
raise exception.ResourceNotFound(resource=res)
lb = self.conn.network.find_load_balancer(name_or_id)
return lb
def loadbalancer_list(self):
try:
lbs = [lb for lb in self.conn.network.load_balancers()]
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting loadbalancer: %s.'),
six.text_type(ex))
raise exception.ResourceNotFound(resource=_('loadbalancer:*'))
lbs = [lb for lb in self.conn.network.load_balancers()]
return lbs
def loadbalancer_create(self, vip_subnet_id, vip_address=None,
@ -86,47 +56,20 @@ class NeutronClient(base.DriverBase):
if description is not None:
kwargs['description'] = description
try:
res = self.conn.network.create_load_balancer(**kwargs)
except sdk.exc.HttpException as ex:
msg = six.text_type(ex)
LOG.exception(_('Failed in creating loadbalancer: %s.'), msg)
raise exception.ResourceCreationFailure(rtype='loadbalancer',
reason=msg)
res = self.conn.network.create_load_balancer(**kwargs)
return res
def loadbalancer_delete(self, lb_id, ignore_missing=True):
try:
self.conn.network.delete_load_balancer(
lb_id, ignore_missing=ignore_missing)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in deleting loadbalancer: %s.'),
six.text_type(ex))
res = _('loadbalancer:%s') % lb_id
raise exception.ResourceDeletionFailure(resource=res)
self.conn.network.delete_load_balancer(
lb_id, ignore_missing=ignore_missing)
return
def listener_get(self, name_or_id):
try:
listener = self.conn.network.find_listener(name_or_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting lb listener: %s.'),
six.text_type(ex))
res = _('listener:%s') % name_or_id
raise exception.ResourceNotFound(resource=res)
listener = self.conn.network.find_listener(name_or_id)
return listener
def listener_list(self):
try:
listeners = [i for i in self.conn.network.listeners()]
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in listing lb listener: %s.'),
six.text_type(ex))
raise exception.ResourceNotFound(resource=_('listener:*'))
listeners = [i for i in self.conn.network.listeners()]
return listeners
def listener_create(self, loadbalancer_id, protocol, protocol_port,
@ -147,46 +90,20 @@ class NeutronClient(base.DriverBase):
if description is not None:
kwargs['description'] = description
try:
res = self.conn.network.create_listener(**kwargs)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in creating lb listener: %s.'),
six.text_type(ex))
raise exception.ResourceCreationFailure(rtype='listener')
res = self.conn.network.create_listener(**kwargs)
return res
def listener_delete(self, listener_id, ignore_missing=True):
try:
self.conn.network.delete_listener(listener_id,
ignore_missing=ignore_missing)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in deleting lb listener: %s.'),
six.text_type(ex))
res = _('listener:%s') % listener_id
raise exception.ResourceDeletionFailure(resource=res)
self.conn.network.delete_listener(listener_id,
ignore_missing=ignore_missing)
return
def pool_get(self, name_or_id):
try:
pool = self.conn.network.find_pool(name_or_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting lb pool: %s.'),
six.text_type(ex))
res = _('pool:%s') % name_or_id
raise exception.ResourceNotFound(resource=res)
pool = self.conn.network.find_pool(name_or_id)
return pool
def pool_list(self):
try:
pools = [p for p in self.conn.network.pools()]
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in listing lb pool: %s.'),
six.text_type(ex))
raise exception.ResourceNotFound(resource=_('pool:*'))
pools = [p for p in self.conn.network.pools()]
return pools
def pool_create(self, lb_algorithm, listener_id, protocol,
@ -204,48 +121,21 @@ class NeutronClient(base.DriverBase):
if description is not None:
kwargs['description'] = description
try:
res = self.conn.network.create_pool(**kwargs)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in creating lb pool: %s.'),
six.text_type(ex))
raise exception.ResourceCreationFailure(rtype='pool')
res = self.conn.network.create_pool(**kwargs)
return res
def pool_delete(self, pool_id, ignore_missing=True):
try:
self.conn.network.delete_pool(pool_id,
ignore_missing=ignore_missing)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in deleting lb pool: %s.'),
six.text_type(ex))
res = _('pool:%s') % pool_id
raise exception.ResourceDeletionFailure(resource=res)
self.conn.network.delete_pool(pool_id,
ignore_missing=ignore_missing)
return
def pool_member_get(self, pool_id, name_or_id):
try:
member = self.conn.network.find_pool_member(name_or_id,
pool_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting lb pool member: %s.'),
six.text_type(ex))
res = _('member:%(p)s:%(m)s') % {'p': pool_id, 'm': name_or_id}
raise exception.ResourceNotFound(resource=res)
member = self.conn.network.find_pool_member(name_or_id,
pool_id)
return member
def pool_member_list(self, pool_id):
try:
members = [m for m in self.conn.network.pool_members(pool_id)]
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in listing lb pool member: %s.'),
six.text_type(ex))
res = _('member:%s:*') % pool_id
raise exception.ResourceNotFound(resource=res)
members = [m for m in self.conn.network.pool_members(pool_id)]
return members
def pool_member_create(self, pool_id, address, protocol_port, subnet_id,
@ -262,46 +152,20 @@ class NeutronClient(base.DriverBase):
if weight is not None:
kwargs['weight'] = weight
try:
res = self.conn.network.create_pool_member(**kwargs)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in creating lb pool member: %s.'),
six.text_type(ex))
raise exception.ResourceCreationFailure(rtype='lb:member')
res = self.conn.network.create_pool_member(**kwargs)
return res
def pool_member_delete(self, pool_id, member_id, ignore_missing=True):
try:
self.conn.network.delete_pool_member(
member_id, pool_id, ignore_missing=ignore_missing)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in deleting lb pool member: %s.'),
six.text_type(ex))
res = _('member:%(p)s:%(m)s') % {'p': pool_id, 'm': member_id}
raise exception.ResourceDeletionFailure(resource=res)
self.conn.network.delete_pool_member(
member_id, pool_id, ignore_missing=ignore_missing)
return
def healthmonitor_get(self, name_or_id):
try:
hm = self.conn.network.find_health_monitor(name_or_id)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in getting lb health-monitor: %s.'),
six.text_type(ex))
res = _('healthmonitor:%s') % name_or_id
raise exception.ResourceNotFound(resource=res)
hm = self.conn.network.find_health_monitor(name_or_id)
return hm
def healthmonitor_list(self):
try:
hms = [hm for hm in self.conn.network.health_monitors()]
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in listing lb health-monitor: %s.'),
six.text_type(ex))
raise exception.ResourceNotFound(resource=_('healthmonitor:*'))
hms = [hm for hm in self.conn.network.health_monitors()]
return hms
def healthmonitor_create(self, hm_type, delay, timeout, max_retries,
@ -326,23 +190,10 @@ class NeutronClient(base.DriverBase):
if expected_codes is not None:
kwargs['expected_codes'] = expected_codes
try:
res = self.conn.network.create_health_monitor(**kwargs)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in creating lb health-monitor: %s.'),
six.text_type(ex))
raise exception.ResourceCreationFailure(rtype='healthmonitor')
res = self.conn.network.create_health_monitor(**kwargs)
return res
def healthmonitor_delete(self, hm_id, ignore_missing=True):
try:
self.conn.network.delete_health_monitor(
hm_id, ignore_missing=ignore_missing)
except sdk.exc.HttpException as ex:
LOG.exception(_('Failed in deleting lb health-monitor: %s.'),
six.text_type(ex))
res = _('healthmonitor:%s') % hm_id
raise exception.ResourceDeletionFailure(resource=res)
self.conn.network.delete_health_monitor(
hm_id, ignore_missing=ignore_missing)
return

View File

@ -15,9 +15,11 @@ import mock
from oslo_context import context as oslo_context
from senlin.common import exception
from senlin.common.i18n import _
from senlin.drivers.openstack import lbaas
from senlin.drivers.openstack import neutron_v2
from senlin.engine import event
from senlin.tests.unit.common import base
from senlin.tests.unit.common import utils
@ -142,7 +144,8 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.lb_driver._wait_for_lb_ready.assert_has_calls(
calls, any_order=False)
def test_lb_create_loadbalancer_creation_failed(self):
@mock.patch.object(event, 'warning')
def test_lb_create_loadbalancer_creation_failed(self, mock_event):
lb_obj = mock.Mock()
lb_obj.id = 'LB_ID'
subnet_obj = mock.Mock()
@ -166,8 +169,27 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.lb_driver.lb_delete.assert_called_once_with(
loadbalancer='LB_ID')
# Exception happens in subnet_get.
self.nc.subnet_get.side_effect = exception.InternalError(
code=500, message='GET FAILED')
status, res = self.lb_driver.lb_create(self.vip, self.pool)
self.assertFalse(status)
msg = _('Failed in getting subnet: GET FAILED.')
self.assertEqual(msg, res)
# Exception happens in loadbalancer_create.
self.nc.subnet_get.side_effect = None
self.nc.loadbalancer_create.side_effect = exception.InternalError(
code=500, message='CREATE FAILED')
status, res = self.lb_driver.lb_create(self.vip, self.pool)
self.assertFalse(status)
msg = _('Failed in creating loadbalancer: CREATE FAILED.')
self.assertEqual(msg, res)
self.assertTrue(mock_event.called)
@mock.patch.object(event, 'warning')
@mock.patch.object(eventlet, 'sleep')
def test_lb_create_listener_creation_failed(self, mock_sleep):
def test_lb_create_listener_creation_failed(self, mock_sleep, mock_event):
lb_obj = mock.Mock()
listener_obj = mock.Mock()
lb_obj.id = 'LB_ID'
@ -197,7 +219,19 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.lb_driver.lb_delete.assert_called_once_with(
loadbalancer='LB_ID', listener='LISTENER_ID')
def test_lb_create_pool_creation_failed(self):
# Exception happens in listen_create
self.lb_driver._wait_for_lb_ready = mock.Mock()
self.lb_driver._wait_for_lb_ready.side_effect = [True, False]
self.nc.listener_create.side_effect = exception.InternalError(
code=500, message='CREATE FAILED')
status, res = self.lb_driver.lb_create(self.vip, self.pool)
self.assertFalse(status)
msg = _('Failed in creating lb listener: CREATE FAILED.')
self.assertEqual(msg, res)
self.assertTrue(mock_event.called)
@mock.patch.object(event, 'warning')
def test_lb_create_pool_creation_failed(self, mock_event):
lb_obj = mock.Mock()
listener_obj = mock.Mock()
pool_obj = mock.Mock()
@ -233,6 +267,17 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.lb_driver.lb_delete.assert_called_once_with(
loadbalancer='LB_ID', listener='LISTENER_ID', pool='POOL_ID')
# Exception happens in pool_create
self.lb_driver._wait_for_lb_ready = mock.Mock()
self.lb_driver._wait_for_lb_ready.side_effect = [True, True, False]
self.nc.pool_create.side_effect = exception.InternalError(
code=500, message='CREATE FAILED')
status, res = self.lb_driver.lb_create(self.vip, self.pool)
self.assertFalse(status)
msg = _('Failed in creating lb pool: CREATE FAILED.')
self.assertEqual(msg, res)
self.assertTrue(mock_event.called)
def test_lb_delete(self):
kwargs = {
'loadbalancer': 'LB_ID',
@ -254,6 +299,58 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.lb_driver._wait_for_lb_ready.assert_has_calls(
calls, any_order=False)
@mock.patch.object(event, 'warning')
def test_lb_healthmonitor_delete_internalerror(self, mock_event):
kwargs = {
'loadbalancer': 'LB_ID',
'listener': 'LISTENER_ID',
'pool': 'POOL_ID',
'healthmonitor': 'HM_ID'
}
self.nc.healthmonitor_delete.side_effect = exception.InternalError(
code=500, message='DELETE FAILED')
status, res = self.lb_driver.lb_delete(**kwargs)
self.assertFalse(status)
msg = _('Failed in deleting healthmonitor: DELETE FAILED.')
self.assertEqual(msg, res)
self.assertTrue(mock_event.called)
@mock.patch.object(event, 'warning')
def test_lb_pool_delete_internalerror(self, mock_event):
kwargs = {
'loadbalancer': 'LB_ID',
'listener': 'LISTENER_ID',
'pool': 'POOL_ID',
'healthmonitor': 'HM_ID'
}
self.nc.pool_delete.side_effect = exception.InternalError(
code=500, message='DELETE FAILED')
self.lb_driver._wait_for_lb_ready = mock.Mock()
self.lb_driver._wait_for_lb_ready.return_value = True
status, res = self.lb_driver.lb_delete(**kwargs)
self.assertFalse(status)
msg = _('Failed in deleting lb pool: DELETE FAILED.')
self.assertEqual(msg, res)
self.assertTrue(mock_event.called)
@mock.patch.object(event, 'warning')
def test_lb_listener_delete_internalerror(self, mock_event):
kwargs = {
'loadbalancer': 'LB_ID',
'listener': 'LISTENER_ID',
'pool': 'POOL_ID',
'healthmonitor': 'HM_ID'
}
self.nc.listener_delete.side_effect = exception.InternalError(
code=500, message='DELETE FAILED')
self.lb_driver._wait_for_lb_ready = mock.Mock()
self.lb_driver._wait_for_lb_ready.return_value = True
status, res = self.lb_driver.lb_delete(**kwargs)
self.assertFalse(status)
msg = _('Failed in deleting listener: DELETE FAILED.')
self.assertEqual(msg, res)
self.assertTrue(mock_event.called)
def test_lb_delete_no_physical_object(self):
kwargs = {'loadbalancer': 'LB_ID'}
self.lb_driver._wait_for_lb_ready = mock.Mock()
@ -316,8 +413,9 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
res = self.lb_driver._get_node_address(node, version=4)
self.assertEqual({}, res)
@mock.patch.object(event, 'warning')
@mock.patch.object(lbaas.LoadBalancerDriver, '_get_node_address')
def test_member_add_succeeded(self, mock_get_node_address):
def test_member_add(self, mock_get_node_address, mock_event):
node = mock.Mock()
lb_id = 'LB_ID'
pool_id = 'POOL_ID'
@ -349,6 +447,33 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.nc.pool_member_create.assert_called_once_with(
pool_id, 'ipaddr_net1', port, 'SUBNET_ID')
# Exception happens in subnet_get
self.nc.subnet_get.side_effect = exception.InternalError(
code=500, message="Can't find subnet1")
res = self.lb_driver.member_add(node, lb_id, pool_id, port, subnet)
self.assertEqual(None, res)
self.assertTrue(mock_event.called)
# Exception happens in network_get
self.nc.subnet_get.side_effect = None
self.nc.subnet_get.return_value = subnet_obj
self.nc.network_get.side_effect = exception.InternalError(
code=500, message="Can't find NETWORK_ID")
res = self.lb_driver.member_add(node, lb_id, pool_id, port, subnet)
self.assertEqual(None, res)
self.assertTrue(mock_event.called)
# Exception happens in pool_member_create
self.nc.subnet_get.side_effect = None
self.nc.subnet_get.return_value = subnet_obj
self.nc.network_get.side_effect = None
self.nc.network_get.return_value = network_obj
self.nc.pool_member_create.side_effect = exception.InternalError(
code=500, message="CREATE FAILED")
res = self.lb_driver.member_add(node, lb_id, pool_id, port, subnet)
self.assertEqual(None, res)
self.assertTrue(mock_event.called)
@mock.patch.object(lbaas.LoadBalancerDriver, '_get_node_address')
def test_member_add_node_no_address(self, mock_get_node_address):
node = mock.Mock()
@ -397,17 +522,20 @@ class TestNeutronLBaaSDriver(base.SenlinTestCase):
self.nc.pool_member_delete.assert_called_once_with(pool_id, member_id)
self.lb_driver._wait_for_lb_ready.assert_called_once_with(lb_id)
def test_member_remove_failed(self):
@mock.patch.object(event, 'warning')
def test_member_remove_failed(self, mock_event):
lb_id = 'LB_ID'
pool_id = 'POOL_ID'
member_id = 'MEMBER_ID'
self.lb_driver._wait_for_lb_ready = mock.Mock()
self.lb_driver._wait_for_lb_ready.return_value = True
self.nc.pool_member_delete.side_effect = Exception('')
self.nc.pool_member_delete.side_effect = exception.InternalError(
code=500, message='')
res = self.lb_driver.member_remove(lb_id, pool_id, member_id)
self.assertFalse(res)
self.nc.pool_member_delete.assert_called_once_with(pool_id, member_id)
self.assertTrue(mock_event.called)
self.nc.pool_member_delete.side_effect = None
self.lb_driver._wait_for_lb_ready.return_value = False

View File

@ -11,10 +11,7 @@
# under the License.
import mock
import six
from senlin.common import exception
from senlin.common.i18n import _
from senlin.drivers.openstack import neutron_v2
from senlin.drivers.openstack import sdk
from senlin.tests.unit.common import base
@ -47,15 +44,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.find_network.assert_called_once_with(net_id)
self.assertEqual(network_obj, res)
exception_info = 'Exception happened when getting network.'
fake_exception = sdk.exc.HttpException(exception_info)
self.conn.network.find_network.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.network_get, net_id)
msg = _('The resource (network:%s) could not be found.') % net_id
self.assertEqual(msg, six.text_type(ex))
def test_subnet_get(self):
subnet_id = 'subnet_identifier'
subnet_obj = mock.Mock()
@ -65,14 +53,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.find_subnet.assert_called_once_with(subnet_id)
self.assertEqual(subnet_obj, res)
exception_info = 'Exception happened when getting subnet.'
fake_exception = sdk.exc.HttpException(exception_info)
self.conn.network.find_subnet.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.subnet_get, subnet_id)
msg = _('The resource (subnet:%s) could not be found.') % subnet_id
self.assertEqual(msg, six.text_type(ex))
def test_loadbalancer_get(self):
lb_id = 'loadbalancer_identifier'
loadbalancer_obj = mock.Mock()
@ -82,15 +62,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.find_load_balancer.assert_called_once_with(lb_id)
self.assertEqual(loadbalancer_obj, res)
exception_info = 'Exception happened when getting loadbalancer.'
fake_exception = sdk.exc.HttpException(exception_info)
self.conn.network.find_load_balancer.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.loadbalancer_get, lb_id)
msg = _('The resource (loadbalancer:%s) could not be found.') % lb_id
self.assertEqual(msg, six.text_type(ex))
def test_loadbalancer_list(self):
loadbalancers = ['lb1', 'lb2']
@ -98,14 +69,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.assertEqual(loadbalancers, self.nc.loadbalancer_list())
self.conn.network.load_balancers.assert_called_once_with()
exception_info = 'Exception happened when listing loadbalancer.'
fake_exception = sdk.exc.HttpException(exception_info)
self.conn.network.load_balancers.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.loadbalancer_list)
msg = _('The resource (loadbalancer:*) could not be found.')
self.assertEqual(msg, six.text_type(ex))
def test_loadbalancer_create(self):
vip_subnet_id = 'ID1'
lb_obj = mock.Mock()
@ -132,15 +95,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.create_load_balancer.assert_called_with(
vip_subnet_id=vip_subnet_id, **kwargs)
# Exception happened during creating progress
exception_info = 'Exception happened when creating loadbalancer.'
fake_exception = sdk.exc.HttpException(exception_info)
self.conn.network.create_load_balancer.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceCreationFailure,
self.nc.loadbalancer_create, vip_subnet_id)
msg = _('Failed in creating loadbalancer.')
self.assertEqual(msg, six.text_type(ex))
def test_loadbalancer_delete(self):
lb_id = 'ID1'
@ -152,14 +106,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.delete_load_balancer.assert_called_with(
lb_id, ignore_missing=True)
fake_exception = sdk.exc.HttpException('')
self.conn.network.delete_load_balancer.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceDeletionFailure,
self.nc.loadbalancer_delete,
lb_id)
msg = _('Failed in deleting loadbalancer:%s.') % lb_id
self.assertEqual(msg, six.text_type(ex))
def test_listener_get(self):
name_or_id = 'listener_identifier'
listener_obj = mock.Mock()
@ -170,14 +116,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
name_or_id)
self.assertEqual(listener_obj, res)
fake_exception = sdk.exc.HttpException('')
self.conn.network.find_listener.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.listener_get,
name_or_id)
msg = _('The resource (listener:%s) could not be found.') % name_or_id
self.assertEqual(msg, six.text_type(ex))
def test_listener_list(self):
listeners = ['listener1', 'listener2']
@ -185,13 +123,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.assertEqual(listeners, self.nc.listener_list())
self.conn.network.listeners.assert_called_once_with()
fake_exception = sdk.exc.HttpException('')
self.conn.network.listeners.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.listener_list)
msg = _('The resource (listener:*) could not be found.')
self.assertEqual(msg, six.text_type(ex))
def test_listener_create(self):
loadbalancer_id = 'ID1'
protocol = 'HTTP'
@ -223,15 +154,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
loadbalancer_id=loadbalancer_id, protocol=protocol,
protocol_port=protocol_port, **kwargs)
# Exception happened during creating progress
fake_exception = sdk.exc.HttpException('')
self.conn.network.create_listener.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceCreationFailure,
self.nc.listener_create, loadbalancer_id,
protocol, protocol_port)
msg = _("Failed in creating %(rtype)s.") % {'rtype': 'listener'}
self.assertEqual(msg, six.text_type(ex))
def test_listener_delete(self):
listener_id = 'ID1'
@ -243,14 +165,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.delete_listener.assert_called_with(
listener_id, ignore_missing=True)
fake_exception = sdk.exc.HttpException('')
self.conn.network.delete_listener.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceDeletionFailure,
self.nc.listener_delete,
listener_id)
msg = _('Failed in deleting listener:%s.') % listener_id
self.assertEqual(msg, six.text_type(ex))
def test_pool_get(self):
name_or_id = 'pool_identifier'
pool_obj = mock.Mock()
@ -260,13 +174,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.find_pool.assert_called_once_with(name_or_id)
self.assertEqual(pool_obj, res)
fake_exception = sdk.exc.HttpException('')
self.conn.network.find_pool.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound, self.nc.pool_get,
name_or_id)
msg = _('The resource (pool:%s) could not be found.') % name_or_id
self.assertEqual(msg, six.text_type(ex))
def test_pool_list(self):
pools = ['pool1', 'pool2']
@ -274,12 +181,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.assertEqual(pools, self.nc.pool_list())
self.conn.network.pools.assert_called_once_with()
fake_exception = sdk.exc.HttpException('')
self.conn.network.pools.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound, self.nc.pool_list)
msg = _('The resource (pool:*) could not be found.')
self.assertEqual(msg, six.text_type(ex))
def test_pool_create(self):
lb_algorithm = 'ROUND_ROBIN'
listener_id = 'ID1'
@ -310,15 +211,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
lb_algorithm=lb_algorithm, listener_id=listener_id,
protocol=protocol, **kwargs)
# Exception happened during creating progress
fake_exception = sdk.exc.HttpException('')
self.conn.network.create_pool.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceCreationFailure,
self.nc.pool_create, lb_algorithm,
listener_id, protocol)
msg = _("Failed in creating %(rtype)s.") % {'rtype': 'pool'}
self.assertEqual(msg, six.text_type(ex))
def test_pool_delete(self):
pool_id = 'ID1'
@ -330,14 +222,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.delete_pool.assert_called_with(
pool_id, ignore_missing=True)
fake_exception = sdk.exc.HttpException('')
self.conn.network.delete_pool.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceDeletionFailure,
self.nc.pool_delete,
pool_id)
msg = _('Failed in deleting pool:%s.') % pool_id
self.assertEqual(msg, six.text_type(ex))
def test_pool_member_get(self):
name_or_id = 'member_identifier'
pool_id = 'ID1'
@ -349,15 +233,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
name_or_id, pool_id)
self.assertEqual(member_obj, res)
fake_exception = sdk.exc.HttpException('')
self.conn.network.find_pool_member.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.pool_member_get,
pool_id, name_or_id)
msg = _('The resource (member:%(p)s:%(m)s) could not be found.'
) % {'p': pool_id, 'm': name_or_id}
self.assertEqual(msg, six.text_type(ex))
def test_pool_member_list(self):
pool_id = 'ID1'
members = ['member1', 'member2']
@ -366,14 +241,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.assertEqual(members, self.nc.pool_member_list(pool_id))
self.conn.network.pool_members.assert_called_once_with(pool_id)
fake_exception = sdk.exc.HttpException('')
self.conn.network.pool_members.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.pool_member_list,
pool_id)
msg = _('The resource (member:%s:*) could not be found.') % pool_id
self.assertEqual(msg, six.text_type(ex))
def test_pool_member_create(self):
pool_id = 'ID1'
address = '192.168.1.100'
@ -405,15 +272,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
pool_id=pool_id, address=address, protocol_port=protocol_port,
subnet_id=subnet_id, **kwargs)
# Exception happened during creating progress
fake_exception = sdk.exc.HttpException('')
self.conn.network.create_pool_member.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceCreationFailure,
self.nc.pool_member_create, pool_id, address,
protocol_port, subnet_id)
msg = _("Failed in creating %(rtype)s.") % {'rtype': 'lb:member'}
self.assertEqual(msg, six.text_type(ex))
def test_pool_member_delete(self):
pool_id = 'ID1'
member_id = 'ID2'
@ -426,15 +284,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.conn.network.delete_pool_member.assert_called_with(
member_id, pool_id, ignore_missing=True)
fake_exception = sdk.exc.HttpException('')
self.conn.network.delete_pool_member.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceDeletionFailure,
self.nc.pool_member_delete,
pool_id, member_id)
msg = _('Failed in deleting member:%(p)s:%(m)s.'
) % {'p': pool_id, 'm': member_id}
self.assertEqual(msg, six.text_type(ex))
def test_healthmonitor_get(self):
name_or_id = 'healthmonitor_identifier'
healthmonitor_obj = mock.Mock()
@ -445,15 +294,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
name_or_id)
self.assertEqual(healthmonitor_obj, res)
fake_exception = sdk.exc.HttpException('')
self.conn.network.find_health_monitor.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.healthmonitor_get,
name_or_id)
msg = _('The resource (healthmonitor:%s) could not be found.'
) % name_or_id
self.assertEqual(msg, six.text_type(ex))
def test_healthmonitor_list(self):
healthmonitors = ['hm1', 'hm2']
@ -461,13 +301,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.assertEqual(healthmonitors, self.nc.healthmonitor_list())
self.conn.network.health_monitors.assert_called_once_with()
fake_exception = sdk.exc.HttpException('')
self.conn.network.health_monitors.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceNotFound,
self.nc.healthmonitor_list)
msg = _('The resource (healthmonitor:*) could not be found.')
self.assertEqual(msg, six.text_type(ex))
def test_healthmonitor_create(self):
hm_type = 'HTTP'
delay = 30
@ -511,16 +344,6 @@ class TestNeutronV2Driver(base.SenlinTestCase):
max_retries=max_retries, pool_id=pool_id,
admin_state_up=True)
# Exception happened during creating progress
exception_info = 'Exception happened when creating healthmonitor.'
fake_exception = sdk.exc.HttpException(exception_info)
self.conn.network.create_health_monitor.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceCreationFailure,
self.nc.healthmonitor_create, hm_type, delay,
timeout, max_retries, pool_id)
msg = _("Failed in creating %(rtype)s.") % {'rtype': 'healthmonitor'}
self.assertEqual(msg, six.text_type(ex))
def test_healthmonitor_delete(self):
healthmonitor_id = 'ID1'
@ -531,11 +354,3 @@ class TestNeutronV2Driver(base.SenlinTestCase):
self.nc.healthmonitor_delete(healthmonitor_id)
self.conn.network.delete_health_monitor.assert_called_with(
healthmonitor_id, ignore_missing=True)
fake_exception = sdk.exc.HttpException('')
self.conn.network.delete_health_monitor.side_effect = fake_exception
ex = self.assertRaises(exception.ResourceDeletionFailure,
self.nc.healthmonitor_delete,
healthmonitor_id)
msg = _('Failed in deleting healthmonitor:%s.') % healthmonitor_id
self.assertEqual(msg, six.text_type(ex))