Skip to content

Commit

Permalink
Fix LBAAS SI deletion
Browse files Browse the repository at this point in the history
Don't delete the SI right away but wait on notification to evaluate the
reaction map so that related resources VMs and VMIs are properly
destroyed.

Change-Id: I2028dd4e81a192f2bf11573ab58b5df426e56b17
Author: Jean-Philippe Braun
Partial-Bug: #1743355
  • Loading branch information
ymariappan authored and Yuvaraja Mariappan committed Jan 28, 2018
1 parent 7ab123f commit 76fbae7
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
Expand Up @@ -169,7 +169,6 @@ def _update_loadbalancer_instance(self, pool_id, vip_id=None):
if props is None:
try:
self._api.service_instance_delete(id=si_refs)
ServiceInstanceSM.delete(si_refs)
except RefsExistError as ex:
self._svc_manager.logger.error(str(ex))
return
Expand Down Expand Up @@ -206,7 +205,6 @@ def _clear_loadbalancer_instance(self, tenant_id, pool_id):
'service-instance', si_id, None, 'DELETE')
try:
self._api.service_instance_delete(id=si_id)
ServiceInstanceSM.delete(si_id)
except RefsExistError as ex:
self._svc_manager.logger.error(str(ex))
self.db.pool_remove(pool_id, ['service_instance'])
Expand All @@ -228,7 +226,6 @@ def _update_loadbalancer_instance_v2(self, lb_id):
if props is None:
try:
self._api.service_instance_delete(id=si_refs)
ServiceInstanceSM.delete(si_refs)
except RefsExistError as ex:
self._svc_manager.logger.error(str(ex))
return
Expand Down Expand Up @@ -270,7 +267,6 @@ def _clear_loadbalancer_instance_v2(self, lb_id):
if si_obj:
try:
self._api.service_instance_delete(id=si_obj.uuid)
ServiceInstanceSM.delete(si_obj.uuid)
except RefsExistError as ex:
self._svc_manager.logger.error(str(ex))

Expand Down
36 changes: 32 additions & 4 deletions src/config/svc-monitor/svc_monitor/tests/test_ha_proxy.py
Expand Up @@ -39,16 +39,21 @@ def store_si_create(obj):
obj.uuid = 'pool-si'
self._store_si[obj.uuid] = obj


def update_si_side_effect(obj):
self._store_si[obj.uuid] = obj

def delete_si_side_effect(id):
del self._store_si[id]

self.vnc_lib.service_instance_create = \
mock.Mock(side_effect=store_si_create)

self.vnc_lib.service_instance_update = \
mock.Mock(side_effect=update_si_side_effect)

self.vnc_lib.service_instance_delete = \
mock.Mock(side_effect=delete_si_side_effect)

self._db = {}
def read_db(id, **kwargs):
if id in self._db:
Expand Down Expand Up @@ -312,6 +317,14 @@ def create_vip(self, vip, project, vn, vmi, ip_addr):
# end create_vip

def test_add_delete_pool_with_members_vip(self):
def read_si_side_effect(id):
if id in self._store_si:
return self._store_si[id]
else:
raise NoIdError(id)
# Return the stored SI data
self.vnc_lib.service_instance_read = \
mock.Mock(side_effect=read_si_side_effect)
project = self.create_project("fake-project", "project")
vip = self.create_vip('vip', project, 'fake-vip-vn', 'vmi', '1.1.1.1')
pool = self.create_pool("test-lb-pool",
Expand Down Expand Up @@ -345,7 +358,13 @@ def test_add_delete_pool_with_members_vip(self):
config_db.VirtualIpSM.delete('vip')
config_db.LoadbalancerPoolSM.delete('test-lb-pool')
self.assertEqual(len(self._si_pool), 0)
self.assertEqual(len(config_db.ServiceInstanceSM._dict.keys()), 0)
si_id = 'pool-si'
try:
si_obj = self.vnc_lib.service_instance_read(id=si_id)
self.assertIsNone(si_obj, 'service-instance is not deleted')
except NoIdError:
pass
config_db.ServiceInstanceSM.delete(si_id)
# end test_add_delete_pool_with_members_vip
#
# In this test, update the vip on the pool
Expand Down Expand Up @@ -389,7 +408,10 @@ def test_update_vip(self):
vip_new.loadbalancer_pool = pool.uuid

def read_si_side_effect(id):
return self._store_si[id]
if id in self._store_si:
return self._store_si[id]
else:
raise NoIdError(id)
# Return the stored SI data
self.vnc_lib.service_instance_read = \
mock.Mock(side_effect=read_si_side_effect)
Expand Down Expand Up @@ -420,6 +442,12 @@ def read_si_side_effect(id):
config_db.VirtualIpSM.delete('vip')
config_db.LoadbalancerPoolSM.delete('test-lb-pool')
self.assertEqual(len(self._si_pool), 0)
self.assertEqual(len(config_db.ServiceInstanceSM._dict.keys()), 0)
si_id = 'pool-si'
try:
si_obj = self.vnc_lib.service_instance_read(id=si_id)
self.assertIsNone(si_obj, 'service-instance is not deleted')
except NoIdError:
pass
config_db.ServiceInstanceSM.delete(si_id)
# end test_update_vip
#end HAProxyTest(unittest.TestCase):

0 comments on commit 76fbae7

Please sign in to comment.