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
(cherry picked from commit 993facb3bf
)
This commit is contained in:
parent
978b036a64
commit
1e488339de
@ -431,7 +431,7 @@ def _extract_attributes(image):
|
|||||||
elif attr == 'checksum' and output['status'] != 'active':
|
elif attr == 'checksum' and output['status'] != 'active':
|
||||||
output[attr] = None
|
output[attr] = None
|
||||||
else:
|
else:
|
||||||
output[attr] = getattr(image, attr)
|
output[attr] = getattr(image, attr, None)
|
||||||
|
|
||||||
output['properties'] = getattr(image, 'properties', {})
|
output['properties'] = getattr(image, 'properties', {})
|
||||||
|
|
||||||
|
@ -17,8 +17,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
import glanceclient.exc
|
import glanceclient.exc
|
||||||
import glanceclient.v2.client
|
from glanceclient.v2 import client as glance_client_v2
|
||||||
from glanceclient.v2.client import Client as glanceclient_v2
|
|
||||||
from oslo.config import cfg
|
from oslo.config import cfg
|
||||||
|
|
||||||
from cinder import context
|
from cinder import context
|
||||||
@ -542,6 +541,50 @@ class TestGlanceImageService(test.TestCase):
|
|||||||
self.assertEqual(same_id, image_id)
|
self.assertEqual(same_id, image_id)
|
||||||
self.assertEqual(service._client.netloc, ipv6_url)
|
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):
|
class TestGlanceClientVersion(test.TestCase):
|
||||||
"""Tests the version of the glance client generated."""
|
"""Tests the version of the glance client generated."""
|
||||||
@ -551,11 +594,11 @@ class TestGlanceClientVersion(test.TestCase):
|
|||||||
def fake_get_model(self):
|
def fake_get_model(self):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.stubs.Set(glanceclient_v2, '_get_image_model',
|
self.stubs.Set(glance_client_v2.Client, '_get_image_model',
|
||||||
fake_get_model)
|
fake_get_model)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.stubs.Set(glanceclient_v2, '_get_member_model',
|
self.stubs.Set(glance_client_v2.Client, '_get_member_model',
|
||||||
fake_get_model)
|
fake_get_model)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# method requires stubbing only with newer glanceclients.
|
# method requires stubbing only with newer glanceclients.
|
||||||
|
Loading…
Reference in New Issue
Block a user