From 8aa46de0ec8321616284b888875424d964efc5e6 Mon Sep 17 00:00:00 2001 From: Marc Methot Date: Sat, 7 Apr 2018 13:59:56 -0400 Subject: [PATCH] Implement a function to check the image status Using new function is_image_active to confirm if the image is active Change-Id: Ib261401ab5681fd8ba1a91252a5bed51ec73c757 Story: 2001797 Task: 12519 --- ironic/common/glance_service/base_image_service.py | 6 ++++++ ironic/common/glance_service/service_utils.py | 9 +++++++++ ironic/tests/unit/common/test_glance_service.py | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ironic/common/glance_service/base_image_service.py b/ironic/common/glance_service/base_image_service.py index 85aae5734a..387e34290b 100644 --- a/ironic/common/glance_service/base_image_service.py +++ b/ironic/common/glance_service/base_image_service.py @@ -183,6 +183,7 @@ class BaseImageService(object): :returns: A dict containing image metadata. :raises: ImageNotFound + :raises: ImageUnacceptable if the image status is not active """ LOG.debug("Getting image metadata from glance. Image: %s", image_href) @@ -190,6 +191,11 @@ class BaseImageService(object): image = self.call(method, image_id) + if not service_utils.is_image_active(image): + raise exception.ImageUnacceptable( + image_id=image_id, + reason=_("The image is required to be in an active state.")) + if not service_utils.is_image_available(self.context, image): raise exception.ImageNotFound(image_id=image_id) diff --git a/ironic/common/glance_service/service_utils.py b/ironic/common/glance_service/service_utils.py index 6738eed1ce..91c19825d4 100644 --- a/ironic/common/glance_service/service_utils.py +++ b/ironic/common/glance_service/service_utils.py @@ -171,6 +171,15 @@ def is_image_available(context, image): return str(user_id) == str(context.user_id) +def is_image_active(image): + """Check the image status. + + This check is needed in case the Glance image is stuck in queued status + or pending_delete. + """ + return str(getattr(image, 'status', None)) == "active" + + def is_glance_image(image_href): if not isinstance(image_href, six.string_types): return False diff --git a/ironic/tests/unit/common/test_glance_service.py b/ironic/tests/unit/common/test_glance_service.py index 71c9846fc1..14ff155b7e 100644 --- a/ironic/tests/unit/common/test_glance_service.py +++ b/ironic/tests/unit/common/test_glance_service.py @@ -105,7 +105,7 @@ class TestGlanceImageService(base.TestCase): def _make_fixture(**kwargs): fixture = {'name': None, 'properties': {}, - 'status': None, + 'status': "active", 'is_public': None} fixture.update(kwargs) return stubs.FakeImage(fixture) @@ -145,7 +145,7 @@ class TestGlanceImageService(base.TestCase): 'updated_at': None, 'deleted_at': None, 'deleted': None, - 'status': None, + 'status': "active", 'properties': {}, 'owner': None, }