From 31cdee11dd35040b051283f783e607f9ea51d710 Mon Sep 17 00:00:00 2001 From: David Shrewsbury Date: Mon, 23 Nov 2015 11:14:24 -0500 Subject: [PATCH] Fix for min_disk/min_ram in create_image API If min_disk or min_ram are passed in as keyword arguments, the values must be integers or glance hates us even more than usual. Change-Id: I1ed04174796e12258055840e9184aa9f8bcf3ea8 --- shade/openstackcloud.py | 4 ++++ shade/tests/functional/test_image.py | 2 ++ shade/tests/unit/test_caching.py | 9 +++++---- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/shade/openstackcloud.py b/shade/openstackcloud.py index a87334e4d..9647ac9f8 100644 --- a/shade/openstackcloud.py +++ b/shade/openstackcloud.py @@ -1963,6 +1963,10 @@ class OpenStackCloud(object): img_props = image_kwargs.pop('properties') for k, v in iter(img_props.items()): image_kwargs[k] = str(v) + # some MUST be integer + for k in ('min_disk', 'min_ram'): + if k in image_kwargs: + image_kwargs[k] = int(image_kwargs[k]) image = self.manager.submitTask(_tasks.ImageCreate( name=name, **image_kwargs)) self.manager.submitTask(_tasks.ImageUpload( diff --git a/shade/tests/functional/test_image.py b/shade/tests/functional/test_image.py index 8c630a4e7..e603acee9 100644 --- a/shade/tests/functional/test_image.py +++ b/shade/tests/functional/test_image.py @@ -42,6 +42,8 @@ class TestImage(base.TestCase): filename=test_image.name, disk_format='raw', container_format='bare', + min_disk=10, + min_ram=1024, wait=True) finally: self.cloud.delete_image(image_name, wait=True) diff --git a/shade/tests/unit/test_caching.py b/shade/tests/unit/test_caching.py index a637c7994..82f95a699 100644 --- a/shade/tests/unit/test_caching.py +++ b/shade/tests/unit/test_caching.py @@ -294,13 +294,13 @@ class TestMemoryCache(base.TestCase): # therefore we should _not_ expect to see the new one here self.assertEqual([first_image], self.cloud.list_images()) - def _call_create_image(self, name, container=None): + def _call_create_image(self, name, container=None, **kwargs): imagefile = tempfile.NamedTemporaryFile(delete=False) imagefile.write(b'\0') imagefile.close() self.cloud.create_image( name, imagefile.name, container=container, wait=True, - is_public=False) + is_public=False, **kwargs) @mock.patch.object(occ.cloud_config.CloudConfig, 'get_api_version') @mock.patch.object(shade.OpenStackCloud, 'glance_client') @@ -336,12 +336,13 @@ class TestMemoryCache(base.TestCase): fake_image = fakes.FakeImage('42', '42 name', 'success') glance_mock.images.create.return_value = fake_image glance_mock.images.list.return_value = [fake_image] - self._call_create_image('42 name') + self._call_create_image('42 name', min_disk=0, min_ram=0) args = {'name': '42 name', 'container_format': 'bare', 'disk_format': 'qcow2', 'owner_specified.shade.md5': mock.ANY, 'owner_specified.shade.sha256': mock.ANY, - 'visibility': 'private'} + 'visibility': 'private', + 'min_disk': 0, 'min_ram': 0} glance_mock.images.create.assert_called_with(**args) glance_mock.images.upload.assert_called_with( image_data=mock.ANY, image_id=fake_image.id)