LBaaS plugin bugfix

Correct behavior of LBaaS plugin while deleting members, creating and
updating VIPs.

Change-Id: Ibc8f17b4e1406669c108c28821f41e6282a7f9f1
This commit is contained in:
Kobi Samoray 2015-03-30 16:32:19 +03:00
parent b582c78def
commit 4f08e0a72e
2 changed files with 39 additions and 33 deletions

View File

@ -477,7 +477,7 @@ class EdgeLbDriver(object):
LOG.debug('Create VIP %s', vip)
app_profile = convert_lbaas_app_profile(
vip['id'], vip.get('session_persistence', {}),
vip['id'], vip.get('session_persistence') or {},
vip.get('protocol'))
if not pool_mapping:
@ -520,7 +520,7 @@ class EdgeLbDriver(object):
edge_vip_id = vip_mapping['edge_vse_id']
app_profile_id = vip_mapping['edge_app_profile_id']
app_profile = convert_lbaas_app_profile(
vip['name'], vip.get('session_persistence', {}),
vip['name'], vip.get('session_persistence') or {},
vip.get('protocol'))
try:
self.vcns.update_app_profile(edge_id, app_profile_id, app_profile)
@ -544,34 +544,33 @@ class EdgeLbDriver(object):
if not vip_mapping:
LOG.error(_LE('No mapping found for vip %s'), vip['id'])
return
else:
edge_id = vip_mapping['edge_id']
edge_vse_id = vip_mapping['edge_vse_id']
app_profile_id = vip_mapping['edge_app_profile_id']
edge_id = vip_mapping['edge_id']
edge_vse_id = vip_mapping['edge_vse_id']
app_profile_id = vip_mapping['edge_app_profile_id']
try:
self.vcns.delete_vip(edge_id, edge_vse_id)
self._del_vip_as_secondary_ip(edge_id, vip['address'])
self._del_vip_fw_rule(edge_id, vip_mapping['edge_fw_rule_id'])
except nsxv_exc.ResourceNotFound:
LOG.error(_LE('vip not found on edge: %s'), edge_id)
except nsxv_exc.VcnsApiException:
with excutils.save_and_reraise_exception():
self._lb_driver.vip_failed(context, vip)
LOG.error(
_LE('Failed to delete vip on edge: %s'), edge_id)
try:
self.vcns.delete_vip(edge_id, edge_vse_id)
self._del_vip_as_secondary_ip(edge_id, vip['address'])
self._del_vip_fw_rule(edge_id, vip_mapping['edge_fw_rule_id'])
except nsxv_exc.ResourceNotFound:
LOG.error(_LE('vip not found on edge: %s'), edge_id)
except nsxv_exc.VcnsApiException:
with excutils.save_and_reraise_exception():
self._lb_driver.vip_failed(context, vip)
LOG.error(
_LE('Failed to delete vip on edge: %s'), edge_id)
try:
self.vcns.delete_app_profile(edge_id, app_profile_id)
except nsxv_exc.ResourceNotFound:
LOG.error(_LE('app profile not found on edge: %s'), edge_id)
except nsxv_exc.VcnsApiException:
with excutils.save_and_reraise_exception():
self._lb_driver.vip_failed(context, vip)
LOG.error(
_LE('Failed to delete app profile on Edge: %s'),
edge_id)
try:
self.vcns.delete_app_profile(edge_id, app_profile_id)
except nsxv_exc.ResourceNotFound:
LOG.error(_LE('app profile not found on edge: %s'), edge_id)
except nsxv_exc.VcnsApiException:
with excutils.save_and_reraise_exception():
self._lb_driver.vip_failed(context, vip)
LOG.error(
_LE('Failed to delete app profile on Edge: %s'),
edge_id)
self._lb_driver.delete_vip_successful(context, vip)
@ -655,7 +654,8 @@ class EdgeLbDriver(object):
LOG.error(_LE('Failed to update member on edge: %s'),
pool_mapping['edge_id'])
self._lb_driver.member_successful(context, member)
lb_plugin = self._get_lb_plugin()
lb_plugin._delete_db_member(context, member['id'])
def create_pool_health_monitor(self, context, health_monitor, pool_id,
pool_mapping, mon_mappings):

View File

@ -412,6 +412,10 @@ class TestEdgeLbDriver(base.BaseTestCase):
mock_member_successful.assert_called_with(self.context, member_to)
def test_delete_member(self):
def _del_member(context, member_id):
self.assertEqual(context, self.context)
self.assertEqual(member_id, MEMBER_ID)
lbaas_member = lbaas_member_maker(status='PENDING_DELETE')
edge_pool = {
'monitorId': [], 'name': POOL_ID, 'applicationRuleId': [],
@ -422,23 +426,25 @@ class TestEdgeLbDriver(base.BaseTestCase):
'transparent': False}
pool_mapping = {'edge_id': EDGE_ID, 'edge_pool_id': EDGE_POOL_ID}
mock_lb_plugin = mock.Mock()
with contextlib.nested(
mock.patch.object(self.edge_driver.vcns, 'get_pool'),
mock.patch.object(self.edge_driver.vcns, 'update_pool'),
mock.patch.object(self.edge_driver, '_update_pool_fw_rule'),
mock.patch.object(self.edge_driver._lb_driver, 'member_successful')
mock.patch.object(self.edge_driver, '_get_lb_plugin'),
mock.patch.object(mock_lb_plugin, '_delete_db_member',
side_effect=_del_member)
) as (mock_get_pool, mock_update_pool, mock_upd_fw_rule,
mock_member_successful):
mock_get_lb_plugin, mock_del_member):
mock_get_pool.return_value = (None, edge_pool)
self.edge_driver.delete_member(self.context, lbaas_member,
pool_mapping)
mock_get_lb_plugin.return_value = mock_lb_plugin
edge_pool['member'] = []
mock_update_pool.assert_called_with(EDGE_ID, EDGE_POOL_ID,
edge_pool)
mock_member_successful.assert_called_with(self.context,
lbaas_member)
def test__update_pool_fw_rule_add(self):
edge_fw_section = (