Merge "Fix member address selection in lbaas driver"

This commit is contained in:
Zuul 2019-01-28 20:19:11 +00:00 committed by Gerrit Code Review
commit 2adcbf7099
2 changed files with 57 additions and 12 deletions

View File

@ -291,8 +291,17 @@ class LoadBalancerDriver(base.DriverBase):
LOG.error('Node is not in subnet %(subnet)s', {'subnet': subnet})
return None
# Use the first IP address if more than one are found in target network
address = addresses[net_name][0]['addr']
# Use the first IP address that match with the subnet ip_version
# if more than one are found in target network
address = None
for ip in addresses[net_name]:
if ip['version'] == subnet_obj.ip_version:
address = ip['addr']
break
if not address:
LOG.error("Node does not match with subnet's (%s) ip version (%s)"
% (subnet, subnet_obj.ip_version))
return None
try:
# FIXME(Yanyan Hu): Currently, Neutron lbaasv2 service can not
# handle concurrent lb member operations well: new member creation

View File

@ -445,6 +445,7 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
port = '80'
subnet = 'subnet'
subnet_obj = mock.Mock(id='SUBNET_ID', network_id='NETWORK_ID')
subnet_obj.ip_version = '4'
subnet_obj.name = 'subnet'
network_obj = mock.Mock(id='NETWORK_ID')
network_obj.name = 'network1'
@ -452,8 +453,9 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
node_detail = {
'name': 'node-01',
'addresses': {
'network1': [{'addr': 'ipaddr_net1'}],
'network2': [{'addr': 'ipaddr_net2'}]
'network1': [{'addr': 'ipaddr1_net1', 'version': '6'},
{'addr': 'ipaddr2_net1', 'version': '4'}],
'network2': [{'addr': 'ipaddr_net2', 'version': '4'}]
}
}
mock_load.return_value = node
@ -469,8 +471,9 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
self.assertEqual('MEMBER_ID', res)
self.nc.subnet_get.assert_called_once_with(subnet)
self.nc.network_get.assert_called_once_with('NETWORK_ID')
# Make sure the ip matches with subnet ip_version
self.oc.pool_member_create.assert_called_once_with(
pool_id, 'ipaddr_net1', port, 'SUBNET_ID')
pool_id, 'ipaddr2_net1', port, 'SUBNET_ID')
self.lb_driver._wait_for_lb_ready.assert_has_calls(
[mock.call('LB_ID'), mock.call('LB_ID')])
mock_load.assert_called_once_with(fake_context, db_node=node)
@ -505,13 +508,14 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
node = mock.Mock()
subnet_obj = mock.Mock(id='SUBNET_ID', network_id='NETWORK_ID')
subnet_obj.name = 'subnet'
subnet_obj.ip_version = '4'
network_obj = mock.Mock(id='NETWORK_ID')
network_obj.name = 'network1'
node_detail = {
'name': 'node-01',
'addresses': {
'network1': [{'addr': 'ipaddr_net1'}],
'network2': [{'addr': 'ipaddr_net2'}]
'network1': [{'addr': 'ipaddr_net1', 'version': '4'}],
'network2': [{'addr': 'ipaddr_net2', 'version': '4'}]
}
}
mock_load.return_value = node
@ -536,13 +540,14 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
node = mock.Mock()
subnet_obj = mock.Mock(id='SUBNET_ID', network_id='NETWORK_ID')
subnet_obj.name = 'subnet'
subnet_obj.ip_version = '4'
network_obj = mock.Mock(id='NETWORK_ID')
network_obj.name = 'network1'
node_detail = {
'name': 'node-01',
'addresses': {
'network1': [{'addr': 'ipaddr_net1'}],
'network2': [{'addr': 'ipaddr_net2'}]
'network1': [{'addr': 'ipaddr_net1', 'version': '4'}],
'network2': [{'addr': 'ipaddr_net2', 'version': '4'}]
}
}
mock_load.return_value = node
@ -561,17 +566,48 @@ class TestOctaviaLBaaSDriver(base.SenlinTestCase):
@mock.patch.object(nodem.Node, 'load')
@mock.patch.object(oslo_context, 'get_current')
def test_member_add_wait_for_lb_timeout(self, mock_get_current, mock_load):
def test_member_add_ip_version_match_failed(self, mock_get_current,
mock_load):
node = mock.Mock()
subnet_obj = mock.Mock(id='SUBNET_ID', network_id='NETWORK_ID')
subnet_obj.name = 'subnet'
subnet_obj.ip_version = '4'
network_obj = mock.Mock(id='NETWORK_ID')
network_obj.name = 'network1'
node_detail = {
'name': 'node-01',
'addresses': {
'network1': [{'addr': 'ipaddr_net1'}],
'network2': [{'addr': 'ipaddr_net2'}]
'network1': [{'addr': 'ipaddr_net1', 'version': '6'}],
'network2': [{'addr': 'ipaddr_net2', 'version': '6'}]
}
}
mock_load.return_value = node
node.get_details.return_value = node_detail
# Node does not match with subnet ip_version
self.lb_driver._wait_for_lb_ready = mock.Mock()
self.lb_driver._wait_for_lb_ready.return_value = True
self.nc.subnet_get.return_value = subnet_obj
self.nc.network_get.return_value = network_obj
self.oc.pool_member_create = mock.Mock(id='MEMBER_ID')
res = self.lb_driver.member_add(node, 'LB_ID', 'POOL_ID', 80,
'subnet')
self.assertIsNone(res)
@mock.patch.object(nodem.Node, 'load')
@mock.patch.object(oslo_context, 'get_current')
def test_member_add_wait_for_lb_timeout(self, mock_get_current, mock_load):
node = mock.Mock()
subnet_obj = mock.Mock(id='SUBNET_ID', network_id='NETWORK_ID')
subnet_obj.name = 'subnet'
subnet_obj.ip_version = '4'
network_obj = mock.Mock(id='NETWORK_ID')
network_obj.name = 'network1'
node_detail = {
'name': 'node-01',
'addresses': {
'network1': [{'addr': 'ipaddr_net1', 'version': '4'}],
'network2': [{'addr': 'ipaddr_net2', 'version': '4'}]
}
}
mock_load.return_value = node