blob: 756c78ce8e1d0d0b9b5494cd6de4345b947eea17 [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipes50677282012-01-06 15:39:20 -05002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053016import six
Matthew Treinish01472ff2015-02-20 17:26:52 -050017
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.image import base
Ken'ichi Ohmichi01151e82016-06-10 11:19:52 -070019from tempest.common import image as common_image
Fei Long Wangd39431f2015-05-14 11:30:48 +120020from tempest.common.utils import data_utils
Yaroslav Lobankov2fea4052016-04-19 15:05:57 +030021from tempest.common import waiters
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000022from tempest import config
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080023from tempest.lib import decorators
Matthew Treinish4217a702016-10-07 17:27:11 -040024from tempest.lib import exceptions
Jay Pipes50677282012-01-06 15:39:20 -050025
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000026CONF = config.CONF
27
Jay Pipes50677282012-01-06 15:39:20 -050028
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090029def get_container_and_disk_format():
30 a_formats = ['ami', 'ari', 'aki']
31
32 container_format = CONF.image.container_formats[0]
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090033
zhufl5aba18f2016-12-27 11:39:31 +080034 # In v1, If container_format is one of ['ami', 'ari', 'aki'], then
35 # disk_format must be same with container_format.
36 # If they are of different item sequence in tempest.conf, such as:
37 # container_formats = ami,ari,aki,bare
38 # disk_formats = ari,ami,aki,vhd
39 # we can select one in disk_format list that is same with container_format.
40 if container_format in a_formats:
41 if container_format in CONF.image.disk_formats:
42 disk_format = container_format
43 else:
44 msg = ("The container format and the disk format don't match. "
45 "Container format: %(container)s, Disk format: %(disk)s." %
46 {'container': container_format, 'disk': disk_format})
47 raise exceptions.InvalidConfiguration(msg)
48 else:
49 disk_format = CONF.image.disk_formats[0]
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090050
51 return container_format, disk_format
52
53
Matthew Treinishce3ef922013-03-11 14:02:46 -040054class CreateRegisterImagesTest(base.BaseV1ImageTest):
55 """Here we test the registration and creation of images."""
Jay Pipes50677282012-01-06 15:39:20 -050056
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080057 @decorators.idempotent_id('3027f8e6-3492-4a11-8575-c3293017af4d')
Jay Pipes50677282012-01-06 15:39:20 -050058 def test_register_then_upload(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050059 # Register, then upload an image
Matthew Treinish72ea4422013-02-07 14:42:49 -050060 properties = {'prop1': 'val1'}
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090061 container_format, disk_format = get_container_and_disk_format()
lkuchlanb3348792016-09-29 10:42:21 +030062 image = self.create_image(name='New Name',
63 container_format=container_format,
64 disk_format=disk_format,
65 is_public=False,
66 properties=properties)
lkuchlanb3348792016-09-29 10:42:21 +030067 self.assertEqual('New Name', image.get('name'))
68 self.assertFalse(image.get('is_public'))
69 self.assertEqual('queued', image.get('status'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050070 for key, val in properties.items():
lkuchlanb3348792016-09-29 10:42:21 +030071 self.assertEqual(val, image.get('properties')[key])
Jay Pipes50677282012-01-06 15:39:20 -050072
73 # Now try uploading an image file
Sirushti Murugesan12dc9732016-07-13 22:49:17 +053074 image_file = six.BytesIO(data_utils.random_bytes())
lkuchlanb3348792016-09-29 10:42:21 +030075 body = self.client.update_image(image['id'], data=image_file)['image']
Attila Fazekase191cb12013-07-29 06:41:52 +020076 self.assertIn('size', body)
Matthew Treinish72ea4422013-02-07 14:42:49 -050077 self.assertEqual(1024, body.get('size'))
Jay Pipes50677282012-01-06 15:39:20 -050078
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080079 @decorators.idempotent_id('69da74d9-68a9-404b-9664-ff7164ccb0f5')
Jay Pipes50677282012-01-06 15:39:20 -050080 def test_register_remote_image(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050081 # Register a new remote image
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090082 container_format, disk_format = get_container_and_disk_format()
David Kranz34f18782015-01-06 13:43:55 -050083 body = self.create_image(name='New Remote Image',
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090084 container_format=container_format,
85 disk_format=disk_format, is_public=False,
David Kranz34f18782015-01-06 13:43:55 -050086 location=CONF.image.http_image,
87 properties={'key1': 'value1',
88 'key2': 'value2'})
Matthew Treinish72ea4422013-02-07 14:42:49 -050089 self.assertEqual('New Remote Image', body.get('name'))
Aaron Rosenc7720622014-05-20 10:38:10 -070090 self.assertFalse(body.get('is_public'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050091 self.assertEqual('active', body.get('status'))
afazekas4a96bf82013-03-25 16:07:38 +010092 properties = body.get('properties')
93 self.assertEqual(properties['key1'], 'value1')
94 self.assertEqual(properties['key2'], 'value2')
Jay Pipes50677282012-01-06 15:39:20 -050095
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -080096 @decorators.idempotent_id('6d0e13a7-515b-460c-b91f-9f4793f09816')
Attila Fazekase72b7cd2013-03-26 18:34:21 +010097 def test_register_http_image(self):
Takashi NATSUMEb7d85912015-11-10 13:24:48 +090098 container_format, disk_format = get_container_and_disk_format()
lkuchlanb3348792016-09-29 10:42:21 +030099 image = self.create_image(name='New Http Image',
100 container_format=container_format,
101 disk_format=disk_format, is_public=False,
102 copy_from=CONF.image.http_image)
lkuchlanb3348792016-09-29 10:42:21 +0300103 self.assertEqual('New Http Image', image.get('name'))
104 self.assertFalse(image.get('is_public'))
105 waiters.wait_for_image_status(self.client, image['id'], 'active')
106 self.client.show_image(image['id'])
Attila Fazekase72b7cd2013-03-26 18:34:21 +0100107
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800108 @decorators.idempotent_id('05b19d55-140c-40d0-b36b-fafd774d421b')
hi2suresh75a20302013-04-09 09:17:06 +0000109 def test_register_image_with_min_ram(self):
110 # Register an image with min ram
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900111 container_format, disk_format = get_container_and_disk_format()
hi2suresh75a20302013-04-09 09:17:06 +0000112 properties = {'prop1': 'val1'}
David Kranz34f18782015-01-06 13:43:55 -0500113 body = self.create_image(name='New_image_with_min_ram',
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900114 container_format=container_format,
115 disk_format=disk_format,
David Kranz34f18782015-01-06 13:43:55 -0500116 is_public=False,
117 min_ram=40,
118 properties=properties)
hi2suresh75a20302013-04-09 09:17:06 +0000119 self.assertEqual('New_image_with_min_ram', body.get('name'))
Aaron Rosenc7720622014-05-20 10:38:10 -0700120 self.assertFalse(body.get('is_public'))
hi2suresh75a20302013-04-09 09:17:06 +0000121 self.assertEqual('queued', body.get('status'))
122 self.assertEqual(40, body.get('min_ram'))
123 for key, val in properties.items():
124 self.assertEqual(val, body.get('properties')[key])
David Kranz9c3b3b62014-06-19 16:05:53 -0400125 self.client.delete_image(body['id'])
hi2suresh75a20302013-04-09 09:17:06 +0000126
Jay Pipes50677282012-01-06 15:39:20 -0500127
Matthew Treinishce3ef922013-03-11 14:02:46 -0400128class ListImagesTest(base.BaseV1ImageTest):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000129 """Here we test the listing of image information"""
Jay Pipes50677282012-01-06 15:39:20 -0500130
131 @classmethod
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900132 def skip_checks(cls):
133 super(ListImagesTest, cls).skip_checks()
134 if (len(CONF.image.container_formats) < 2
135 or len(CONF.image.disk_formats) < 2):
136 skip_msg = ("%s skipped as multiple container formats "
137 "or disk formats are not available." % cls.__name__)
138 raise cls.skipException(skip_msg)
139
140 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100141 def resource_setup(cls):
142 super(ListImagesTest, cls).resource_setup()
Jay Pipes50677282012-01-06 15:39:20 -0500143 # We add a few images here to test the listing functionality of
144 # the images API
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900145 a_formats = ['ami', 'ari', 'aki']
146
147 (cls.container_format,
zhufl7a8f29d2017-02-17 10:16:45 +0800148 container_format_alt) = CONF.image.container_formats[:2]
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900149 cls.disk_format, cls.disk_format_alt = CONF.image.disk_formats[:2]
150 if cls.container_format in a_formats:
151 cls.disk_format = cls.container_format
zhufl7a8f29d2017-02-17 10:16:45 +0800152 if container_format_alt in a_formats:
153 cls.disk_format_alt = container_format_alt
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900154
155 img1 = cls._create_remote_image('one', cls.container_format,
156 cls.disk_format)
zhufl7a8f29d2017-02-17 10:16:45 +0800157 img2 = cls._create_remote_image('two', container_format_alt,
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900158 cls.disk_format_alt)
159 img3 = cls._create_remote_image('dup', cls.container_format,
160 cls.disk_format)
161 img4 = cls._create_remote_image('dup', cls.container_format,
162 cls.disk_format)
zhufl7a8f29d2017-02-17 10:16:45 +0800163 img5 = cls._create_standard_image('1', container_format_alt,
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900164 cls.disk_format_alt, 42)
zhufl7a8f29d2017-02-17 10:16:45 +0800165 img6 = cls._create_standard_image('2', container_format_alt,
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900166 cls.disk_format_alt, 142)
167 img7 = cls._create_standard_image('33', cls.container_format,
168 cls.disk_format, 142)
169 img8 = cls._create_standard_image('33', cls.container_format,
170 cls.disk_format, 142)
Attila Fazekas11795b52013-02-24 15:49:08 +0100171 cls.created_set = set(cls.created_images)
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900172 # same container format
173 cls.same_container_format_set = set((img1, img3, img4, img7, img8))
174 # same disk format
175 cls.same_disk_format_set = set((img2, img5, img6))
176
Attila Fazekas11795b52013-02-24 15:49:08 +0100177 # 1x with size 42
178 cls.size42_set = set((img5,))
179 # 3x with size 142
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800180 cls.size142_set = set((img6, img7, img8,))
Attila Fazekas11795b52013-02-24 15:49:08 +0100181 # dup named
182 cls.dup_set = set((img3, img4))
Jay Pipes50677282012-01-06 15:39:20 -0500183
184 @classmethod
Attila Fazekas11795b52013-02-24 15:49:08 +0100185 def _create_remote_image(cls, name, container_format, disk_format):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000186 """Create a new remote image and return newly-registered image-id"""
187
Attila Fazekas11795b52013-02-24 15:49:08 +0100188 name = 'New Remote Image %s' % name
Matthew Treinishe81ae692014-06-19 17:41:31 -0400189 location = CONF.image.http_image
David Kranz34f18782015-01-06 13:43:55 -0500190 image = cls.create_image(name=name,
191 container_format=container_format,
192 disk_format=disk_format,
193 is_public=False,
194 location=location)
lkuchlanb3348792016-09-29 10:42:21 +0300195 return image['id']
Jay Pipes50677282012-01-06 15:39:20 -0500196
197 @classmethod
Attila Fazekas11795b52013-02-24 15:49:08 +0100198 def _create_standard_image(cls, name, container_format,
199 disk_format, size):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000200 """Create a new standard image and return newly-registered image-id
201
202 Note that the size of the new image is a random number between
Jay Pipes50677282012-01-06 15:39:20 -0500203 1024 and 4096
204 """
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530205 image_file = six.BytesIO(data_utils.random_bytes(size))
Attila Fazekas11795b52013-02-24 15:49:08 +0100206 name = 'New Standard Image %s' % name
David Kranz34f18782015-01-06 13:43:55 -0500207 image = cls.create_image(name=name,
208 container_format=container_format,
209 disk_format=disk_format,
210 is_public=False, data=image_file)
lkuchlanb3348792016-09-29 10:42:21 +0300211 return image['id']
Jay Pipes50677282012-01-06 15:39:20 -0500212
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800213 @decorators.idempotent_id('246178ab-3b33-4212-9a4b-a7fe8261794d')
Jay Pipes50677282012-01-06 15:39:20 -0500214 def test_index_no_params(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -0500215 # Simple test to see all fixture images returned
John Warren66207252015-07-31 15:51:02 -0400216 images_list = self.client.list_images()['images']
Sirushti Murugesan935f2cc2016-07-12 19:48:24 +0530217 image_list = [image['id'] for image in images_list]
Attila Fazekas11795b52013-02-24 15:49:08 +0100218 for image_id in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200219 self.assertIn(image_id, image_list)
Attila Fazekas11795b52013-02-24 15:49:08 +0100220
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800221 @decorators.idempotent_id('f1755589-63d6-4468-b098-589820eb4031')
Attila Fazekas11795b52013-02-24 15:49:08 +0100222 def test_index_disk_format(self):
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900223 images_list = self.client.list_images(
224 disk_format=self.disk_format_alt)['images']
Attila Fazekas11795b52013-02-24 15:49:08 +0100225 for image in images_list:
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900226 self.assertEqual(image['disk_format'], self.disk_format_alt)
Attila Fazekas11795b52013-02-24 15:49:08 +0100227 result_set = set(map(lambda x: x['id'], images_list))
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900228 self.assertTrue(self.same_disk_format_set <= result_set)
229 self.assertFalse(self.created_set - self.same_disk_format_set
230 <= result_set)
Attila Fazekas11795b52013-02-24 15:49:08 +0100231
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800232 @decorators.idempotent_id('2143655d-96d9-4bec-9188-8674206b4b3b')
Attila Fazekas11795b52013-02-24 15:49:08 +0100233 def test_index_container_format(self):
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900234 images_list = self.client.list_images(
235 container_format=self.container_format)['images']
Attila Fazekas11795b52013-02-24 15:49:08 +0100236 for image in images_list:
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900237 self.assertEqual(image['container_format'], self.container_format)
Attila Fazekas11795b52013-02-24 15:49:08 +0100238 result_set = set(map(lambda x: x['id'], images_list))
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900239 self.assertTrue(self.same_container_format_set <= result_set)
240 self.assertFalse(self.created_set - self.same_container_format_set
241 <= result_set)
Attila Fazekas11795b52013-02-24 15:49:08 +0100242
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800243 @decorators.idempotent_id('feb32ac6-22bb-4a16-afd8-9454bb714b14')
Attila Fazekas11795b52013-02-24 15:49:08 +0100244 def test_index_max_size(self):
John Warren66207252015-07-31 15:51:02 -0400245 images_list = self.client.list_images(size_max=42)['images']
Attila Fazekas11795b52013-02-24 15:49:08 +0100246 for image in images_list:
Béla Vancsics64862f72016-11-08 09:12:31 +0100247 self.assertLessEqual(image['size'], 42)
Attila Fazekas11795b52013-02-24 15:49:08 +0100248 result_set = set(map(lambda x: x['id'], images_list))
249 self.assertTrue(self.size42_set <= result_set)
250 self.assertFalse(self.created_set - self.size42_set <= result_set)
251
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800252 @decorators.idempotent_id('6ffc16d0-4cbf-4401-95c8-4ac63eac34d8')
Attila Fazekas11795b52013-02-24 15:49:08 +0100253 def test_index_min_size(self):
John Warren66207252015-07-31 15:51:02 -0400254 images_list = self.client.list_images(size_min=142)['images']
Attila Fazekas11795b52013-02-24 15:49:08 +0100255 for image in images_list:
zhufl080dcfb2016-10-21 17:45:38 +0800256 self.assertGreaterEqual(image['size'], 142)
Attila Fazekas11795b52013-02-24 15:49:08 +0100257 result_set = set(map(lambda x: x['id'], images_list))
258 self.assertTrue(self.size142_set <= result_set)
259 self.assertFalse(self.size42_set <= result_set)
260
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800261 @decorators.idempotent_id('e5dc26d9-9aa2-48dd-bda5-748e1445da98')
Attila Fazekas11795b52013-02-24 15:49:08 +0100262 def test_index_status_active_detail(self):
Ken'ichi Ohmichibcad2a22015-05-22 09:37:06 +0000263 images_list = self.client.list_images(detail=True,
264 status='active',
265 sort_key='size',
John Warren66207252015-07-31 15:51:02 -0400266 sort_dir='desc')['images']
Attila Fazekas11795b52013-02-24 15:49:08 +0100267 top_size = images_list[0]['size'] # We have non-zero sized images
268 for image in images_list:
269 size = image['size']
Béla Vancsics64862f72016-11-08 09:12:31 +0100270 self.assertLessEqual(size, top_size)
Attila Fazekas11795b52013-02-24 15:49:08 +0100271 top_size = size
272 self.assertEqual(image['status'], 'active')
273
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800274 @decorators.idempotent_id('097af10a-bae8-4342-bff4-edf89969ed2a')
Attila Fazekas11795b52013-02-24 15:49:08 +0100275 def test_index_name(self):
Ken'ichi Ohmichibcad2a22015-05-22 09:37:06 +0000276 images_list = self.client.list_images(
277 detail=True,
John Warren66207252015-07-31 15:51:02 -0400278 name='New Remote Image dup')['images']
Attila Fazekas11795b52013-02-24 15:49:08 +0100279 result_set = set(map(lambda x: x['id'], images_list))
280 for image in images_list:
281 self.assertEqual(image['name'], 'New Remote Image dup')
282 self.assertTrue(self.dup_set <= result_set)
283 self.assertFalse(self.created_set - self.dup_set <= result_set)
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800284
285
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800286class UpdateImageMetaTest(base.BaseV1ImageTest):
287 @classmethod
Andrea Frittoli69a6b632014-09-15 13:14:53 +0100288 def resource_setup(cls):
289 super(UpdateImageMetaTest, cls).resource_setup()
Takashi NATSUMEb7d85912015-11-10 13:24:48 +0900290 container_format, disk_format = get_container_and_disk_format()
291 cls.image_id = cls._create_standard_image('1', container_format,
292 disk_format, 42)
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800293
294 @classmethod
295 def _create_standard_image(cls, name, container_format,
296 disk_format, size):
Ken'ichi Ohmichi9e3dac02015-11-19 07:01:07 +0000297 """Create a new standard image and return newly-registered image-id"""
298
Sirushti Murugesan12dc9732016-07-13 22:49:17 +0530299 image_file = six.BytesIO(data_utils.random_bytes(size))
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800300 name = 'New Standard Image %s' % name
David Kranz34f18782015-01-06 13:43:55 -0500301 image = cls.create_image(name=name,
302 container_format=container_format,
303 disk_format=disk_format,
304 is_public=False, data=image_file,
305 properties={'key1': 'value1'})
lkuchlanb3348792016-09-29 10:42:21 +0300306 return image['id']
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800307
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800308 @decorators.idempotent_id('01752c1c-0275-4de3-9e5b-876e44541928')
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800309 def test_list_image_metadata(self):
310 # All metadata key/value pairs for an image should be returned
Ken'ichi Ohmichi01151e82016-06-10 11:19:52 -0700311 resp = self.client.check_image(self.image_id)
312 resp_metadata = common_image.get_image_meta_from_headers(resp)
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800313 expected = {'key1': 'value1'}
314 self.assertEqual(expected, resp_metadata['properties'])
315
Ken'ichi Ohmichif35efa22017-01-27 17:55:24 -0800316 @decorators.idempotent_id('d6d7649c-08ce-440d-9ea7-e3dda552f33c')
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800317 def test_update_image_metadata(self):
318 # The metadata for the image should match the updated values
319 req_metadata = {'key1': 'alt1', 'key2': 'value2'}
Ken'ichi Ohmichi01151e82016-06-10 11:19:52 -0700320 resp = self.client.check_image(self.image_id)
321 metadata = common_image.get_image_meta_from_headers(resp)
ivan-zhud1bbe5d2013-12-29 18:32:46 +0800322 self.assertEqual(metadata['properties'], {'key1': 'value1'})
323 metadata['properties'].update(req_metadata)
Ken'ichi Ohmichi02bcdf32016-06-17 16:41:26 -0700324 headers = common_image.image_meta_to_headers(
325 properties=metadata['properties'])
guo yunxian6c5f5eb2016-08-23 15:35:53 +0800326 self.client.update_image(self.image_id, headers=headers)
Ken'ichi Ohmichi01151e82016-06-10 11:19:52 -0700327 resp = self.client.check_image(self.image_id)
328 resp_metadata = common_image.get_image_meta_from_headers(resp)
guo yunxian6c5f5eb2016-08-23 15:35:53 +0800329 self.assertEqual(req_metadata, resp_metadata['properties'])