blob: 004268ed3bdd3378e20787287df78b454b74e826 [file] [log] [blame]
Jay Pipes13b479b2012-06-11 14:52:27 -04001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
ZhiQiang Fan39f97222013-09-20 04:49:44 +08003# Copyright 2012 OpenStack Foundation
Jay Pipes13b479b2012-06-11 14:52:27 -04004# 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
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api import compute
19from tempest.api.compute import base
Chris Yeoh8abacf32013-01-21 17:08:32 +103020from tempest.common.utils.data_utils import rand_int_id
21from tempest.common.utils.data_utils import rand_name
Tiago Mellodb525252013-02-07 14:51:38 -050022from tempest import exceptions
Chris Yeoh9465b0b2013-02-09 22:19:15 +103023from tempest.test import attr
Giulio Fidente83181a92013-10-01 06:02:24 +020024from tempest.test import skip_because
Rohit Karajgi03530292012-04-24 17:00:50 -070025
26
Attila Fazekas19044d52013-02-16 07:35:06 +010027class FlavorsAdminTestJSON(base.BaseComputeAdminTest):
Rohit Karajgi03530292012-04-24 17:00:50 -070028
29 """
30 Tests Flavors API Create and Delete that require admin privileges
31 """
32
Attila Fazekas19044d52013-02-16 07:35:06 +010033 _interface = 'json'
34
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053035 @classmethod
Attila Fazekas19044d52013-02-16 07:35:06 +010036 def setUpClass(cls):
37 super(FlavorsAdminTestJSON, cls).setUpClass()
Jay Pipesf38eaac2012-06-21 13:37:35 -040038 if not compute.FLAVOR_EXTRA_DATA_ENABLED:
39 msg = "FlavorExtraData extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080040 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070041
Attila Fazekas4ba36582013-02-12 08:26:17 +010042 cls.client = cls.os_adm.flavors_client
afazekascda40822013-03-25 16:50:41 +010043 cls.user_client = cls.os.flavors_client
Chris Yeoh8abacf32013-01-21 17:08:32 +103044 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040045 cls.ram = 512
46 cls.vcpus = 1
47 cls.disk = 10
48 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040049 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053050 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070051
Attila Fazekas2883fd52013-03-10 12:05:21 +010052 def flavor_clean_up(self, flavor_id):
53 resp, body = self.client.delete_flavor(flavor_id)
54 self.assertEqual(resp.status, 202)
55 self.client.wait_for_resource_deletion(flavor_id)
56
Giulio Fidenteba3985a2013-05-29 01:46:36 +020057 @attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -070058 def test_create_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050059 # Create a flavor and ensure it is listed
60 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103061 flavor_name = rand_name(self.flavor_name_prefix)
62 new_flavor_id = rand_int_id(start=1000)
63
Attila Fazekasf7f34f92013-08-01 17:01:44 +020064 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +010065 resp, flavor = self.client.create_flavor(flavor_name,
66 self.ram, self.vcpus,
67 self.disk,
68 new_flavor_id,
69 ephemeral=self.ephemeral,
70 swap=self.swap,
71 rxtx=self.rxtx)
72 self.addCleanup(self.flavor_clean_up, flavor['id'])
73 self.assertEqual(200, resp.status)
74 self.assertEqual(flavor['name'], flavor_name)
75 self.assertEqual(flavor['vcpus'], self.vcpus)
76 self.assertEqual(flavor['disk'], self.disk)
77 self.assertEqual(flavor['ram'], self.ram)
78 self.assertEqual(int(flavor['id']), new_flavor_id)
79 self.assertEqual(flavor['swap'], self.swap)
80 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
81 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
82 self.ephemeral)
83 if self._interface == "xml":
84 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
85 "flavor_access/api/v2"
86 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
87 self.assertEqual(flavor[key], "True")
88 if self._interface == "json":
89 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070090
Attila Fazekasf7f34f92013-08-01 17:01:44 +020091 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +010092 resp, flavor = self.client.get_flavor_details(new_flavor_id)
93 self.assertEqual(resp.status, 200)
94 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070095
Giulio Fidenteba3985a2013-05-29 01:46:36 +020096 @attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -070097 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050098 # Create a flavor and ensure it's details are listed
99 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030100 flavor_name = rand_name(self.flavor_name_prefix)
101 new_flavor_id = rand_int_id(start=1000)
102
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200103 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100104 resp, flavor = self.client.create_flavor(flavor_name,
105 self.ram, self.vcpus,
106 self.disk,
107 new_flavor_id,
108 ephemeral=self.ephemeral,
109 swap=self.swap,
110 rxtx=self.rxtx)
111 self.addCleanup(self.flavor_clean_up, flavor['id'])
112 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200113 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100114 resp, flavors = self.client.list_flavors_with_detail()
115 self.assertEqual(resp.status, 200)
116 for flavor in flavors:
117 if flavor['name'] == flavor_name:
118 flag = True
119 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700120
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400121 @attr(type=['negative', 'gate'])
Rohit Karajgi03530292012-04-24 17:00:50 -0700122 def test_get_flavor_details_for_deleted_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500123 # Delete a flavor and ensure it is not listed
Rohit Karajgi03530292012-04-24 17:00:50 -0700124 # Create a test flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030125 flavor_name = rand_name(self.flavor_name_prefix)
126 new_flavor_id = rand_int_id(start=1000)
127
128 resp, flavor = self.client.create_flavor(flavor_name,
Jay Pipesf38eaac2012-06-21 13:37:35 -0400129 self.ram,
130 self.vcpus, self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030131 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530132 ephemeral=self.ephemeral,
133 swap=self.swap,
134 rxtx=self.rxtx)
Rohit Karajgi03530292012-04-24 17:00:50 -0700135 # Delete the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100136 new_flavor_id = flavor['id']
137 resp_delete, body = self.client.delete_flavor(new_flavor_id)
Chang Bo Guofc77e932013-09-16 17:38:26 -0700138 self.assertEqual(200, resp.status)
139 self.assertEqual(202, resp_delete.status)
Rohit Karajgi03530292012-04-24 17:00:50 -0700140
Dan Prince8581f532012-05-30 17:11:55 -0400141 # Deleted flavors can be seen via detailed GET
Chris Yeoh8abacf32013-01-21 17:08:32 +1030142 resp, flavor = self.client.get_flavor_details(new_flavor_id)
Dan Prince8581f532012-05-30 17:11:55 -0400143 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030144 self.assertEqual(flavor['name'], flavor_name)
Dan Prince8581f532012-05-30 17:11:55 -0400145
146 # Deleted flavors should not show up in a list however
Jay Pipesf38eaac2012-06-21 13:37:35 -0400147 resp, flavors = self.client.list_flavors_with_detail()
Dan Prince8581f532012-05-30 17:11:55 -0400148 self.assertEqual(resp.status, 200)
149 flag = True
150 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030151 if flavor['name'] == flavor_name:
Dan Prince8581f532012-05-30 17:11:55 -0400152 flag = False
153 self.assertTrue(flag)
Tiago Melloeda03b52012-08-22 23:47:29 -0300154
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400155 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530156 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200157 # Create a flavor and ensure it is listed
158 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030159 flavor_name = rand_name(self.flavor_name_prefix)
160 new_flavor_id = rand_int_id(start=1000)
161
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200162 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100163 resp, flavor = self.client.create_flavor(flavor_name,
164 self.ram, self.vcpus,
165 self.disk,
166 new_flavor_id)
167 self.addCleanup(self.flavor_clean_up, flavor['id'])
168 self.assertEqual(200, resp.status)
169 self.assertEqual(flavor['name'], flavor_name)
170 self.assertEqual(flavor['ram'], self.ram)
171 self.assertEqual(flavor['vcpus'], self.vcpus)
172 self.assertEqual(flavor['disk'], self.disk)
173 self.assertEqual(int(flavor['id']), new_flavor_id)
174 self.assertEqual(flavor['swap'], '')
175 self.assertEqual(int(flavor['rxtx_factor']), 1)
176 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
177 if self._interface == "xml":
178 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
179 "flavor_access/api/v2"
180 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
181 self.assertEqual(flavor[key], "True")
182 if self._interface == "json":
183 self.assertEqual(flavor['os-flavor-access:is_public'], True)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530184
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200185 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100186 resp, flavor = self.client.get_flavor_details(new_flavor_id)
187 self.assertEqual(resp.status, 200)
188 self.assertEqual(flavor['name'], flavor_name)
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200189 # Check if flavor is present in list
Attila Fazekas2883fd52013-03-10 12:05:21 +0100190 resp, flavors = self.client.list_flavors_with_detail()
191 self.assertEqual(resp.status, 200)
192 for flavor in flavors:
193 if flavor['name'] == flavor_name:
194 flag = True
195 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530196
Giulio Fidente83181a92013-10-01 06:02:24 +0200197 @skip_because(bug="1209101")
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200198 @attr(type='gate')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530199 def test_list_non_public_flavor(self):
200 # Create a flavor with os-flavor-access:is_public false should
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200201 # be present in list_details.
202 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030203 flavor_name = rand_name(self.flavor_name_prefix)
204 new_flavor_id = rand_int_id(start=1000)
205
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200206 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100207 resp, flavor = self.client.create_flavor(flavor_name,
208 self.ram, self.vcpus,
209 self.disk,
210 new_flavor_id,
211 is_public="False")
212 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200213 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530214 flag = False
Attila Fazekas2883fd52013-03-10 12:05:21 +0100215 resp, flavors = self.client.list_flavors_with_detail()
216 self.assertEqual(resp.status, 200)
217 for flavor in flavors:
218 if flavor['name'] == flavor_name:
219 flag = True
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530220 self.assertTrue(flag)
221
222 # Verify flavor is not retrieved with other user
223 flag = False
224 resp, flavors = self.user_client.list_flavors_with_detail()
225 self.assertEqual(resp.status, 200)
226 for flavor in flavors:
227 if flavor['name'] == flavor_name:
228 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100229 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530230
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400231 @attr(type='gate')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900232 def test_create_server_with_non_public_flavor(self):
233 # Create a flavor with os-flavor-access:is_public false
234 flavor_name = rand_name(self.flavor_name_prefix)
235 new_flavor_id = rand_int_id(start=1000)
236
237 # Create the flavor
238 resp, flavor = self.client.create_flavor(flavor_name,
239 self.ram, self.vcpus,
240 self.disk,
241 new_flavor_id,
242 is_public="False")
243 self.addCleanup(self.flavor_clean_up, flavor['id'])
244 self.assertEqual(200, resp.status)
245
246 # Verify flavor is not used by other user
247 self.assertRaises(exceptions.BadRequest,
248 self.os.servers_client.create_server,
249 'test', self.image_ref, flavor['id'])
250
251 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530252 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200253 # Create a Flavor with public access.
254 # Try to List/Get flavor with another user
Chris Yeoh8abacf32013-01-21 17:08:32 +1030255 flavor_name = rand_name(self.flavor_name_prefix)
256 new_flavor_id = rand_int_id(start=1000)
257
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200258 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100259 resp, flavor = self.client.create_flavor(flavor_name,
260 self.ram, self.vcpus,
261 self.disk,
262 new_flavor_id,
263 is_public="True")
264 self.addCleanup(self.flavor_clean_up, flavor['id'])
265 flag = False
266 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200267 # Verify flavor is retrieved with new user
Attila Fazekas2883fd52013-03-10 12:05:21 +0100268 resp, flavors = self.new_client.list_flavors_with_detail()
269 self.assertEqual(resp.status, 200)
270 for flavor in flavors:
271 if flavor['name'] == flavor_name:
272 flag = True
273 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530274
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200275 @attr(type='gate')
Tiago Mello0d835d22013-02-06 13:57:50 -0500276 def test_is_public_string_variations(self):
Attila Fazekas2883fd52013-03-10 12:05:21 +0100277 flavor_id_not_public = rand_int_id(start=1000)
278 flavor_name_not_public = rand_name(self.flavor_name_prefix)
279 flavor_id_public = rand_int_id(start=1000)
280 flavor_name_public = rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500281
Attila Fazekas2883fd52013-03-10 12:05:21 +0100282 # Create a non public flavor
283 resp, flavor = self.client.create_flavor(flavor_name_not_public,
284 self.ram, self.vcpus,
285 self.disk,
286 flavor_id_not_public,
287 is_public="False")
288 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500289
Attila Fazekas2883fd52013-03-10 12:05:21 +0100290 # Create a public flavor
291 resp, flavor = self.client.create_flavor(flavor_name_public,
292 self.ram, self.vcpus,
293 self.disk,
294 flavor_id_public,
295 is_public="True")
296 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500297
Attila Fazekas2883fd52013-03-10 12:05:21 +0100298 def _flavor_lookup(flavors, flavor_name):
299 for flavor in flavors:
300 if flavor['name'] == flavor_name:
301 return flavor
302 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500303
Attila Fazekas2883fd52013-03-10 12:05:21 +0100304 def _test_string_variations(variations, flavor_name):
305 for string in variations:
306 params = {'is_public': string}
307 r, flavors = self.client.list_flavors_with_detail(params)
308 self.assertEqual(r.status, 200)
309 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200310 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500311
Attila Fazekas2883fd52013-03-10 12:05:21 +0100312 _test_string_variations(['f', 'false', 'no', '0'],
313 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500314
Attila Fazekas2883fd52013-03-10 12:05:21 +0100315 _test_string_variations(['t', 'true', 'yes', '1'],
316 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500317
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800318 @attr(type='gate')
319 def test_create_flavor_using_string_ram(self):
320 flavor_name = rand_name(self.flavor_name_prefix)
321 new_flavor_id = rand_int_id(start=1000)
322
323 ram = " 1024 "
324 resp, flavor = self.client.create_flavor(flavor_name,
325 ram, self.vcpus,
326 self.disk,
327 new_flavor_id)
328 self.addCleanup(self.flavor_clean_up, flavor['id'])
329 self.assertEqual(200, resp.status)
330 self.assertEqual(flavor['name'], flavor_name)
331 self.assertEqual(flavor['vcpus'], self.vcpus)
332 self.assertEqual(flavor['disk'], self.disk)
333 self.assertEqual(flavor['ram'], int(ram))
334 self.assertEqual(int(flavor['id']), new_flavor_id)
335
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400336 @attr(type=['negative', 'gate'])
Tiago Mellodb525252013-02-07 14:51:38 -0500337 def test_invalid_is_public_string(self):
338 self.assertRaises(exceptions.BadRequest,
339 self.client.list_flavors_with_detail,
340 {'is_public': 'invalid'})
341
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400342 @attr(type=['negative', 'gate'])
afazekascda40822013-03-25 16:50:41 +0100343 def test_create_flavor_as_user(self):
344 flavor_name = rand_name(self.flavor_name_prefix)
345 new_flavor_id = rand_int_id(start=1000)
346
347 self.assertRaises(exceptions.Unauthorized,
348 self.user_client.create_flavor,
349 flavor_name, self.ram, self.vcpus, self.disk,
350 new_flavor_id, ephemeral=self.ephemeral,
351 swap=self.swap, rxtx=self.rxtx)
352
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400353 @attr(type=['negative', 'gate'])
afazekascda40822013-03-25 16:50:41 +0100354 def test_delete_flavor_as_user(self):
355 self.assertRaises(exceptions.Unauthorized,
356 self.user_client.delete_flavor,
357 self.flavor_ref_alt)
Attila Fazekas4ba36582013-02-12 08:26:17 +0100358
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800359 @attr(type=['negative', 'gate'])
360 def test_create_flavor_using_invalid_ram(self):
361 flavor_name = rand_name(self.flavor_name_prefix)
362 new_flavor_id = rand_int_id(start=1000)
363
364 self.assertRaises(exceptions.BadRequest,
365 self.client.create_flavor,
366 flavor_name, -1, self.vcpus,
367 self.disk, new_flavor_id)
368
369 @attr(type=['negative', 'gate'])
370 def test_create_flavor_using_invalid_vcpus(self):
371 flavor_name = rand_name(self.flavor_name_prefix)
372 new_flavor_id = rand_int_id(start=1000)
373
374 self.assertRaises(exceptions.BadRequest,
375 self.client.create_flavor,
376 flavor_name, self.ram, 0,
377 self.disk, new_flavor_id)
378
Tiago Melloeda03b52012-08-22 23:47:29 -0300379
Attila Fazekas19044d52013-02-16 07:35:06 +0100380class FlavorsAdminTestXML(FlavorsAdminTestJSON):
381 _interface = 'xml'