Support PUT in Image v2 API

Not only is there a difference between put and task uploads, there is
also a difference between v1 put and v2 put. Of course there is.

Co-Authored-By: David Shrewsbury <shrewsbury.dave@gmail.com>

Change-Id: I63f8dd4279cf242da7e76018580479968bc9aaef
This commit is contained in:
Monty Taylor 2015-05-10 15:05:09 -04:00 committed by David Shrewsbury
parent 6d654bc7ad
commit 1cb9b2094a
3 changed files with 54 additions and 3 deletions

View File

@ -15,6 +15,7 @@
import hashlib
import logging
import operator
import os
import time
from cinderclient.v1 import client as cinder_client
@ -1264,11 +1265,35 @@ class OpenStackCloud(object):
return self._upload_image_put(name, filename, **image_kwargs)
def _upload_image_put(self, name, filename, **image_kwargs):
def _upload_image_put_v2(self, name, image_data, **image_kwargs):
if 'properties' in image_kwargs:
img_props = image_kwargs.pop('properties')
for k, v in iter(img_props.items()):
image_kwargs[k] = str(v)
image = self.manager.submitTask(_tasks.ImageCreate(
name=name, **image_kwargs))
curr = image_data.tell()
image_data.seek(0, os.SEEK_END)
data_size = image_data.tell()
image_data.seek(curr)
self.manager.submitTask(_tasks.ImageUpload(
image_id=image.id, image_data=image_data, image_size=data_size))
return image
def _upload_image_put_v1(self, name, image_data, **image_kwargs):
image = self.manager.submitTask(_tasks.ImageCreate(
name=name, **image_kwargs))
self.manager.submitTask(_tasks.ImageUpdate(
image=image, data=open(filename, 'rb')))
image=image, data=image_data))
return image
def _upload_image_put(self, name, filename, **image_kwargs):
image_data = open(filename, 'rb')
# Because reasons and crying bunnies
if self.api_versions['image'] == '2':
image = self._upload_image_put_v2(name, image_data, **image_kwargs)
else:
image = self._upload_image_put_v1(name, image_data, **image_kwargs)
self._cache.invalidate()
return self.get_image(image.id)

View File

@ -162,6 +162,11 @@ class ImageUpdate(task_manager.Task):
client.glance_client.images.update(**self.args)
class ImageUpload(task_manager.Task):
def main(self, client):
client.glance_client.images.upload(**self.args)
class VolumeCreate(task_manager.Task):
def main(self, client):
return client.cinder_client.volumes.create(**self.args)

View File

@ -262,7 +262,7 @@ class TestMemoryCache(base.TestCase):
name, imagefile.name, container=container, wait=True)
@mock.patch.object(shade.OpenStackCloud, 'glance_client')
def test_create_image_put(self, glance_mock):
def test_create_image_put_v1(self, glance_mock):
self.cloud.api_versions['image'] = '1'
glance_mock.images.list.return_value = []
self.assertEqual([], self.cloud.list_images())
@ -280,6 +280,27 @@ class TestMemoryCache(base.TestCase):
fake_image_dict = meta.obj_to_dict(fake_image)
self.assertEqual([fake_image_dict], self.cloud.list_images())
@mock.patch.object(shade.OpenStackCloud, 'glance_client')
def test_create_image_put_v2(self, glance_mock):
self.cloud.api_versions['image'] = '2'
self.cloud.image_api_use_tasks = False
glance_mock.images.list.return_value = []
self.assertEqual([], self.cloud.list_images())
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')
args = {'name': '42 name',
'owner_specified.shade.md5': mock.ANY,
'owner_specified.shade.sha256': mock.ANY}
glance_mock.images.create.assert_called_with(**args)
glance_mock.images.upload.assert_called_with(
image_data=mock.ANY, image_id=fake_image.id, image_size=1)
fake_image_dict = meta.obj_to_dict(fake_image)
self.assertEqual([fake_image_dict], self.cloud.list_images())
@mock.patch.object(shade.OpenStackCloud, 'glance_client')
@mock.patch.object(shade.OpenStackCloud, 'swift_client')
def test_create_image_task(self, swift_mock, glance_mock):