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:
@@ -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)
|
||||||
|
|||||||
@@ -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_'):
|
||||||
|
|||||||
Reference in New Issue
Block a user