blob: 448b86ee062269fd5ce5f5f51587e8cfd73d0b8b [file] [log] [blame]
Jay Pipes50677282012-01-06 15:39:20 -05001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2012 OpenStack, LLC
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
18import cStringIO as StringIO
Jay Pipes50677282012-01-06 15:39:20 -050019
Matthew Treinish481466b2012-12-20 17:16:01 -050020from tempest import clients
Matthew Treinish72ea4422013-02-07 14:42:49 -050021from tempest import exceptions
Attila Fazekas11795b52013-02-24 15:49:08 +010022from tempest.test import attr
Matthew Treinishce3ef922013-03-11 14:02:46 -040023from tempest.tests.image import base
Jay Pipes50677282012-01-06 15:39:20 -050024
25
Matthew Treinishce3ef922013-03-11 14:02:46 -040026class CreateRegisterImagesTest(base.BaseV1ImageTest):
27 """Here we test the registration and creation of images."""
Jay Pipes50677282012-01-06 15:39:20 -050028
Matthew Treinish72ea4422013-02-07 14:42:49 -050029 @attr(type='negative')
30 def test_register_with_invalid_container_format(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050031 # Negative tests for invalid data supplied to POST /images
Chris Yeohe04628e2013-02-25 17:12:21 +103032 self.assertRaises(exceptions.BadRequest, self.client.create_image,
33 'test', 'wrong', 'vhd')
Jay Pipes50677282012-01-06 15:39:20 -050034
Matthew Treinish72ea4422013-02-07 14:42:49 -050035 @attr(type='negative')
36 def test_register_with_invalid_disk_format(self):
Chris Yeohe04628e2013-02-25 17:12:21 +103037 self.assertRaises(exceptions.BadRequest, self.client.create_image,
38 'test', 'bare', 'wrong')
Jay Pipes50677282012-01-06 15:39:20 -050039
40 @attr(type='image')
41 def test_register_then_upload(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050042 # Register, then upload an image
Matthew Treinish72ea4422013-02-07 14:42:49 -050043 properties = {'prop1': 'val1'}
Matthew Treinishce3ef922013-03-11 14:02:46 -040044 resp, body = self.create_image(name='New Name',
45 container_format='bare',
46 disk_format='raw',
47 is_public=True,
48 properties=properties)
Matthew Treinish72ea4422013-02-07 14:42:49 -050049 self.assertTrue('id' in body)
50 image_id = body.get('id')
Jay Pipes50677282012-01-06 15:39:20 -050051 self.created_images.append(image_id)
Matthew Treinish72ea4422013-02-07 14:42:49 -050052 self.assertEqual('New Name', body.get('name'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050053 self.assertTrue(body.get('is_public'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050054 self.assertEqual('queued', body.get('status'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050055 for key, val in properties.items():
56 self.assertEqual(val, body.get('properties')[key])
Jay Pipes50677282012-01-06 15:39:20 -050057
58 # Now try uploading an image file
Matthew Treinish72ea4422013-02-07 14:42:49 -050059 image_file = StringIO.StringIO(('*' * 1024))
60 resp, body = self.client.update_image(image_id, data=image_file)
61 self.assertTrue('size' in body)
62 self.assertEqual(1024, body.get('size'))
Jay Pipes50677282012-01-06 15:39:20 -050063
64 @attr(type='image')
Jay Pipes50677282012-01-06 15:39:20 -050065 def test_register_remote_image(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -050066 # Register a new remote image
Matthew Treinishce3ef922013-03-11 14:02:46 -040067 resp, body = self.create_image(name='New Remote Image',
68 container_format='bare',
69 disk_format='raw', is_public=True,
70 location='http://example.com'
afazekas4a96bf82013-03-25 16:07:38 +010071 '/someimage.iso',
72 properties={'key1': 'value1',
73 'key2': 'value2'})
Matthew Treinish72ea4422013-02-07 14:42:49 -050074 self.assertTrue('id' in body)
75 image_id = body.get('id')
Jay Pipes50677282012-01-06 15:39:20 -050076 self.created_images.append(image_id)
Matthew Treinish72ea4422013-02-07 14:42:49 -050077 self.assertEqual('New Remote Image', body.get('name'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050078 self.assertTrue(body.get('is_public'))
Matthew Treinish72ea4422013-02-07 14:42:49 -050079 self.assertEqual('active', body.get('status'))
afazekas4a96bf82013-03-25 16:07:38 +010080 properties = body.get('properties')
81 self.assertEqual(properties['key1'], 'value1')
82 self.assertEqual(properties['key2'], 'value2')
Jay Pipes50677282012-01-06 15:39:20 -050083
84
Matthew Treinishce3ef922013-03-11 14:02:46 -040085class ListImagesTest(base.BaseV1ImageTest):
Jay Pipes50677282012-01-06 15:39:20 -050086
87 """
88 Here we test the listing of image information
89 """
90
91 @classmethod
92 def setUpClass(cls):
Matthew Treinishce3ef922013-03-11 14:02:46 -040093 super(ListImagesTest, cls).setUpClass()
Jay Pipes50677282012-01-06 15:39:20 -050094
95 # We add a few images here to test the listing functionality of
96 # the images API
Attila Fazekas11795b52013-02-24 15:49:08 +010097 img1 = cls._create_remote_image('one', 'bare', 'raw')
98 img2 = cls._create_remote_image('two', 'ami', 'ami')
99 img3 = cls._create_remote_image('dup', 'bare', 'raw')
100 img4 = cls._create_remote_image('dup', 'bare', 'raw')
101 img5 = cls._create_standard_image('1', 'ami', 'ami', 42)
102 img6 = cls._create_standard_image('2', 'ami', 'ami', 142)
103 img7 = cls._create_standard_image('33', 'bare', 'raw', 142)
104 img8 = cls._create_standard_image('33', 'bare', 'raw', 142)
105 cls.created_set = set(cls.created_images)
106 # 4x-4x remote image
107 cls.remote_set = set((img1, img2, img3, img4))
108 cls.standard_set = set((img5, img6, img7, img8))
109 # 5x bare, 3x ami
110 cls.bare_set = set((img1, img3, img4, img7, img8))
111 cls.ami_set = set((img2, img5, img6))
112 # 1x with size 42
113 cls.size42_set = set((img5,))
114 # 3x with size 142
115 cls.size142_set = set((img6, img7, img8))
116 # dup named
117 cls.dup_set = set((img3, img4))
Jay Pipes50677282012-01-06 15:39:20 -0500118
119 @classmethod
Attila Fazekas11795b52013-02-24 15:49:08 +0100120 def _create_remote_image(cls, name, container_format, disk_format):
Jay Pipes50677282012-01-06 15:39:20 -0500121 """
122 Create a new remote image and return the ID of the newly-registered
123 image
124 """
Attila Fazekas11795b52013-02-24 15:49:08 +0100125 name = 'New Remote Image %s' % name
126 location = 'http://example.com/someimage_%s.iso' % name
Matthew Treinishce3ef922013-03-11 14:02:46 -0400127 resp, image = cls.create_image(name=name,
128 container_format=container_format,
129 disk_format=disk_format,
130 is_public=True,
131 location=location)
Attila Fazekas11795b52013-02-24 15:49:08 +0100132 image_id = image['id']
Jay Pipes50677282012-01-06 15:39:20 -0500133 return image_id
134
135 @classmethod
Attila Fazekas11795b52013-02-24 15:49:08 +0100136 def _create_standard_image(cls, name, container_format,
137 disk_format, size):
Jay Pipes50677282012-01-06 15:39:20 -0500138 """
139 Create a new standard image and return the ID of the newly-registered
140 image. Note that the size of the new image is a random number between
141 1024 and 4096
142 """
Attila Fazekas11795b52013-02-24 15:49:08 +0100143 image_file = StringIO.StringIO('*' * size)
144 name = 'New Standard Image %s' % name
Matthew Treinishce3ef922013-03-11 14:02:46 -0400145 resp, image = cls.create_image(name=name,
146 container_format=container_format,
147 disk_format=disk_format,
148 is_public=True, data=image_file)
Attila Fazekas11795b52013-02-24 15:49:08 +0100149 image_id = image['id']
Jay Pipes50677282012-01-06 15:39:20 -0500150 return image_id
151
152 @attr(type='image')
153 def test_index_no_params(self):
Sean Dague46c4a2b2013-01-03 17:54:17 -0500154 # Simple test to see all fixture images returned
Matthew Treinish72ea4422013-02-07 14:42:49 -0500155 resp, images_list = self.client.image_list()
156 self.assertEqual(resp['status'], '200')
157 image_list = map(lambda x: x['id'], images_list)
Attila Fazekas11795b52013-02-24 15:49:08 +0100158 for image_id in self.created_images:
159 self.assertTrue(image_id in image_list)
160
161 @attr(type='image')
162 def test_index_disk_format(self):
163 resp, images_list = self.client.image_list(disk_format='ami')
164 self.assertEqual(resp['status'], '200')
165 for image in images_list:
166 self.assertEqual(image['disk_format'], 'ami')
167 result_set = set(map(lambda x: x['id'], images_list))
168 self.assertTrue(self.ami_set <= result_set)
169 self.assertFalse(self.created_set - self.ami_set <= result_set)
170
171 @attr(type='image')
172 def test_index_container_format(self):
173 resp, images_list = self.client.image_list(container_format='bare')
174 self.assertEqual(resp['status'], '200')
175 for image in images_list:
176 self.assertEqual(image['container_format'], 'bare')
177 result_set = set(map(lambda x: x['id'], images_list))
178 self.assertTrue(self.bare_set <= result_set)
179 self.assertFalse(self.created_set - self.bare_set <= result_set)
180
181 @attr(type='image')
182 def test_index_max_size(self):
183 resp, images_list = self.client.image_list(size_max=42)
184 self.assertEqual(resp['status'], '200')
185 for image in images_list:
186 self.assertTrue(image['size'] <= 42)
187 result_set = set(map(lambda x: x['id'], images_list))
188 self.assertTrue(self.size42_set <= result_set)
189 self.assertFalse(self.created_set - self.size42_set <= result_set)
190
191 @attr(type='image')
192 def test_index_min_size(self):
193 resp, images_list = self.client.image_list(size_min=142)
194 self.assertEqual(resp['status'], '200')
195 for image in images_list:
196 self.assertTrue(image['size'] >= 142)
197 result_set = set(map(lambda x: x['id'], images_list))
198 self.assertTrue(self.size142_set <= result_set)
199 self.assertFalse(self.size42_set <= result_set)
200
201 @attr(type='image')
202 def test_index_status_active_detail(self):
203 resp, images_list = self.client.image_list_detail(status='active',
204 sort_key='size',
205 sort_dir='desc')
206 self.assertEqual(resp['status'], '200')
207 top_size = images_list[0]['size'] # We have non-zero sized images
208 for image in images_list:
209 size = image['size']
210 self.assertTrue(size <= top_size)
211 top_size = size
212 self.assertEqual(image['status'], 'active')
213
214 @attr(type='image')
215 def test_index_name(self):
216 resp, images_list = self.client.image_list_detail(
217 name='New Remote Image dup')
218 self.assertEqual(resp['status'], '200')
219 result_set = set(map(lambda x: x['id'], images_list))
220 for image in images_list:
221 self.assertEqual(image['name'], 'New Remote Image dup')
222 self.assertTrue(self.dup_set <= result_set)
223 self.assertFalse(self.created_set - self.dup_set <= result_set)