From 56c4a69ba667de6aa914caec2b7a7ebf17acaa56 Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Wed, 7 Jan 2026 16:57:41 -0600 Subject: [PATCH] return error about external network to the user on build failure Instead of masking the error message with "Failure prepping block device" when the user requests an invalid configuration, return the actual error message to the user. Closes-Bug: 2137673 Change-Id: If12555da64ccba2649a19ee6ccbdac0e888e6ad6 Signed-off-by: Doug Goldstein --- nova/compute/manager.py | 1 + nova/tests/unit/compute/test_compute_mgr.py | 30 +++++++++++++++++++ ...x-failure-prep-block-d7e1cad6d3910502.yaml | 9 ++++++ 3 files changed, 40 insertions(+) create mode 100644 releasenotes/notes/fix-failure-prep-block-d7e1cad6d3910502.yaml diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 59a8926b73..b0d77cd570 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -2945,6 +2945,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 aba391af3a..5ddd01b9b2 100644 --- a/nova/tests/unit/compute/test_compute_mgr.py +++ b/nova/tests/unit/compute/test_compute_mgr.py @@ -8534,6 +8534,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