Fix volume upload failure with glance_api_version=2

When the volume has additional image properties, upload-to-image
using glance API version 2 will fail with the following error.

  Failed validation u'type' in schema[u'additionalProperties']:
      {u'type': u'string'}

This is due to non core properties passed as a dict to the key
'properties'. It is valid in Image API v1, but the additional
properties must be passed just like core properties in v2.

Change-Id: Ib32c92a8be170b5f43a34e69155398dfc1a8cbcd
Closes-Bug: #1527324
This commit is contained in:
Tomoki Sekiyama 2015-12-18 20:38:36 +09:00
parent e7965dc323
commit edf00659aa
3 changed files with 58 additions and 0 deletions

View File

@ -412,6 +412,15 @@ class GlanceImageService(object):
def _translate_to_glance(image_meta):
image_meta = _convert_to_string(image_meta)
image_meta = _remove_read_only(image_meta)
# NOTE(tsekiyama): From the Image API v2, custom properties must
# be stored in image_meta directly, instead of the 'properties' key.
if CONF.glance_api_version >= 2:
properties = image_meta.get('properties')
if properties:
image_meta.update(properties)
del image_meta['properties']
return image_meta
@staticmethod

View File

@ -665,6 +665,52 @@ class TestGlanceImageService(test.TestCase):
self.assertEqual(expected, actual)
def test_translate_to_glance(self):
self.flags(glance_api_version=1)
client = glance_stubs.StubGlanceClient()
service = self._create_image_service(client)
metadata = {
'id': 1,
'size': 2,
'min_disk': 2,
'min_ram': 2,
'properties': {'kernel_id': 'foo',
'ramdisk_id': 'bar',
'x_billinginfo': '123'},
}
actual = service._translate_to_glance(metadata)
expected = metadata
self.assertEqual(expected, actual)
def test_translate_to_glance_v2(self):
self.flags(glance_api_version=2)
client = glance_stubs.StubGlanceClient()
service = self._create_image_service(client)
metadata = {
'id': 1,
'size': 2,
'min_disk': 2,
'min_ram': 2,
'properties': {'kernel_id': 'foo',
'ramdisk_id': 'bar',
'x_billinginfo': '123'},
}
actual = service._translate_to_glance(metadata)
expected = {
'id': 1,
'size': 2,
'min_disk': 2,
'min_ram': 2,
'kernel_id': 'foo',
'ramdisk_id': 'bar',
'x_billinginfo': '123',
}
self.assertEqual(expected, actual)
class TestGlanceClientVersion(test.TestCase):
"""Tests the version of the glance client generated."""

View File

@ -0,0 +1,3 @@
---
fixes:
- upload-to-image using Image API v2 now correctly handles custom image properties.