xenapi: handle InstanceNotFound in detach_interface()

CI tests frequently teardown by rolling back interface
attachments and then deleting the server, both of which
are asynchronous. If we're trying to detach an interface
on a guest that is gone, we don't need to log a traceback
exception in the logs, just let the InstanceNotFound
raise up to the ComputeManager which will handle the
error and log it appropriately.

Change-Id: I9428be0e6e5b640fdda00410817925001361fd2c
Closes-Bug: #1759979
(cherry picked from commit 5a42701f89)
This commit is contained in:
Matt Riedemann 2018-04-19 17:42:23 -04:00
parent bf0a069773
commit ffe092b112
2 changed files with 19 additions and 1 deletions

View File

@ -2100,8 +2100,10 @@ class AttachInterfaceTestCase(VMOpsTestBase):
self.vmops.vif_driver.unplug.assert_called_once_with(
self.fake_instance, self.fake_vif, 'fake_vm_ref')
@mock.patch('nova.virt.xenapi.vmops.LOG.exception')
@mock.patch.object(vmops.VMOps, '_get_vm_opaque_ref')
def test_detach_interface_exception(self, mock_get_vm_opaque_ref):
def test_detach_interface_exception(self, mock_get_vm_opaque_ref,
mock_log_exception):
mock_get_vm_opaque_ref.return_value = 'fake_vm_ref'
self.vmops.vif_driver.unplug.side_effect =\
exception.VirtualInterfaceUnplugException('Failed to unplug VIF')
@ -2109,3 +2111,15 @@ class AttachInterfaceTestCase(VMOpsTestBase):
self.assertRaises(exception.VirtualInterfaceUnplugException,
self.vmops.detach_interface,
self.fake_instance, self.fake_vif)
mock_log_exception.assert_called()
@mock.patch('nova.virt.xenapi.vmops.LOG.exception',
new_callable=mock.NonCallableMock)
@mock.patch.object(vmops.VMOps, '_get_vm_opaque_ref',
side_effect=exception.InstanceNotFound(
instance_id='fake_vm_ref'))
def test_detach_interface_instance_not_found(
self, mock_get_vm_opaque_ref, mock_log_exception):
self.assertRaises(exception.InstanceNotFound,
self.vmops.detach_interface,
self.fake_instance, self.fake_vif)

View File

@ -2695,6 +2695,10 @@ class VMOps(object):
try:
vm_ref = self._get_vm_opaque_ref(instance)
self.vif_driver.unplug(instance, vif, vm_ref)
except exception.InstanceNotFound:
# Let this go up to the compute manager which will log a message
# for it.
raise
except exception.NovaException:
with excutils.save_and_reraise_exception():
LOG.exception(_('detach network interface %s failed.'),