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:
parent
6d654bc7ad
commit
1cb9b2094a
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue