blob: 32b06f8ac54517fb541722fe06fbbc6cd9dd09b3 [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
Chris Yeoh8abacf32013-01-21 17:08:32 +103018from tempest.common.utils.data_utils import rand_int_id
19from tempest.common.utils.data_utils import rand_name
Tiago Mellodb525252013-02-07 14:51:38 -050020from tempest import exceptions
Chris Yeoh9465b0b2013-02-09 22:19:15 +103021from tempest.test import attr
Jay Pipesf38eaac2012-06-21 13:37:35 -040022from tempest.tests import compute
Matthew Treinisha83a16e2012-12-07 13:44:02 -050023from tempest.tests.compute import base
Rohit Karajgi03530292012-04-24 17:00:50 -070024
25
Attila Fazekas19044d52013-02-16 07:35:06 +010026class FlavorsAdminTestJSON(base.BaseComputeAdminTest):
Rohit Karajgi03530292012-04-24 17:00:50 -070027
28 """
29 Tests Flavors API Create and Delete that require admin privileges
30 """
31
Attila Fazekas19044d52013-02-16 07:35:06 +010032 _interface = 'json'
33
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053034 @classmethod
Attila Fazekas19044d52013-02-16 07:35:06 +010035 def setUpClass(cls):
36 super(FlavorsAdminTestJSON, cls).setUpClass()
Jay Pipesf38eaac2012-06-21 13:37:35 -040037 if not compute.FLAVOR_EXTRA_DATA_ENABLED:
38 msg = "FlavorExtraData extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080039 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070040
Attila Fazekas4ba36582013-02-12 08:26:17 +010041 cls.client = cls.os_adm.flavors_client
afazekascda40822013-03-25 16:50:41 +010042 cls.user_client = cls.os.flavors_client
Chris Yeoh8abacf32013-01-21 17:08:32 +103043 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040044 cls.ram = 512
45 cls.vcpus = 1
46 cls.disk = 10
47 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040048 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053049 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070050
51 @attr(type='positive')
52 def test_create_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050053 # Create a flavor and ensure it is listed
54 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103055 flavor_name = rand_name(self.flavor_name_prefix)
56 new_flavor_id = rand_int_id(start=1000)
57
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053058 try:
59 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +103060 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053061 self.ram, self.vcpus,
62 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +103063 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053064 ephemeral=self.ephemeral,
65 swap=self.swap,
66 rxtx=self.rxtx)
67 self.assertEqual(200, resp.status)
Chris Yeoh8abacf32013-01-21 17:08:32 +103068 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053069 self.assertEqual(flavor['vcpus'], self.vcpus)
70 self.assertEqual(flavor['disk'], self.disk)
71 self.assertEqual(flavor['ram'], self.ram)
Chris Yeoh8abacf32013-01-21 17:08:32 +103072 self.assertEqual(int(flavor['id']), new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053073 self.assertEqual(flavor['swap'], self.swap)
74 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
75 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
76 self.ephemeral)
James E. Blaire6d8ee12013-01-18 21:33:45 +000077 if self._interface == "xml":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053078 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
79 "flavor_access/api/v2"
80 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
81 self.assertEqual(flavor[key], "True")
James E. Blaire6d8ee12013-01-18 21:33:45 +000082 if self._interface == "json":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053083 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070084
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053085 #Verify flavor is retrieved
Chris Yeoh8abacf32013-01-21 17:08:32 +103086 resp, flavor = self.client.get_flavor_details(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053087 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +103088 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070089
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053090 finally:
91 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +103092 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053093 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +103094 self.client.wait_for_resource_deletion(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -070095
96 @attr(type='positive')
97 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
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530103 try:
104 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030105 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530106 self.ram, self.vcpus,
107 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030108 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530109 ephemeral=self.ephemeral,
110 swap=self.swap,
111 rxtx=self.rxtx)
112 flag = False
113 #Verify flavor is retrieved
114 resp, flavors = self.client.list_flavors_with_detail()
115 self.assertEqual(resp.status, 200)
116 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030117 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530118 flag = True
119 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700120
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530121 finally:
122 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030123 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530124 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030125 self.client.wait_for_resource_deletion(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -0700126
127 @attr(type='negative')
128 def test_get_flavor_details_for_deleted_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500129 # Delete a flavor and ensure it is not listed
Rohit Karajgi03530292012-04-24 17:00:50 -0700130 # Create a test flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030131 flavor_name = rand_name(self.flavor_name_prefix)
132 new_flavor_id = rand_int_id(start=1000)
133
134 resp, flavor = self.client.create_flavor(flavor_name,
Jay Pipesf38eaac2012-06-21 13:37:35 -0400135 self.ram,
136 self.vcpus, self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030137 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530138 ephemeral=self.ephemeral,
139 swap=self.swap,
140 rxtx=self.rxtx)
Rohit Karajgi03530292012-04-24 17:00:50 -0700141 self.assertEquals(200, resp.status)
142
143 # Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030144 resp, _ = self.client.delete_flavor(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -0700145 self.assertEqual(resp.status, 202)
146
Dan Prince8581f532012-05-30 17:11:55 -0400147 # Deleted flavors can be seen via detailed GET
Chris Yeoh8abacf32013-01-21 17:08:32 +1030148 resp, flavor = self.client.get_flavor_details(new_flavor_id)
Dan Prince8581f532012-05-30 17:11:55 -0400149 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030150 self.assertEqual(flavor['name'], flavor_name)
Dan Prince8581f532012-05-30 17:11:55 -0400151
152 # Deleted flavors should not show up in a list however
Jay Pipesf38eaac2012-06-21 13:37:35 -0400153 resp, flavors = self.client.list_flavors_with_detail()
Dan Prince8581f532012-05-30 17:11:55 -0400154 self.assertEqual(resp.status, 200)
155 flag = True
156 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030157 if flavor['name'] == flavor_name:
Dan Prince8581f532012-05-30 17:11:55 -0400158 flag = False
159 self.assertTrue(flag)
Tiago Melloeda03b52012-08-22 23:47:29 -0300160
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530161 def test_create_list_flavor_without_extra_data(self):
162 #Create a flavor and ensure it is listed
163 #This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030164 flavor_name = rand_name(self.flavor_name_prefix)
165 new_flavor_id = rand_int_id(start=1000)
166
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530167 try:
168 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030169 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530170 self.ram, self.vcpus,
171 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030172 new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530173 self.assertEqual(200, resp.status)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030174 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530175 self.assertEqual(flavor['ram'], self.ram)
176 self.assertEqual(flavor['vcpus'], self.vcpus)
177 self.assertEqual(flavor['disk'], self.disk)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030178 self.assertEqual(int(flavor['id']), new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530179 self.assertEqual(flavor['swap'], '')
180 self.assertEqual(int(flavor['rxtx_factor']), 1)
181 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
James E. Blaire6d8ee12013-01-18 21:33:45 +0000182 if self._interface == "xml":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530183 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
184 "flavor_access/api/v2"
185 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
186 self.assertEqual(flavor[key], "True")
James E. Blaire6d8ee12013-01-18 21:33:45 +0000187 if self._interface == "json":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530188 self.assertEqual(flavor['os-flavor-access:is_public'], True)
189
190 #Verify flavor is retrieved
Chris Yeoh8abacf32013-01-21 17:08:32 +1030191 resp, flavor = self.client.get_flavor_details(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530192 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030193 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530194 #Check if flavor is present in list
195 resp, flavors = self.client.list_flavors_with_detail()
196 self.assertEqual(resp.status, 200)
197 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030198 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530199 flag = True
200 self.assertTrue(flag)
201
202 finally:
203 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030204 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530205 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030206 self.client.wait_for_resource_deletion(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530207
208 @attr(type='positive')
209 def test_flavor_not_public_verify_entry_not_in_list_details(self):
210 #Create a flavor with os-flavor-access:is_public false should not
211 #be present in list_details.
212 #This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030213 flavor_name = rand_name(self.flavor_name_prefix)
214 new_flavor_id = rand_int_id(start=1000)
215
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530216 try:
217 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030218 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530219 self.ram, self.vcpus,
220 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030221 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530222 is_public="False")
223 flag = False
224 #Verify flavor is retrieved
225 resp, flavors = self.client.list_flavors_with_detail()
226 self.assertEqual(resp.status, 200)
227 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030228 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530229 flag = True
230 self.assertFalse(flag)
231 finally:
232 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030233 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530234 self.assertEqual(resp.status, 202)
235
236 def test_list_public_flavor_with_other_user(self):
237 #Create a Flavor with public access.
238 #Try to List/Get flavor with another user
Chris Yeoh8abacf32013-01-21 17:08:32 +1030239 flavor_name = rand_name(self.flavor_name_prefix)
240 new_flavor_id = rand_int_id(start=1000)
241
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530242 try:
243 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030244 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530245 self.ram, self.vcpus,
246 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030247 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530248 is_public="True")
249 flag = False
250 self.new_client = self.flavors_client
251 #Verify flavor is retrieved with new user
252 resp, flavors = self.new_client.list_flavors_with_detail()
253 self.assertEqual(resp.status, 200)
254 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030255 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530256 flag = True
257 self.assertTrue(flag)
258 finally:
259 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030260 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530261 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030262 self.client.wait_for_resource_deletion(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530263
Tiago Mello0d835d22013-02-06 13:57:50 -0500264 @attr(type='positive')
265 def test_is_public_string_variations(self):
266 try:
267 flavor_id_not_public = rand_int_id(start=1000)
268 flavor_name_not_public = rand_name(self.flavor_name_prefix)
269 flavor_id_public = rand_int_id(start=1000)
270 flavor_name_public = rand_name(self.flavor_name_prefix)
271
272 # Create a non public flavor
273 resp, flavor = self.client.create_flavor(flavor_name_not_public,
274 self.ram, self.vcpus,
275 self.disk,
276 flavor_id_not_public,
277 is_public="False")
278
279 # Create a public flavor
280 resp, flavor = self.client.create_flavor(flavor_name_public,
281 self.ram, self.vcpus,
282 self.disk,
283 flavor_id_public,
284 is_public="True")
285
286 def _flavor_lookup(flavors, flavor_name):
287 for flavor in flavors:
288 if flavor['name'] == flavor_name:
289 return flavor
290 return None
291
292 def _test_string_variations(variations, flavor_name):
293 for string in variations:
294 params = {'is_public': string}
295 r, flavors = self.client.list_flavors_with_detail(params)
296 self.assertEqual(r.status, 200)
297 flavor = _flavor_lookup(flavors, flavor_name)
298 self.assertNotEqual(flavor, None)
299
300 _test_string_variations(['f', 'false', 'no', '0'],
301 flavor_name_not_public)
302
303 _test_string_variations(['t', 'true', 'yes', '1'],
304 flavor_name_public)
305
306 finally:
307 # Delete flavors
308 for flavor_id in [flavor_id_not_public, flavor_id_public]:
309 resp, body = self.client.delete_flavor(flavor_id)
310 self.assertEqual(resp.status, 202)
311 self.client.wait_for_resource_deletion(flavor_id)
312
Tiago Mellodb525252013-02-07 14:51:38 -0500313 @attr(type='negative')
314 def test_invalid_is_public_string(self):
315 self.assertRaises(exceptions.BadRequest,
316 self.client.list_flavors_with_detail,
317 {'is_public': 'invalid'})
318
afazekascda40822013-03-25 16:50:41 +0100319 @attr(type='negative')
320 def test_create_flavor_as_user(self):
321 flavor_name = rand_name(self.flavor_name_prefix)
322 new_flavor_id = rand_int_id(start=1000)
323
324 self.assertRaises(exceptions.Unauthorized,
325 self.user_client.create_flavor,
326 flavor_name, self.ram, self.vcpus, self.disk,
327 new_flavor_id, ephemeral=self.ephemeral,
328 swap=self.swap, rxtx=self.rxtx)
329
330 @attr(type='negative')
331 def test_delete_flavor_as_user(self):
332 self.assertRaises(exceptions.Unauthorized,
333 self.user_client.delete_flavor,
334 self.flavor_ref_alt)
Attila Fazekas4ba36582013-02-12 08:26:17 +0100335
Tiago Melloeda03b52012-08-22 23:47:29 -0300336
Attila Fazekas19044d52013-02-16 07:35:06 +0100337class FlavorsAdminTestXML(FlavorsAdminTestJSON):
338 _interface = 'xml'