blob: 7efd3c1cc1075f106d46a897d4a238ca5f1d2421 [file] [log] [blame]
Jay Pipes13b479b2012-06-11 14:52:27 -04001# 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
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +053018import testtools
19
Sean Dague1937d092013-05-17 16:36:38 -040020from tempest.api import compute
21from tempest.api.compute import base
Chris Yeoh8abacf32013-01-21 17:08:32 +103022from tempest.common.utils.data_utils import rand_int_id
23from tempest.common.utils.data_utils import rand_name
Tiago Mellodb525252013-02-07 14:51:38 -050024from tempest import exceptions
Chris Yeoh9465b0b2013-02-09 22:19:15 +103025from tempest.test import attr
Rohit Karajgi03530292012-04-24 17:00:50 -070026
27
Attila Fazekas19044d52013-02-16 07:35:06 +010028class FlavorsAdminTestJSON(base.BaseComputeAdminTest):
Rohit Karajgi03530292012-04-24 17:00:50 -070029
30 """
31 Tests Flavors API Create and Delete that require admin privileges
32 """
33
Attila Fazekas19044d52013-02-16 07:35:06 +010034 _interface = 'json'
35
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053036 @classmethod
Attila Fazekas19044d52013-02-16 07:35:06 +010037 def setUpClass(cls):
38 super(FlavorsAdminTestJSON, cls).setUpClass()
Jay Pipesf38eaac2012-06-21 13:37:35 -040039 if not compute.FLAVOR_EXTRA_DATA_ENABLED:
40 msg = "FlavorExtraData extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080041 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070042
Attila Fazekas4ba36582013-02-12 08:26:17 +010043 cls.client = cls.os_adm.flavors_client
afazekascda40822013-03-25 16:50:41 +010044 cls.user_client = cls.os.flavors_client
Chris Yeoh8abacf32013-01-21 17:08:32 +103045 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040046 cls.ram = 512
47 cls.vcpus = 1
48 cls.disk = 10
49 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040050 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053051 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070052
Attila Fazekas2883fd52013-03-10 12:05:21 +010053 def flavor_clean_up(self, flavor_id):
54 resp, body = self.client.delete_flavor(flavor_id)
55 self.assertEqual(resp.status, 202)
56 self.client.wait_for_resource_deletion(flavor_id)
57
Giulio Fidenteba3985a2013-05-29 01:46:36 +020058 @attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -070059 def test_create_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050060 # Create a flavor and ensure it is listed
61 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103062 flavor_name = rand_name(self.flavor_name_prefix)
63 new_flavor_id = rand_int_id(start=1000)
64
Attila Fazekasf7f34f92013-08-01 17:01:44 +020065 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +010066 resp, flavor = self.client.create_flavor(flavor_name,
67 self.ram, self.vcpus,
68 self.disk,
69 new_flavor_id,
70 ephemeral=self.ephemeral,
71 swap=self.swap,
72 rxtx=self.rxtx)
73 self.addCleanup(self.flavor_clean_up, flavor['id'])
74 self.assertEqual(200, resp.status)
75 self.assertEqual(flavor['name'], flavor_name)
76 self.assertEqual(flavor['vcpus'], self.vcpus)
77 self.assertEqual(flavor['disk'], self.disk)
78 self.assertEqual(flavor['ram'], self.ram)
79 self.assertEqual(int(flavor['id']), new_flavor_id)
80 self.assertEqual(flavor['swap'], self.swap)
81 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
82 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
83 self.ephemeral)
84 if self._interface == "xml":
85 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
86 "flavor_access/api/v2"
87 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
88 self.assertEqual(flavor[key], "True")
89 if self._interface == "json":
90 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070091
Attila Fazekasf7f34f92013-08-01 17:01:44 +020092 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +010093 resp, flavor = self.client.get_flavor_details(new_flavor_id)
94 self.assertEqual(resp.status, 200)
95 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070096
Giulio Fidenteba3985a2013-05-29 01:46:36 +020097 @attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -070098 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050099 # Create a flavor and ensure it's details are listed
100 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030101 flavor_name = rand_name(self.flavor_name_prefix)
102 new_flavor_id = rand_int_id(start=1000)
103
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200104 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100105 resp, flavor = self.client.create_flavor(flavor_name,
106 self.ram, self.vcpus,
107 self.disk,
108 new_flavor_id,
109 ephemeral=self.ephemeral,
110 swap=self.swap,
111 rxtx=self.rxtx)
112 self.addCleanup(self.flavor_clean_up, flavor['id'])
113 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200114 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100115 resp, flavors = self.client.list_flavors_with_detail()
116 self.assertEqual(resp.status, 200)
117 for flavor in flavors:
118 if flavor['name'] == flavor_name:
119 flag = True
120 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700121
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400122 @attr(type=['negative', 'gate'])
Rohit Karajgi03530292012-04-24 17:00:50 -0700123 def test_get_flavor_details_for_deleted_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500124 # Delete a flavor and ensure it is not listed
Rohit Karajgi03530292012-04-24 17:00:50 -0700125 # Create a test flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030126 flavor_name = rand_name(self.flavor_name_prefix)
127 new_flavor_id = rand_int_id(start=1000)
128
129 resp, flavor = self.client.create_flavor(flavor_name,
Jay Pipesf38eaac2012-06-21 13:37:35 -0400130 self.ram,
131 self.vcpus, self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030132 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530133 ephemeral=self.ephemeral,
134 swap=self.swap,
135 rxtx=self.rxtx)
Rohit Karajgi03530292012-04-24 17:00:50 -0700136 # Delete the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100137 new_flavor_id = flavor['id']
138 resp_delete, body = self.client.delete_flavor(new_flavor_id)
139 self.assertEquals(200, resp.status)
140 self.assertEquals(202, resp_delete.status)
Rohit Karajgi03530292012-04-24 17:00:50 -0700141
Dan Prince8581f532012-05-30 17:11:55 -0400142 # Deleted flavors can be seen via detailed GET
Chris Yeoh8abacf32013-01-21 17:08:32 +1030143 resp, flavor = self.client.get_flavor_details(new_flavor_id)
Dan Prince8581f532012-05-30 17:11:55 -0400144 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030145 self.assertEqual(flavor['name'], flavor_name)
Dan Prince8581f532012-05-30 17:11:55 -0400146
147 # Deleted flavors should not show up in a list however
Jay Pipesf38eaac2012-06-21 13:37:35 -0400148 resp, flavors = self.client.list_flavors_with_detail()
Dan Prince8581f532012-05-30 17:11:55 -0400149 self.assertEqual(resp.status, 200)
150 flag = True
151 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030152 if flavor['name'] == flavor_name:
Dan Prince8581f532012-05-30 17:11:55 -0400153 flag = False
154 self.assertTrue(flag)
Tiago Melloeda03b52012-08-22 23:47:29 -0300155
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400156 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530157 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200158 # Create a flavor and ensure it is listed
159 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030160 flavor_name = rand_name(self.flavor_name_prefix)
161 new_flavor_id = rand_int_id(start=1000)
162
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200163 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100164 resp, flavor = self.client.create_flavor(flavor_name,
165 self.ram, self.vcpus,
166 self.disk,
167 new_flavor_id)
168 self.addCleanup(self.flavor_clean_up, flavor['id'])
169 self.assertEqual(200, resp.status)
170 self.assertEqual(flavor['name'], flavor_name)
171 self.assertEqual(flavor['ram'], self.ram)
172 self.assertEqual(flavor['vcpus'], self.vcpus)
173 self.assertEqual(flavor['disk'], self.disk)
174 self.assertEqual(int(flavor['id']), new_flavor_id)
175 self.assertEqual(flavor['swap'], '')
176 self.assertEqual(int(flavor['rxtx_factor']), 1)
177 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
178 if self._interface == "xml":
179 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
180 "flavor_access/api/v2"
181 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
182 self.assertEqual(flavor[key], "True")
183 if self._interface == "json":
184 self.assertEqual(flavor['os-flavor-access:is_public'], True)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530185
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200186 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100187 resp, flavor = self.client.get_flavor_details(new_flavor_id)
188 self.assertEqual(resp.status, 200)
189 self.assertEqual(flavor['name'], flavor_name)
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200190 # Check if flavor is present in list
Attila Fazekas2883fd52013-03-10 12:05:21 +0100191 resp, flavors = self.client.list_flavors_with_detail()
192 self.assertEqual(resp.status, 200)
193 for flavor in flavors:
194 if flavor['name'] == flavor_name:
195 flag = True
196 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530197
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530198 @testtools.skip("Skipped until the Bug #1209101 is resolved")
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200199 @attr(type='gate')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530200 def test_list_non_public_flavor(self):
201 # Create a flavor with os-flavor-access:is_public false should
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200202 # be present in list_details.
203 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030204 flavor_name = rand_name(self.flavor_name_prefix)
205 new_flavor_id = rand_int_id(start=1000)
206
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200207 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100208 resp, flavor = self.client.create_flavor(flavor_name,
209 self.ram, self.vcpus,
210 self.disk,
211 new_flavor_id,
212 is_public="False")
213 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200214 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530215 flag = False
Attila Fazekas2883fd52013-03-10 12:05:21 +0100216 resp, flavors = self.client.list_flavors_with_detail()
217 self.assertEqual(resp.status, 200)
218 for flavor in flavors:
219 if flavor['name'] == flavor_name:
220 flag = True
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530221 self.assertTrue(flag)
222
223 # Verify flavor is not retrieved with other user
224 flag = False
225 resp, flavors = self.user_client.list_flavors_with_detail()
226 self.assertEqual(resp.status, 200)
227 for flavor in flavors:
228 if flavor['name'] == flavor_name:
229 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100230 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530231
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400232 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530233 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200234 # Create a Flavor with public access.
235 # Try to List/Get flavor with another user
Chris Yeoh8abacf32013-01-21 17:08:32 +1030236 flavor_name = rand_name(self.flavor_name_prefix)
237 new_flavor_id = rand_int_id(start=1000)
238
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200239 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100240 resp, flavor = self.client.create_flavor(flavor_name,
241 self.ram, self.vcpus,
242 self.disk,
243 new_flavor_id,
244 is_public="True")
245 self.addCleanup(self.flavor_clean_up, flavor['id'])
246 flag = False
247 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200248 # Verify flavor is retrieved with new user
Attila Fazekas2883fd52013-03-10 12:05:21 +0100249 resp, flavors = self.new_client.list_flavors_with_detail()
250 self.assertEqual(resp.status, 200)
251 for flavor in flavors:
252 if flavor['name'] == flavor_name:
253 flag = True
254 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530255
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200256 @attr(type='gate')
Tiago Mello0d835d22013-02-06 13:57:50 -0500257 def test_is_public_string_variations(self):
Attila Fazekas2883fd52013-03-10 12:05:21 +0100258 flavor_id_not_public = rand_int_id(start=1000)
259 flavor_name_not_public = rand_name(self.flavor_name_prefix)
260 flavor_id_public = rand_int_id(start=1000)
261 flavor_name_public = rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500262
Attila Fazekas2883fd52013-03-10 12:05:21 +0100263 # Create a non public flavor
264 resp, flavor = self.client.create_flavor(flavor_name_not_public,
265 self.ram, self.vcpus,
266 self.disk,
267 flavor_id_not_public,
268 is_public="False")
269 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500270
Attila Fazekas2883fd52013-03-10 12:05:21 +0100271 # Create a public flavor
272 resp, flavor = self.client.create_flavor(flavor_name_public,
273 self.ram, self.vcpus,
274 self.disk,
275 flavor_id_public,
276 is_public="True")
277 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500278
Attila Fazekas2883fd52013-03-10 12:05:21 +0100279 def _flavor_lookup(flavors, flavor_name):
280 for flavor in flavors:
281 if flavor['name'] == flavor_name:
282 return flavor
283 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500284
Attila Fazekas2883fd52013-03-10 12:05:21 +0100285 def _test_string_variations(variations, flavor_name):
286 for string in variations:
287 params = {'is_public': string}
288 r, flavors = self.client.list_flavors_with_detail(params)
289 self.assertEqual(r.status, 200)
290 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200291 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500292
Attila Fazekas2883fd52013-03-10 12:05:21 +0100293 _test_string_variations(['f', 'false', 'no', '0'],
294 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500295
Attila Fazekas2883fd52013-03-10 12:05:21 +0100296 _test_string_variations(['t', 'true', 'yes', '1'],
297 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500298
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800299 @attr(type='gate')
300 def test_create_flavor_using_string_ram(self):
301 flavor_name = rand_name(self.flavor_name_prefix)
302 new_flavor_id = rand_int_id(start=1000)
303
304 ram = " 1024 "
305 resp, flavor = self.client.create_flavor(flavor_name,
306 ram, self.vcpus,
307 self.disk,
308 new_flavor_id)
309 self.addCleanup(self.flavor_clean_up, flavor['id'])
310 self.assertEqual(200, resp.status)
311 self.assertEqual(flavor['name'], flavor_name)
312 self.assertEqual(flavor['vcpus'], self.vcpus)
313 self.assertEqual(flavor['disk'], self.disk)
314 self.assertEqual(flavor['ram'], int(ram))
315 self.assertEqual(int(flavor['id']), new_flavor_id)
316
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400317 @attr(type=['negative', 'gate'])
Tiago Mellodb525252013-02-07 14:51:38 -0500318 def test_invalid_is_public_string(self):
319 self.assertRaises(exceptions.BadRequest,
320 self.client.list_flavors_with_detail,
321 {'is_public': 'invalid'})
322
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400323 @attr(type=['negative', 'gate'])
afazekascda40822013-03-25 16:50:41 +0100324 def test_create_flavor_as_user(self):
325 flavor_name = rand_name(self.flavor_name_prefix)
326 new_flavor_id = rand_int_id(start=1000)
327
328 self.assertRaises(exceptions.Unauthorized,
329 self.user_client.create_flavor,
330 flavor_name, self.ram, self.vcpus, self.disk,
331 new_flavor_id, ephemeral=self.ephemeral,
332 swap=self.swap, rxtx=self.rxtx)
333
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400334 @attr(type=['negative', 'gate'])
afazekascda40822013-03-25 16:50:41 +0100335 def test_delete_flavor_as_user(self):
336 self.assertRaises(exceptions.Unauthorized,
337 self.user_client.delete_flavor,
338 self.flavor_ref_alt)
Attila Fazekas4ba36582013-02-12 08:26:17 +0100339
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800340 @attr(type=['negative', 'gate'])
341 def test_create_flavor_using_invalid_ram(self):
342 flavor_name = rand_name(self.flavor_name_prefix)
343 new_flavor_id = rand_int_id(start=1000)
344
345 self.assertRaises(exceptions.BadRequest,
346 self.client.create_flavor,
347 flavor_name, -1, self.vcpus,
348 self.disk, new_flavor_id)
349
350 @attr(type=['negative', 'gate'])
351 def test_create_flavor_using_invalid_vcpus(self):
352 flavor_name = rand_name(self.flavor_name_prefix)
353 new_flavor_id = rand_int_id(start=1000)
354
355 self.assertRaises(exceptions.BadRequest,
356 self.client.create_flavor,
357 flavor_name, self.ram, 0,
358 self.disk, new_flavor_id)
359
Tiago Melloeda03b52012-08-22 23:47:29 -0300360
Attila Fazekas19044d52013-02-16 07:35:06 +0100361class FlavorsAdminTestXML(FlavorsAdminTestJSON):
362 _interface = 'xml'