blob: 8c62c05f0ddc560a0c137c5f5fbe56f9b98de56a [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
16import cStringIO as StringIO
Jay Pipes50677282012-01-06 15:39:20 -050017
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.image import base
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000019from tempest import config
Attila Fazekas11795b52013-02-24 15:49:08 +010020from tempest.test import attr
Jay Pipes50677282012-01-06 15:39:20 -050021
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000022CONF = config.CONF
23
Jay Pipes50677282012-01-06 15:39:20 -050024
Matthew Treinishce3ef922013-03-11 14:02:46 -040025class CreateRegisterImagesTest(base.BaseV1ImageTest):
26 """Here we test the registration and creation of images."""
Jay Pipes50677282012-01-06 15:39:20 -050027
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -040028 @attr(type='gate')
Jay Pipes50677282012-01-06 15:39:20 -050029 def test_register_then_upload(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050030 # Register, then upload an image
Matthew Treinish72ea4422013-02-07 14:42:49 -050031 properties = {'prop1': 'val1'}
Matthew Treinishce3ef922013-03-11 14:02:46 -040032 resp, body = self.create_image(name='New Name',
33 container_format='bare',
34 disk_format='raw',
35 is_public=True,
36 properties=properties)
Attila Fazekase191cb12013-07-29 06:41:52 +020037 self.assertIn('id', body)
Matthew Treinish72ea4422013-02-07 14:42:49 -050038 image_id = body.get('id')
Matthew Treinish72ea4422013-02-07 14:42:49 -050039 self.assertEqual('New Name', body.get('name'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050040 self.assertTrue(body.get('is_public'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050041 self.assertEqual('queued', body.get('status'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050042 for key, val in properties.items():
43 self.assertEqual(val, body.get('properties')[key])
Jay Pipes50677282012-01-06 15:39:20 -050044
45 # Now try uploading an image file
Matthew Treinish72ea4422013-02-07 14:42:49 -050046 image_file = StringIO.StringIO(('*' * 1024))
47 resp, body = self.client.update_image(image_id, data=image_file)
Attila Fazekase191cb12013-07-29 06:41:52 +020048 self.assertIn('size', body)
Matthew Treinish72ea4422013-02-07 14:42:49 -050049 self.assertEqual(1024, body.get('size'))
Jay Pipes50677282012-01-06 15:39:20 -050050
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -040051 @attr(type='gate')
Jay Pipes50677282012-01-06 15:39:20 -050052 def test_register_remote_image(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050053 # Register a new remote image
Matthew Treinishce3ef922013-03-11 14:02:46 -040054 resp, body = self.create_image(name='New Remote Image',
55 container_format='bare',
56 disk_format='raw', is_public=True,
57 location='http://example.com'
afazekas4a96bf82013-03-25 16:07:38 +010058 '/someimage.iso',
59 properties={'key1': 'value1',
60 'key2': 'value2'})
Attila Fazekase191cb12013-07-29 06:41:52 +020061 self.assertIn('id', body)
Matthew Treinish72ea4422013-02-07 14:42:49 -050062 self.assertEqual('New Remote Image', body.get('name'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050063 self.assertTrue(body.get('is_public'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050064 self.assertEqual('active', body.get('status'))
afazekas4a96bf82013-03-25 16:07:38 +010065 properties = body.get('properties')
66 self.assertEqual(properties['key1'], 'value1')
67 self.assertEqual(properties['key2'], 'value2')
Jay Pipes50677282012-01-06 15:39:20 -050068
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -040069 @attr(type='gate')
Attila Fazekase72b7cd2013-03-26 18:34:21 +010070 def test_register_http_image(self):
Attila Fazekase72b7cd2013-03-26 18:34:21 +010071 resp, body = self.create_image(name='New Http Image',
72 container_format='bare',
73 disk_format='raw', is_public=True,
Matthew Treinishbc0e03e2014-01-30 16:51:06 +000074 copy_from=CONF.images.http_image)
Attila Fazekase191cb12013-07-29 06:41:52 +020075 self.assertIn('id', body)
Attila Fazekase72b7cd2013-03-26 18:34:21 +010076 image_id = body.get('id')
Attila Fazekase72b7cd2013-03-26 18:34:21 +010077 self.assertEqual('New Http Image', body.get('name'))
78 self.assertTrue(body.get('is_public'))
79 self.client.wait_for_image_status(image_id, 'active')
80 resp, body = self.client.get_image(image_id)
81 self.assertEqual(resp['status'], '200')
Attila Fazekase72b7cd2013-03-26 18:34:21 +010082
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -040083 @attr(type='gate')
hi2suresh75a20302013-04-09 09:17:06 +000084 def test_register_image_with_min_ram(self):
85 # Register an image with min ram
86 properties = {'prop1': 'val1'}
87 resp, body = self.create_image(name='New_image_with_min_ram',
88 container_format='bare',
89 disk_format='raw',
90 is_public=True,
91 min_ram=40,
92 properties=properties)
Attila Fazekase191cb12013-07-29 06:41:52 +020093 self.assertIn('id', body)
hi2suresh75a20302013-04-09 09:17:06 +000094 self.assertEqual('New_image_with_min_ram', body.get('name'))
95 self.assertTrue(body.get('is_public'))
96 self.assertEqual('queued', body.get('status'))
97 self.assertEqual(40, body.get('min_ram'))
98 for key, val in properties.items():
99 self.assertEqual(val, body.get('properties')[key])
ivan-zhu3867a1c2013-10-11 14:16:58 +0800100 resp, body = self.client.delete_image(body['id'])
101 self.assertEqual('200', resp['status'])
hi2suresh75a20302013-04-09 09:17:06 +0000102
Jay Pipes50677282012-01-06 15:39:20 -0500103
Matthew Treinishce3ef922013-03-11 14:02:46 -0400104class ListImagesTest(base.BaseV1ImageTest):
Jay Pipes50677282012-01-06 15:39:20 -0500105
106 """
107 Here we test the listing of image information
108 """
109
110 @classmethod
111 def setUpClass(cls):
Matthew Treinishce3ef922013-03-11 14:02:46 -0400112 super(ListImagesTest, cls).setUpClass()
Jay Pipes50677282012-01-06 15:39:20 -0500113
114 # We add a few images here to test the listing functionality of
115 # the images API
Attila Fazekas11795b52013-02-24 15:49:08 +0100116 img1 = cls._create_remote_image('one', 'bare', 'raw')
117 img2 = cls._create_remote_image('two', 'ami', 'ami')
118 img3 = cls._create_remote_image('dup', 'bare', 'raw')
119 img4 = cls._create_remote_image('dup', 'bare', 'raw')
120 img5 = cls._create_standard_image('1', 'ami', 'ami', 42)
121 img6 = cls._create_standard_image('2', 'ami', 'ami', 142)
122 img7 = cls._create_standard_image('33', 'bare', 'raw', 142)
123 img8 = cls._create_standard_image('33', 'bare', 'raw', 142)
124 cls.created_set = set(cls.created_images)
125 # 4x-4x remote image
126 cls.remote_set = set((img1, img2, img3, img4))
127 cls.standard_set = set((img5, img6, img7, img8))
128 # 5x bare, 3x ami
129 cls.bare_set = set((img1, img3, img4, img7, img8))
130 cls.ami_set = set((img2, img5, img6))
131 # 1x with size 42
132 cls.size42_set = set((img5,))
133 # 3x with size 142
134 cls.size142_set = set((img6, img7, img8))
135 # dup named
136 cls.dup_set = set((img3, img4))
Jay Pipes50677282012-01-06 15:39:20 -0500137
138 @classmethod
Attila Fazekas11795b52013-02-24 15:49:08 +0100139 def _create_remote_image(cls, name, container_format, disk_format):
Jay Pipes50677282012-01-06 15:39:20 -0500140 """
141 Create a new remote image and return the ID of the newly-registered
142 image
143 """
Attila Fazekas11795b52013-02-24 15:49:08 +0100144 name = 'New Remote Image %s' % name
145 location = 'http://example.com/someimage_%s.iso' % name
Matthew Treinishce3ef922013-03-11 14:02:46 -0400146 resp, image = cls.create_image(name=name,
147 container_format=container_format,
148 disk_format=disk_format,
149 is_public=True,
150 location=location)
Attila Fazekas11795b52013-02-24 15:49:08 +0100151 image_id = image['id']
Jay Pipes50677282012-01-06 15:39:20 -0500152 return image_id
153
154 @classmethod
Attila Fazekas11795b52013-02-24 15:49:08 +0100155 def _create_standard_image(cls, name, container_format,
156 disk_format, size):
Jay Pipes50677282012-01-06 15:39:20 -0500157 """
158 Create a new standard image and return the ID of the newly-registered
159 image. Note that the size of the new image is a random number between
160 1024 and 4096
161 """
Attila Fazekas11795b52013-02-24 15:49:08 +0100162 image_file = StringIO.StringIO('*' * size)
163 name = 'New Standard Image %s' % name
Matthew Treinishce3ef922013-03-11 14:02:46 -0400164 resp, image = cls.create_image(name=name,
165 container_format=container_format,
166 disk_format=disk_format,
167 is_public=True, data=image_file)
Attila Fazekas11795b52013-02-24 15:49:08 +0100168 image_id = image['id']
Jay Pipes50677282012-01-06 15:39:20 -0500169 return image_id
170
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400171 @attr(type='gate')
Jay Pipes50677282012-01-06 15:39:20 -0500172 def test_index_no_params(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -0500173 # Simple test to see all fixture images returned
Matthew Treinish72ea4422013-02-07 14:42:49 -0500174 resp, images_list = self.client.image_list()
175 self.assertEqual(resp['status'], '200')
176 image_list = map(lambda x: x['id'], images_list)
Attila Fazekas11795b52013-02-24 15:49:08 +0100177 for image_id in self.created_images:
Attila Fazekase191cb12013-07-29 06:41:52 +0200178 self.assertIn(image_id, image_list)
Attila Fazekas11795b52013-02-24 15:49:08 +0100179
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400180 @attr(type='gate')
Attila Fazekas11795b52013-02-24 15:49:08 +0100181 def test_index_disk_format(self):
182 resp, images_list = self.client.image_list(disk_format='ami')
183 self.assertEqual(resp['status'], '200')
184 for image in images_list:
185 self.assertEqual(image['disk_format'], 'ami')
186 result_set = set(map(lambda x: x['id'], images_list))
187 self.assertTrue(self.ami_set <= result_set)
188 self.assertFalse(self.created_set - self.ami_set <= result_set)
189
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400190 @attr(type='gate')
Attila Fazekas11795b52013-02-24 15:49:08 +0100191 def test_index_container_format(self):
192 resp, images_list = self.client.image_list(container_format='bare')
193 self.assertEqual(resp['status'], '200')
194 for image in images_list:
195 self.assertEqual(image['container_format'], 'bare')
196 result_set = set(map(lambda x: x['id'], images_list))
197 self.assertTrue(self.bare_set <= result_set)
198 self.assertFalse(self.created_set - self.bare_set <= result_set)
199
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400200 @attr(type='gate')
Attila Fazekas11795b52013-02-24 15:49:08 +0100201 def test_index_max_size(self):
202 resp, images_list = self.client.image_list(size_max=42)
203 self.assertEqual(resp['status'], '200')
204 for image in images_list:
205 self.assertTrue(image['size'] <= 42)
206 result_set = set(map(lambda x: x['id'], images_list))
207 self.assertTrue(self.size42_set <= result_set)
208 self.assertFalse(self.created_set - self.size42_set <= result_set)
209
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400210 @attr(type='gate')
Attila Fazekas11795b52013-02-24 15:49:08 +0100211 def test_index_min_size(self):
212 resp, images_list = self.client.image_list(size_min=142)
213 self.assertEqual(resp['status'], '200')
214 for image in images_list:
215 self.assertTrue(image['size'] >= 142)
216 result_set = set(map(lambda x: x['id'], images_list))
217 self.assertTrue(self.size142_set <= result_set)
218 self.assertFalse(self.size42_set <= result_set)
219
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400220 @attr(type='gate')
Attila Fazekas11795b52013-02-24 15:49:08 +0100221 def test_index_status_active_detail(self):
222 resp, images_list = self.client.image_list_detail(status='active',
223 sort_key='size',
224 sort_dir='desc')
225 self.assertEqual(resp['status'], '200')
226 top_size = images_list[0]['size'] # We have non-zero sized images
227 for image in images_list:
228 size = image['size']
229 self.assertTrue(size <= top_size)
230 top_size = size
231 self.assertEqual(image['status'], 'active')
232
Giampaolo Lauriafd5f5952013-05-15 09:44:24 -0400233 @attr(type='gate')
Attila Fazekas11795b52013-02-24 15:49:08 +0100234 def test_index_name(self):
235 resp, images_list = self.client.image_list_detail(
Sean Dague14c68182013-04-14 15:34:30 -0400236 name='New Remote Image dup')
Attila Fazekas11795b52013-02-24 15:49:08 +0100237 self.assertEqual(resp['status'], '200')
238 result_set = set(map(lambda x: x['id'], images_list))
239 for image in images_list:
240 self.assertEqual(image['name'], 'New Remote Image dup')
241 self.assertTrue(self.dup_set <= result_set)
242 self.assertFalse(self.created_set - self.dup_set <= result_set)