Make exception handling in get_image_metadata more specific

The generic try/except with Exception was masking an
AttributeError raised during migration flows in conductor.

This change makes the error handling specific to the translated
exceptions raised from the image service in nova.image.glance,
specifically the _translate_image_exception method.

Related-Bug: #1326926

Change-Id: I3e4db73569fc1b02d7a05b4ab10fe83fec956922
This commit is contained in:
Matt Riedemann
2014-06-18 10:55:11 -07:00
parent 7f53a8c91e
commit b1ddfdd706
2 changed files with 23 additions and 4 deletions

View File

@@ -203,7 +203,9 @@ def get_image_metadata(context, image_api, image_id_or_uri, instance):
# If the base image is still available, get its metadata # If the base image is still available, get its metadata
try: try:
image = image_api.get(context, image_id_or_uri) image = image_api.get(context, image_id_or_uri)
except Exception as e: except (exception.ImageNotAuthorized,
exception.ImageNotFound,
exception.Invalid) as e:
LOG.warning(_("Can't access image %(image_id)s: %(error)s"), LOG.warning(_("Can't access image %(image_id)s: %(error)s"),
{"image_id": image_id_or_uri, "error": e}, {"image_id": image_id_or_uri, "error": e},
instance=instance) instance=instance)

View File

@@ -21,6 +21,7 @@ import string
import mock import mock
from oslo.config import cfg from oslo.config import cfg
import testtools
from nova.compute import flavors from nova.compute import flavors
from nova.compute import power_state from nova.compute import power_state
@@ -668,9 +669,8 @@ class ComputeGetImageMetadataTestCase(test.TestCase):
self.image['properties'] = 'DONTCARE' self.image['properties'] = 'DONTCARE'
self.assertThat(self.image, matchers.DictMatches(image_meta)) self.assertThat(self.image, matchers.DictMatches(image_meta))
def test_get_image_meta_no_image(self): def _test_get_image_meta_exception(self, error):
e = exception.ImageNotFound(image_id='fake-image') self.mock_image_api.get.side_effect = error
self.mock_image_api.get.side_effect = e
image_meta = compute_utils.get_image_metadata( image_meta = compute_utils.get_image_metadata(
self.ctx, self.mock_image_api, 'fake-image', self.instance_obj) self.ctx, self.mock_image_api, 'fake-image', self.instance_obj)
@@ -681,6 +681,23 @@ class ComputeGetImageMetadataTestCase(test.TestCase):
self.image[key] = str(self.image[key]) self.image[key] = str(self.image[key])
self.assertThat(self.image, matchers.DictMatches(image_meta)) self.assertThat(self.image, matchers.DictMatches(image_meta))
def test_get_image_meta_no_image(self):
error = exception.ImageNotFound(image_id='fake-image')
self._test_get_image_meta_exception(error)
def test_get_image_meta_not_authorized(self):
error = exception.ImageNotAuthorized(image_id='fake-image')
self._test_get_image_meta_exception(error)
def test_get_image_meta_bad_request(self):
error = exception.Invalid()
self._test_get_image_meta_exception(error)
def test_get_image_meta_unexpected_exception(self):
error = test.TestingException()
with testtools.ExpectedException(test.TestingException):
self._test_get_image_meta_exception(error)
def test_get_image_meta_no_image_system_meta(self): def test_get_image_meta_no_image_system_meta(self):
for k in self.instance['system_metadata'].keys(): for k in self.instance['system_metadata'].keys():
if k.startswith('image_'): if k.startswith('image_'):