blob: c846f886aec4aa471b4dd624e00bd812110e3739 [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
lkuchlan32b53c32017-04-20 16:51:08 +030021import testtools
22
Takashi NATSUME12a48512015-08-10 18:33:16 +090023from oslo_log import log as logging
Sean Dague1937d092013-05-17 16:36:38 -040024from tempest.api.image import base
Takashi NATSUME12a48512015-08-10 18:33:16 +090025from tempest import config
Ken'ichi Ohmichicc01c3e2017-03-10 10:48:14 -080026from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080027from tempest.lib import decorators
lkuchlan32b53c32017-04-20 16:51:08 +030028from tempest.lib import exceptions as lib_exc
Matthew Treinisha62347f2013-03-01 16:37:30 -050029
Takashi NATSUME12a48512015-08-10 18:33:16 +090030CONF = config.CONF
31LOG = logging.getLogger(__name__)
32
Matthew Treinisha62347f2013-03-01 16:37:30 -050033
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053034class BasicOperationsImagesTest(base.BaseV2ImageTest):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000035 """Here we test the basic operations of images"""
Matthew Treinisha62347f2013-03-01 16:37:30 -050036
Jordan Pittier3b46d272017-04-12 16:17:28 +020037 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080038 @decorators.idempotent_id('139b765e-7f3d-4b3d-8b37-3ca3876ee318')
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053039 def test_register_upload_get_image_file(self):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000040 """Here we test these functionalities
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053041
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000042 Register image, upload the image file, get image and get image
43 file api's
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053044 """
45
Sean Daguec6ec4762014-05-29 08:54:21 -040046 uuid = '00000000-1111-2222-3333-444455556666'
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053047 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090048 container_format = CONF.image.container_formats[0]
49 disk_format = CONF.image.disk_formats[0]
lkuchlanb3348792016-09-29 10:42:21 +030050 image = self.create_image(name=image_name,
51 container_format=container_format,
52 disk_format=disk_format,
53 visibility='private',
54 ramdisk_id=uuid)
lkuchlanb3348792016-09-29 10:42:21 +030055 self.assertIn('name', image)
56 self.assertEqual(image_name, image['name'])
57 self.assertIn('visibility', image)
58 self.assertEqual('private', image['visibility'])
59 self.assertIn('status', image)
60 self.assertEqual('queued', image['status'])
Matthew Treinisha62347f2013-03-01 16:37:30 -050061
62 # Now try uploading an image file
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -070063 file_content = data_utils.random_bytes()
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053064 image_file = six.BytesIO(file_content)
lkuchlanb3348792016-09-29 10:42:21 +030065 self.client.store_image_file(image['id'], image_file)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053066
67 # Now try to get image details
lkuchlanb3348792016-09-29 10:42:21 +030068 body = self.client.show_image(image['id'])
69 self.assertEqual(image['id'], body['id'])
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053070 self.assertEqual(image_name, body['name'])
Sean Daguec6ec4762014-05-29 08:54:21 -040071 self.assertEqual(uuid, body['ramdisk_id'])
Attila Fazekase191cb12013-07-29 06:41:52 +020072 self.assertIn('size', body)
Matthew Treinisha62347f2013-03-01 16:37:30 -050073 self.assertEqual(1024, body.get('size'))
74
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053075 # Now try get image file
lkuchlanb3348792016-09-29 10:42:21 +030076 body = self.client.show_image_file(image['id'])
David Kranzd7e97b42015-02-16 09:37:31 -050077 self.assertEqual(file_content, body.data)
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053078
Jordan Pittier3b46d272017-04-12 16:17:28 +020079 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080080 @decorators.idempotent_id('f848bb94-1c6e-45a4-8726-39e3a5b23535')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053081 def test_delete_image(self):
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +040082 # Deletes an image by image_id
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053083
84 # Create image
85 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090086 container_format = CONF.image.container_formats[0]
87 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +020088 image = self.create_image(name=image_name,
89 container_format=container_format,
90 disk_format=disk_format,
91 visibility='private')
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053092 # Delete Image
lkuchlanb3348792016-09-29 10:42:21 +030093 self.client.delete_image(image['id'])
94 self.client.wait_for_resource_deletion(image['id'])
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053095
96 # Verifying deletion
John Warrenf3b3e952015-08-17 19:28:12 +000097 images = self.client.list_images()['images']
Sunil G29856a32014-07-17 23:17:58 +053098 images_id = [item['id'] for item in images]
lkuchlanb3348792016-09-29 10:42:21 +030099 self.assertNotIn(image['id'], images_id)
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +0530100
Jordan Pittier3b46d272017-04-12 16:17:28 +0200101 @decorators.attr(type='smoke')
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800102 @decorators.idempotent_id('f66891a7-a35c-41a8-b590-a065c2a1caa6')
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400103 def test_update_image(self):
104 # Updates an image by image_id
105
106 # Create image
107 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +0900108 container_format = CONF.image.container_formats[0]
109 disk_format = CONF.image.disk_formats[0]
Benny Kopilov900fceb2016-11-09 09:45:40 +0200110 image = self.create_image(name=image_name,
111 container_format=container_format,
112 disk_format=disk_format,
113 visibility='private')
lkuchlanb3348792016-09-29 10:42:21 +0300114 self.assertEqual('queued', image['status'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400115
116 # Now try uploading an image file
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530117 image_file = six.BytesIO(data_utils.random_bytes())
lkuchlanb3348792016-09-29 10:42:21 +0300118 self.client.store_image_file(image['id'], image_file)
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400119
120 # Update Image
121 new_image_name = data_utils.rand_name('new-image')
zhufl311104e2017-08-17 15:13:18 +0800122 self.client.update_image(image['id'], [
Aaron Rosenc7720622014-05-20 10:38:10 -0700123 dict(replace='/name', value=new_image_name)])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400124
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400125 # Verifying updating
126
lkuchlanb3348792016-09-29 10:42:21 +0300127 body = self.client.show_image(image['id'])
128 self.assertEqual(image['id'], body['id'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400129 self.assertEqual(new_image_name, body['name'])
Sergey Nikitinc6b2ee82014-02-03 17:13:50 +0400130
lkuchlan32b53c32017-04-20 16:51:08 +0300131 @testtools.skipUnless(CONF.image_feature_enabled.deactivate_image,
132 'deactivate-image is not available.')
133 @decorators.idempotent_id('951ebe01-969f-4ea9-9898-8a3f1f442ab0')
134 def test_deactivate_reactivate_image(self):
135 # Create image
136 image_name = data_utils.rand_name('image')
137 image = self.create_image(name=image_name,
138 container_format='bare',
139 disk_format='raw',
140 visibility='private')
141
142 # Upload an image file
143 content = data_utils.random_bytes()
144 image_file = six.BytesIO(content)
145 self.client.store_image_file(image['id'], image_file)
146
147 # Deactivate image
148 self.client.deactivate_image(image['id'])
149 body = self.client.show_image(image['id'])
150 self.assertEqual("deactivated", body['status'])
151
152 # User unable to download deactivated image
153 self.assertRaises(lib_exc.Forbidden, self.client.show_image_file,
154 image['id'])
155
156 # Reactivate image
157 self.client.reactivate_image(image['id'])
158 body = self.client.show_image(image['id'])
159 self.assertEqual("active", body['status'])
160
161 # User able to download image after reactivation
162 body = self.client.show_image_file(image['id'])
163 self.assertEqual(content, body.data)
164
Matthew Treinisha62347f2013-03-01 16:37:30 -0500165
zhufl6e042bc2017-01-25 10:33:40 +0800166class ListUserImagesTest(base.BaseV2ImageTest):
167 """Here we test the listing of image information"""
Matthew Treinisha62347f2013-03-01 16:37:30 -0500168
169 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100170 def resource_setup(cls):
zhufl6e042bc2017-01-25 10:33:40 +0800171 super(ListUserImagesTest, cls).resource_setup()
Matthew Treinisha62347f2013-03-01 16:37:30 -0500172 # We add a few images here to test the listing functionality of
173 # the images API
Takashi NATSUME12a48512015-08-10 18:33:16 +0900174 container_fmts = CONF.image.container_formats
175 disk_fmts = CONF.image.disk_formats
176 all_pairs = [(container_fmt, disk_fmt)
177 for container_fmt in container_fmts
178 for disk_fmt in disk_fmts]
179
180 for (container_fmt, disk_fmt) in all_pairs[:6]:
hgangwxf186edc2015-12-28 21:12:59 +0800181 LOG.debug("Creating an image"
Takashi NATSUME12a48512015-08-10 18:33:16 +0900182 "(Container format: %s, Disk format: %s).",
183 container_fmt, disk_fmt)
184 cls._create_standard_image(container_fmt, disk_fmt)
Matthew Treinisha62347f2013-03-01 16:37:30 -0500185
186 @classmethod
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700187 def _create_standard_image(cls, container_format, disk_format):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000188 """Create a new standard image and return the newly-registered image-id
189
190 Note that the size of the new image is a random number between
Matthew Treinisha62347f2013-03-01 16:37:30 -0500191 1024 and 4096
192 """
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -0700193 size = random.randint(1024, 4096)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530194 image_file = six.BytesIO(data_utils.random_bytes(size))
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700195 tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
zhufl08e42762016-10-18 16:07:56 +0800196 image = cls.create_image(container_format=container_format,
lkuchlanb3348792016-09-29 10:42:21 +0300197 disk_format=disk_format,
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700198 visibility='private',
199 tags=tags)
lkuchlanb3348792016-09-29 10:42:21 +0300200 cls.client.store_image_file(image['id'], data=image_file)
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700201 # Keep the data of one test image so it can be used to filter lists
202 cls.test_data = image
Matthew Treinisha62347f2013-03-01 16:37:30 -0500203
lkuchlanb3348792016-09-29 10:42:21 +0300204 return image['id']
Matthew Treinisha62347f2013-03-01 16:37:30 -0500205
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700206 def _list_by_param_value_and_assert(self, params):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000207 """Perform list action with given params and validates result."""
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700208 # Retrieve the list of images that meet the filter
John Warrenf3b3e952015-08-17 19:28:12 +0000209 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700210 # Validating params of fetched images
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700211 msg = 'No images were found that met the filter criteria.'
212 self.assertNotEmpty(images_list, msg)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700213 for image in images_list:
214 for key in params:
215 msg = "Failed to list images by %s" % key
216 self.assertEqual(params[key], image[key], msg)
217
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700218 def _list_sorted_by_image_size_and_assert(self, params, desc=False):
219 """Validate an image list that has been sorted by size
220
221 Perform list action with given params and validates the results are
222 sorted by image size in either ascending or descending order.
223 """
224 # Retrieve the list of images that meet the filter
225 images_list = self.client.list_images(params=params)['images']
226 # Validate that the list was fetched sorted accordingly
227 msg = 'No images were found that met the filter criteria.'
228 self.assertNotEmpty(images_list, msg)
229 sorted_list = [image['size'] for image in images_list]
230 msg = 'The list of images was not sorted correctly.'
231 self.assertEqual(sorted(sorted_list, reverse=desc), sorted_list, msg)
232
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800233 @decorators.idempotent_id('1e341d7a-90a9-494c-b143-2cdf2aeb6aee')
Flavio Percoco7e26be12015-09-15 22:33:19 +0200234 def test_list_no_params(self):
Matthew Treinisha62347f2013-03-01 16:37:30 -0500235 # Simple test to see all fixture images returned
John Warrenf3b3e952015-08-17 19:28:12 +0000236 images_list = self.client.list_images()['images']
Sirushti Murugesan935f2cc2016-07-12 19:48:24 +0530237 image_list = [image['id'] for image in images_list]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700238
Matthew Treinisha62347f2013-03-01 16:37:30 -0500239 for image in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200240 self.assertIn(image, image_list)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700241
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800242 @decorators.idempotent_id('9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700243 def test_list_images_param_container_format(self):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700244 # Test to get all images with a specific container_format
245 params = {"container_format": self.test_data['container_format']}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700246 self._list_by_param_value_and_assert(params)
247
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800248 @decorators.idempotent_id('4a4735a7-f22f-49b6-b0d9-66e1ef7453eb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700249 def test_list_images_param_disk_format(self):
250 # Test to get all images with disk_format = raw
251 params = {"disk_format": "raw"}
252 self._list_by_param_value_and_assert(params)
253
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800254 @decorators.idempotent_id('7a95bb92-d99e-4b12-9718-7bc6ab73e6d2')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700255 def test_list_images_param_visibility(self):
Aaron Rosenc7720622014-05-20 10:38:10 -0700256 # Test to get all images with visibility = private
257 params = {"visibility": "private"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700258 self._list_by_param_value_and_assert(params)
259
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800260 @decorators.idempotent_id('cf1b9a48-8340-480e-af7b-fe7e17690876')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700261 def test_list_images_param_size(self):
262 # Test to get all images by size
Takashi NATSUME12a48512015-08-10 18:33:16 +0900263 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700264 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000265 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700266
267 params = {"size": image['size']}
268 self._list_by_param_value_and_assert(params)
269
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800270 @decorators.idempotent_id('4ad8c157-971a-4ba8-aa84-ed61154b1e7f')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700271 def test_list_images_param_min_max_size(self):
272 # Test to get all images with size between 2000 to 3000
Takashi NATSUME12a48512015-08-10 18:33:16 +0900273 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700274 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000275 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700276
277 size = image['size']
278 params = {"size_min": size - 500, "size_max": size + 500}
John Warrenf3b3e952015-08-17 19:28:12 +0000279 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700280 image_size_list = map(lambda x: x['size'], images_list)
281
282 for image_size in image_size_list:
Béla Vancsics64862f72016-11-08 09:12:31 +0100283 self.assertGreaterEqual(image_size, params['size_min'],
284 "Failed to get images by size_min")
285 self.assertLessEqual(image_size, params['size_max'],
286 "Failed to get images by size_max")
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700287
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800288 @decorators.idempotent_id('7fc9e369-0f58-4d05-9aa5-0969e2d59d15')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700289 def test_list_images_param_status(self):
Anju Tiwarica2249d2014-01-23 17:33:02 +0530290 # Test to get all active images
291 params = {"status": "active"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700292 self._list_by_param_value_and_assert(params)
293
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800294 @decorators.idempotent_id('e914a891-3cc8-4b40-ad32-e0a39ffbddbb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700295 def test_list_images_param_limit(self):
296 # Test to get images by limit
Takashi NATSUME12a48512015-08-10 18:33:16 +0900297 params = {"limit": 1}
John Warrenf3b3e952015-08-17 19:28:12 +0000298 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700299
300 self.assertEqual(len(images_list), params['limit'],
301 "Failed to get images by limit")
raiesmh08a1ce3542014-03-04 11:58:29 +0530302
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800303 @decorators.idempotent_id('e9a44b91-31c8-4b40-a332-e0a39ffb4dbb')
Li Wei14bf2412016-09-25 15:56:23 +0800304 def test_list_image_param_owner(self):
305 # Test to get images by owner
306 image_id = self.created_images[0]
307 # Get image metadata
308 image = self.client.show_image(image_id)
309
310 params = {"owner": image['owner']}
311 self._list_by_param_value_and_assert(params)
312
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800313 @decorators.idempotent_id('55c8f5f5-bfed-409d-a6d5-4caeda985d7b')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700314 def test_list_images_param_name(self):
315 # Test to get images by name
316 params = {'name': self.test_data['name']}
317 self._list_by_param_value_and_assert(params)
318
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800319 @decorators.idempotent_id('aa8ac4df-cff9-418b-8d0f-dd9c67b072c9')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700320 def test_list_images_param_tag(self):
321 # Test to get images matching a tag
322 params = {'tag': self.test_data['tags'][0]}
323 images_list = self.client.list_images(params=params)['images']
324 # Validating properties of fetched images
325 self.assertNotEmpty(images_list)
326 for image in images_list:
327 msg = ("The image {image_name} does not have the expected tag "
328 "{expected_tag} among its tags: {observerd_tags}."
329 .format(image_name=image['name'],
330 expected_tag=self.test_data['tags'][0],
331 observerd_tags=image['tags']))
332 self.assertIn(self.test_data['tags'][0], image['tags'], msg)
333
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800334 @decorators.idempotent_id('eeadce49-04e0-43b7-aec7-52535d903e7a')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700335 def test_list_images_param_sort(self):
336 params = {'sort': 'size:desc'}
337 self._list_sorted_by_image_size_and_assert(params, desc=True)
338
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800339 @decorators.idempotent_id('9faaa0c2-c3a5-43e1-8f61-61c54b409a49')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700340 def test_list_images_param_sort_key_dir(self):
341 params = {'sort_key': 'size', 'sort_dir': 'desc'}
342 self._list_sorted_by_image_size_and_assert(params, desc=True)
343
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800344 @decorators.idempotent_id('622b925c-479f-4736-860d-adeaf13bc371')
raiesmh08a1ce3542014-03-04 11:58:29 +0530345 def test_get_image_schema(self):
346 # Test to get image schema
347 schema = "image"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900348 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530349 self.assertEqual("image", body['name'])
350
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800351 @decorators.idempotent_id('25c8d7b2-df21-460f-87ac-93130bcdc684')
raiesmh08a1ce3542014-03-04 11:58:29 +0530352 def test_get_images_schema(self):
353 # Test to get images schema
354 schema = "images"
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("images", body['name'])
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700357
358
zhufl6e042bc2017-01-25 10:33:40 +0800359class ListSharedImagesTest(base.BaseV2ImageTest):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700360 """Here we test the listing of a shared image information"""
361
362 credentials = ['primary', 'alt']
363
364 @classmethod
365 def setup_clients(cls):
366 super(ListSharedImagesTest, cls).setup_clients()
Jordan Pittier8160d312017-04-18 11:52:23 +0200367 cls.image_member_client = cls.os_primary.image_member_client_v2
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700368 cls.alt_img_client = cls.os_alt.image_client_v2
369
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800370 @decorators.idempotent_id('3fa50be4-8e38-4c02-a8db-7811bb780122')
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700371 def test_list_images_param_member_status(self):
Steve Lewis8ac5b972016-12-22 07:41:29 -0800372 # Create an image to be shared using default visibility
373 image_file = six.BytesIO(data_utils.random_bytes(2048))
374 container_format = CONF.image.container_formats[0]
375 disk_format = CONF.image.disk_formats[0]
376 image = self.create_image(container_format=container_format,
377 disk_format=disk_format)
378 self.client.store_image_file(image['id'], data=image_file)
379
380 # Share the image created with the alt user
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700381 self.image_member_client.create_image_member(
Steve Lewis8ac5b972016-12-22 07:41:29 -0800382 image_id=image['id'], member=self.alt_img_client.tenant_id)
383
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700384 # As an image consumer you need to provide the member_status parameter
385 # along with the visibility=shared parameter in order for it to show
386 # results
387 params = {'member_status': 'pending', 'visibility': 'shared'}
388 fetched_images = self.alt_img_client.list_images(params)['images']
389 self.assertEqual(1, len(fetched_images))
Steve Lewis8ac5b972016-12-22 07:41:29 -0800390 self.assertEqual(image['id'], fetched_images[0]['id'])