diff --git a/nova/network/model.py b/nova/network/model.py index 7207cba546e2..9febd55984f4 100644 --- a/nova/network/model.py +++ b/nova/network/model.py @@ -380,6 +380,14 @@ class NetworkInfo(list): def json(self): return jsonutils.dumps(self) + def wait(self, do_raise=True): + """A no-op method. + + This is useful to avoid type checking when NetworkInfo might be + subclassed with NetworkInfoAsyncWrapper. + """ + pass + class NetworkInfoAsyncWrapper(NetworkInfo): """Wrapper around NetworkInfo that allows retrieving NetworkInfo diff --git a/nova/tests/compute/test_compute_mgr.py b/nova/tests/compute/test_compute_mgr.py index e81a83c0cc78..0b5f078b04f5 100644 --- a/nova/tests/compute/test_compute_mgr.py +++ b/nova/tests/compute/test_compute_mgr.py @@ -1820,6 +1820,30 @@ class ComputeManagerBuildInstanceTestCase(test.NoDBTestCase): mock.call(self.context, self.instance, self.requested_networks, self.security_groups)) + def test_build_resources_with_network_info_obj_on_spawn_failure(self): + self.mox.StubOutWithMock(self.compute, '_cleanup_build_resources') + self.mox.StubOutWithMock(self.compute, '_build_networks_for_instance') + self.compute._build_networks_for_instance(self.context, self.instance, + self.requested_networks, self.security_groups).AndReturn( + network_model.NetworkInfo()) + self._build_resources_instance_update() + self.compute._cleanup_build_resources(self.context, self.instance, + self.block_device_mapping) + self.mox.ReplayAll() + + test_exception = test.TestingException() + + def fake_spawn(): + raise test_exception + + try: + with self.compute._build_resources(self.context, self.instance, + self.requested_networks, self.security_groups, + self.image, self.block_device_mapping): + fake_spawn() + except Exception as e: + self.assertEqual(test_exception, e) + def test_build_resources_cleans_up_and_reraises_on_spawn_failure(self): self.mox.StubOutWithMock(self.compute, '_cleanup_build_resources') self.mox.StubOutWithMock(self.compute, '_build_networks_for_instance')