diff --git a/cinder/image/glance.py b/cinder/image/glance.py index d0785718f75..bb5810fb559 100644 --- a/cinder/image/glance.py +++ b/cinder/image/glance.py @@ -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 diff --git a/cinder/tests/unit/image/test_glance.py b/cinder/tests/unit/image/test_glance.py index c8fcbebbf6c..f078e6143b7 100644 --- a/cinder/tests/unit/image/test_glance.py +++ b/cinder/tests/unit/image/test_glance.py @@ -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.""" diff --git a/releasenotes/notes/glance_v2_upload-939c5693bcc25483.yaml b/releasenotes/notes/glance_v2_upload-939c5693bcc25483.yaml new file mode 100644 index 00000000000..a737ff365d3 --- /dev/null +++ b/releasenotes/notes/glance_v2_upload-939c5693bcc25483.yaml @@ -0,0 +1,3 @@ +--- +fixes: + - upload-to-image using Image API v2 now correctly handles custom image properties.