From 993facb3bf753d23332236dc05b397850bf99144 Mon Sep 17 00:00:00 2001 From: Mike Perez Date: Thu, 17 Apr 2014 18:46:36 -0700 Subject: [PATCH] Fallback to None on missing Glance image attrs It's possible for glance images to be missing attributes like name and checksum. We'll just set those to None by default to avoid missing key exceptions being raised. Closes-Bug: #1308058 Change-Id: I85c42f8351763da201021a22f5ff0ebd62c6b2db --- cinder/image/glance.py | 2 +- cinder/tests/image/test_glance.py | 51 ++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/cinder/image/glance.py b/cinder/image/glance.py index 0c15ba0aa..e0e6ab257 100644 --- a/cinder/image/glance.py +++ b/cinder/image/glance.py @@ -431,7 +431,7 @@ def _extract_attributes(image): elif attr == 'checksum' and output['status'] != 'active': output[attr] = None else: - output[attr] = getattr(image, attr) + output[attr] = getattr(image, attr, None) output['properties'] = getattr(image, 'properties', {}) diff --git a/cinder/tests/image/test_glance.py b/cinder/tests/image/test_glance.py index 3be3568ab..737437260 100644 --- a/cinder/tests/image/test_glance.py +++ b/cinder/tests/image/test_glance.py @@ -17,8 +17,7 @@ import datetime import glanceclient.exc -import glanceclient.v2.client -from glanceclient.v2.client import Client as glanceclient_v2 +from glanceclient.v2 import client as glance_client_v2 from oslo.config import cfg from cinder import context @@ -542,6 +541,50 @@ class TestGlanceImageService(test.TestCase): self.assertEqual(same_id, image_id) self.assertEqual(service._client.netloc, ipv6_url) + def test_extracting_missing_attributes(self): + """Verify behavior from glance objects that are missing attributes + + This fakes the image class and is missing the checksum and name + attribute as the client would return if they're not set in the + database. Regression test for bug #1308058. + """ + class MyFakeGlanceImage(glance_stubs.FakeImage): + def __init__(self, metadata): + IMAGE_ATTRIBUTES = ['size', 'disk_format', 'owner', + 'container_format', 'id', 'created_at', + 'updated_at', 'deleted', 'status', + 'min_disk', 'min_ram', 'is_public'] + raw = dict.fromkeys(IMAGE_ATTRIBUTES) + raw.update(metadata) + self.__dict__['raw'] = raw + + metadata = { + 'id': 1, + 'created_at': self.NOW_DATETIME, + 'updated_at': self.NOW_DATETIME, + } + image = MyFakeGlanceImage(metadata) + actual = glance._extract_attributes(image) + expected = { + 'id': 1, + 'name': None, + 'is_public': None, + 'size': None, + 'min_disk': None, + 'min_ram': None, + 'disk_format': None, + 'container_format': None, + 'checksum': None, + 'created_at': self.NOW_DATETIME, + 'updated_at': self.NOW_DATETIME, + 'deleted_at': None, + 'deleted': None, + 'status': None, + 'properties': {}, + 'owner': None, + } + self.assertEqual(actual, expected) + class TestGlanceClientVersion(test.TestCase): """Tests the version of the glance client generated.""" @@ -551,11 +594,11 @@ class TestGlanceClientVersion(test.TestCase): def fake_get_model(self): return - self.stubs.Set(glanceclient_v2, '_get_image_model', + self.stubs.Set(glance_client_v2.Client, '_get_image_model', fake_get_model) try: - self.stubs.Set(glanceclient_v2, '_get_member_model', + self.stubs.Set(glance_client_v2.Client, '_get_member_model', fake_get_model) except AttributeError: # method requires stubbing only with newer glanceclients. -- 2.45.2