diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index a7987d8c48..cc77b86964 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -17,6 +17,7 @@ import contextlib import copy import functools +import sys from oslo_config import cfg from oslo_log import log as logging @@ -740,7 +741,7 @@ class ComputeTaskManager(base.Base): context, 'get_image_info', self.host, instance.uuid): try: image = safe_image_show(context, image_id) - except exception.ImageNotFound: + except exception.ImageNotFound as error: instance.vm_state = vm_states.ERROR instance.save() @@ -748,6 +749,9 @@ class ComputeTaskManager(base.Base): 'cannot be found.') % image_id LOG.error(reason, instance=instance) + compute_utils.add_instance_fault_from_exc( + context, instance, error, sys.exc_info(), + fault_message=reason) raise exception.UnshelveException( instance_id=instance.uuid, reason=reason) diff --git a/nova/tests/unit/conductor/test_conductor.py b/nova/tests/unit/conductor/test_conductor.py index a9ab3bd998..2da33d977a 100644 --- a/nova/tests/unit/conductor/test_conductor.py +++ b/nova/tests/unit/conductor/test_conductor.py @@ -1047,10 +1047,11 @@ class _BaseTaskTestCase(object): do_test() + @mock.patch('nova.compute.utils.add_instance_fault_from_exc') @mock.patch.object(image_api.API, 'get', side_effect=exc.ImageNotFound(image_id=uuids.image)) def test_unshelve_offloaded_instance_glance_image_not_found( - self, mock_get): + self, mock_get, add_instance_fault_from_exc): instance = self._create_fake_instance_obj() instance.vm_state = vm_states.SHELVED_OFFLOADED instance.task_state = task_states.UNSHELVING @@ -1061,10 +1062,16 @@ class _BaseTaskTestCase(object): system_metadata['shelved_host'] = 'fake-mini' system_metadata['shelved_image_id'] = uuids.image + reason = ('Unshelve attempted but the image %s ' + 'cannot be found.') % uuids.image + self.assertRaises( exc.UnshelveException, self.conductor_manager.unshelve_instance, self.context, instance) + add_instance_fault_from_exc.assert_called_once_with( + self.context, instance, mock_get.side_effect, mock.ANY, + fault_message=reason) self.assertEqual(instance.vm_state, vm_states.ERROR) mock_get.assert_called_once_with(self.context, uuids.image, show_deleted=False)