diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 51110b1fda45..5933974c6d0a 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -6285,6 +6285,20 @@ class ComputeManager(manager.Manager): {'port_id': port_id, 'error': ex}, instance=instance) + # TODO(mriedem): There are likely race failures which can result in + # NotFound and QuotaError exceptions getting traced as well. + @messaging.expected_exceptions( + # Do not log a traceback for user errors. We use Invalid generically + # since this method can raise lots of different exceptions: + # AttachInterfaceNotSupported + # NetworkInterfaceTaggedAttachNotSupported + # NetworkAmbiguous + # PortNotUsable + # PortInUse + # PortNotUsableDNS + # AttachSRIOVPortNotSupported + # NetworksWithQoSPolicyNotSupported + exception.Invalid) @wrap_exception() @wrap_instance_event(prefix='compute') @wrap_instance_fault diff --git a/nova/exception.py b/nova/exception.py index bcb3e3b8451c..b69e9745c326 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -1572,12 +1572,12 @@ class ConfigDriveNotFound(NotFound): "does not exist.") -class InterfaceAttachFailed(Invalid): +class InterfaceAttachFailed(NovaException): msg_fmt = _("Failed to attach network adapter device to " "%(instance_uuid)s") -class InterfaceAttachFailedNoNetwork(InterfaceAttachFailed): +class InterfaceAttachFailedNoNetwork(Invalid): msg_fmt = _("No specific network was requested and none are available " "for project '%(project_id)s'.") diff --git a/nova/tests/unit/compute/test_compute.py b/nova/tests/unit/compute/test_compute.py index 34aeb55d44da..ed9452cacc02 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -10473,10 +10473,13 @@ class ComputeAPITestCase(BaseTestCase): with mock.patch.dict(self.compute.driver.capabilities, supports_attach_interface=True, supports_tagged_attach_interface=False): - self.assertRaises( - exception.NetworkInterfaceTaggedAttachNotSupported, + expected_exception = self.assertRaises( + messaging.ExpectedException, self.compute.attach_interface, self.context, instance, 'fake-network-id', 'fake-port-id', 'fake-req-ip', tag='foo') + wrapped_exc = expected_exception.exc_info[1] + self.assertIsInstance( + wrapped_exc, exception.NetworkInterfaceTaggedAttachNotSupported) def test_attach_interface_failed(self): new_type = flavors.get_flavor_by_flavor_id('4')