NSX|V3: ensure that network rollback works correctly
In the event that a network creation fails ensure that we do the rollback correctly. Here the network on the NSX was not deleted nor the neutron network. Change-Id: Ib7801958385c4b4ce93e72e6036da043c202e948
This commit is contained in:
parent
8f5260689e
commit
8058b53c86
@ -760,6 +760,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
az = self.get_obj_az_by_hints(net_data)
|
az = self.get_obj_az_by_hints(net_data)
|
||||||
|
|
||||||
self._ensure_default_security_group(context, tenant_id)
|
self._ensure_default_security_group(context, tenant_id)
|
||||||
|
nsx_net_id = None
|
||||||
if validators.is_attr_set(external) and external:
|
if validators.is_attr_set(external) and external:
|
||||||
self._assert_on_external_net_with_qos(net_data)
|
self._assert_on_external_net_with_qos(net_data)
|
||||||
is_provider_net, net_type, physical_net, vlan_id = (
|
is_provider_net, net_type, physical_net, vlan_id = (
|
||||||
@ -769,6 +770,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
self._create_network_at_the_backend(context, net_data, az))
|
self._create_network_at_the_backend(context, net_data, az))
|
||||||
is_backend_network = True
|
is_backend_network = True
|
||||||
try:
|
try:
|
||||||
|
rollback_network = False
|
||||||
with db_api.context_manager.writer.using(context):
|
with db_api.context_manager.writer.using(context):
|
||||||
# Create network in Neutron
|
# Create network in Neutron
|
||||||
created_net = super(NsxV3Plugin, self).create_network(context,
|
created_net = super(NsxV3Plugin, self).create_network(context,
|
||||||
@ -806,6 +808,7 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
neutron_net_id,
|
neutron_net_id,
|
||||||
nsx_net_id)
|
nsx_net_id)
|
||||||
|
|
||||||
|
rollback_network = True
|
||||||
if is_backend_network and cfg.CONF.nsx_v3.native_dhcp_metadata:
|
if is_backend_network and cfg.CONF.nsx_v3.native_dhcp_metadata:
|
||||||
# Enable native metadata proxy for this network.
|
# Enable native metadata proxy for this network.
|
||||||
tags = self.nsxlib.build_v3_tags_payload(
|
tags = self.nsxlib.build_v3_tags_payload(
|
||||||
@ -825,10 +828,12 @@ class NsxV3Plugin(agentschedulers_db.AZDhcpAgentSchedulerDbMixin,
|
|||||||
except Exception:
|
except Exception:
|
||||||
with excutils.save_and_reraise_exception():
|
with excutils.save_and_reraise_exception():
|
||||||
# Undo creation on the backend
|
# Undo creation on the backend
|
||||||
LOG.exception('Failed to create network %s',
|
LOG.exception('Failed to create network')
|
||||||
created_net['id'])
|
if nsx_net_id:
|
||||||
if net_type != utils.NetworkTypes.L3_EXT:
|
self.nsxlib.logical_switch.delete(nsx_net_id)
|
||||||
self.nsxlib.logical_switch.delete(created_net['id'])
|
if rollback_network:
|
||||||
|
super(NsxV3Plugin, self).delete_network(
|
||||||
|
context, created_net['id'])
|
||||||
|
|
||||||
# this extra lookup is necessary to get the
|
# this extra lookup is necessary to get the
|
||||||
# latest db model for the extension functions
|
# latest db model for the extension functions
|
||||||
|
@ -43,6 +43,7 @@ from neutron_lib.plugins import directory
|
|||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
|
|
||||||
|
from vmware_nsx.api_client import exception as api_exc
|
||||||
from vmware_nsx.common import utils
|
from vmware_nsx.common import utils
|
||||||
from vmware_nsx.plugins.nsx_v3 import plugin as nsx_plugin
|
from vmware_nsx.plugins.nsx_v3 import plugin as nsx_plugin
|
||||||
from vmware_nsx.tests import unit as vmware
|
from vmware_nsx.tests import unit as vmware
|
||||||
@ -245,6 +246,16 @@ class TestNetworksV2(test_plugin.TestNetworksV2, NsxV3PluginTestCaseMixin):
|
|||||||
az_hints = net['network']['availability_zone_hints']
|
az_hints = net['network']['availability_zone_hints']
|
||||||
self.assertListEqual(az_hints, zone)
|
self.assertListEqual(az_hints, zone)
|
||||||
|
|
||||||
|
def test_network_failure_rollback(self):
|
||||||
|
cfg.CONF.set_override('native_dhcp_metadata', True, 'nsx_v3')
|
||||||
|
self.plugin = directory.get_plugin()
|
||||||
|
with mock.patch.object(self.plugin._port_client, 'create',
|
||||||
|
side_effect=api_exc.NsxApiException):
|
||||||
|
self.network()
|
||||||
|
ctx = context.get_admin_context()
|
||||||
|
networks = self.plugin.get_networks(ctx)
|
||||||
|
self.assertListEqual([], networks)
|
||||||
|
|
||||||
|
|
||||||
class TestSubnetsV2(test_plugin.TestSubnetsV2, NsxV3PluginTestCaseMixin):
|
class TestSubnetsV2(test_plugin.TestSubnetsV2, NsxV3PluginTestCaseMixin):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user