summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-03-19 15:05:23 +0000
committerGerrit Code Review <review@openstack.org>2014-03-19 15:05:23 +0000
commitefd628c9d604759adc11564bbea0e1ea082876ce (patch)
tree80aac780d8106f746e177ac43eb9f715c16cf3e8
parent2ce626fb53e5cbbd736fe7c37edfc338bdfd331c (diff)
parent88da0984c81fa98ff1d32915a4152773d7caa257 (diff)
downloadnova-efd628c9d604759adc11564bbea0e1ea082876ce.tar.gz
Merge "Take a vm out of SNAPSHOTTING after Glance error" into stable/havana
-rw-r--r--nova/compute/manager.py6
-rw-r--r--nova/tests/compute/test_compute.py14
2 files changed, 18 insertions, 2 deletions
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 8e56d150cf..4e70c94405 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -2351,8 +2351,10 @@ class ComputeManager(manager.SchedulerDependentManager):
msg = _("Instance disappeared during snapshot")
LOG.debug(msg, instance=instance)
except exception.ImageNotFound:
- msg = _("Image not found")
- LOG.debug(msg, instance=instance)
+ instance.task_state = None
+ instance.save()
+ msg = _("Image not found during snapshot")
+ LOG.warn(msg, instance=instance)
except exception.UnexpectedTaskStateError as e:
actual_task_state = e.kwargs.get('actual', None)
if actual_task_state == 'deleting':
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index 069b26ddc0..d6b4e37c0c 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -2480,6 +2480,20 @@ class ComputeTestCase(BaseTestCase):
def test_snapshot_fails_cleanup_ignores_exception(self):
self._test_snapshot_fails(True)
+ def test_snapshot_fails_with_glance_error(self):
+ def fake_snapshot(*args, **kwargs):
+ raise exception.ImageNotFound(image_id='xxx')
+
+ self.stubs.Set(self.compute.driver, 'snapshot', fake_snapshot)
+ fake_image.stub_out_image_service(self.stubs)
+
+ inst_obj = self._get_snapshotting_instance()
+
+ self.compute.snapshot_instance(
+ self.context, image_id='fakesnap',
+ instance=inst_obj)
+ self._assert_state({'task_state': None})
+
def test_snapshot_handles_cases_when_instance_is_deleted(self):
inst_obj = self._get_snapshotting_instance()
inst_obj.task_state = task_states.DELETING