From 760d996829979e4d2ba5c9d389961e6e375f15e9 Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Thu, 30 Apr 2015 02:45:28 +0200 Subject: [PATCH] Switch tasks vs put on a boolean config flag Rackspace's requirement for task-create is a choice that is orthogonal to the v2 choice. Make that decision point clear. Also, rename the hidden methods just so that we're clear on what's happening. Update to a more recent version of os-client-config, since that also has support for the task-create flag. Depends-On: I2cdcfe302a73ebfa7f739399c1eeb3bc9f96ab3c Change-Id: I72bb5992eeb116f1338a090d997893b9ae93050c --- requirements.txt | 2 +- shade/__init__.py | 19 ++++++++++++------- shade/tests/unit/test_caching.py | 5 +++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/requirements.txt b/requirements.txt index cf25ff199..ec2cb7793 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ pbr>=0.5.21,<1.0 jsonpatch -os-client-config>=0.7.0 +os-client-config>=0.8.1 six python-novaclient>=2.21.0 diff --git a/shade/__init__.py b/shade/__init__.py index da9b2b6d3..52b9e231e 100644 --- a/shade/__init__.py +++ b/shade/__init__.py @@ -240,6 +240,10 @@ class OpenStackCloud(object): OpenStack API tasks. Unless you're doing rate limiting client side, you almost certainly don't need this. (optional) + :param bool image_api_use_tasks: Whether or not this cloud needs to + use the glance task-create interface for + image upload activities instead of direct + calls. (optional, defaults to False) """ def __init__(self, cloud, auth, @@ -253,6 +257,7 @@ class OpenStackCloud(object): cache_class='dogpile.cache.null', cache_arguments=None, manager=None, + image_api_use_tasks=False, **kwargs): self.name = cloud @@ -272,6 +277,7 @@ class OpenStackCloud(object): self.service_names = _get_service_values(kwargs, 'service_name') self.endpoints = _get_service_values(kwargs, 'endpoint') self.api_versions = _get_service_values(kwargs, 'api_version') + self.image_api_use_tasks = image_api_use_tasks (self.verify, self.cert) = _ssl_args(verify, cacert, cert, key) @@ -1128,22 +1134,21 @@ class OpenStackCloud(object): kwargs[IMAGE_MD5_KEY] = md5 kwargs[IMAGE_SHA256_KEY] = sha256 # This makes me want to die inside - glance_api_version = self._get_glance_api_version() - if glance_api_version == '2': - return self._upload_image_v2( + if self.image_api_use_tasks: + return self._upload_image_task( name, filename, container, current_image=current_image, wait=wait, timeout=timeout, **kwargs) - elif glance_api_version == '1': + else: image_kwargs = dict(properties=kwargs) if disk_format: image_kwargs['disk_format'] = disk_format if container_format: image_kwargs['container_format'] = container_format - return self._upload_image_v1(name, filename, **image_kwargs) + return self._upload_image_put(name, filename, **image_kwargs) - def _upload_image_v1(self, name, filename, **image_kwargs): + def _upload_image_put(self, name, filename, **image_kwargs): image = self.manager.submitTask(_tasks.ImageCreate( name=name, **image_kwargs)) self.manager.submitTask(_tasks.ImageUpdate( @@ -1151,7 +1156,7 @@ class OpenStackCloud(object): self._cache.invalidate() return self.get_image_dict(image.id) - def _upload_image_v2( + def _upload_image_task( self, name, filename, container, current_image=None, wait=True, timeout=None, **image_properties): self.create_object( diff --git a/shade/tests/unit/test_caching.py b/shade/tests/unit/test_caching.py index c88a367a5..ee70a908e 100644 --- a/shade/tests/unit/test_caching.py +++ b/shade/tests/unit/test_caching.py @@ -302,7 +302,7 @@ class TestMemoryCache(base.TestCase): name, imagefile.name, container=container, wait=True) @mock.patch.object(shade.OpenStackCloud, 'glance_client') - def test_create_image_v1(self, glance_mock): + def test_create_image_put(self, glance_mock): self.cloud.api_versions['image'] = '1' glance_mock.images.list.return_value = [] self.assertEqual({}, self.cloud.list_images()) @@ -325,8 +325,9 @@ class TestMemoryCache(base.TestCase): @mock.patch.object(shade.OpenStackCloud, 'glance_client') @mock.patch.object(shade.OpenStackCloud, 'swift_client') - def test_create_image_v2(self, swift_mock, glance_mock): + def test_create_image_task(self, swift_mock, glance_mock): self.cloud.api_versions['image'] = '2' + self.cloud.image_api_use_tasks = True class Container(object): name = 'image_upload_v2_test_container'