blob: 296766628ec3fba75a3e645dd1dde5adba058c74 [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
Rohit Karajgi03530292012-04-24 17:00:50 -070018from nose.plugins.attrib import attr
ivan-zhu1feeb382013-01-24 10:14:39 +080019import testtools
Jay Pipes13b479b2012-06-11 14:52:27 -040020
Chris Yeoh8abacf32013-01-21 17:08:32 +103021from tempest.common.utils.data_utils import rand_int_id
22from tempest.common.utils.data_utils import rand_name
Jay Pipesf38eaac2012-06-21 13:37:35 -040023from tempest.tests import compute
Matthew Treinisha83a16e2012-12-07 13:44:02 -050024from tempest.tests.compute import base
Rohit Karajgi03530292012-04-24 17:00:50 -070025
26
Tiago Melloeda03b52012-08-22 23:47:29 -030027class FlavorsAdminTestBase(object):
Rohit Karajgi03530292012-04-24 17:00:50 -070028
29 """
30 Tests Flavors API Create and Delete that require admin privileges
31 """
32
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053033 @classmethod
34 def setUpClass(self, cls):
Jay Pipesf38eaac2012-06-21 13:37:35 -040035 if not compute.FLAVOR_EXTRA_DATA_ENABLED:
36 msg = "FlavorExtraData extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080037 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070038
Jay Pipesf38eaac2012-06-21 13:37:35 -040039 cls.client = cls.os.flavors_client
Chris Yeoh8abacf32013-01-21 17:08:32 +103040 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040041 cls.ram = 512
42 cls.vcpus = 1
43 cls.disk = 10
44 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040045 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053046 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070047
48 @attr(type='positive')
49 def test_create_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050050 # Create a flavor and ensure it is listed
51 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103052 flavor_name = rand_name(self.flavor_name_prefix)
53 new_flavor_id = rand_int_id(start=1000)
54
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053055 try:
56 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +103057 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053058 self.ram, self.vcpus,
59 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +103060 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053061 ephemeral=self.ephemeral,
62 swap=self.swap,
63 rxtx=self.rxtx)
64 self.assertEqual(200, resp.status)
Chris Yeoh8abacf32013-01-21 17:08:32 +103065 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053066 self.assertEqual(flavor['vcpus'], self.vcpus)
67 self.assertEqual(flavor['disk'], self.disk)
68 self.assertEqual(flavor['ram'], self.ram)
Chris Yeoh8abacf32013-01-21 17:08:32 +103069 self.assertEqual(int(flavor['id']), new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053070 self.assertEqual(flavor['swap'], self.swap)
71 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
72 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
73 self.ephemeral)
James E. Blaire6d8ee12013-01-18 21:33:45 +000074 if self._interface == "xml":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053075 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
76 "flavor_access/api/v2"
77 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
78 self.assertEqual(flavor[key], "True")
James E. Blaire6d8ee12013-01-18 21:33:45 +000079 if self._interface == "json":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053080 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070081
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053082 #Verify flavor is retrieved
Chris Yeoh8abacf32013-01-21 17:08:32 +103083 resp, flavor = self.client.get_flavor_details(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053084 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +103085 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070086
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053087 finally:
88 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +103089 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053090 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +103091 self.client.wait_for_resource_deletion(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -070092
93 @attr(type='positive')
94 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050095 # Create a flavor and ensure it's details are listed
96 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103097 flavor_name = rand_name(self.flavor_name_prefix)
98 new_flavor_id = rand_int_id(start=1000)
99
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530100 try:
101 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030102 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530103 self.ram, self.vcpus,
104 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030105 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530106 ephemeral=self.ephemeral,
107 swap=self.swap,
108 rxtx=self.rxtx)
109 flag = False
110 #Verify flavor is retrieved
111 resp, flavors = self.client.list_flavors_with_detail()
112 self.assertEqual(resp.status, 200)
113 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030114 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530115 flag = True
116 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700117
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530118 finally:
119 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030120 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530121 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030122 self.client.wait_for_resource_deletion(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -0700123
124 @attr(type='negative')
125 def test_get_flavor_details_for_deleted_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500126 # Delete a flavor and ensure it is not listed
Rohit Karajgi03530292012-04-24 17:00:50 -0700127 # Create a test flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030128 flavor_name = rand_name(self.flavor_name_prefix)
129 new_flavor_id = rand_int_id(start=1000)
130
131 resp, flavor = self.client.create_flavor(flavor_name,
Jay Pipesf38eaac2012-06-21 13:37:35 -0400132 self.ram,
133 self.vcpus, self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030134 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530135 ephemeral=self.ephemeral,
136 swap=self.swap,
137 rxtx=self.rxtx)
Rohit Karajgi03530292012-04-24 17:00:50 -0700138 self.assertEquals(200, resp.status)
139
140 # Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030141 resp, _ = self.client.delete_flavor(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -0700142 self.assertEqual(resp.status, 202)
143
Dan Prince8581f532012-05-30 17:11:55 -0400144 # Deleted flavors can be seen via detailed GET
Chris Yeoh8abacf32013-01-21 17:08:32 +1030145 resp, flavor = self.client.get_flavor_details(new_flavor_id)
Dan Prince8581f532012-05-30 17:11:55 -0400146 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030147 self.assertEqual(flavor['name'], flavor_name)
Dan Prince8581f532012-05-30 17:11:55 -0400148
149 # Deleted flavors should not show up in a list however
Jay Pipesf38eaac2012-06-21 13:37:35 -0400150 resp, flavors = self.client.list_flavors_with_detail()
Dan Prince8581f532012-05-30 17:11:55 -0400151 self.assertEqual(resp.status, 200)
152 flag = True
153 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030154 if flavor['name'] == flavor_name:
Dan Prince8581f532012-05-30 17:11:55 -0400155 flag = False
156 self.assertTrue(flag)
Tiago Melloeda03b52012-08-22 23:47:29 -0300157
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530158 def test_create_list_flavor_without_extra_data(self):
159 #Create a flavor and ensure it is listed
160 #This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030161 flavor_name = rand_name(self.flavor_name_prefix)
162 new_flavor_id = rand_int_id(start=1000)
163
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530164 try:
165 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030166 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530167 self.ram, self.vcpus,
168 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030169 new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530170 self.assertEqual(200, resp.status)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030171 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530172 self.assertEqual(flavor['ram'], self.ram)
173 self.assertEqual(flavor['vcpus'], self.vcpus)
174 self.assertEqual(flavor['disk'], self.disk)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030175 self.assertEqual(int(flavor['id']), new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530176 self.assertEqual(flavor['swap'], '')
177 self.assertEqual(int(flavor['rxtx_factor']), 1)
178 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
James E. Blaire6d8ee12013-01-18 21:33:45 +0000179 if self._interface == "xml":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530180 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
181 "flavor_access/api/v2"
182 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
183 self.assertEqual(flavor[key], "True")
James E. Blaire6d8ee12013-01-18 21:33:45 +0000184 if self._interface == "json":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530185 self.assertEqual(flavor['os-flavor-access:is_public'], True)
186
187 #Verify flavor is retrieved
Chris Yeoh8abacf32013-01-21 17:08:32 +1030188 resp, flavor = self.client.get_flavor_details(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530189 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030190 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530191 #Check if flavor is present in list
192 resp, flavors = self.client.list_flavors_with_detail()
193 self.assertEqual(resp.status, 200)
194 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030195 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530196 flag = True
197 self.assertTrue(flag)
198
199 finally:
200 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030201 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530202 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030203 self.client.wait_for_resource_deletion(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530204
205 @attr(type='positive')
206 def test_flavor_not_public_verify_entry_not_in_list_details(self):
207 #Create a flavor with os-flavor-access:is_public false should not
208 #be present in list_details.
209 #This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030210 flavor_name = rand_name(self.flavor_name_prefix)
211 new_flavor_id = rand_int_id(start=1000)
212
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530213 try:
214 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030215 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530216 self.ram, self.vcpus,
217 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030218 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530219 is_public="False")
220 flag = False
221 #Verify flavor is retrieved
222 resp, flavors = self.client.list_flavors_with_detail()
223 self.assertEqual(resp.status, 200)
224 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030225 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530226 flag = True
227 self.assertFalse(flag)
228 finally:
229 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030230 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530231 self.assertEqual(resp.status, 202)
232
233 def test_list_public_flavor_with_other_user(self):
234 #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
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530239 try:
240 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030241 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530242 self.ram, self.vcpus,
243 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030244 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530245 is_public="True")
246 flag = False
247 self.new_client = self.flavors_client
248 #Verify flavor is retrieved with new user
249 resp, flavors = self.new_client.list_flavors_with_detail()
250 self.assertEqual(resp.status, 200)
251 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030252 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530253 flag = True
254 self.assertTrue(flag)
255 finally:
256 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030257 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530258 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030259 self.client.wait_for_resource_deletion(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530260
Tiago Mello0d835d22013-02-06 13:57:50 -0500261 @attr(type='positive')
262 def test_is_public_string_variations(self):
263 try:
264 flavor_id_not_public = rand_int_id(start=1000)
265 flavor_name_not_public = rand_name(self.flavor_name_prefix)
266 flavor_id_public = rand_int_id(start=1000)
267 flavor_name_public = rand_name(self.flavor_name_prefix)
268
269 # Create a non public flavor
270 resp, flavor = self.client.create_flavor(flavor_name_not_public,
271 self.ram, self.vcpus,
272 self.disk,
273 flavor_id_not_public,
274 is_public="False")
275
276 # Create a public flavor
277 resp, flavor = self.client.create_flavor(flavor_name_public,
278 self.ram, self.vcpus,
279 self.disk,
280 flavor_id_public,
281 is_public="True")
282
283 def _flavor_lookup(flavors, flavor_name):
284 for flavor in flavors:
285 if flavor['name'] == flavor_name:
286 return flavor
287 return None
288
289 def _test_string_variations(variations, flavor_name):
290 for string in variations:
291 params = {'is_public': string}
292 r, flavors = self.client.list_flavors_with_detail(params)
293 self.assertEqual(r.status, 200)
294 flavor = _flavor_lookup(flavors, flavor_name)
295 self.assertNotEqual(flavor, None)
296
297 _test_string_variations(['f', 'false', 'no', '0'],
298 flavor_name_not_public)
299
300 _test_string_variations(['t', 'true', 'yes', '1'],
301 flavor_name_public)
302
303 finally:
304 # Delete flavors
305 for flavor_id in [flavor_id_not_public, flavor_id_public]:
306 resp, body = self.client.delete_flavor(flavor_id)
307 self.assertEqual(resp.status, 202)
308 self.client.wait_for_resource_deletion(flavor_id)
309
Tiago Melloeda03b52012-08-22 23:47:29 -0300310
James E. Blaire6d8ee12013-01-18 21:33:45 +0000311class FlavorsAdminTestXML(base.BaseComputeAdminTestXML,
312 base.BaseComputeTestXML,
313 FlavorsAdminTestBase):
Tiago Melloeda03b52012-08-22 23:47:29 -0300314
315 @classmethod
316 def setUpClass(cls):
James E. Blaire6d8ee12013-01-18 21:33:45 +0000317 super(FlavorsAdminTestXML, cls).setUpClass()
318 base.BaseComputeTestXML.setUpClass()
319 FlavorsAdminTestBase.setUpClass(cls)
320
321
322class FlavorsAdminTestJSON(base.BaseComputeAdminTestJSON,
323 base.BaseComputeTestJSON,
324 FlavorsAdminTestBase):
325
326 @classmethod
327 def setUpClass(cls):
328 super(FlavorsAdminTestJSON, cls).setUpClass()
329 base.BaseComputeTestJSON.setUpClass()
Tiago Melloeda03b52012-08-22 23:47:29 -0300330 FlavorsAdminTestBase.setUpClass(cls)