Fix image normalization when image has properties property
In the somewhat pathological case of an image having a property named properties already that contains a non-dict value, image normalizaiton becomes quite unhappy. Fix it. Change-Id: I2ce4dd4e3b7a4a9b46ff2bf699d2c8517e1ce7ce Story: 2001073 Task: 4697
This commit is contained in:
parent
74522a1a22
commit
bc942953bc
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
issues:
|
||||||
|
- Images in the cloud with a string property named "properties"
|
||||||
|
caused image normalization to bomb.
|
@ -268,7 +268,13 @@ class Normalizer(object):
|
|||||||
# Discard noise
|
# Discard noise
|
||||||
self._remove_novaclient_artifacts(image)
|
self._remove_novaclient_artifacts(image)
|
||||||
|
|
||||||
|
# If someone made a property called "properties" that contains a
|
||||||
|
# string (this has happened at least one time in the wild), the
|
||||||
|
# the rest of the normalization here goes belly up.
|
||||||
properties = image.pop('properties', {})
|
properties = image.pop('properties', {})
|
||||||
|
if not isinstance(properties, dict):
|
||||||
|
properties = {'properties': properties}
|
||||||
|
|
||||||
visibility = image.pop('visibility', None)
|
visibility = image.pop('visibility', None)
|
||||||
protected = _to_bool(image.pop('protected', False))
|
protected = _to_bool(image.pop('protected', False))
|
||||||
|
|
||||||
@ -318,7 +324,8 @@ class Normalizer(object):
|
|||||||
# Backwards compat with glance
|
# Backwards compat with glance
|
||||||
if not self.strict_mode:
|
if not self.strict_mode:
|
||||||
for key, val in properties.items():
|
for key, val in properties.items():
|
||||||
new_image[key] = val
|
if key != 'properties':
|
||||||
|
new_image[key] = val
|
||||||
new_image['protected'] = protected
|
new_image['protected'] = protected
|
||||||
new_image['metadata'] = properties
|
new_image['metadata'] = properties
|
||||||
new_image['created'] = new_image['created_at']
|
new_image['created'] = new_image['created_at']
|
||||||
|
@ -136,6 +136,22 @@ class TestImage(BaseTestImage):
|
|||||||
self.cloud.list_images())
|
self.cloud.list_images())
|
||||||
self.assert_calls()
|
self.assert_calls()
|
||||||
|
|
||||||
|
def test_list_images_string_properties(self):
|
||||||
|
image_dict = self.fake_image_dict.copy()
|
||||||
|
image_dict['properties'] = 'list,of,properties'
|
||||||
|
self.register_uris([
|
||||||
|
dict(method='GET', uri='https://image.example.com/v2/images',
|
||||||
|
json={'images': [image_dict]}),
|
||||||
|
])
|
||||||
|
images = self.cloud.list_images()
|
||||||
|
self.assertEqual(
|
||||||
|
self.cloud._normalize_images([image_dict]),
|
||||||
|
images)
|
||||||
|
self.assertEqual(
|
||||||
|
images[0]['properties']['properties'],
|
||||||
|
'list,of,properties')
|
||||||
|
self.assert_calls()
|
||||||
|
|
||||||
def test_list_images_paginated(self):
|
def test_list_images_paginated(self):
|
||||||
marker = str(uuid.uuid4())
|
marker = str(uuid.uuid4())
|
||||||
self.register_uris([
|
self.register_uris([
|
||||||
|
Loading…
Reference in New Issue
Block a user