]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Fallback to None on missing Glance image attrs
authorMike Perez <thingee@gmail.com>
Fri, 18 Apr 2014 01:46:36 +0000 (18:46 -0700)
committerThomas Goirand <thomas@goirand.fr>
Mon, 9 Jun 2014 14:08:50 +0000 (22:08 +0800)
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
(cherry picked from commit 993facb3bf753d23332236dc05b397850bf99144)

cinder/image/glance.py
cinder/tests/image/test_glance.py

index 0c15ba0aa092473195fbddf868d87b4ef77e2a46..e0e6ab257736d4ff1867457526a4ec34a1448b04 100644 (file)
@@ -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', {})
 
index 3be3568ab4445b7e950cc43dd2c9c47a59a7ce39..737437260f0d8928a7672bfc1f22bae14befa9e5 100644 (file)
@@ -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.