Merge "Add locking to LBaaSv1 driver, exclusive router"
This commit is contained in:
@@ -16,6 +16,8 @@ from oslo_log import log as logging
|
||||
|
||||
from neutron.api.v2 import attributes as attr
|
||||
|
||||
from vmware_nsx.neutron.plugins.vmware.common import locking
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import nsxv_db
|
||||
from vmware_nsx.neutron.plugins.vmware.plugins import nsx_v
|
||||
from vmware_nsx.neutron.plugins.vmware.plugins.nsx_v_drivers import (
|
||||
abstract_router_driver as router_driver)
|
||||
@@ -37,6 +39,7 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
|
||||
|
||||
def update_router(self, context, router_id, router):
|
||||
r = router['router']
|
||||
|
||||
gw_info = self.plugin._extract_external_gw(context, router,
|
||||
is_extract=True)
|
||||
super(nsx_v.NsxVPluginV2, self.plugin).update_router(
|
||||
@@ -55,12 +58,17 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
|
||||
return self.plugin.get_router(context, router_id)
|
||||
|
||||
def delete_router(self, context, router_id):
|
||||
self.edge_manager.delete_lrouter(context, router_id, dist=False)
|
||||
if self.plugin.metadata_proxy_handler:
|
||||
self.plugin.metadata_proxy_handler.cleanup_router_edge(router_id)
|
||||
with locking.LockManager.get_lock(
|
||||
self._get_router_edge_id(context, router_id), external=True):
|
||||
self.edge_manager.delete_lrouter(context, router_id, dist=False)
|
||||
if self.plugin.metadata_proxy_handler:
|
||||
self.plugin.metadata_proxy_handler.cleanup_router_edge(
|
||||
router_id)
|
||||
|
||||
def update_routes(self, context, router_id, nexthop):
|
||||
self.plugin._update_routes(context, router_id, nexthop)
|
||||
with locking.LockManager.get_lock(
|
||||
self._get_router_edge_id(context, router_id), external=True):
|
||||
self.plugin._update_routes(context, router_id, nexthop)
|
||||
|
||||
def _update_router_gw_info(self, context, router_id, info):
|
||||
router = self.plugin._get_router(context, router_id)
|
||||
@@ -79,31 +87,33 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
|
||||
self.plugin._get_external_attachment_info(
|
||||
context, router))
|
||||
|
||||
if new_ext_net_id != org_ext_net_id and orgnexthop:
|
||||
# network changed, so need to remove default gateway before
|
||||
# vnic can be configured
|
||||
LOG.debug("Delete default gateway %s", orgnexthop)
|
||||
edge_utils.clear_gateway(self.nsx_v, context, router_id)
|
||||
edge_id = self._get_router_edge_id(context, router_id)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
if new_ext_net_id != org_ext_net_id and orgnexthop:
|
||||
# network changed, so need to remove default gateway before
|
||||
# vnic can be configured
|
||||
LOG.debug("Delete default gateway %s", orgnexthop)
|
||||
edge_utils.clear_gateway(self.nsx_v, context, router_id)
|
||||
|
||||
# Update external vnic if addr or mask is changed
|
||||
if orgaddr != newaddr or orgmask != newmask:
|
||||
edge_utils.update_external_interface(
|
||||
self.nsx_v, context, router_id,
|
||||
new_ext_net_id, newaddr, newmask)
|
||||
# Update external vnic if addr or mask is changed
|
||||
if orgaddr != newaddr or orgmask != newmask:
|
||||
edge_utils.update_external_interface(
|
||||
self.nsx_v, context, router_id,
|
||||
new_ext_net_id, newaddr, newmask)
|
||||
|
||||
# Update SNAT rules if ext net changed
|
||||
# or ext net not changed but snat is changed.
|
||||
if (new_ext_net_id != org_ext_net_id or
|
||||
(new_ext_net_id == org_ext_net_id and
|
||||
new_enable_snat != org_enable_snat)):
|
||||
self.plugin._update_nat_rules(context, router)
|
||||
# Update SNAT rules if ext net changed
|
||||
# or ext net not changed but snat is changed.
|
||||
if (new_ext_net_id != org_ext_net_id or
|
||||
(new_ext_net_id == org_ext_net_id and
|
||||
new_enable_snat != org_enable_snat)):
|
||||
self.plugin._update_nat_rules(context, router)
|
||||
|
||||
if (new_ext_net_id != org_ext_net_id or
|
||||
new_enable_snat != org_enable_snat):
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router)
|
||||
if (new_ext_net_id != org_ext_net_id or
|
||||
new_enable_snat != org_enable_snat):
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router)
|
||||
|
||||
# Update static routes in all.
|
||||
self.plugin._update_routes(context, router_id, newnexthop)
|
||||
# Update static routes in all.
|
||||
self.plugin._update_routes(context, router_id, newnexthop)
|
||||
|
||||
def add_router_interface(self, context, router_id, interface_info):
|
||||
self.plugin._check_intf_number_of_router(context, router_id)
|
||||
@@ -115,15 +125,17 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
|
||||
network_id = subnet['network_id']
|
||||
address_groups = self.plugin._get_address_groups(
|
||||
context, router_id, network_id)
|
||||
edge_utils.update_internal_interface(self.nsx_v, context, router_id,
|
||||
network_id, address_groups,
|
||||
router_db['admin_state_up'])
|
||||
# Update edge's firewall rules to accept subnets flows.
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router_db)
|
||||
with locking.LockManager.get_lock(
|
||||
self._get_router_edge_id(context, router_id), external=True):
|
||||
edge_utils.update_internal_interface(
|
||||
self.nsx_v, context, router_id, network_id, address_groups,
|
||||
router_db['admin_state_up'])
|
||||
# Update edge's firewall rules to accept subnets flows.
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router_db)
|
||||
|
||||
if router_db.gw_port and router_db.enable_snat:
|
||||
# Update Nat rules on external edge vnic
|
||||
self.plugin._update_nat_rules(context, router_db)
|
||||
if router_db.gw_port and router_db.enable_snat:
|
||||
# Update Nat rules on external edge vnic
|
||||
self.plugin._update_nat_rules(context, router_db)
|
||||
return info
|
||||
|
||||
def remove_router_interface(self, context, router_id, interface_info):
|
||||
@@ -132,27 +144,35 @@ class RouterExclusiveDriver(router_driver.RouterBaseDriver):
|
||||
router_db = self.plugin._get_router(context, router_id)
|
||||
subnet = self.plugin.get_subnet(context, info['subnet_id'])
|
||||
network_id = subnet['network_id']
|
||||
if router_db.gw_port and router_db.enable_snat:
|
||||
# First update nat rules
|
||||
self.plugin._update_nat_rules(context, router_db)
|
||||
ports = self.plugin._get_router_interface_ports_by_network(
|
||||
context, router_id, network_id)
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router_db)
|
||||
# No subnet on the network connects to the edge vnic
|
||||
if not ports:
|
||||
edge_utils.delete_interface(self.nsx_v, context,
|
||||
router_id, network_id,
|
||||
dist=False)
|
||||
else:
|
||||
address_groups = self.plugin._get_address_groups(
|
||||
with locking.LockManager.get_lock(
|
||||
self._get_router_edge_id(context, router_id), external=True):
|
||||
if router_db.gw_port and router_db.enable_snat:
|
||||
# First update nat rules
|
||||
self.plugin._update_nat_rules(context, router_db)
|
||||
ports = self.plugin._get_router_interface_ports_by_network(
|
||||
context, router_id, network_id)
|
||||
edge_utils.update_internal_interface(self.nsx_v, context,
|
||||
router_id, network_id,
|
||||
address_groups)
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router_db)
|
||||
# No subnet on the network connects to the edge vnic
|
||||
if not ports:
|
||||
edge_utils.delete_interface(self.nsx_v, context,
|
||||
router_id, network_id,
|
||||
dist=False)
|
||||
else:
|
||||
address_groups = self.plugin._get_address_groups(
|
||||
context, router_id, network_id)
|
||||
edge_utils.update_internal_interface(self.nsx_v, context,
|
||||
router_id, network_id,
|
||||
address_groups)
|
||||
return info
|
||||
|
||||
def _update_edge_router(self, context, router_id):
|
||||
router = self.plugin._get_router(context, router_id)
|
||||
self.plugin._update_external_interface(context, router)
|
||||
self.plugin._update_nat_rules(context, router)
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router)
|
||||
with locking.LockManager.get_lock(
|
||||
self._get_router_edge_id(context, router_id), external=True):
|
||||
self.plugin._update_external_interface(context, router)
|
||||
self.plugin._update_nat_rules(context, router)
|
||||
self.plugin._update_subnets_and_dnat_firewall(context, router)
|
||||
|
||||
def _get_router_edge_id(self, context, router_id):
|
||||
binding = nsxv_db.get_nsxv_router_binding(context.session, router_id)
|
||||
return binding['edge_id']
|
||||
|
||||
@@ -23,6 +23,7 @@ from neutron.common import exceptions as n_exc
|
||||
from neutron.i18n import _LE
|
||||
from neutron import manager
|
||||
from neutron.plugins.common import constants
|
||||
from vmware_nsx.neutron.plugins.vmware.common import locking
|
||||
from vmware_nsx.neutron.plugins.vmware.dbexts import nsxv_db
|
||||
from vmware_nsx.neutron.plugins.vmware.vshield.common import (
|
||||
exceptions as nsxv_exc)
|
||||
@@ -265,13 +266,18 @@ class EdgeLbDriver(object):
|
||||
|
||||
def _get_lbaas_fw_section_id(self):
|
||||
if not self._fw_section_id:
|
||||
fw_section_id = self.vcns.get_section_id(LBAAS_FW_SECTION_NAME)
|
||||
if not fw_section_id:
|
||||
section = et.Element('section')
|
||||
section.attrib['name'] = LBAAS_FW_SECTION_NAME
|
||||
sect = self.vcns.create_section('ip', et.tostring(section))[1]
|
||||
fw_section_id = et.fromstring(sect).attrib['id']
|
||||
self._fw_section_id = fw_section_id
|
||||
# Avoid concurrent creation of section by multiple neutron
|
||||
# instances
|
||||
with locking.LockManager.get_lock('lbaas-section-creation',
|
||||
external=True):
|
||||
fw_section_id = self.vcns.get_section_id(LBAAS_FW_SECTION_NAME)
|
||||
if not fw_section_id:
|
||||
section = et.Element('section')
|
||||
section.attrib['name'] = LBAAS_FW_SECTION_NAME
|
||||
sect = self.vcns.create_section('ip',
|
||||
et.tostring(section))[1]
|
||||
fw_section_id = et.fromstring(sect).attrib['id']
|
||||
self._fw_section_id = fw_section_id
|
||||
return self._fw_section_id
|
||||
|
||||
def _get_lb_edge_id(self, context, subnet_id):
|
||||
@@ -295,21 +301,22 @@ class EdgeLbDriver(object):
|
||||
return rtr_bindings['edge_id']
|
||||
|
||||
def _vip_as_secondary_ip(self, edge_id, vip, handler):
|
||||
r = self.vcns.get_interfaces(edge_id)[1]
|
||||
vnics = r.get('vnics', [])
|
||||
for vnic in vnics:
|
||||
if vnic['type'] == 'trunk':
|
||||
for sub_interface in vnic.get('subInterfaces').get(
|
||||
'subInterfaces'):
|
||||
address_groups = sub_interface.get('addressGroups')
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
r = self.vcns.get_interfaces(edge_id)[1]
|
||||
vnics = r.get('vnics', [])
|
||||
for vnic in vnics:
|
||||
if vnic['type'] == 'trunk':
|
||||
for sub_interface in vnic.get('subInterfaces').get(
|
||||
'subInterfaces'):
|
||||
address_groups = sub_interface.get('addressGroups')
|
||||
if handler(vip, address_groups):
|
||||
self.vcns.update_interface(edge_id, vnic)
|
||||
return True
|
||||
else:
|
||||
address_groups = vnic.get('addressGroups')
|
||||
if handler(vip, address_groups):
|
||||
self.vcns.update_interface(edge_id, vnic)
|
||||
return True
|
||||
else:
|
||||
address_groups = vnic.get('addressGroups')
|
||||
if handler(vip, address_groups):
|
||||
self.vcns.update_interface(edge_id, vnic)
|
||||
return True
|
||||
return False
|
||||
|
||||
def _add_vip_as_secondary_ip(self, edge_id, vip):
|
||||
@@ -358,56 +365,58 @@ class EdgeLbDriver(object):
|
||||
|
||||
def _update_pool_fw_rule(self, context, pool_id, edge_id,
|
||||
operation=None, address=None):
|
||||
edge_ips = self._get_edge_ips(edge_id)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
edge_ips = self._get_edge_ips(edge_id)
|
||||
|
||||
plugin = self._get_lb_plugin()
|
||||
members = plugin.get_members(
|
||||
context,
|
||||
filters={'pool_id': [pool_id]},
|
||||
fields=['address'])
|
||||
member_ips = [member['address'] for member in members]
|
||||
if operation == 'add' and address not in member_ips:
|
||||
member_ips.append(address)
|
||||
elif operation == 'del' and address in member_ips:
|
||||
member_ips.remove(address)
|
||||
plugin = self._get_lb_plugin()
|
||||
members = plugin.get_members(
|
||||
context,
|
||||
filters={'pool_id': [pool_id]},
|
||||
fields=['address'])
|
||||
member_ips = [member['address'] for member in members]
|
||||
if operation == 'add' and address not in member_ips:
|
||||
member_ips.append(address)
|
||||
elif operation == 'del' and address in member_ips:
|
||||
member_ips.remove(address)
|
||||
|
||||
section_uri = '%s/%s/%s' % (nsxv_api.FIREWALL_PREFIX,
|
||||
'layer3sections',
|
||||
self._get_lbaas_fw_section_id())
|
||||
xml_section = self.vcns.get_section(section_uri)[1]
|
||||
section = et.fromstring(xml_section)
|
||||
pool_rule = None
|
||||
for rule in section.iter('rule'):
|
||||
if rule.find('name').text == pool_id:
|
||||
pool_rule = rule
|
||||
if member_ips:
|
||||
pool_rule.find('sources').find('source').find(
|
||||
'value').text = (','.join(edge_ips))
|
||||
pool_rule.find('destinations').find('destination').find(
|
||||
'value').text = ','.join(member_ips)
|
||||
else:
|
||||
section.remove(pool_rule)
|
||||
break
|
||||
section_uri = '%s/%s/%s' % (nsxv_api.FIREWALL_PREFIX,
|
||||
'layer3sections',
|
||||
self._get_lbaas_fw_section_id())
|
||||
xml_section = self.vcns.get_section(section_uri)[1]
|
||||
section = et.fromstring(xml_section)
|
||||
pool_rule = None
|
||||
for rule in section.iter('rule'):
|
||||
if rule.find('name').text == pool_id:
|
||||
pool_rule = rule
|
||||
if member_ips:
|
||||
pool_rule.find('sources').find('source').find(
|
||||
'value').text = (','.join(edge_ips))
|
||||
pool_rule.find('destinations').find(
|
||||
'destination').find('value').text = ','.join(
|
||||
member_ips)
|
||||
else:
|
||||
section.remove(pool_rule)
|
||||
break
|
||||
|
||||
if member_ips and pool_rule is None:
|
||||
pool_rule = et.SubElement(section, 'rule')
|
||||
et.SubElement(pool_rule, 'name').text = pool_id
|
||||
et.SubElement(pool_rule, 'action').text = 'allow'
|
||||
sources = et.SubElement(pool_rule, 'sources')
|
||||
sources.attrib['excluded'] = 'false'
|
||||
source = et.SubElement(sources, 'source')
|
||||
et.SubElement(source, 'type').text = 'Ipv4Address'
|
||||
et.SubElement(source, 'value').text = ','.join(edge_ips)
|
||||
if member_ips and pool_rule is None:
|
||||
pool_rule = et.SubElement(section, 'rule')
|
||||
et.SubElement(pool_rule, 'name').text = pool_id
|
||||
et.SubElement(pool_rule, 'action').text = 'allow'
|
||||
sources = et.SubElement(pool_rule, 'sources')
|
||||
sources.attrib['excluded'] = 'false'
|
||||
source = et.SubElement(sources, 'source')
|
||||
et.SubElement(source, 'type').text = 'Ipv4Address'
|
||||
et.SubElement(source, 'value').text = ','.join(edge_ips)
|
||||
|
||||
destinations = et.SubElement(pool_rule, 'destinations')
|
||||
destinations.attrib['excluded'] = 'false'
|
||||
destination = et.SubElement(destinations, 'destination')
|
||||
et.SubElement(destination, 'type').text = 'Ipv4Address'
|
||||
et.SubElement(destination, 'value').text = ','.join(member_ips)
|
||||
destinations = et.SubElement(pool_rule, 'destinations')
|
||||
destinations.attrib['excluded'] = 'false'
|
||||
destination = et.SubElement(destinations, 'destination')
|
||||
et.SubElement(destination, 'type').text = 'Ipv4Address'
|
||||
et.SubElement(destination, 'value').text = ','.join(member_ips)
|
||||
|
||||
self.vcns.update_section(section_uri,
|
||||
et.tostring(section, encoding="us-ascii"),
|
||||
None)
|
||||
self.vcns.update_section(section_uri,
|
||||
et.tostring(section, encoding="us-ascii"),
|
||||
None)
|
||||
|
||||
def _add_vip_fw_rule(self, edge_id, vip_id, ip_address):
|
||||
fw_rule = {
|
||||
@@ -417,13 +426,15 @@ class EdgeLbDriver(object):
|
||||
'enabled': True,
|
||||
'name': vip_id}]}
|
||||
|
||||
h = self.vcns.add_firewall_rule(edge_id, fw_rule)[0]
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
h = self.vcns.add_firewall_rule(edge_id, fw_rule)[0]
|
||||
fw_rule_id = extract_resource_id(h['location'])
|
||||
|
||||
return fw_rule_id
|
||||
|
||||
def _del_vip_fw_rule(self, edge_id, vip_fw_rule_id):
|
||||
self.vcns.delete_firewall_rule(edge_id, vip_fw_rule_id)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
self.vcns.delete_firewall_rule(edge_id, vip_fw_rule_id)
|
||||
|
||||
def create_pool(self, context, pool):
|
||||
LOG.debug('Creating pool %s', pool)
|
||||
@@ -436,7 +447,8 @@ class EdgeLbDriver(object):
|
||||
|
||||
edge_pool = convert_lbaas_pool(pool)
|
||||
try:
|
||||
h = self.vcns.create_pool(edge_id, edge_pool)[0]
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
h = self.vcns.create_pool(edge_id, edge_pool)[0]
|
||||
edge_pool_id = extract_resource_id(h['location'])
|
||||
self._lb_driver.create_pool_successful(
|
||||
context, pool, edge_id, edge_pool_id)
|
||||
@@ -450,10 +462,12 @@ class EdgeLbDriver(object):
|
||||
LOG.debug('Updating pool %s to %s', (old_pool, pool))
|
||||
edge_pool = convert_lbaas_pool(pool)
|
||||
try:
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
self._lb_driver.pool_successful(context, pool)
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
self._lb_driver.pool_successful(context, pool)
|
||||
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
@@ -465,8 +479,10 @@ class EdgeLbDriver(object):
|
||||
|
||||
if pool_mapping:
|
||||
try:
|
||||
self.vcns.delete_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
self.vcns.delete_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.pool_failed(context, pool)
|
||||
@@ -491,7 +507,8 @@ class EdgeLbDriver(object):
|
||||
|
||||
app_profile_id = None
|
||||
try:
|
||||
h = (self.vcns.create_app_profile(edge_id, app_profile))[0]
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
h = (self.vcns.create_app_profile(edge_id, app_profile))[0]
|
||||
app_profile_id = extract_resource_id(h['location'])
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
@@ -502,7 +519,8 @@ class EdgeLbDriver(object):
|
||||
edge_vip = convert_lbaas_vip(vip, app_profile_id, pool_mapping)
|
||||
try:
|
||||
self._add_vip_as_secondary_ip(edge_id, vip['address'])
|
||||
h = self.vcns.create_vip(edge_id, edge_vip)[0]
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
h = self.vcns.create_vip(edge_id, edge_vip)[0]
|
||||
edge_vip_id = extract_resource_id(h['location'])
|
||||
edge_fw_rule_id = self._add_vip_fw_rule(edge_id, vip['id'],
|
||||
vip['address'])
|
||||
@@ -514,7 +532,8 @@ class EdgeLbDriver(object):
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.vip_failed(context, vip)
|
||||
LOG.error(_LE('Failed to create vip on Edge: %s'), edge_id)
|
||||
self.vcns.delete_app_profile(edge_id, app_profile_id)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
self.vcns.delete_app_profile(edge_id, app_profile_id)
|
||||
|
||||
def update_vip(self, context, old_vip, vip, pool_mapping, vip_mapping):
|
||||
LOG.debug('Updating VIP %s to %s', (old_vip, vip))
|
||||
@@ -526,7 +545,9 @@ class EdgeLbDriver(object):
|
||||
vip['name'], vip.get('session_persistence') or {},
|
||||
vip.get('protocol'))
|
||||
try:
|
||||
self.vcns.update_app_profile(edge_id, app_profile_id, app_profile)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
self.vcns.update_app_profile(edge_id, app_profile_id,
|
||||
app_profile)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.vip_failed(context, vip)
|
||||
@@ -535,7 +556,8 @@ class EdgeLbDriver(object):
|
||||
|
||||
edge_vip = convert_lbaas_vip(vip, app_profile_id, pool_mapping)
|
||||
try:
|
||||
self.vcns.update_vip(edge_id, edge_vip_id, edge_vip)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
self.vcns.update_vip(edge_id, edge_vip_id, edge_vip)
|
||||
self._lb_driver.vip_successful(context, vip)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
@@ -553,7 +575,8 @@ class EdgeLbDriver(object):
|
||||
app_profile_id = vip_mapping['edge_app_profile_id']
|
||||
|
||||
try:
|
||||
self.vcns.delete_vip(edge_id, edge_vse_id)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
self.vcns.delete_vip(edge_id, edge_vse_id)
|
||||
self._del_vip_as_secondary_ip(edge_id, vip['address'])
|
||||
self._del_vip_fw_rule(edge_id, vip_mapping['edge_fw_rule_id'])
|
||||
except nsxv_exc.ResourceNotFound:
|
||||
@@ -565,7 +588,8 @@ class EdgeLbDriver(object):
|
||||
_LE('Failed to delete vip on edge: %s'), edge_id)
|
||||
|
||||
try:
|
||||
self.vcns.delete_app_profile(edge_id, app_profile_id)
|
||||
with locking.LockManager.get_lock(edge_id, external=True):
|
||||
self.vcns.delete_app_profile(edge_id, app_profile_id)
|
||||
except nsxv_exc.ResourceNotFound:
|
||||
LOG.error(_LE('app profile not found on edge: %s'), edge_id)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
@@ -580,83 +604,89 @@ class EdgeLbDriver(object):
|
||||
def create_member(self, context, member, pool_mapping):
|
||||
LOG.debug('Creating member %s', member)
|
||||
|
||||
edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
edge_member = convert_lbaas_member(member)
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
edge_member = convert_lbaas_member(member)
|
||||
|
||||
if edge_pool['member']:
|
||||
edge_pool['member'].append(edge_member)
|
||||
else:
|
||||
edge_pool['member'] = [edge_member]
|
||||
if edge_pool['member']:
|
||||
edge_pool['member'].append(edge_member)
|
||||
else:
|
||||
edge_pool['member'] = [edge_member]
|
||||
|
||||
try:
|
||||
self.vcns.update_pool(
|
||||
pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
try:
|
||||
self.vcns.update_pool(
|
||||
pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
|
||||
self._update_pool_fw_rule(context, member['pool_id'],
|
||||
pool_mapping['edge_id'],
|
||||
'add',
|
||||
member['address'])
|
||||
self._lb_driver.member_successful(context, member)
|
||||
self._update_pool_fw_rule(context, member['pool_id'],
|
||||
pool_mapping['edge_id'],
|
||||
'add',
|
||||
member['address'])
|
||||
self._lb_driver.member_successful(context, member)
|
||||
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.member_failed(context, member)
|
||||
LOG.error(_LE('Failed to create member on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.member_failed(context, member)
|
||||
LOG.error(_LE('Failed to create member on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
def update_member(self, context, old_member, member, pool_mapping):
|
||||
LOG.debug('Updating member %s to %s', old_member, member)
|
||||
|
||||
edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
|
||||
edge_member = convert_lbaas_member(member)
|
||||
for i, m in enumerate(edge_pool['member']):
|
||||
if m['name'] == get_member_id(member['id']):
|
||||
edge_pool['member'][i] = edge_member
|
||||
break
|
||||
|
||||
try:
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
self._lb_driver.member_successful(context, member)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.member_failed(context, member)
|
||||
LOG.error(_LE('Failed to update member on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
def delete_member(self, context, member, pool_mapping):
|
||||
LOG.debug('Deleting member %s', member)
|
||||
|
||||
if pool_mapping:
|
||||
edge_pool = self.vcns.get_pool(
|
||||
pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
|
||||
edge_member = convert_lbaas_member(member)
|
||||
for i, m in enumerate(edge_pool['member']):
|
||||
if m['name'] == get_member_id(member['id']):
|
||||
edge_pool['member'].pop(i)
|
||||
edge_pool['member'][i] = edge_member
|
||||
break
|
||||
|
||||
try:
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
self._update_pool_fw_rule(context, member['pool_id'],
|
||||
pool_mapping['edge_id'],
|
||||
'del',
|
||||
member['address'])
|
||||
self._lb_driver.member_successful(context, member)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.member_failed(context, member)
|
||||
LOG.error(_LE('Failed to update member on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
def delete_member(self, context, member, pool_mapping):
|
||||
LOG.debug('Deleting member %s', member)
|
||||
|
||||
if pool_mapping:
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
edge_pool = self.vcns.get_pool(
|
||||
pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
|
||||
for i, m in enumerate(edge_pool['member']):
|
||||
if m['name'] == get_member_id(member['id']):
|
||||
edge_pool['member'].pop(i)
|
||||
break
|
||||
|
||||
try:
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
self._update_pool_fw_rule(context, member['pool_id'],
|
||||
pool_mapping['edge_id'],
|
||||
'del',
|
||||
member['address'])
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.member_failed(context, member)
|
||||
LOG.error(_LE('Failed to update member on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
lb_plugin = self._get_lb_plugin()
|
||||
lb_plugin._delete_db_member(context, member['id'])
|
||||
|
||||
@@ -665,50 +695,52 @@ class EdgeLbDriver(object):
|
||||
LOG.debug('Create HM %s', health_monitor)
|
||||
|
||||
edge_mon_id = None
|
||||
# 1st, we find if we already have a pool with the same monitor, on
|
||||
# the same Edge appliance.
|
||||
# If there is no pool on this Edge which is already associated with
|
||||
# this monitor, create this monitor on Edge
|
||||
if mon_mappings:
|
||||
edge_mon_id = mon_mappings['edge_monitor_id']
|
||||
else:
|
||||
edge_monitor = convert_lbaas_monitor(health_monitor)
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
# 1st, we find if we already have a pool with the same monitor, on
|
||||
# the same Edge appliance.
|
||||
# If there is no pool on this Edge which is already associated with
|
||||
# this monitor, create this monitor on Edge
|
||||
if mon_mappings:
|
||||
edge_mon_id = mon_mappings['edge_monitor_id']
|
||||
else:
|
||||
edge_monitor = convert_lbaas_monitor(health_monitor)
|
||||
try:
|
||||
h = self.vcns.create_health_monitor(
|
||||
pool_mapping['edge_id'], edge_monitor)[0]
|
||||
edge_mon_id = extract_resource_id(h['location'])
|
||||
|
||||
except nsxv_exc.VcnsApiException:
|
||||
self._lb_driver.pool_health_monitor_failed(context,
|
||||
health_monitor,
|
||||
pool_id)
|
||||
with excutils.save_and_reraise_exception():
|
||||
LOG.error(
|
||||
_LE('Failed to associate monitor on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
try:
|
||||
h = self.vcns.create_health_monitor(
|
||||
pool_mapping['edge_id'], edge_monitor)[0]
|
||||
edge_mon_id = extract_resource_id(h['location'])
|
||||
# Associate monitor with Edge pool
|
||||
edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
if edge_pool['monitorId']:
|
||||
edge_pool['monitorId'].append(edge_mon_id)
|
||||
else:
|
||||
edge_pool['monitorId'] = [edge_mon_id]
|
||||
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
|
||||
except nsxv_exc.VcnsApiException:
|
||||
self._lb_driver.pool_health_monitor_failed(context,
|
||||
health_monitor,
|
||||
pool_id)
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.pool_health_monitor_failed(context,
|
||||
health_monitor,
|
||||
pool_id)
|
||||
LOG.error(
|
||||
_LE('Failed to associate monitor on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
try:
|
||||
# Associate monitor with Edge pool
|
||||
edge_pool = self.vcns.get_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
if edge_pool['monitorId']:
|
||||
edge_pool['monitorId'].append(edge_mon_id)
|
||||
else:
|
||||
edge_pool['monitorId'] = [edge_mon_id]
|
||||
|
||||
self.vcns.update_pool(pool_mapping['edge_id'],
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.pool_health_monitor_failed(context,
|
||||
health_monitor,
|
||||
pool_id)
|
||||
LOG.error(
|
||||
_LE('Failed to associate monitor on edge: %s'),
|
||||
pool_mapping['edge_id'])
|
||||
|
||||
self._lb_driver.create_pool_health_monitor_successful(
|
||||
context, health_monitor, pool_id, pool_mapping['edge_id'],
|
||||
edge_mon_id)
|
||||
@@ -718,11 +750,14 @@ class EdgeLbDriver(object):
|
||||
LOG.debug('Update HM %s to %s', old_health_monitor, health_monitor)
|
||||
|
||||
edge_monitor = convert_lbaas_monitor(health_monitor)
|
||||
|
||||
try:
|
||||
self.vcns.update_health_monitor(
|
||||
mon_mapping['edge_id'],
|
||||
mon_mapping['edge_monitor_id'],
|
||||
edge_monitor)
|
||||
with locking.LockManager.get_lock(mon_mapping['edge_id'],
|
||||
external=True):
|
||||
self.vcns.update_health_monitor(
|
||||
mon_mapping['edge_id'],
|
||||
mon_mapping['edge_monitor_id'],
|
||||
edge_monitor)
|
||||
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
@@ -745,37 +780,39 @@ class EdgeLbDriver(object):
|
||||
if not mon_mapping:
|
||||
return
|
||||
|
||||
edge_pool = self.vcns.get_pool(edge_id,
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
edge_pool['monitorId'].remove(mon_mapping['edge_monitor_id'])
|
||||
with locking.LockManager.get_lock(pool_mapping['edge_id'],
|
||||
external=True):
|
||||
edge_pool = self.vcns.get_pool(edge_id,
|
||||
pool_mapping['edge_pool_id'])[1]
|
||||
edge_pool['monitorId'].remove(mon_mapping['edge_monitor_id'])
|
||||
|
||||
try:
|
||||
self.vcns.update_pool(edge_id,
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.pool_health_monitor_failed(context,
|
||||
health_monitor,
|
||||
pool_id)
|
||||
LOG.error(
|
||||
_LE('Failed to delete monitor mapping on edge: %s'),
|
||||
mon_mapping['edge_id'])
|
||||
|
||||
# If this monitor is not used on this edge anymore, delete it
|
||||
if not edge_pool['monitorId']:
|
||||
try:
|
||||
self.vcns.delete_health_monitor(
|
||||
mon_mapping['edge_id'],
|
||||
mon_mapping['edge_monitor_id'])
|
||||
self.vcns.update_pool(edge_id,
|
||||
pool_mapping['edge_pool_id'],
|
||||
edge_pool)
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.pool_health_monitor_failed(
|
||||
context, health_monitor, pool_id)
|
||||
self._lb_driver.pool_health_monitor_failed(context,
|
||||
health_monitor,
|
||||
pool_id)
|
||||
LOG.error(
|
||||
_LE('Failed to delete monitor on edge: %s'),
|
||||
_LE('Failed to delete monitor mapping on edge: %s'),
|
||||
mon_mapping['edge_id'])
|
||||
|
||||
# If this monitor is not used on this edge anymore, delete it
|
||||
if not edge_pool['monitorId']:
|
||||
try:
|
||||
self.vcns.delete_health_monitor(
|
||||
mon_mapping['edge_id'],
|
||||
mon_mapping['edge_monitor_id'])
|
||||
except nsxv_exc.VcnsApiException:
|
||||
with excutils.save_and_reraise_exception():
|
||||
self._lb_driver.pool_health_monitor_failed(
|
||||
context, health_monitor, pool_id)
|
||||
LOG.error(
|
||||
_LE('Failed to delete monitor on edge: %s'),
|
||||
mon_mapping['edge_id'])
|
||||
|
||||
self._lb_driver.delete_pool_health_monitor_successful(
|
||||
context, health_monitor, pool_id, mon_mapping)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user