Merge "VMware NSX: Fix db integrity error on dhcp port operations"
This commit is contained in:
commit
68e13455de
@ -24,6 +24,7 @@ import logging
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
|
from sqlalchemy import exc as sql_exc
|
||||||
from sqlalchemy.orm import exc as sa_exc
|
from sqlalchemy.orm import exc as sa_exc
|
||||||
import webob.exc
|
import webob.exc
|
||||||
|
|
||||||
@ -56,6 +57,7 @@ from neutron.extensions import portbindings as pbin
|
|||||||
from neutron.extensions import portsecurity as psec
|
from neutron.extensions import portsecurity as psec
|
||||||
from neutron.extensions import providernet as pnet
|
from neutron.extensions import providernet as pnet
|
||||||
from neutron.extensions import securitygroup as ext_sg
|
from neutron.extensions import securitygroup as ext_sg
|
||||||
|
from neutron.openstack.common.db import exception as db_exc
|
||||||
from neutron.openstack.common import excutils
|
from neutron.openstack.common import excutils
|
||||||
from neutron.openstack.common import lockutils
|
from neutron.openstack.common import lockutils
|
||||||
from neutron.plugins.common import constants as plugin_const
|
from neutron.plugins.common import constants as plugin_const
|
||||||
@ -490,6 +492,22 @@ class NvpPluginV2(addr_pair_db.AllowedAddressPairsMixin,
|
|||||||
context, port_data['id'],
|
context, port_data['id'],
|
||||||
selected_lswitch and selected_lswitch['uuid'],
|
selected_lswitch and selected_lswitch['uuid'],
|
||||||
lport and lport['uuid'])
|
lport and lport['uuid'])
|
||||||
|
except db_exc.DBError as e:
|
||||||
|
if (port_data['device_owner'] == constants.DEVICE_OWNER_DHCP and
|
||||||
|
isinstance(e.inner_exception, sql_exc.IntegrityError)):
|
||||||
|
msg = (_("Concurrent network deletion detected; Back-end Port "
|
||||||
|
"%(nsx_id)s creation to be rolled back for Neutron "
|
||||||
|
"port: %(neutron_id)s")
|
||||||
|
% {'nsx_id': lport['uuid'],
|
||||||
|
'neutron_id': port_data['id']})
|
||||||
|
LOG.warning(msg)
|
||||||
|
if selected_lswitch and lport:
|
||||||
|
try:
|
||||||
|
nvplib.delete_port(self.cluster,
|
||||||
|
selected_lswitch['uuid'],
|
||||||
|
lport['uuid'])
|
||||||
|
except q_exc.NotFound:
|
||||||
|
LOG.debug(_("NSX Port %s already gone"), lport['uuid'])
|
||||||
|
|
||||||
def _nvp_delete_port(self, context, port_data):
|
def _nvp_delete_port(self, context, port_data):
|
||||||
# FIXME(salvatore-orlando): On the NVP platform we do not really have
|
# FIXME(salvatore-orlando): On the NVP platform we do not really have
|
||||||
|
@ -20,6 +20,7 @@ import contextlib
|
|||||||
import mock
|
import mock
|
||||||
import netaddr
|
import netaddr
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
|
from sqlalchemy import exc as sql_exc
|
||||||
import webob.exc
|
import webob.exc
|
||||||
|
|
||||||
from neutron.api.v2 import attributes
|
from neutron.api.v2 import attributes
|
||||||
@ -36,6 +37,7 @@ from neutron.extensions import providernet as pnet
|
|||||||
from neutron.extensions import securitygroup as secgrp
|
from neutron.extensions import securitygroup as secgrp
|
||||||
from neutron import manager
|
from neutron import manager
|
||||||
from neutron.manager import NeutronManager
|
from neutron.manager import NeutronManager
|
||||||
|
from neutron.openstack.common.db import exception as db_exc
|
||||||
from neutron.openstack.common import uuidutils
|
from neutron.openstack.common import uuidutils
|
||||||
from neutron.plugins.nicira.common import exceptions as nvp_exc
|
from neutron.plugins.nicira.common import exceptions as nvp_exc
|
||||||
from neutron.plugins.nicira.common import sync
|
from neutron.plugins.nicira.common import sync
|
||||||
@ -250,6 +252,17 @@ class TestNiciraPortsV2(NiciraPluginV2TestCase,
|
|||||||
webob.exc.HTTPInternalServerError.code)
|
webob.exc.HTTPInternalServerError.code)
|
||||||
self._verify_no_orphan_left(net_id)
|
self._verify_no_orphan_left(net_id)
|
||||||
|
|
||||||
|
def test_create_port_db_error_no_orphan_left(self):
|
||||||
|
db_exception = db_exc.DBError(
|
||||||
|
inner_exception=sql_exc.IntegrityError(mock.ANY,
|
||||||
|
mock.ANY,
|
||||||
|
mock.ANY))
|
||||||
|
with mock.patch.object(nicira_db, 'add_neutron_nsx_port_mapping',
|
||||||
|
side_effect=db_exception):
|
||||||
|
with self.network() as net:
|
||||||
|
with self.port(device_owner='network:dhcp'):
|
||||||
|
self._verify_no_orphan_left(net['network']['id'])
|
||||||
|
|
||||||
def test_create_port_maintenance_returns_503(self):
|
def test_create_port_maintenance_returns_503(self):
|
||||||
with self.network() as net:
|
with self.network() as net:
|
||||||
with mock.patch.object(nvplib, 'do_request',
|
with mock.patch.object(nvplib, 'do_request',
|
||||||
|
Loading…
Reference in New Issue
Block a user