diff options
| author | Johannes Erdfelt <johannes.erdfelt@rackspace.com> | 2012-07-26 19:53:51 +0000 |
|---|---|---|
| committer | Johannes Erdfelt <johannes.erdfelt@rackspace.com> | 2012-07-26 20:42:54 +0000 |
| commit | 5974c441bd538897bd4547e6a05ee27216461d97 (patch) | |
| tree | 60329a30101859e3c1ff52c563cf6c380587e044 | |
| parent | ef4f5b21d7917eacd1d07b7a61f51f0d3d7654bf (diff) | |
Ensure instance is moved to ERROR on suspend failure
Fixes bug 1029627
Change-Id: I8b137cafe56be5f2f9ffca08c0edc1d1468bc3b1
| -rw-r--r-- | nova/compute/manager.py | 3 | ||||
| -rw-r--r-- | nova/tests/compute/test_compute.py | 17 |
2 files changed, 19 insertions, 1 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index dec26992a..b66eed063 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -1796,7 +1796,8 @@ class ComputeManager(manager.SchedulerDependentManager): instance = self.db.instance_get_by_uuid(context, instance_uuid) LOG.audit(_('Suspending'), context=context, instance=instance) - self.driver.suspend(instance) + with self.error_out_instance_on_exception(context, instance['uuid']): + self.driver.suspend(instance) current_power_state = self._get_power_state(context, instance) self._instance_update(context, diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 6ccf2e312..86155c6be 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -508,6 +508,23 @@ class ComputeTestCase(BaseTestCase): self.compute.resume_instance(self.context, instance_uuid) self.compute.terminate_instance(self.context, instance_uuid) + def test_suspend_error(self): + """Ensure vm_state is ERROR when suspend error occurs""" + def fake(*args, **kwargs): + raise test.TestingException() + self.stubs.Set(self.compute.driver, 'suspend', fake) + + instance = self._create_fake_instance() + instance_uuid = instance['uuid'] + self.compute.run_instance(self.context, instance_uuid) + self.assertRaises(test.TestingException, + self.compute.suspend_instance, + self.context, + instance=jsonutils.to_primitive(instance)) + instance = db.instance_get_by_uuid(self.context, instance_uuid) + self.assertEqual(instance['vm_state'], vm_states.ERROR) + self.compute.terminate_instance(self.context, instance_uuid) + def test_rebuild(self): """Ensure instance can be rebuilt""" instance = self._create_fake_instance() |
