NSX|P: Fix handling LB member on external subnet
If the LB has an external vip, the member must have a local subnet-id connected to a router with an uplink, or the member must have an IP which is a FIP address In addition, remove one leftover log, and remove a lock on router id when it is None Change-Id: Iefb492e43b5cc47a84ce82e4dfbcb0d1e5e6bffe
This commit is contained in:
parent
b95e53a28d
commit
b0550ef194
@ -46,7 +46,6 @@ class EdgeListenerManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
|||||||
tags.append({
|
tags.append({
|
||||||
'scope': lb_const.LB_LB_TYPE,
|
'scope': lb_const.LB_LB_TYPE,
|
||||||
'tag': listener['loadbalancer_id']})
|
'tag': listener['loadbalancer_id']})
|
||||||
LOG.error("DEBUG ADIT _get_listener_tags end")
|
|
||||||
return tags
|
return tags
|
||||||
|
|
||||||
def _upload_certificate(self, listener_id, cert_href, tags,
|
def _upload_certificate(self, listener_id, cert_href, tags,
|
||||||
|
@ -102,7 +102,15 @@ class EdgeLoadBalancerManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
|||||||
else:
|
else:
|
||||||
tier1_srv = self.core_plugin.nsxpolicy.tier1
|
tier1_srv = self.core_plugin.nsxpolicy.tier1
|
||||||
connectivity_path = tier1_srv.get_path(router_id)
|
connectivity_path = tier1_srv.get_path(router_id)
|
||||||
with p_utils.get_lb_rtr_lock(router_id):
|
if connectivity_path:
|
||||||
|
with p_utils.get_lb_rtr_lock(router_id):
|
||||||
|
service_client.create_or_overwrite(
|
||||||
|
lb_name, lb_service_id=lb['id'],
|
||||||
|
description=lb['description'],
|
||||||
|
tags=tags, size=lb_size,
|
||||||
|
connectivity_path=connectivity_path)
|
||||||
|
else:
|
||||||
|
# no lock
|
||||||
service_client.create_or_overwrite(
|
service_client.create_or_overwrite(
|
||||||
lb_name, lb_service_id=lb['id'],
|
lb_name, lb_service_id=lb['id'],
|
||||||
description=lb['description'],
|
description=lb['description'],
|
||||||
|
@ -31,17 +31,23 @@ def _translate_member_state(state):
|
|||||||
|
|
||||||
|
|
||||||
class EdgeMemberManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
class EdgeMemberManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
||||||
def _get_info_from_fip(self, context, fip):
|
def _get_fip_object(self, context, fip):
|
||||||
filters = {'floating_ip_address': [fip]}
|
filters = {'floating_ip_address': [fip]}
|
||||||
floating_ips = self.core_plugin.get_floatingips(context,
|
floating_ips = self.core_plugin.get_floatingips(context,
|
||||||
filters=filters)
|
filters=filters)
|
||||||
if floating_ips:
|
if floating_ips:
|
||||||
return floating_ips[0]['fixed_ip_address']
|
return floating_ips[0]
|
||||||
else:
|
else:
|
||||||
msg = (_('Member IP %(fip)s is an external IP, and is expected to '
|
msg = (_('Member IP %(fip)s is an external IP, and is expected to '
|
||||||
'be a floating IP') % {'fip': fip})
|
'be a floating IP') % {'fip': fip})
|
||||||
raise n_exc.BadRequest(resource='lbaas-vip', msg=msg)
|
raise n_exc.BadRequest(resource='lbaas-vip', msg=msg)
|
||||||
|
|
||||||
|
def _get_info_from_fip(self, context, fip):
|
||||||
|
return self._get_fip_object(context, fip)['fixed_ip_address']
|
||||||
|
|
||||||
|
def _get_router_from_fip(self, context, fip):
|
||||||
|
return self._get_fip_object(context, fip)['router_id']
|
||||||
|
|
||||||
def _validate_member_lb_connectivity(self, context, member, completor):
|
def _validate_member_lb_connectivity(self, context, member, completor):
|
||||||
lb = member['pool'].get('loadbalancer')
|
lb = member['pool'].get('loadbalancer')
|
||||||
|
|
||||||
@ -70,8 +76,32 @@ class EdgeMemberManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
|||||||
raise n_exc.BadRequest(resource='lbaas-router', msg=msg)
|
raise n_exc.BadRequest(resource='lbaas-router', msg=msg)
|
||||||
|
|
||||||
if not service.get('connectivity_path'):
|
if not service.get('connectivity_path'):
|
||||||
router_id = lb_utils.get_router_from_network(
|
# Find the router of the local subnet
|
||||||
|
network = lb_utils.get_network_from_subnet(
|
||||||
context, self.core_plugin, member['subnet_id'])
|
context, self.core_plugin, member['subnet_id'])
|
||||||
|
if network and network.get('router:external'):
|
||||||
|
# member ip should be a fip
|
||||||
|
try:
|
||||||
|
router_id = self._get_router_from_fip(
|
||||||
|
context, member['address'])
|
||||||
|
except n_exc.BadRequest:
|
||||||
|
with excutils.save_and_reraise_exception():
|
||||||
|
completor(success=False)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
router_id = lb_utils.get_router_from_network(
|
||||||
|
context, self.core_plugin, member['subnet_id'])
|
||||||
|
except Exception:
|
||||||
|
completor(success=False)
|
||||||
|
msg = (_('Cannot find router attached to member '
|
||||||
|
'%(mem_id)s') % {'mem_id': member['id']})
|
||||||
|
raise n_exc.BadRequest(resource='lbaas-router', msg=msg)
|
||||||
|
if not router_id:
|
||||||
|
completor(success=False)
|
||||||
|
msg = (_('Cannot find router with uplink attached to '
|
||||||
|
'member %(mem_id)s') % {'mem_id': member['id']})
|
||||||
|
raise n_exc.BadRequest(resource='lbaas-router', msg=msg)
|
||||||
|
|
||||||
if not self.core_plugin.service_router_has_services(context,
|
if not self.core_plugin.service_router_has_services(context,
|
||||||
router_id):
|
router_id):
|
||||||
self.core_plugin.create_service_router(context, router_id)
|
self.core_plugin.create_service_router(context, router_id)
|
||||||
@ -124,7 +154,11 @@ class EdgeMemberManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
|||||||
else:
|
else:
|
||||||
network = None
|
network = None
|
||||||
if network and network.get('router:external'):
|
if network and network.get('router:external'):
|
||||||
fixed_ip = self._get_info_from_fip(context, member['address'])
|
try:
|
||||||
|
fixed_ip = self._get_info_from_fip(context, member['address'])
|
||||||
|
except n_exc.BadRequest:
|
||||||
|
with excutils.save_and_reraise_exception():
|
||||||
|
completor(success=False)
|
||||||
else:
|
else:
|
||||||
fixed_ip = member['address']
|
fixed_ip = member['address']
|
||||||
pool_id = member['pool']['id']
|
pool_id = member['pool']['id']
|
||||||
@ -149,7 +183,12 @@ class EdgeMemberManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
|||||||
network = lb_utils.get_network_from_subnet(
|
network = lb_utils.get_network_from_subnet(
|
||||||
context, self.core_plugin, new_member['subnet_id'])
|
context, self.core_plugin, new_member['subnet_id'])
|
||||||
if network and network.get('router:external'):
|
if network and network.get('router:external'):
|
||||||
fixed_ip = self._get_info_from_fip(context, new_member['address'])
|
try:
|
||||||
|
fixed_ip = self._get_info_from_fip(
|
||||||
|
context, new_member['address'])
|
||||||
|
except n_exc.BadRequest:
|
||||||
|
with excutils.save_and_reraise_exception():
|
||||||
|
completor(success=False)
|
||||||
else:
|
else:
|
||||||
fixed_ip = new_member['address']
|
fixed_ip = new_member['address']
|
||||||
pool_id = old_member['pool']['id']
|
pool_id = old_member['pool']['id']
|
||||||
@ -176,7 +215,11 @@ class EdgeMemberManagerFromDict(base_mgr.NsxpLoadbalancerBaseManager):
|
|||||||
network = lb_utils.get_network_from_subnet(
|
network = lb_utils.get_network_from_subnet(
|
||||||
context, self.core_plugin, member['subnet_id'])
|
context, self.core_plugin, member['subnet_id'])
|
||||||
if network and network.get('router:external'):
|
if network and network.get('router:external'):
|
||||||
fixed_ip = self._get_info_from_fip(context, member['address'])
|
try:
|
||||||
|
fixed_ip = self._get_info_from_fip(context, member['address'])
|
||||||
|
except n_exc.BadRequest:
|
||||||
|
with excutils.save_and_reraise_exception():
|
||||||
|
completor(success=False)
|
||||||
else:
|
else:
|
||||||
fixed_ip = member['address']
|
fixed_ip = member['address']
|
||||||
pool_id = member['pool']['id']
|
pool_id = member['pool']['id']
|
||||||
|
@ -1618,7 +1618,8 @@ class TestEdgeLbaasV2Member(BaseTestEdgeLbaasV2):
|
|||||||
return_value=[]),\
|
return_value=[]),\
|
||||||
mock.patch.object(self.core_plugin, 'get_floatingips',
|
mock.patch.object(self.core_plugin, 'get_floatingips',
|
||||||
return_value=[{
|
return_value=[{
|
||||||
'fixed_ip_address': MEMBER_ADDRESS}]),\
|
'fixed_ip_address': MEMBER_ADDRESS,
|
||||||
|
'router_id': LB_ROUTER_ID}]),\
|
||||||
mock.patch.object(self.pool_client,
|
mock.patch.object(self.pool_client,
|
||||||
'create_pool_member_and_add_to_pool'
|
'create_pool_member_and_add_to_pool'
|
||||||
) as mock_update_pool_with_members:
|
) as mock_update_pool_with_members:
|
||||||
@ -1663,7 +1664,42 @@ class TestEdgeLbaasV2Member(BaseTestEdgeLbaasV2):
|
|||||||
return_value=[]),\
|
return_value=[]),\
|
||||||
mock.patch.object(self.core_plugin, 'get_floatingips',
|
mock.patch.object(self.core_plugin, 'get_floatingips',
|
||||||
return_value=[{
|
return_value=[{
|
||||||
'fixed_ip_address': MEMBER_ADDRESS}]):
|
'fixed_ip_address': MEMBER_ADDRESS,
|
||||||
|
'router_id': LB_ROUTER_ID}]):
|
||||||
|
mock_get_pool_members.return_value = [self.member]
|
||||||
|
mock_get_network.return_value = EXT_LB_NETWORK
|
||||||
|
mock_get_router.return_value = LB_ROUTER_ID
|
||||||
|
mock_get_lb_service.return_value = {'id': LB_SERVICE_ID}
|
||||||
|
mock_get_pool.return_value = LB_POOL
|
||||||
|
|
||||||
|
self.assertRaises(
|
||||||
|
n_exc.BadRequest, self.edge_driver.member.create,
|
||||||
|
self.context, self.member_dict, self.completor)
|
||||||
|
self.assertTrue(self.last_completor_called)
|
||||||
|
self.assertFalse(self.last_completor_succees)
|
||||||
|
|
||||||
|
def test_create_external_vip_no_fip(self):
|
||||||
|
self.reset_completor()
|
||||||
|
lb_service = {'id': LB_SERVICE_ID}
|
||||||
|
with mock.patch.object(self.lbv2_driver.plugin, 'get_pool_members'
|
||||||
|
) as mock_get_pool_members, \
|
||||||
|
mock.patch.object(lb_utils, 'get_network_from_subnet'
|
||||||
|
) as mock_get_network, \
|
||||||
|
mock.patch.object(lb_utils, 'get_router_from_network'
|
||||||
|
) as mock_get_router, \
|
||||||
|
mock.patch.object(self.service_client, 'get_router_lb_service'
|
||||||
|
) as mock_get_lb_service, \
|
||||||
|
mock.patch.object(self.core_plugin.nsxpolicy, 'search_by_tags',
|
||||||
|
return_value={'results': [lb_service]}),\
|
||||||
|
mock.patch.object(self.core_plugin,
|
||||||
|
'service_router_has_loadbalancers',
|
||||||
|
return_value=True),\
|
||||||
|
mock.patch.object(self.pool_client, 'get'
|
||||||
|
) as mock_get_pool, \
|
||||||
|
mock.patch.object(self.core_plugin, '_find_router_gw_subnets',
|
||||||
|
return_value=[]),\
|
||||||
|
mock.patch.object(self.core_plugin, 'get_floatingips',
|
||||||
|
return_value=[]):
|
||||||
mock_get_pool_members.return_value = [self.member]
|
mock_get_pool_members.return_value = [self.member]
|
||||||
mock_get_network.return_value = EXT_LB_NETWORK
|
mock_get_network.return_value = EXT_LB_NETWORK
|
||||||
mock_get_router.return_value = LB_ROUTER_ID
|
mock_get_router.return_value = LB_ROUTER_ID
|
||||||
|
Loading…
x
Reference in New Issue
Block a user