From 6f300a68efc189bbc9b55640d53d54ffa4b34dbc Mon Sep 17 00:00:00 2001 From: Tong Liu Date: Tue, 28 Nov 2017 14:57:19 -0800 Subject: [PATCH] NSXv3: Fix pool member update Fix pool member update including member weight and name. This patch also updates the unit test for member update. Change-Id: If5305bfc7c2eea1954dbe5031bda79955880a808 --- .../services/lbaas/nsx_v3/member_mgr.py | 44 +++++++++++++++---- .../unit/services/lbaas/test_nsxv3_driver.py | 23 +++++++--- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/vmware_nsx/services/lbaas/nsx_v3/member_mgr.py b/vmware_nsx/services/lbaas/nsx_v3/member_mgr.py index f7a435c95a..ed89b32833 100644 --- a/vmware_nsx/services/lbaas/nsx_v3/member_mgr.py +++ b/vmware_nsx/services/lbaas/nsx_v3/member_mgr.py @@ -73,6 +73,20 @@ class EdgeMemberManager(base_mgr.Nsxv3LoadbalancerBaseManager): nsx_router_id, advertise_lb_vip=True) return lb_service + def _get_updated_pool_members(self, context, lb_pool, member): + network = lb_utils.get_network_from_subnet( + context, self.core_plugin, member.subnet_id) + if network.get('router:external'): + fixed_ip, router_id = self._get_info_from_fip( + context, member.address) + else: + fixed_ip = member.address + for m in lb_pool['members']: + if m['ip_address'] == fixed_ip: + m['display_name'] = member.name[:219] + '_' + member.id + m['weight'] = member.weight + return lb_pool['members'] + @log_helpers.log_method_call def _add_loadbalancer_binding(self, context, lb_id, lbs_id, nsx_router_id, vip_address): @@ -173,14 +187,28 @@ class EdgeMemberManager(base_mgr.Nsxv3LoadbalancerBaseManager): @log_helpers.log_method_call def update(self, context, old_member, new_member): - try: - self.lbv2_driver.member.successful_completion( - context, new_member) - - except nsx_exc.NsxPluginException: - with excutils.save_and_reraise_exception(): - self.lbv2_driver.member.failed_completion( - context, new_member) + lb_id = old_member.pool.loadbalancer_id + pool_id = old_member.pool.id + pool_client = self.core_plugin.nsxlib.load_balancer.pool + pool_binding = nsx_db.get_nsx_lbaas_pool_binding( + context.session, lb_id, pool_id) + if pool_binding: + lb_pool_id = pool_binding.get('lb_pool_id') + try: + lb_pool = pool_client.get(lb_pool_id) + updated_members = self._get_updated_pool_members( + context, lb_pool, new_member) + pool_client.update_pool_with_members(lb_pool_id, + updated_members) + except Exception as e: + with excutils.save_and_reraise_exception(): + self.lbv2_driver.member.failed_completion( + context, new_member) + LOG.error('Failed to update member %(member)s: ' + '%(err)s', + {'member': old_member.id, 'err': e}) + self.lbv2_driver.member.successful_completion( + context, new_member) @log_helpers.log_method_call def delete(self, context, member): diff --git a/vmware_nsx/tests/unit/services/lbaas/test_nsxv3_driver.py b/vmware_nsx/tests/unit/services/lbaas/test_nsxv3_driver.py index 4fe6f4e1f0..a999a016c0 100644 --- a/vmware_nsx/tests/unit/services/lbaas/test_nsxv3_driver.py +++ b/vmware_nsx/tests/unit/services/lbaas/test_nsxv3_driver.py @@ -85,7 +85,6 @@ LB_POOL_WITH_MEMBER = { "admin_state": "ENABLED" } ] - } HM_ID = 'hhh-mmm' LB_MONITOR_ID = 'mmm-ddd' @@ -557,13 +556,25 @@ class TestEdgeLbaasV2Member(BaseTestEdgeLbaasV2): def test_update(self): new_member = lb_models.Member(MEMBER_ID, LB_TENANT_ID, POOL_ID, - MEMBER_ADDRESS, 80, 1, pool=self.pool, + MEMBER_ADDRESS, 80, 2, pool=self.pool, name='member-nnn-nnn') - self.edge_driver.member.update(self.context, self.pool, new_member) + with mock.patch.object(nsx_db, 'get_nsx_lbaas_pool_binding' + ) as mock_get_pool_binding, \ + mock.patch.object(self.pool_client, 'get' + ) as mock_get_pool, \ + mock.patch.object(lb_utils, 'get_network_from_subnet' + ) as mock_get_network_from_subnet: + mock_get_pool_binding.return_value = POOL_BINDING + mock_get_pool.return_value = LB_POOL_WITH_MEMBER + mock_get_network_from_subnet.return_value = LB_NETWORK - mock_successful_completion = ( - self.lbv2_driver.member.successful_completion) - mock_successful_completion.assert_called_with(self.context, new_member) + self.edge_driver.member.update(self.context, self.member, + new_member) + + mock_successful_completion = ( + self.lbv2_driver.member.successful_completion) + mock_successful_completion.assert_called_with(self.context, + new_member) def test_delete(self): with mock.patch.object(nsx_db, 'get_nsx_lbaas_pool_binding'