blob: aa57dafdd4e3e9ce0efae4710a2354b092576c1d [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
Ken'ichi Ohmichi3b79f172018-03-20 11:31:44 -070074 # NOTE: This Glance API returns different status codes for image
75 # condition. In this non-empty data case, Glance should return 200,
76 # so here should check the status code.
lkuchlanb3348792016-09-29 10:42:21 +030077 body = self.client.show_image_file(image['id'])
David Kranzd7e97b42015-02-16 09:37:31 -050078 self.assertEqual(file_content, body.data)
Ken'ichi Ohmichi3b79f172018-03-20 11:31:44 -070079 self.assertEqual(200, body.response.status)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053080
Jordan Pittier3b46d272017-04-12 16:17:28 +020081 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080082 @decorators.idempotent_id('f848bb94-1c6e-45a4-8726-39e3a5b23535')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053083 def test_delete_image(self):
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +040084 # Deletes an image by image_id
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053085
86 # Create image
87 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090088 container_format = CONF.image.container_formats[0]
89 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +020090 image = self.create_image(name=image_name,
91 container_format=container_format,
92 disk_format=disk_format,
93 visibility='private')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053094 # Delete Image
lkuchlanb3348792016-09-29 10:42:21 +030095 self.client.delete_image(image['id'])
96 self.client.wait_for_resource_deletion(image['id'])
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053097
98 # Verifying deletion
John Warrenf3b3e952015-08-17 19:28:12 +000099 images = self.client.list_images()['images']
Sunil G29856a32014-07-17 23:17:58 +0530100 images_id = [item['id'] for item in images]
lkuchlanb3348792016-09-29 10:42:21 +0300101 self.assertNotIn(image['id'], images_id)
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +0530102
Jordan Pittier3b46d272017-04-12 16:17:28 +0200103 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800104 @decorators.idempotent_id('f66891a7-a35c-41a8-b590-a065c2a1caa6')
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400105 def test_update_image(self):
106 # Updates an image by image_id
107
108 # Create image
109 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +0900110 container_format = CONF.image.container_formats[0]
111 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +0200112 image = self.create_image(name=image_name,
113 container_format=container_format,
114 disk_format=disk_format,
115 visibility='private')
lkuchlanb3348792016-09-29 10:42:21 +0300116 self.assertEqual('queued', image['status'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400117
Ken'ichi Ohmichi3b79f172018-03-20 11:31:44 -0700118 # NOTE: This Glance API returns different status codes for image
119 # condition. In this empty data case, Glance should return 204,
120 # so here should check the status code.
121 image_file = self.client.show_image_file(image['id'])
122 self.assertEqual(0, len(image_file.data))
123 self.assertEqual(204, image_file.response.status)
124
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400125 # Now try uploading an image file
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530126 image_file = six.BytesIO(data_utils.random_bytes())
lkuchlanb3348792016-09-29 10:42:21 +0300127 self.client.store_image_file(image['id'], image_file)
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400128
129 # Update Image
130 new_image_name = data_utils.rand_name('new-image')
zhufl311104e2017-08-17 15:13:18 +0800131 self.client.update_image(image['id'], [
Aaron Rosenc7720622014-05-20 10:38:10 -0700132 dict(replace='/name', value=new_image_name)])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400133
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400134 # Verifying updating
135
lkuchlanb3348792016-09-29 10:42:21 +0300136 body = self.client.show_image(image['id'])
137 self.assertEqual(image['id'], body['id'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400138 self.assertEqual(new_image_name, body['name'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400139
lkuchlan32b53c32017-04-20 16:51:08 +0300140 @decorators.idempotent_id('951ebe01-969f-4ea9-9898-8a3f1f442ab0')
141 def test_deactivate_reactivate_image(self):
142 # Create image
143 image_name = data_utils.rand_name('image')
144 image = self.create_image(name=image_name,
145 container_format='bare',
146 disk_format='raw',
147 visibility='private')
148
149 # Upload an image file
150 content = data_utils.random_bytes()
151 image_file = six.BytesIO(content)
152 self.client.store_image_file(image['id'], image_file)
153
154 # Deactivate image
155 self.client.deactivate_image(image['id'])
156 body = self.client.show_image(image['id'])
157 self.assertEqual("deactivated", body['status'])
158
159 # User unable to download deactivated image
160 self.assertRaises(lib_exc.Forbidden, self.client.show_image_file,
161 image['id'])
162
163 # Reactivate image
164 self.client.reactivate_image(image['id'])
165 body = self.client.show_image(image['id'])
166 self.assertEqual("active", body['status'])
167
168 # User able to download image after reactivation
169 body = self.client.show_image_file(image['id'])
170 self.assertEqual(content, body.data)
171
Matthew Treinisha62347f2013-03-01 16:37:30 -0500172
zhufl6e042bc2017-01-25 10:33:40 +0800173class ListUserImagesTest(base.BaseV2ImageTest):
174 """Here we test the listing of image information"""
Matthew Treinisha62347f2013-03-01 16:37:30 -0500175
176 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100177 def resource_setup(cls):
zhufl6e042bc2017-01-25 10:33:40 +0800178 super(ListUserImagesTest, cls).resource_setup()
Matthew Treinisha62347f2013-03-01 16:37:30 -0500179 # We add a few images here to test the listing functionality of
180 # the images API
Takashi NATSUME12a48512015-08-10 18:33:16 +0900181 container_fmts = CONF.image.container_formats
182 disk_fmts = CONF.image.disk_formats
183 all_pairs = [(container_fmt, disk_fmt)
184 for container_fmt in container_fmts
185 for disk_fmt in disk_fmts]
186
187 for (container_fmt, disk_fmt) in all_pairs[:6]:
hgangwxf186edc2015-12-28 21:12:59 +0800188 LOG.debug("Creating an image"
Takashi NATSUME12a48512015-08-10 18:33:16 +0900189 "(Container format: %s, Disk format: %s).",
190 container_fmt, disk_fmt)
191 cls._create_standard_image(container_fmt, disk_fmt)
Matthew Treinisha62347f2013-03-01 16:37:30 -0500192
193 @classmethod
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700194 def _create_standard_image(cls, container_format, disk_format):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000195 """Create a new standard image and return the newly-registered image-id
196
197 Note that the size of the new image is a random number between
Matthew Treinisha62347f2013-03-01 16:37:30 -0500198 1024 and 4096
199 """
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -0700200 size = random.randint(1024, 4096)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530201 image_file = six.BytesIO(data_utils.random_bytes(size))
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700202 tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
zhufl08e42762016-10-18 16:07:56 +0800203 image = cls.create_image(container_format=container_format,
lkuchlanb3348792016-09-29 10:42:21 +0300204 disk_format=disk_format,
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700205 visibility='private',
206 tags=tags)
lkuchlanb3348792016-09-29 10:42:21 +0300207 cls.client.store_image_file(image['id'], data=image_file)
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700208 # Keep the data of one test image so it can be used to filter lists
209 cls.test_data = image
Matthew Treinisha62347f2013-03-01 16:37:30 -0500210
lkuchlanb3348792016-09-29 10:42:21 +0300211 return image['id']
Matthew Treinisha62347f2013-03-01 16:37:30 -0500212
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700213 def _list_by_param_value_and_assert(self, params):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000214 """Perform list action with given params and validates result."""
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700215 # Retrieve the list of images that meet the filter
John Warrenf3b3e952015-08-17 19:28:12 +0000216 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700217 # Validating params of fetched images
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700218 msg = 'No images were found that met the filter criteria.'
219 self.assertNotEmpty(images_list, msg)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700220 for image in images_list:
221 for key in params:
222 msg = "Failed to list images by %s" % key
223 self.assertEqual(params[key], image[key], msg)
224
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700225 def _list_sorted_by_image_size_and_assert(self, params, desc=False):
226 """Validate an image list that has been sorted by size
227
228 Perform list action with given params and validates the results are
229 sorted by image size in either ascending or descending order.
230 """
231 # Retrieve the list of images that meet the filter
232 images_list = self.client.list_images(params=params)['images']
233 # Validate that the list was fetched sorted accordingly
234 msg = 'No images were found that met the filter criteria.'
235 self.assertNotEmpty(images_list, msg)
236 sorted_list = [image['size'] for image in images_list]
237 msg = 'The list of images was not sorted correctly.'
238 self.assertEqual(sorted(sorted_list, reverse=desc), sorted_list, msg)
239
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800240 @decorators.idempotent_id('1e341d7a-90a9-494c-b143-2cdf2aeb6aee')
Flavio Percoco7e26be12015-09-15 22:33:19 +0200241 def test_list_no_params(self):
Matthew Treinisha62347f2013-03-01 16:37:30 -0500242 # Simple test to see all fixture images returned
John Warrenf3b3e952015-08-17 19:28:12 +0000243 images_list = self.client.list_images()['images']
Sirushti Murugesan935f2cc2016-07-12 19:48:24 +0530244 image_list = [image['id'] for image in images_list]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700245
Matthew Treinisha62347f2013-03-01 16:37:30 -0500246 for image in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200247 self.assertIn(image, image_list)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700248
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800249 @decorators.idempotent_id('9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700250 def test_list_images_param_container_format(self):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700251 # Test to get all images with a specific container_format
252 params = {"container_format": self.test_data['container_format']}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700253 self._list_by_param_value_and_assert(params)
254
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800255 @decorators.idempotent_id('4a4735a7-f22f-49b6-b0d9-66e1ef7453eb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700256 def test_list_images_param_disk_format(self):
257 # Test to get all images with disk_format = raw
258 params = {"disk_format": "raw"}
259 self._list_by_param_value_and_assert(params)
260
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800261 @decorators.idempotent_id('7a95bb92-d99e-4b12-9718-7bc6ab73e6d2')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700262 def test_list_images_param_visibility(self):
Aaron Rosenc7720622014-05-20 10:38:10 -0700263 # Test to get all images with visibility = private
264 params = {"visibility": "private"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700265 self._list_by_param_value_and_assert(params)
266
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800267 @decorators.idempotent_id('cf1b9a48-8340-480e-af7b-fe7e17690876')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700268 def test_list_images_param_size(self):
269 # Test to get all images by size
Takashi NATSUME12a48512015-08-10 18:33:16 +0900270 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700271 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000272 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700273
274 params = {"size": image['size']}
275 self._list_by_param_value_and_assert(params)
276
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800277 @decorators.idempotent_id('4ad8c157-971a-4ba8-aa84-ed61154b1e7f')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700278 def test_list_images_param_min_max_size(self):
279 # Test to get all images with size between 2000 to 3000
Takashi NATSUME12a48512015-08-10 18:33:16 +0900280 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700281 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000282 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700283
284 size = image['size']
285 params = {"size_min": size - 500, "size_max": size + 500}
John Warrenf3b3e952015-08-17 19:28:12 +0000286 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700287 image_size_list = map(lambda x: x['size'], images_list)
288
289 for image_size in image_size_list:
Béla Vancsics64862f72016-11-08 09:12:31 +0100290 self.assertGreaterEqual(image_size, params['size_min'],
291 "Failed to get images by size_min")
292 self.assertLessEqual(image_size, params['size_max'],
293 "Failed to get images by size_max")
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700294
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800295 @decorators.idempotent_id('7fc9e369-0f58-4d05-9aa5-0969e2d59d15')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700296 def test_list_images_param_status(self):
Anju Tiwarica2249d2014-01-23 17:33:02 +0530297 # Test to get all active images
298 params = {"status": "active"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700299 self._list_by_param_value_and_assert(params)
300
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800301 @decorators.idempotent_id('e914a891-3cc8-4b40-ad32-e0a39ffbddbb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700302 def test_list_images_param_limit(self):
303 # Test to get images by limit
Takashi NATSUME12a48512015-08-10 18:33:16 +0900304 params = {"limit": 1}
John Warrenf3b3e952015-08-17 19:28:12 +0000305 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700306
307 self.assertEqual(len(images_list), params['limit'],
308 "Failed to get images by limit")
raiesmh08a1ce3542014-03-04 11:58:29 +0530309
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800310 @decorators.idempotent_id('e9a44b91-31c8-4b40-a332-e0a39ffb4dbb')
Li Wei14bf2412016-09-25 15:56:23 +0800311 def test_list_image_param_owner(self):
312 # Test to get images by owner
313 image_id = self.created_images[0]
314 # Get image metadata
315 image = self.client.show_image(image_id)
316
317 params = {"owner": image['owner']}
318 self._list_by_param_value_and_assert(params)
319
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800320 @decorators.idempotent_id('55c8f5f5-bfed-409d-a6d5-4caeda985d7b')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700321 def test_list_images_param_name(self):
322 # Test to get images by name
323 params = {'name': self.test_data['name']}
324 self._list_by_param_value_and_assert(params)
325
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800326 @decorators.idempotent_id('aa8ac4df-cff9-418b-8d0f-dd9c67b072c9')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700327 def test_list_images_param_tag(self):
328 # Test to get images matching a tag
329 params = {'tag': self.test_data['tags'][0]}
330 images_list = self.client.list_images(params=params)['images']
331 # Validating properties of fetched images
332 self.assertNotEmpty(images_list)
333 for image in images_list:
334 msg = ("The image {image_name} does not have the expected tag "
335 "{expected_tag} among its tags: {observerd_tags}."
336 .format(image_name=image['name'],
337 expected_tag=self.test_data['tags'][0],
338 observerd_tags=image['tags']))
339 self.assertIn(self.test_data['tags'][0], image['tags'], msg)
340
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800341 @decorators.idempotent_id('eeadce49-04e0-43b7-aec7-52535d903e7a')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700342 def test_list_images_param_sort(self):
343 params = {'sort': 'size:desc'}
344 self._list_sorted_by_image_size_and_assert(params, desc=True)
345
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800346 @decorators.idempotent_id('9faaa0c2-c3a5-43e1-8f61-61c54b409a49')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700347 def test_list_images_param_sort_key_dir(self):
348 params = {'sort_key': 'size', 'sort_dir': 'desc'}
349 self._list_sorted_by_image_size_and_assert(params, desc=True)
350
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800351 @decorators.idempotent_id('622b925c-479f-4736-860d-adeaf13bc371')
raiesmh08a1ce3542014-03-04 11:58:29 +0530352 def test_get_image_schema(self):
353 # Test to get image schema
354 schema = "image"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900355 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530356 self.assertEqual("image", body['name'])
357
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800358 @decorators.idempotent_id('25c8d7b2-df21-460f-87ac-93130bcdc684')
raiesmh08a1ce3542014-03-04 11:58:29 +0530359 def test_get_images_schema(self):
360 # Test to get images schema
361 schema = "images"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900362 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530363 self.assertEqual("images", body['name'])
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700364
365
zhufl6e042bc2017-01-25 10:33:40 +0800366class ListSharedImagesTest(base.BaseV2ImageTest):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700367 """Here we test the listing of a shared image information"""
368
369 credentials = ['primary', 'alt']
370
371 @classmethod
372 def setup_clients(cls):
373 super(ListSharedImagesTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200374 cls.image_member_client = cls.os_primary.image_member_client_v2
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700375 cls.alt_img_client = cls.os_alt.image_client_v2
376
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800377 @decorators.idempotent_id('3fa50be4-8e38-4c02-a8db-7811bb780122')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700378 def test_list_images_param_member_status(self):
Steve Lewis8ac5b972016-12-22 07:41:29 -0800379 # Create an image to be shared using default visibility
380 image_file = six.BytesIO(data_utils.random_bytes(2048))
381 container_format = CONF.image.container_formats[0]
382 disk_format = CONF.image.disk_formats[0]
383 image = self.create_image(container_format=container_format,
384 disk_format=disk_format)
385 self.client.store_image_file(image['id'], data=image_file)
386
387 # Share the image created with the alt user
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700388 self.image_member_client.create_image_member(
Steve Lewis8ac5b972016-12-22 07:41:29 -0800389 image_id=image['id'], member=self.alt_img_client.tenant_id)
390
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700391 # As an image consumer you need to provide the member_status parameter
392 # along with the visibility=shared parameter in order for it to show
393 # results
394 params = {'member_status': 'pending', 'visibility': 'shared'}
395 fetched_images = self.alt_img_client.list_images(params)['images']
396 self.assertEqual(1, len(fetched_images))
Steve Lewis8ac5b972016-12-22 07:41:29 -0800397 self.assertEqual(image['id'], fetched_images[0]['id'])