From b5fbbfde6d7ac20aeabb1d487ffd11eea70d2e18 Mon Sep 17 00:00:00 2001 From: Adit Sarfaty Date: Tue, 26 Feb 2019 14:40:52 +0200 Subject: [PATCH] NSX|V3+V: Fix octavia completor func In case of delete action, overriding the original object status again can change the returned status. In case of pool deletion, it prevents the deltion from the octavia DB side. Change-Id: Ie973592598f604814818cac3aa7da31d4e71d504 --- .../lbaas/octavia/octavia_listener.py | 16 ++++++---- .../services/lbaas/test_octavia_listener.py | 29 +++++++++++++++---- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/vmware_nsx/services/lbaas/octavia/octavia_listener.py b/vmware_nsx/services/lbaas/octavia/octavia_listener.py index a02640a109..aa96551fc9 100644 --- a/vmware_nsx/services/lbaas/octavia/octavia_listener.py +++ b/vmware_nsx/services/lbaas/octavia/octavia_listener.py @@ -90,8 +90,8 @@ class NSXOctaviaListenerEndpoint(object): def get_completor_func(self, obj_type, obj, delete=False, cascade=False): # return a method that will be called on success/failure completion def completor_func(success=True): - LOG.debug("Octavia transaction completed. status %s", - 'success' if success else 'failure') + LOG.debug("Octavia transaction completed. delete %s, status %s", + delete, 'success' if success else 'failure') # calculate the provisioning and operating statuses main_prov_status = constants.ACTIVE @@ -141,22 +141,26 @@ class NSXOctaviaListenerEndpoint(object): loadbalancer_id = obj['policy']['listener'].get( 'loadbalancer_id') - if loadbalancer_id: + if (loadbalancer_id and + not status_dict.get(constants.LOADBALANCERS)): status_dict[constants.LOADBALANCERS] = [{ 'id': loadbalancer_id, constants.PROVISIONING_STATUS: parent_prov_status, constants.OPERATING_STATUS: op_status}] - if listener_id: + if (listener_id and + not status_dict.get(constants.LISTENERS)): status_dict[constants.LISTENERS] = [{ 'id': listener_id, constants.PROVISIONING_STATUS: parent_prov_status, constants.OPERATING_STATUS: op_status}] - if pool_id: + if (pool_id and + not status_dict.get(constants.POOLS)): status_dict[constants.POOLS] = [{ 'id': pool_id, constants.PROVISIONING_STATUS: parent_prov_status, constants.OPERATING_STATUS: op_status}] - if policy_id: + if (policy_id and + not status_dict.get(constants.L7POLICIES)): status_dict[constants.L7POLICIES] = [{ 'id': policy_id, constants.PROVISIONING_STATUS: parent_prov_status, diff --git a/vmware_nsx/tests/unit/services/lbaas/test_octavia_listener.py b/vmware_nsx/tests/unit/services/lbaas/test_octavia_listener.py index 6f2214407b..608f5abc34 100644 --- a/vmware_nsx/tests/unit/services/lbaas/test_octavia_listener.py +++ b/vmware_nsx/tests/unit/services/lbaas/test_octavia_listener.py @@ -197,14 +197,33 @@ class TestNsxOctaviaListener(testtools.TestCase): def test_pool_delete(self): self.dummyResource.delete_called = False - self.endpoint.pool_delete(self.ctx, self.dummyObj) + lb_id = uuidutils.generate_uuid() + listener_id = uuidutils.generate_uuid() + pool_id = uuidutils.generate_uuid() + pool_obj = { + 'id': pool_id, + 'pool_id': pool_id, + 'project_id': uuidutils.generate_uuid(), + 'listener_id': listener_id, + 'loadbalancer_id': lb_id, + 'listener': {'protocol': 'HTTP', + 'id': listener_id, + 'default_pool_id': pool_id, + 'loadbalancer': {'id': lb_id}}} + self.endpoint.pool_delete(self.ctx, pool_obj) self.assertTrue(self.dummyResource.delete_called) self.clientMock.cast.assert_called_once_with( {}, 'update_loadbalancer_status', - status={'pools': [ - {'operating_status': 'ONLINE', - 'provisioning_status': 'DELETED', - 'id': mock.ANY}]}) + status={'loadbalancers': [{'operating_status': 'ONLINE', + 'provisioning_status': 'ACTIVE', + 'id': lb_id}], + 'pools': [{'operating_status': 'ONLINE', + 'provisioning_status': 'DELETED', + 'id': pool_id}], + 'listeners': [{'operating_status': 'ONLINE', + 'provisioning_status': 'ACTIVE', + 'id': listener_id}], + }) def test_pool_update(self): self.dummyResource.update_called = False