diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 9afc2641e0..ce6b98ddcd 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -3051,6 +3051,7 @@ class ComputeManager(manager.Manager): self._build_resources_cleanup(instance, network_info) except (exception.UnexpectedTaskStateError, exception.InstanceUnacceptable, + exception.ExternalNetworkAttachForbidden, exception.OverQuota, exception.InvalidBDM) as e: self._build_resources_cleanup(instance, network_info) raise exception.BuildAbortException(instance_uuid=instance.uuid, diff --git a/nova/tests/unit/compute/test_compute_mgr.py b/nova/tests/unit/compute/test_compute_mgr.py index bef47424a2..4b6980aff8 100644 --- a/nova/tests/unit/compute/test_compute_mgr.py +++ b/nova/tests/unit/compute/test_compute_mgr.py @@ -8605,6 +8605,36 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase): mock.ANY, network_arqs) return resources + @mock.patch.object(virt_driver.ComputeDriver, + 'prepare_for_spawn') + @mock.patch.object(nova.compute.manager.ComputeManager, + '_build_networks_for_instance') + @mock.patch.object(virt_driver.ComputeDriver, + 'prepare_networks_before_block_device_mapping') + def test_build_resources_prepnets_exception( + self, mock_prep_net, mock_build_net, mock_prep_spawn): + + args = (self.context, self.instance, self.requested_networks, + self.security_groups, self.image, self.block_device_mapping, + self.resource_provider_mapping, []) + + mock_prep_net.side_effect = exception.ExternalNetworkAttachForbidden( + network_uuid=uuids.network_id) + + resources = self.compute._build_resources(*args) + e = self.assertRaises( + exception.BuildAbortException, + resources.__enter__ + ) + self.assertIn( + "It is not allowed to create an interface on external network", + str(e) + ) + + mock_build_net.assert_called_once_with(self.context, self.instance, + self.requested_networks, mock.ANY, + mock.ANY, mock.ANY) + @mock.patch.object(nova.compute.manager.ComputeManager, '_get_bound_arq_resources') def test_accel_build_resources_no_device_profile(self, mock_get_arqs): diff --git a/releasenotes/notes/fix-failure-prep-block-d7e1cad6d3910502.yaml b/releasenotes/notes/fix-failure-prep-block-d7e1cad6d3910502.yaml new file mode 100644 index 0000000000..5107335c66 --- /dev/null +++ b/releasenotes/notes/fix-failure-prep-block-d7e1cad6d3910502.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + Fixes `bug 2137673`_ where details about the fact that the user specified + an incorrect configuration by requesting to attach to an external network are + masked by "Failure prepping block device" since they do not have access to + the whole backtrace. + + .. _bug 2137673: https://bugs.launchpad.net/nova/+bug/2137673