blob: e7a10f370a05c712511e49d0ea2ff782079d9e04 [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
Fei Long Wangd39431f2015-05-14 11:30:48 +120023from tempest.common.utils import data_utils
Takashi NATSUME12a48512015-08-10 18:33:16 +090024from tempest import config
Eiichi Aikawa9012f462014-03-05 16:43:32 +090025from tempest import test
Matthew Treinisha62347f2013-03-01 16:37:30 -050026
Takashi NATSUME12a48512015-08-10 18:33:16 +090027CONF = config.CONF
28LOG = logging.getLogger(__name__)
29
Matthew Treinisha62347f2013-03-01 16:37:30 -050030
Hoisaleshwara Madan V S7cba1082013-11-26 12:43:04 +053031class BasicOperationsImagesTest(base.BaseV2ImageTest):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000032 """Here we test the basic operations of images"""
Matthew Treinisha62347f2013-03-01 16:37:30 -050033
Sean Dague0a08c7e2015-04-30 08:37:02 -040034 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080035 @test.idempotent_id('139b765e-7f3d-4b3d-8b37-3ca3876ee318')
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053036 def test_register_upload_get_image_file(self):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000037 """Here we test these functionalities
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053038
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +000039 Register image, upload the image file, get image and get image
40 file api's
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053041 """
42
Sean Daguec6ec4762014-05-29 08:54:21 -040043 uuid = '00000000-1111-2222-3333-444455556666'
Hoisaleshwara Madan V Se50a6f12013-10-23 18:01:01 +053044 image_name = data_utils.rand_name('image')
Takashi NATSUME12a48512015-08-10 18:33:16 +090045 container_format = CONF.image.container_formats[0]
46 disk_format = CONF.image.disk_formats[0]
lkuchlanb3348792016-09-29 10:42:21 +030047 image = self.create_image(name=image_name,
48 container_format=container_format,
49 disk_format=disk_format,
50 visibility='private',
51 ramdisk_id=uuid)
52 self.assertIn('id', image)
53 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
Sean Dague0a08c7e2015-04-30 08:37:02 -040077 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -080078 @test.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
Sean Dague0a08c7e2015-04-30 08:37:02 -040099 @test.attr(type='smoke')
Chris Hoge7579c1a2015-02-26 14:12:15 -0800100 @test.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')
lkuchlanb3348792016-09-29 10:42:21 +0300120 body = 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
Matthew Treinisha62347f2013-03-01 16:37:30 -0500129
Matthew Treinishce3ef922013-03-11 14:02:46 -0400130class ListImagesTest(base.BaseV2ImageTest):
Matthew Treinisha62347f2013-03-01 16:37:30 -0500131
132 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100133 def resource_setup(cls):
134 super(ListImagesTest, cls).resource_setup()
Matthew Treinisha62347f2013-03-01 16:37:30 -0500135 # We add a few images here to test the listing functionality of
136 # the images API
Takashi NATSUME12a48512015-08-10 18:33:16 +0900137 container_fmts = CONF.image.container_formats
138 disk_fmts = CONF.image.disk_formats
139 all_pairs = [(container_fmt, disk_fmt)
140 for container_fmt in container_fmts
141 for disk_fmt in disk_fmts]
142
143 for (container_fmt, disk_fmt) in all_pairs[:6]:
hgangwxf186edc2015-12-28 21:12:59 +0800144 LOG.debug("Creating an image"
Takashi NATSUME12a48512015-08-10 18:33:16 +0900145 "(Container format: %s, Disk format: %s).",
146 container_fmt, disk_fmt)
147 cls._create_standard_image(container_fmt, disk_fmt)
Matthew Treinisha62347f2013-03-01 16:37:30 -0500148
149 @classmethod
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700150 def _create_standard_image(cls, container_format, disk_format):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000151 """Create a new standard image and return the newly-registered image-id
152
153 Note that the size of the new image is a random number between
Matthew Treinisha62347f2013-03-01 16:37:30 -0500154 1024 and 4096
155 """
Mark Washenberger5c3b6fe2014-07-29 13:40:34 -0700156 size = random.randint(1024, 4096)
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530157 image_file = six.BytesIO(data_utils.random_bytes(size))
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700158 tags = [data_utils.rand_name('tag'), data_utils.rand_name('tag')]
zhufl08e42762016-10-18 16:07:56 +0800159 image = cls.create_image(container_format=container_format,
lkuchlanb3348792016-09-29 10:42:21 +0300160 disk_format=disk_format,
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700161 visibility='private',
162 tags=tags)
lkuchlanb3348792016-09-29 10:42:21 +0300163 cls.client.store_image_file(image['id'], data=image_file)
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700164 # Keep the data of one test image so it can be used to filter lists
165 cls.test_data = image
166 cls.test_data['size'] = size
Matthew Treinisha62347f2013-03-01 16:37:30 -0500167
lkuchlanb3348792016-09-29 10:42:21 +0300168 return image['id']
Matthew Treinisha62347f2013-03-01 16:37:30 -0500169
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700170
171class ListUserImagesTest(ListImagesTest):
172 """Here we test the listing of image information"""
173
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700174 def _list_by_param_value_and_assert(self, params):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000175 """Perform list action with given params and validates result."""
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700176 # Retrieve the list of images that meet the filter
John Warrenf3b3e952015-08-17 19:28:12 +0000177 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700178 # Validating params of fetched images
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700179 msg = 'No images were found that met the filter criteria.'
180 self.assertNotEmpty(images_list, msg)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700181 for image in images_list:
182 for key in params:
183 msg = "Failed to list images by %s" % key
184 self.assertEqual(params[key], image[key], msg)
185
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700186 def _list_sorted_by_image_size_and_assert(self, params, desc=False):
187 """Validate an image list that has been sorted by size
188
189 Perform list action with given params and validates the results are
190 sorted by image size in either ascending or descending order.
191 """
192 # Retrieve the list of images that meet the filter
193 images_list = self.client.list_images(params=params)['images']
194 # Validate that the list was fetched sorted accordingly
195 msg = 'No images were found that met the filter criteria.'
196 self.assertNotEmpty(images_list, msg)
197 sorted_list = [image['size'] for image in images_list]
198 msg = 'The list of images was not sorted correctly.'
199 self.assertEqual(sorted(sorted_list, reverse=desc), sorted_list, msg)
200
Chris Hoge7579c1a2015-02-26 14:12:15 -0800201 @test.idempotent_id('1e341d7a-90a9-494c-b143-2cdf2aeb6aee')
Flavio Percoco7e26be12015-09-15 22:33:19 +0200202 def test_list_no_params(self):
Matthew Treinisha62347f2013-03-01 16:37:30 -0500203 # Simple test to see all fixture images returned
John Warrenf3b3e952015-08-17 19:28:12 +0000204 images_list = self.client.list_images()['images']
Sirushti Murugesan935f2cc2016-07-12 19:48:24 +0530205 image_list = [image['id'] for image in images_list]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700206
Matthew Treinisha62347f2013-03-01 16:37:30 -0500207 for image in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200208 self.assertIn(image, image_list)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700209
Chris Hoge7579c1a2015-02-26 14:12:15 -0800210 @test.idempotent_id('9959ca1d-1aa7-4b7a-a1ea-0fff0499b37e')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700211 def test_list_images_param_container_format(self):
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700212 # Test to get all images with a specific container_format
213 params = {"container_format": self.test_data['container_format']}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700214 self._list_by_param_value_and_assert(params)
215
Chris Hoge7579c1a2015-02-26 14:12:15 -0800216 @test.idempotent_id('4a4735a7-f22f-49b6-b0d9-66e1ef7453eb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700217 def test_list_images_param_disk_format(self):
218 # Test to get all images with disk_format = raw
219 params = {"disk_format": "raw"}
220 self._list_by_param_value_and_assert(params)
221
Chris Hoge7579c1a2015-02-26 14:12:15 -0800222 @test.idempotent_id('7a95bb92-d99e-4b12-9718-7bc6ab73e6d2')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700223 def test_list_images_param_visibility(self):
Aaron Rosenc7720622014-05-20 10:38:10 -0700224 # Test to get all images with visibility = private
225 params = {"visibility": "private"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700226 self._list_by_param_value_and_assert(params)
227
Chris Hoge7579c1a2015-02-26 14:12:15 -0800228 @test.idempotent_id('cf1b9a48-8340-480e-af7b-fe7e17690876')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700229 def test_list_images_param_size(self):
230 # Test to get all images by size
Takashi NATSUME12a48512015-08-10 18:33:16 +0900231 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700232 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000233 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700234
235 params = {"size": image['size']}
236 self._list_by_param_value_and_assert(params)
237
Chris Hoge7579c1a2015-02-26 14:12:15 -0800238 @test.idempotent_id('4ad8c157-971a-4ba8-aa84-ed61154b1e7f')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700239 def test_list_images_param_min_max_size(self):
240 # Test to get all images with size between 2000 to 3000
Takashi NATSUME12a48512015-08-10 18:33:16 +0900241 image_id = self.created_images[0]
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700242 # Get image metadata
Ken'ichi Ohmichi5d410762015-05-22 01:10:03 +0000243 image = self.client.show_image(image_id)
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700244
245 size = image['size']
246 params = {"size_min": size - 500, "size_max": size + 500}
John Warrenf3b3e952015-08-17 19:28:12 +0000247 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700248 image_size_list = map(lambda x: x['size'], images_list)
249
250 for image_size in image_size_list:
Béla Vancsics64862f72016-11-08 09:12:31 +0100251 self.assertGreaterEqual(image_size, params['size_min'],
252 "Failed to get images by size_min")
253 self.assertLessEqual(image_size, params['size_max'],
254 "Failed to get images by size_max")
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700255
Chris Hoge7579c1a2015-02-26 14:12:15 -0800256 @test.idempotent_id('7fc9e369-0f58-4d05-9aa5-0969e2d59d15')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700257 def test_list_images_param_status(self):
Anju Tiwarica2249d2014-01-23 17:33:02 +0530258 # Test to get all active images
259 params = {"status": "active"}
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700260 self._list_by_param_value_and_assert(params)
261
Chris Hoge7579c1a2015-02-26 14:12:15 -0800262 @test.idempotent_id('e914a891-3cc8-4b40-ad32-e0a39ffbddbb')
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700263 def test_list_images_param_limit(self):
264 # Test to get images by limit
Takashi NATSUME12a48512015-08-10 18:33:16 +0900265 params = {"limit": 1}
John Warrenf3b3e952015-08-17 19:28:12 +0000266 images_list = self.client.list_images(params=params)['images']
Abhijeet Malawadef268d8e2013-09-17 06:20:23 -0700267
268 self.assertEqual(len(images_list), params['limit'],
269 "Failed to get images by limit")
raiesmh08a1ce3542014-03-04 11:58:29 +0530270
Li Wei14bf2412016-09-25 15:56:23 +0800271 @test.idempotent_id('e9a44b91-31c8-4b40-a332-e0a39ffb4dbb')
272 def test_list_image_param_owner(self):
273 # Test to get images by owner
274 image_id = self.created_images[0]
275 # Get image metadata
276 image = self.client.show_image(image_id)
277
278 params = {"owner": image['owner']}
279 self._list_by_param_value_and_assert(params)
280
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700281 @test.idempotent_id('55c8f5f5-bfed-409d-a6d5-4caeda985d7b')
282 def test_list_images_param_name(self):
283 # Test to get images by name
284 params = {'name': self.test_data['name']}
285 self._list_by_param_value_and_assert(params)
286
287 @test.idempotent_id('aa8ac4df-cff9-418b-8d0f-dd9c67b072c9')
288 def test_list_images_param_tag(self):
289 # Test to get images matching a tag
290 params = {'tag': self.test_data['tags'][0]}
291 images_list = self.client.list_images(params=params)['images']
292 # Validating properties of fetched images
293 self.assertNotEmpty(images_list)
294 for image in images_list:
295 msg = ("The image {image_name} does not have the expected tag "
296 "{expected_tag} among its tags: {observerd_tags}."
297 .format(image_name=image['name'],
298 expected_tag=self.test_data['tags'][0],
299 observerd_tags=image['tags']))
300 self.assertIn(self.test_data['tags'][0], image['tags'], msg)
301
302 @test.idempotent_id('eeadce49-04e0-43b7-aec7-52535d903e7a')
303 def test_list_images_param_sort(self):
304 params = {'sort': 'size:desc'}
305 self._list_sorted_by_image_size_and_assert(params, desc=True)
306
307 @test.idempotent_id('9faaa0c2-c3a5-43e1-8f61-61c54b409a49')
308 def test_list_images_param_sort_key_dir(self):
309 params = {'sort_key': 'size', 'sort_dir': 'desc'}
310 self._list_sorted_by_image_size_and_assert(params, desc=True)
311
Chris Hoge7579c1a2015-02-26 14:12:15 -0800312 @test.idempotent_id('622b925c-479f-4736-860d-adeaf13bc371')
raiesmh08a1ce3542014-03-04 11:58:29 +0530313 def test_get_image_schema(self):
314 # Test to get image schema
315 schema = "image"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900316 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530317 self.assertEqual("image", body['name'])
318
Chris Hoge7579c1a2015-02-26 14:12:15 -0800319 @test.idempotent_id('25c8d7b2-df21-460f-87ac-93130bcdc684')
raiesmh08a1ce3542014-03-04 11:58:29 +0530320 def test_get_images_schema(self):
321 # Test to get images schema
322 schema = "images"
Ken'ichi Ohmichi190b24e2016-06-07 23:20:09 +0900323 body = self.schemas_client.show_schema(schema)
raiesmh08a1ce3542014-03-04 11:58:29 +0530324 self.assertEqual("images", body['name'])
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700325
326
327class ListSharedImagesTest(ListImagesTest):
328 """Here we test the listing of a shared image information"""
329
330 credentials = ['primary', 'alt']
331
332 @classmethod
333 def setup_clients(cls):
334 super(ListSharedImagesTest, cls).setup_clients()
335 cls.image_member_client = cls.os.image_member_client_v2
336 cls.alt_img_client = cls.os_alt.image_client_v2
337
338 @test.idempotent_id('3fa50be4-8e38-4c02-a8db-7811bb780122')
339 def test_list_images_param_member_status(self):
Steve Lewis8ac5b972016-12-22 07:41:29 -0800340 # Create an image to be shared using default visibility
341 image_file = six.BytesIO(data_utils.random_bytes(2048))
342 container_format = CONF.image.container_formats[0]
343 disk_format = CONF.image.disk_formats[0]
344 image = self.create_image(container_format=container_format,
345 disk_format=disk_format)
346 self.client.store_image_file(image['id'], data=image_file)
347
348 # Share the image created with the alt user
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700349 self.image_member_client.create_image_member(
Steve Lewis8ac5b972016-12-22 07:41:29 -0800350 image_id=image['id'], member=self.alt_img_client.tenant_id)
351
Castulo J. Martineze9c8ce82016-05-16 07:55:53 -0700352 # As an image consumer you need to provide the member_status parameter
353 # along with the visibility=shared parameter in order for it to show
354 # results
355 params = {'member_status': 'pending', 'visibility': 'shared'}
356 fetched_images = self.alt_img_client.list_images(params)['images']
357 self.assertEqual(1, len(fetched_images))
Steve Lewis8ac5b972016-12-22 07:41:29 -0800358 self.assertEqual(image['id'], fetched_images[0]['id'])