diff --git a/nova/compute/manager.py b/nova/compute/manager.py index b6e6fa35ed85..81fe151cec8e 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -6055,6 +6055,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 65598516e131..d91c37efbdfe 100644 --- a/nova/exception.py +++ b/nova/exception.py @@ -1599,12 +1599,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 33a3029fa493..d52b96ed5022 100644 --- a/nova/tests/unit/compute/test_compute.py +++ b/nova/tests/unit/compute/test_compute.py @@ -10463,10 +10463,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')