blob: ce5bd3e9ef0e659d00314582f68128ccf6f09483 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2013 OpenStack Foundation
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +05302# Copyright 2013 IBM Corp
Matthew Treinisha62347f2013-03-01 16:37:30 -05003# All Rights Reserved.
Matthew Treinisha62347f2013-03-01 16:37:30 -05004#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License. You may obtain
7# a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14# License for the specific language governing permissions and limitations
15# under the License.
16
Matthew Treinisha62347f2013-03-01 16:37:30 -050017import random
18
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053019import six
Matthew Treinish01472ff2015-02-20 17:26:52 -050020
Takashi NATSUME12a48512015-08-10 18:33:16 +090021from oslo_log import log as logging
Sean Dague1937d092013-05-17 16:36:38 -040022from tempest.api.image import base
Takashi NATSUME12a48512015-08-10 18:33:16 +090023from tempest import config
Ken'ichi Ohmichicc01c3e2017-03-10 10:48:14 -080024from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080025from tempest.lib import decorators
lkuchlan32b53c32017-04-20 16:51:08 +030026from tempest.lib import exceptions as lib_exc
Matthew Treinisha62347f2013-03-01 16:37:30 -050027
Takashi NATSUME12a48512015-08-10 18:33:16 +090028CONF = config.CONF
29LOG = logging.getLogger(__name__)
30
Matthew Treinisha62347f2013-03-01 16:37:30 -050031
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053032class BasicOperationsImagesTest(base.BaseV2ImageTest):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000033 """Here we test the basic operations of images"""
Matthew Treinisha62347f2013-03-01 16:37:30 -050034
Jordan Pittier3b46d272017-04-12 16:17:28 +020035 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080036 @decorators.idempotent_id('139b765e-7f3d-4b3d-8b37-3ca3876ee318')
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053037 def test_register_upload_get_image_file(self):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000038 """Here we test these functionalities
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053039
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000040 Register image, upload the image file, get image and get image
41 file api's
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053042 """
43
Sean Daguec6ec4762014-05-29 08:54:21 -040044 uuid = '00000000-1111-2222-3333-444455556666'
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053045 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090046 container_format = CONF.image.container_formats[0]
47 disk_format = CONF.image.disk_formats[0]
lkuchlanb3348792016-09-29 10:42:21 +030048 image = self.create_image(name=image_name,
49 container_format=container_format,
50 disk_format=disk_format,
51 visibility='private',
52 ramdisk_id=uuid)
lkuchlanb3348792016-09-29 10:42:21 +030053 self.assertIn('name', image)
54 self.assertEqual(image_name, image['name'])
55 self.assertIn('visibility', image)
56 self.assertEqual('private', image['visibility'])
57 self.assertIn('status', image)
58 self.assertEqual('queued', image['status'])
Matthew Treinisha62347f2013-03-01 16:37:30 -050059
60 # Now try uploading an image file
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -070061 file_content = data_utils.random_bytes()
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053062 image_file = six.BytesIO(file_content)
lkuchlanb3348792016-09-29 10:42:21 +030063 self.client.store_image_file(image['id'], image_file)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053064
65 # Now try to get image details
lkuchlanb3348792016-09-29 10:42:21 +030066 body = self.client.show_image(image['id'])
67 self.assertEqual(image['id'], body['id'])
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053068 self.assertEqual(image_name, body['name'])
Sean Daguec6ec4762014-05-29 08:54:21 -040069 self.assertEqual(uuid, body['ramdisk_id'])
Attila Fazekase191cb12013-07-29 06:41:52 +020070 self.assertIn('size', body)
Matthew Treinisha62347f2013-03-01 16:37:30 -050071 self.assertEqual(1024, body.get('size'))
72
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053073 # Now try get image file
lkuchlanb3348792016-09-29 10:42:21 +030074 body = self.client.show_image_file(image['id'])
David Kranzd7e97b42015-02-16 09:37:31 -050075 self.assertEqual(file_content, body.data)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053076
Jordan Pittier3b46d272017-04-12 16:17:28 +020077 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080078 @decorators.idempotent_id('f848bb94-1c6e-45a4-8726-39e3a5b23535')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053079 def test_delete_image(self):
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +040080 # Deletes an image by image_id
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053081
82 # Create image
83 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090084 container_format = CONF.image.container_formats[0]
85 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +020086 image = self.create_image(name=image_name,
87 container_format=container_format,
88 disk_format=disk_format,
89 visibility='private')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053090 # Delete Image
lkuchlanb3348792016-09-29 10:42:21 +030091 self.client.delete_image(image['id'])
92 self.client.wait_for_resource_deletion(image['id'])
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053093
94 # Verifying deletion
John Warrenf3b3e952015-08-17 19:28:12 +000095 images = self.client.list_images()['images']
Sunil G29856a32014-07-17 23:17:58 +053096 images_id = [item['id'] for item in images]
lkuchlanb3348792016-09-29 10:42:21 +030097 self.assertNotIn(image['id'], images_id)
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053098
Jordan Pittier3b46d272017-04-12 16:17:28 +020099 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800100 @decorators.idempotent_id('f66891a7-a35c-41a8-b590-a065c2a1caa6')
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400101 def test_update_image(self):
102 # Updates an image by image_id
103
104 # Create image
105 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +0900106 container_format = CONF.image.container_formats[0]
107 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +0200108 image = self.create_image(name=image_name,
109 container_format=container_format,
110 disk_format=disk_format,
111 visibility='private')
lkuchlanb3348792016-09-29 10:42:21 +0300112 self.assertEqual('queued', image['status'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400113
114 # Now try uploading an image file
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530115 image_file = six.BytesIO(data_utils.random_bytes())
lkuchlanb3348792016-09-29 10:42:21 +0300116 self.client.store_image_file(image['id'], image_file)
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400117
118 # Update Image
119 new_image_name = data_utils.rand_name('new-image')
zhufl311104e2017-08-17 15:13:18 +0800120 self.client.update_image(image['id'], [
Aaron Rosenc7720622014-05-20 10:38:10 -0700121 dict(replace='/name', value=new_image_name)])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400122
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400123 # Verifying updating
124
lkuchlanb3348792016-09-29 10:42:21 +0300125 body = self.client.show_image(image['id'])
126 self.assertEqual(image['id'], body['id'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400127 self.assertEqual(new_image_name, body['name'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400128
lkuchlan32b53c32017-04-20 16:51:08 +0300129 @decorators.idempotent_id('951ebe01-969f-4ea9-9898-8a3f1f442ab0')
130 def test_deactivate_reactivate_image(self):
131 # Create image
132 image_name = data_utils.rand_name('image')
133 image = self.create_image(name=image_name,
134 container_format='bare',
135 disk_format='raw',
136 visibility='private')
137
138 # Upload an image file
139 content = data_utils.random_bytes()
140 image_file = six.BytesIO(content)
141 self.client.store_image_file(image['id'], image_file)
142
143 # Deactivate image
144 self.client.deactivate_image(image['id'])
145 body = self.client.show_image(image['id'])
146 self.assertEqual("deactivated", body['status'])
147
148 # User unable to download deactivated image
149 self.assertRaises(lib_exc.Forbidden, self.client.show_image_file,
150 image['id'])
151
152 # Reactivate image
153 self.client.reactivate_image(image['id'])
154 body = self.client.show_image(image['id'])
155 self.assertEqual("active", body['status'])
156
157 # User able to download image after reactivation
158 body = self.client.show_image_file(image['id'])
159 self.assertEqual(content, body.data)
160
Matthew Treinisha62347f2013-03-01 16:37:30 -0500161
zhufl6e042bc2017-01-25 10:33:40 +0800162class ListUserImagesTest(base.BaseV2ImageTest):
163 """Here we test the listing of image information"""
Matthew Treinisha62347f2013-03-01 16:37:30 -0500164
165 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100166 def resource_setup(cls):
zhufl6e042bc2017-01-25 10:33:40 +0800167 super(ListUserImagesTest, cls).resource_setup()
Matthew Treinisha62347f2013-03-01 16:37:30 -0500168 # We add a few images here to test the listing functionality of
169 # the images API
Takashi NATSUME12a48512015-08-10 18:33:16 +0900170 container_fmts = CONF.image.container_formats
171 disk_fmts = CONF.image.disk_formats
172 all_pairs = [(container_fmt, disk_fmt)
173 for container_fmt in container_fmts
174 for disk_fmt in disk_fmts]
175
176 for (container_fmt, disk_fmt) in all_pairs[:6]:
hgangwxf186edc2015-12-28 21:12:59 +0800177 LOG.debug("Creating an image"
Takashi NATSUME12a48512015-08-10 18:33:16 +0900178 "(Container format: %s, Disk format: %s).",
179 container_fmt, disk_fmt)
180 cls._create_standard_image(container_fmt, disk_fmt)
Matthew Treinisha62347f2013-03-01 16:37:30 -0500181
182 @classmethod
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700183 def _create_standard_image(cls, container_format, disk_format):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000184 """Create a new standard image and return the newly-registered image-id
185
186 Note that the size of the new image is a random number between
Matthew Treinisha62347f2013-03-01 16:37:30 -0500187 1024 and 4096
188 """
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -0700189 size = random.randint(1024, 4096)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530190 image_file = six.BytesIO(data_utils.random_bytes(size))
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700191 tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
zhufl08e42762016-10-18 16:07:56 +0800192 image = cls.create_image(container_format=container_format,
lkuchlanb3348792016-09-29 10:42:21 +0300193 disk_format=disk_format,
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700194 visibility='private',
195 tags=tags)
lkuchlanb3348792016-09-29 10:42:21 +0300196 cls.client.store_image_file(image['id'], data=image_file)
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700197 # Keep the data of one test image so it can be used to filter lists
198 cls.test_data = image
Matthew Treinisha62347f2013-03-01 16:37:30 -0500199
lkuchlanb3348792016-09-29 10:42:21 +0300200 return image['id']
Matthew Treinisha62347f2013-03-01 16:37:30 -0500201
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700202 def _list_by_param_value_and_assert(self, params):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000203 """Perform list action with given params and validates result."""
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700204 # Retrieve the list of images that meet the filter
John Warrenf3b3e952015-08-17 19:28:12 +0000205 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700206 # Validating params of fetched images
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700207 msg = 'No images were found that met the filter criteria.'
208 self.assertNotEmpty(images_list, msg)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700209 for image in images_list:
210 for key in params:
211 msg = "Failed to list images by %s" % key
212 self.assertEqual(params[key], image[key], msg)
213
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700214 def _list_sorted_by_image_size_and_assert(self, params, desc=False):
215 """Validate an image list that has been sorted by size
216
217 Perform list action with given params and validates the results are
218 sorted by image size in either ascending or descending order.
219 """
220 # Retrieve the list of images that meet the filter
221 images_list = self.client.list_images(params=params)['images']
222 # Validate that the list was fetched sorted accordingly
223 msg = 'No images were found that met the filter criteria.'
224 self.assertNotEmpty(images_list, msg)
225 sorted_list = [image['size'] for image in images_list]
226 msg = 'The list of images was not sorted correctly.'
227 self.assertEqual(sorted(sorted_list, reverse=desc), sorted_list, msg)
228
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800229 @decorators.idempotent_id('1e341d7a-90a9-494c-b143-2cdf2aeb6aee')
Flavio Percoco7e26be12015-09-15 22:33:19 +0200230 def test_list_no_params(self):
Matthew Treinisha62347f2013-03-01 16:37:30 -0500231 # Simple test to see all fixture images returned
John Warrenf3b3e952015-08-17 19:28:12 +0000232 images_list = self.client.list_images()['images']
Sirushti Murugesan935f2cc2016-07-12 19:48:24 +0530233 image_list = [image['id'] for image in images_list]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700234
Matthew Treinisha62347f2013-03-01 16:37:30 -0500235 for image in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200236 self.assertIn(image, image_list)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700237
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800238 @decorators.idempotent_id('9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700239 def test_list_images_param_container_format(self):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700240 # Test to get all images with a specific container_format
241 params = {"container_format": self.test_data['container_format']}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700242 self._list_by_param_value_and_assert(params)
243
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800244 @decorators.idempotent_id('4a4735a7-f22f-49b6-b0d9-66e1ef7453eb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700245 def test_list_images_param_disk_format(self):
246 # Test to get all images with disk_format = raw
247 params = {"disk_format": "raw"}
248 self._list_by_param_value_and_assert(params)
249
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800250 @decorators.idempotent_id('7a95bb92-d99e-4b12-9718-7bc6ab73e6d2')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700251 def test_list_images_param_visibility(self):
Aaron Rosenc7720622014-05-20 10:38:10 -0700252 # Test to get all images with visibility = private
253 params = {"visibility": "private"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700254 self._list_by_param_value_and_assert(params)
255
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800256 @decorators.idempotent_id('cf1b9a48-8340-480e-af7b-fe7e17690876')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700257 def test_list_images_param_size(self):
258 # Test to get all images by size
Takashi NATSUME12a48512015-08-10 18:33:16 +0900259 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700260 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000261 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700262
263 params = {"size": image['size']}
264 self._list_by_param_value_and_assert(params)
265
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800266 @decorators.idempotent_id('4ad8c157-971a-4ba8-aa84-ed61154b1e7f')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700267 def test_list_images_param_min_max_size(self):
268 # Test to get all images with size between 2000 to 3000
Takashi NATSUME12a48512015-08-10 18:33:16 +0900269 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700270 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000271 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700272
273 size = image['size']
274 params = {"size_min": size - 500, "size_max": size + 500}
John Warrenf3b3e952015-08-17 19:28:12 +0000275 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700276 image_size_list = map(lambda x: x['size'], images_list)
277
278 for image_size in image_size_list:
Béla Vancsics64862f72016-11-08 09:12:31 +0100279 self.assertGreaterEqual(image_size, params['size_min'],
280 "Failed to get images by size_min")
281 self.assertLessEqual(image_size, params['size_max'],
282 "Failed to get images by size_max")
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700283
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800284 @decorators.idempotent_id('7fc9e369-0f58-4d05-9aa5-0969e2d59d15')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700285 def test_list_images_param_status(self):
Anju Tiwarica2249d2014-01-23 17:33:02 +0530286 # Test to get all active images
287 params = {"status": "active"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700288 self._list_by_param_value_and_assert(params)
289
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800290 @decorators.idempotent_id('e914a891-3cc8-4b40-ad32-e0a39ffbddbb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700291 def test_list_images_param_limit(self):
292 # Test to get images by limit
Takashi NATSUME12a48512015-08-10 18:33:16 +0900293 params = {"limit": 1}
John Warrenf3b3e952015-08-17 19:28:12 +0000294 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700295
296 self.assertEqual(len(images_list), params['limit'],
297 "Failed to get images by limit")
raiesmh08a1ce3542014-03-04 11:58:29 +0530298
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800299 @decorators.idempotent_id('e9a44b91-31c8-4b40-a332-e0a39ffb4dbb')
Li Wei14bf2412016-09-25 15:56:23 +0800300 def test_list_image_param_owner(self):
301 # Test to get images by owner
302 image_id = self.created_images[0]
303 # Get image metadata
304 image = self.client.show_image(image_id)
305
306 params = {"owner": image['owner']}
307 self._list_by_param_value_and_assert(params)
308
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800309 @decorators.idempotent_id('55c8f5f5-bfed-409d-a6d5-4caeda985d7b')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700310 def test_list_images_param_name(self):
311 # Test to get images by name
312 params = {'name': self.test_data['name']}
313 self._list_by_param_value_and_assert(params)
314
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800315 @decorators.idempotent_id('aa8ac4df-cff9-418b-8d0f-dd9c67b072c9')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700316 def test_list_images_param_tag(self):
317 # Test to get images matching a tag
318 params = {'tag': self.test_data['tags'][0]}
319 images_list = self.client.list_images(params=params)['images']
320 # Validating properties of fetched images
321 self.assertNotEmpty(images_list)
322 for image in images_list:
323 msg = ("The image {image_name} does not have the expected tag "
324 "{expected_tag} among its tags: {observerd_tags}."
325 .format(image_name=image['name'],
326 expected_tag=self.test_data['tags'][0],
327 observerd_tags=image['tags']))
328 self.assertIn(self.test_data['tags'][0], image['tags'], msg)
329
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800330 @decorators.idempotent_id('eeadce49-04e0-43b7-aec7-52535d903e7a')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700331 def test_list_images_param_sort(self):
332 params = {'sort': 'size:desc'}
333 self._list_sorted_by_image_size_and_assert(params, desc=True)
334
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800335 @decorators.idempotent_id('9faaa0c2-c3a5-43e1-8f61-61c54b409a49')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700336 def test_list_images_param_sort_key_dir(self):
337 params = {'sort_key': 'size', 'sort_dir': 'desc'}
338 self._list_sorted_by_image_size_and_assert(params, desc=True)
339
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800340 @decorators.idempotent_id('622b925c-479f-4736-860d-adeaf13bc371')
raiesmh08a1ce3542014-03-04 11:58:29 +0530341 def test_get_image_schema(self):
342 # Test to get image schema
343 schema = "image"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900344 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530345 self.assertEqual("image", body['name'])
346
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800347 @decorators.idempotent_id('25c8d7b2-df21-460f-87ac-93130bcdc684')
raiesmh08a1ce3542014-03-04 11:58:29 +0530348 def test_get_images_schema(self):
349 # Test to get images schema
350 schema = "images"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900351 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530352 self.assertEqual("images", body['name'])
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700353
354
zhufl6e042bc2017-01-25 10:33:40 +0800355class ListSharedImagesTest(base.BaseV2ImageTest):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700356 """Here we test the listing of a shared image information"""
357
358 credentials = ['primary', 'alt']
359
360 @classmethod
361 def setup_clients(cls):
362 super(ListSharedImagesTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200363 cls.image_member_client = cls.os_primary.image_member_client_v2
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700364 cls.alt_img_client = cls.os_alt.image_client_v2
365
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800366 @decorators.idempotent_id('3fa50be4-8e38-4c02-a8db-7811bb780122')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700367 def test_list_images_param_member_status(self):
Steve Lewis8ac5b972016-12-22 07:41:29 -0800368 # Create an image to be shared using default visibility
369 image_file = six.BytesIO(data_utils.random_bytes(2048))
370 container_format = CONF.image.container_formats[0]
371 disk_format = CONF.image.disk_formats[0]
372 image = self.create_image(container_format=container_format,
373 disk_format=disk_format)
374 self.client.store_image_file(image['id'], data=image_file)
375
376 # Share the image created with the alt user
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700377 self.image_member_client.create_image_member(
Steve Lewis8ac5b972016-12-22 07:41:29 -0800378 image_id=image['id'], member=self.alt_img_client.tenant_id)
379
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700380 # As an image consumer you need to provide the member_status parameter
381 # along with the visibility=shared parameter in order for it to show
382 # results
383 params = {'member_status': 'pending', 'visibility': 'shared'}
384 fetched_images = self.alt_img_client.list_images(params)['images']
385 self.assertEqual(1, len(fetched_images))
Steve Lewis8ac5b972016-12-22 07:41:29 -0800386 self.assertEqual(image['id'], fetched_images[0]['id'])