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
This commit is contained in:
Tong Liu 2017-11-28 14:57:19 -08:00
parent dc50382115
commit 6f300a68ef
2 changed files with 53 additions and 14 deletions

View File

@ -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):

View File

@ -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'