blob: 5a27a4358bdaaac10cfe25fe6508a904563eddb0 [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
wangxiyuan99e4dcf2019-09-17 09:51:55 +080060 # NOTE: This Glance API returns different status codes for image
61 # condition. In this empty data case, Glance should return 204,
62 # so here should check the status code.
63 image_file = self.client.show_image_file(image['id'])
64 self.assertEqual(0, len(image_file.data))
65 self.assertEqual(204, image_file.response.status)
66
Matthew Treinisha62347f2013-03-01 16:37:30 -050067 # Now try uploading an image file
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -070068 file_content = data_utils.random_bytes()
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053069 image_file = six.BytesIO(file_content)
lkuchlanb3348792016-09-29 10:42:21 +030070 self.client.store_image_file(image['id'], image_file)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053071
72 # Now try to get image details
lkuchlanb3348792016-09-29 10:42:21 +030073 body = self.client.show_image(image['id'])
74 self.assertEqual(image['id'], body['id'])
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053075 self.assertEqual(image_name, body['name'])
Sean Daguec6ec4762014-05-29 08:54:21 -040076 self.assertEqual(uuid, body['ramdisk_id'])
Attila Fazekase191cb12013-07-29 06:41:52 +020077 self.assertIn('size', body)
Matthew Treinisha62347f2013-03-01 16:37:30 -050078 self.assertEqual(1024, body.get('size'))
79
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053080 # Now try get image file
Ken'ichi Ohmichi3b79f172018-03-20 11:31:44 -070081 # NOTE: This Glance API returns different status codes for image
82 # condition. In this non-empty data case, Glance should return 200,
83 # so here should check the status code.
lkuchlanb3348792016-09-29 10:42:21 +030084 body = self.client.show_image_file(image['id'])
David Kranzd7e97b42015-02-16 09:37:31 -050085 self.assertEqual(file_content, body.data)
Ken'ichi Ohmichi3b79f172018-03-20 11:31:44 -070086 self.assertEqual(200, body.response.status)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053087
Jordan Pittier3b46d272017-04-12 16:17:28 +020088 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080089 @decorators.idempotent_id('f848bb94-1c6e-45a4-8726-39e3a5b23535')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053090 def test_delete_image(self):
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +040091 # Deletes an image by image_id
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053092
93 # Create image
94 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090095 container_format = CONF.image.container_formats[0]
96 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +020097 image = self.create_image(name=image_name,
98 container_format=container_format,
99 disk_format=disk_format,
100 visibility='private')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +0530101 # Delete Image
lkuchlanb3348792016-09-29 10:42:21 +0300102 self.client.delete_image(image['id'])
103 self.client.wait_for_resource_deletion(image['id'])
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +0530104
105 # Verifying deletion
John Warrenf3b3e952015-08-17 19:28:12 +0000106 images = self.client.list_images()['images']
Sunil G29856a32014-07-17 23:17:58 +0530107 images_id = [item['id'] for item in images]
lkuchlanb3348792016-09-29 10:42:21 +0300108 self.assertNotIn(image['id'], images_id)
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +0530109
Jordan Pittier3b46d272017-04-12 16:17:28 +0200110 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800111 @decorators.idempotent_id('f66891a7-a35c-41a8-b590-a065c2a1caa6')
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400112 def test_update_image(self):
113 # Updates an image by image_id
114
115 # Create image
116 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +0900117 container_format = CONF.image.container_formats[0]
118 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +0200119 image = self.create_image(name=image_name,
120 container_format=container_format,
121 disk_format=disk_format,
122 visibility='private')
lkuchlanb3348792016-09-29 10:42:21 +0300123 self.assertEqual('queued', image['status'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400124
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400125 # Update Image
126 new_image_name = data_utils.rand_name('new-image')
zhufl311104e2017-08-17 15:13:18 +0800127 self.client.update_image(image['id'], [
Aaron Rosenc7720622014-05-20 10:38:10 -0700128 dict(replace='/name', value=new_image_name)])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400129
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400130 # Verifying updating
131
lkuchlanb3348792016-09-29 10:42:21 +0300132 body = self.client.show_image(image['id'])
133 self.assertEqual(image['id'], body['id'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400134 self.assertEqual(new_image_name, body['name'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400135
lkuchlan32b53c32017-04-20 16:51:08 +0300136 @decorators.idempotent_id('951ebe01-969f-4ea9-9898-8a3f1f442ab0')
137 def test_deactivate_reactivate_image(self):
138 # Create image
139 image_name = data_utils.rand_name('image')
140 image = self.create_image(name=image_name,
141 container_format='bare',
142 disk_format='raw',
143 visibility='private')
144
145 # Upload an image file
146 content = data_utils.random_bytes()
147 image_file = six.BytesIO(content)
148 self.client.store_image_file(image['id'], image_file)
149
150 # Deactivate image
151 self.client.deactivate_image(image['id'])
152 body = self.client.show_image(image['id'])
153 self.assertEqual("deactivated", body['status'])
154
155 # User unable to download deactivated image
156 self.assertRaises(lib_exc.Forbidden, self.client.show_image_file,
157 image['id'])
158
159 # Reactivate image
160 self.client.reactivate_image(image['id'])
161 body = self.client.show_image(image['id'])
162 self.assertEqual("active", body['status'])
163
164 # User able to download image after reactivation
165 body = self.client.show_image_file(image['id'])
166 self.assertEqual(content, body.data)
167
Matthew Treinisha62347f2013-03-01 16:37:30 -0500168
zhufl6e042bc2017-01-25 10:33:40 +0800169class ListUserImagesTest(base.BaseV2ImageTest):
170 """Here we test the listing of image information"""
Matthew Treinisha62347f2013-03-01 16:37:30 -0500171
172 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100173 def resource_setup(cls):
zhufl6e042bc2017-01-25 10:33:40 +0800174 super(ListUserImagesTest, cls).resource_setup()
Matthew Treinisha62347f2013-03-01 16:37:30 -0500175 # We add a few images here to test the listing functionality of
176 # the images API
Takashi NATSUME12a48512015-08-10 18:33:16 +0900177 container_fmts = CONF.image.container_formats
178 disk_fmts = CONF.image.disk_formats
179 all_pairs = [(container_fmt, disk_fmt)
180 for container_fmt in container_fmts
181 for disk_fmt in disk_fmts]
182
183 for (container_fmt, disk_fmt) in all_pairs[:6]:
Sergey Vilgelm36fdd202018-11-20 16:10:47 -0600184 LOG.debug("Creating an image "
Takashi NATSUME12a48512015-08-10 18:33:16 +0900185 "(Container format: %s, Disk format: %s).",
186 container_fmt, disk_fmt)
187 cls._create_standard_image(container_fmt, disk_fmt)
Matthew Treinisha62347f2013-03-01 16:37:30 -0500188
189 @classmethod
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700190 def _create_standard_image(cls, container_format, disk_format):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000191 """Create a new standard image and return the newly-registered image-id
192
193 Note that the size of the new image is a random number between
Matthew Treinisha62347f2013-03-01 16:37:30 -0500194 1024 and 4096
195 """
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -0700196 size = random.randint(1024, 4096)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530197 image_file = six.BytesIO(data_utils.random_bytes(size))
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700198 tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
zhufl08e42762016-10-18 16:07:56 +0800199 image = cls.create_image(container_format=container_format,
lkuchlanb3348792016-09-29 10:42:21 +0300200 disk_format=disk_format,
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700201 visibility='private',
202 tags=tags)
lkuchlanb3348792016-09-29 10:42:21 +0300203 cls.client.store_image_file(image['id'], data=image_file)
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700204 # Keep the data of one test image so it can be used to filter lists
205 cls.test_data = image
Matthew Treinisha62347f2013-03-01 16:37:30 -0500206
lkuchlanb3348792016-09-29 10:42:21 +0300207 return image['id']
Matthew Treinisha62347f2013-03-01 16:37:30 -0500208
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700209 def _list_by_param_value_and_assert(self, params):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000210 """Perform list action with given params and validates result."""
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700211 # Retrieve the list of images that meet the filter
John Warrenf3b3e952015-08-17 19:28:12 +0000212 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700213 # Validating params of fetched images
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700214 msg = 'No images were found that met the filter criteria.'
215 self.assertNotEmpty(images_list, msg)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700216 for image in images_list:
217 for key in params:
218 msg = "Failed to list images by %s" % key
219 self.assertEqual(params[key], image[key], msg)
220
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700221 def _list_sorted_by_image_size_and_assert(self, params, desc=False):
222 """Validate an image list that has been sorted by size
223
224 Perform list action with given params and validates the results are
225 sorted by image size in either ascending or descending order.
226 """
227 # Retrieve the list of images that meet the filter
228 images_list = self.client.list_images(params=params)['images']
229 # Validate that the list was fetched sorted accordingly
230 msg = 'No images were found that met the filter criteria.'
231 self.assertNotEmpty(images_list, msg)
232 sorted_list = [image['size'] for image in images_list]
233 msg = 'The list of images was not sorted correctly.'
234 self.assertEqual(sorted(sorted_list, reverse=desc), sorted_list, msg)
235
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800236 @decorators.idempotent_id('1e341d7a-90a9-494c-b143-2cdf2aeb6aee')
Flavio Percoco7e26be12015-09-15 22:33:19 +0200237 def test_list_no_params(self):
Matthew Treinisha62347f2013-03-01 16:37:30 -0500238 # Simple test to see all fixture images returned
John Warrenf3b3e952015-08-17 19:28:12 +0000239 images_list = self.client.list_images()['images']
Sirushti Murugesan935f2cc2016-07-12 19:48:24 +0530240 image_list = [image['id'] for image in images_list]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700241
Matthew Treinisha62347f2013-03-01 16:37:30 -0500242 for image in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200243 self.assertIn(image, image_list)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700244
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800245 @decorators.idempotent_id('9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700246 def test_list_images_param_container_format(self):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700247 # Test to get all images with a specific container_format
248 params = {"container_format": self.test_data['container_format']}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700249 self._list_by_param_value_and_assert(params)
250
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800251 @decorators.idempotent_id('4a4735a7-f22f-49b6-b0d9-66e1ef7453eb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700252 def test_list_images_param_disk_format(self):
253 # Test to get all images with disk_format = raw
254 params = {"disk_format": "raw"}
255 self._list_by_param_value_and_assert(params)
256
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800257 @decorators.idempotent_id('7a95bb92-d99e-4b12-9718-7bc6ab73e6d2')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700258 def test_list_images_param_visibility(self):
Aaron Rosenc7720622014-05-20 10:38:10 -0700259 # Test to get all images with visibility = private
260 params = {"visibility": "private"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700261 self._list_by_param_value_and_assert(params)
262
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800263 @decorators.idempotent_id('cf1b9a48-8340-480e-af7b-fe7e17690876')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700264 def test_list_images_param_size(self):
265 # Test to get all images by size
Takashi NATSUME12a48512015-08-10 18:33:16 +0900266 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700267 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000268 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700269
270 params = {"size": image['size']}
271 self._list_by_param_value_and_assert(params)
272
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800273 @decorators.idempotent_id('4ad8c157-971a-4ba8-aa84-ed61154b1e7f')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700274 def test_list_images_param_min_max_size(self):
275 # Test to get all images with size between 2000 to 3000
Takashi NATSUME12a48512015-08-10 18:33:16 +0900276 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700277 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000278 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700279
280 size = image['size']
281 params = {"size_min": size - 500, "size_max": size + 500}
John Warrenf3b3e952015-08-17 19:28:12 +0000282 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700283 image_size_list = map(lambda x: x['size'], images_list)
284
285 for image_size in image_size_list:
Béla Vancsics64862f72016-11-08 09:12:31 +0100286 self.assertGreaterEqual(image_size, params['size_min'],
287 "Failed to get images by size_min")
288 self.assertLessEqual(image_size, params['size_max'],
289 "Failed to get images by size_max")
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700290
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800291 @decorators.idempotent_id('7fc9e369-0f58-4d05-9aa5-0969e2d59d15')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700292 def test_list_images_param_status(self):
Anju Tiwarica2249d2014-01-23 17:33:02 +0530293 # Test to get all active images
294 params = {"status": "active"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700295 self._list_by_param_value_and_assert(params)
296
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800297 @decorators.idempotent_id('e914a891-3cc8-4b40-ad32-e0a39ffbddbb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700298 def test_list_images_param_limit(self):
299 # Test to get images by limit
Takashi NATSUME12a48512015-08-10 18:33:16 +0900300 params = {"limit": 1}
John Warrenf3b3e952015-08-17 19:28:12 +0000301 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700302
303 self.assertEqual(len(images_list), params['limit'],
304 "Failed to get images by limit")
raiesmh08a1ce3542014-03-04 11:58:29 +0530305
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800306 @decorators.idempotent_id('e9a44b91-31c8-4b40-a332-e0a39ffb4dbb')
Li Wei14bf2412016-09-25 15:56:23 +0800307 def test_list_image_param_owner(self):
308 # Test to get images by owner
309 image_id = self.created_images[0]
310 # Get image metadata
311 image = self.client.show_image(image_id)
312
313 params = {"owner": image['owner']}
314 self._list_by_param_value_and_assert(params)
315
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800316 @decorators.idempotent_id('55c8f5f5-bfed-409d-a6d5-4caeda985d7b')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700317 def test_list_images_param_name(self):
318 # Test to get images by name
319 params = {'name': self.test_data['name']}
320 self._list_by_param_value_and_assert(params)
321
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800322 @decorators.idempotent_id('aa8ac4df-cff9-418b-8d0f-dd9c67b072c9')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700323 def test_list_images_param_tag(self):
324 # Test to get images matching a tag
325 params = {'tag': self.test_data['tags'][0]}
326 images_list = self.client.list_images(params=params)['images']
327 # Validating properties of fetched images
328 self.assertNotEmpty(images_list)
329 for image in images_list:
330 msg = ("The image {image_name} does not have the expected tag "
331 "{expected_tag} among its tags: {observerd_tags}."
332 .format(image_name=image['name'],
333 expected_tag=self.test_data['tags'][0],
334 observerd_tags=image['tags']))
335 self.assertIn(self.test_data['tags'][0], image['tags'], msg)
336
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800337 @decorators.idempotent_id('eeadce49-04e0-43b7-aec7-52535d903e7a')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700338 def test_list_images_param_sort(self):
339 params = {'sort': 'size:desc'}
340 self._list_sorted_by_image_size_and_assert(params, desc=True)
341
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800342 @decorators.idempotent_id('9faaa0c2-c3a5-43e1-8f61-61c54b409a49')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700343 def test_list_images_param_sort_key_dir(self):
344 params = {'sort_key': 'size', 'sort_dir': 'desc'}
345 self._list_sorted_by_image_size_and_assert(params, desc=True)
346
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800347 @decorators.idempotent_id('622b925c-479f-4736-860d-adeaf13bc371')
raiesmh08a1ce3542014-03-04 11:58:29 +0530348 def test_get_image_schema(self):
349 # Test to get image schema
350 schema = "image"
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("image", body['name'])
353
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800354 @decorators.idempotent_id('25c8d7b2-df21-460f-87ac-93130bcdc684')
raiesmh08a1ce3542014-03-04 11:58:29 +0530355 def test_get_images_schema(self):
356 # Test to get images schema
357 schema = "images"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900358 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530359 self.assertEqual("images", body['name'])
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700360
361
zhufl6e042bc2017-01-25 10:33:40 +0800362class ListSharedImagesTest(base.BaseV2ImageTest):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700363 """Here we test the listing of a shared image information"""
364
365 credentials = ['primary', 'alt']
366
367 @classmethod
368 def setup_clients(cls):
369 super(ListSharedImagesTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200370 cls.image_member_client = cls.os_primary.image_member_client_v2
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700371 cls.alt_img_client = cls.os_alt.image_client_v2
372
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800373 @decorators.idempotent_id('3fa50be4-8e38-4c02-a8db-7811bb780122')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700374 def test_list_images_param_member_status(self):
Steve Lewis8ac5b972016-12-22 07:41:29 -0800375 # Create an image to be shared using default visibility
376 image_file = six.BytesIO(data_utils.random_bytes(2048))
377 container_format = CONF.image.container_formats[0]
378 disk_format = CONF.image.disk_formats[0]
379 image = self.create_image(container_format=container_format,
380 disk_format=disk_format)
381 self.client.store_image_file(image['id'], data=image_file)
382
383 # Share the image created with the alt user
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700384 self.image_member_client.create_image_member(
Steve Lewis8ac5b972016-12-22 07:41:29 -0800385 image_id=image['id'], member=self.alt_img_client.tenant_id)
386
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700387 # As an image consumer you need to provide the member_status parameter
388 # along with the visibility=shared parameter in order for it to show
389 # results
390 params = {'member_status': 'pending', 'visibility': 'shared'}
391 fetched_images = self.alt_img_client.list_images(params)['images']
392 self.assertEqual(1, len(fetched_images))
Steve Lewis8ac5b972016-12-22 07:41:29 -0800393 self.assertEqual(image['id'], fetched_images[0]['id'])