blob: 30c3d59c2c1b9f994e61082dce9d3cda1f310b5f [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
Tiago Melloeda03b52012-08-22 23:47:29 -030026class FlavorsAdminTestBase(object):
Rohit Karajgi03530292012-04-24 17:00:50 -070027
28 """
29 Tests Flavors API Create and Delete that require admin privileges
30 """
31
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053032 @classmethod
33 def setUpClass(self, cls):
Jay Pipesf38eaac2012-06-21 13:37:35 -040034 if not compute.FLAVOR_EXTRA_DATA_ENABLED:
35 msg = "FlavorExtraData extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080036 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070037
Attila Fazekas4ba36582013-02-12 08:26:17 +010038 cls.client = cls.os_adm.flavors_client
Chris Yeoh8abacf32013-01-21 17:08:32 +103039 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040040 cls.ram = 512
41 cls.vcpus = 1
42 cls.disk = 10
43 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040044 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053045 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070046
47 @attr(type='positive')
48 def test_create_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050049 # Create a flavor and ensure it is listed
50 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103051 flavor_name = rand_name(self.flavor_name_prefix)
52 new_flavor_id = rand_int_id(start=1000)
53
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053054 try:
55 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +103056 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053057 self.ram, self.vcpus,
58 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +103059 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053060 ephemeral=self.ephemeral,
61 swap=self.swap,
62 rxtx=self.rxtx)
63 self.assertEqual(200, resp.status)
Chris Yeoh8abacf32013-01-21 17:08:32 +103064 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053065 self.assertEqual(flavor['vcpus'], self.vcpus)
66 self.assertEqual(flavor['disk'], self.disk)
67 self.assertEqual(flavor['ram'], self.ram)
Chris Yeoh8abacf32013-01-21 17:08:32 +103068 self.assertEqual(int(flavor['id']), new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053069 self.assertEqual(flavor['swap'], self.swap)
70 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
71 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
72 self.ephemeral)
James E. Blaire6d8ee12013-01-18 21:33:45 +000073 if self._interface == "xml":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053074 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
75 "flavor_access/api/v2"
76 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
77 self.assertEqual(flavor[key], "True")
James E. Blaire6d8ee12013-01-18 21:33:45 +000078 if self._interface == "json":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053079 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070080
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053081 #Verify flavor is retrieved
Chris Yeoh8abacf32013-01-21 17:08:32 +103082 resp, flavor = self.client.get_flavor_details(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053083 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +103084 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070085
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053086 finally:
87 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +103088 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053089 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +103090 self.client.wait_for_resource_deletion(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -070091
92 @attr(type='positive')
93 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050094 # Create a flavor and ensure it's details are listed
95 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103096 flavor_name = rand_name(self.flavor_name_prefix)
97 new_flavor_id = rand_int_id(start=1000)
98
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053099 try:
100 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030101 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530102 self.ram, self.vcpus,
103 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030104 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530105 ephemeral=self.ephemeral,
106 swap=self.swap,
107 rxtx=self.rxtx)
108 flag = False
109 #Verify flavor is retrieved
110 resp, flavors = self.client.list_flavors_with_detail()
111 self.assertEqual(resp.status, 200)
112 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030113 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530114 flag = True
115 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700116
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530117 finally:
118 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030119 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530120 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030121 self.client.wait_for_resource_deletion(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -0700122
123 @attr(type='negative')
124 def test_get_flavor_details_for_deleted_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500125 # Delete a flavor and ensure it is not listed
Rohit Karajgi03530292012-04-24 17:00:50 -0700126 # Create a test flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030127 flavor_name = rand_name(self.flavor_name_prefix)
128 new_flavor_id = rand_int_id(start=1000)
129
130 resp, flavor = self.client.create_flavor(flavor_name,
Jay Pipesf38eaac2012-06-21 13:37:35 -0400131 self.ram,
132 self.vcpus, self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030133 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530134 ephemeral=self.ephemeral,
135 swap=self.swap,
136 rxtx=self.rxtx)
Rohit Karajgi03530292012-04-24 17:00:50 -0700137 self.assertEquals(200, resp.status)
138
139 # Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030140 resp, _ = self.client.delete_flavor(new_flavor_id)
Rohit Karajgi03530292012-04-24 17:00:50 -0700141 self.assertEqual(resp.status, 202)
142
Dan Prince8581f532012-05-30 17:11:55 -0400143 # Deleted flavors can be seen via detailed GET
Chris Yeoh8abacf32013-01-21 17:08:32 +1030144 resp, flavor = self.client.get_flavor_details(new_flavor_id)
Dan Prince8581f532012-05-30 17:11:55 -0400145 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030146 self.assertEqual(flavor['name'], flavor_name)
Dan Prince8581f532012-05-30 17:11:55 -0400147
148 # Deleted flavors should not show up in a list however
Jay Pipesf38eaac2012-06-21 13:37:35 -0400149 resp, flavors = self.client.list_flavors_with_detail()
Dan Prince8581f532012-05-30 17:11:55 -0400150 self.assertEqual(resp.status, 200)
151 flag = True
152 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030153 if flavor['name'] == flavor_name:
Dan Prince8581f532012-05-30 17:11:55 -0400154 flag = False
155 self.assertTrue(flag)
Tiago Melloeda03b52012-08-22 23:47:29 -0300156
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530157 def test_create_list_flavor_without_extra_data(self):
158 #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
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530163 try:
164 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030165 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530166 self.ram, self.vcpus,
167 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030168 new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530169 self.assertEqual(200, resp.status)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030170 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530171 self.assertEqual(flavor['ram'], self.ram)
172 self.assertEqual(flavor['vcpus'], self.vcpus)
173 self.assertEqual(flavor['disk'], self.disk)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030174 self.assertEqual(int(flavor['id']), new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530175 self.assertEqual(flavor['swap'], '')
176 self.assertEqual(int(flavor['rxtx_factor']), 1)
177 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
James E. Blaire6d8ee12013-01-18 21:33:45 +0000178 if self._interface == "xml":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530179 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")
James E. Blaire6d8ee12013-01-18 21:33:45 +0000183 if self._interface == "json":
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530184 self.assertEqual(flavor['os-flavor-access:is_public'], True)
185
186 #Verify flavor is retrieved
Chris Yeoh8abacf32013-01-21 17:08:32 +1030187 resp, flavor = self.client.get_flavor_details(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530188 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030189 self.assertEqual(flavor['name'], flavor_name)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530190 #Check if flavor is present in list
191 resp, flavors = self.client.list_flavors_with_detail()
192 self.assertEqual(resp.status, 200)
193 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030194 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530195 flag = True
196 self.assertTrue(flag)
197
198 finally:
199 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030200 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530201 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030202 self.client.wait_for_resource_deletion(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530203
204 @attr(type='positive')
205 def test_flavor_not_public_verify_entry_not_in_list_details(self):
206 #Create a flavor with os-flavor-access:is_public false should not
207 #be present in list_details.
208 #This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030209 flavor_name = rand_name(self.flavor_name_prefix)
210 new_flavor_id = rand_int_id(start=1000)
211
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530212 try:
213 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030214 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530215 self.ram, self.vcpus,
216 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030217 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530218 is_public="False")
219 flag = False
220 #Verify flavor is retrieved
221 resp, flavors = self.client.list_flavors_with_detail()
222 self.assertEqual(resp.status, 200)
223 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030224 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530225 flag = True
226 self.assertFalse(flag)
227 finally:
228 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030229 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530230 self.assertEqual(resp.status, 202)
231
232 def test_list_public_flavor_with_other_user(self):
233 #Create a Flavor with public access.
234 #Try to List/Get flavor with another user
Chris Yeoh8abacf32013-01-21 17:08:32 +1030235 flavor_name = rand_name(self.flavor_name_prefix)
236 new_flavor_id = rand_int_id(start=1000)
237
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530238 try:
239 #Create the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030240 resp, flavor = self.client.create_flavor(flavor_name,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530241 self.ram, self.vcpus,
242 self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030243 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530244 is_public="True")
245 flag = False
246 self.new_client = self.flavors_client
247 #Verify flavor is retrieved with new user
248 resp, flavors = self.new_client.list_flavors_with_detail()
249 self.assertEqual(resp.status, 200)
250 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030251 if flavor['name'] == flavor_name:
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530252 flag = True
253 self.assertTrue(flag)
254 finally:
255 #Delete the flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030256 resp, body = self.client.delete_flavor(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530257 self.assertEqual(resp.status, 202)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030258 self.client.wait_for_resource_deletion(new_flavor_id)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530259
Tiago Mello0d835d22013-02-06 13:57:50 -0500260 @attr(type='positive')
261 def test_is_public_string_variations(self):
262 try:
263 flavor_id_not_public = rand_int_id(start=1000)
264 flavor_name_not_public = rand_name(self.flavor_name_prefix)
265 flavor_id_public = rand_int_id(start=1000)
266 flavor_name_public = rand_name(self.flavor_name_prefix)
267
268 # Create a non public flavor
269 resp, flavor = self.client.create_flavor(flavor_name_not_public,
270 self.ram, self.vcpus,
271 self.disk,
272 flavor_id_not_public,
273 is_public="False")
274
275 # Create a public flavor
276 resp, flavor = self.client.create_flavor(flavor_name_public,
277 self.ram, self.vcpus,
278 self.disk,
279 flavor_id_public,
280 is_public="True")
281
282 def _flavor_lookup(flavors, flavor_name):
283 for flavor in flavors:
284 if flavor['name'] == flavor_name:
285 return flavor
286 return None
287
288 def _test_string_variations(variations, flavor_name):
289 for string in variations:
290 params = {'is_public': string}
291 r, flavors = self.client.list_flavors_with_detail(params)
292 self.assertEqual(r.status, 200)
293 flavor = _flavor_lookup(flavors, flavor_name)
294 self.assertNotEqual(flavor, None)
295
296 _test_string_variations(['f', 'false', 'no', '0'],
297 flavor_name_not_public)
298
299 _test_string_variations(['t', 'true', 'yes', '1'],
300 flavor_name_public)
301
302 finally:
303 # Delete flavors
304 for flavor_id in [flavor_id_not_public, flavor_id_public]:
305 resp, body = self.client.delete_flavor(flavor_id)
306 self.assertEqual(resp.status, 202)
307 self.client.wait_for_resource_deletion(flavor_id)
308
Tiago Mellodb525252013-02-07 14:51:38 -0500309 @attr(type='negative')
310 def test_invalid_is_public_string(self):
311 self.assertRaises(exceptions.BadRequest,
312 self.client.list_flavors_with_detail,
313 {'is_public': 'invalid'})
314
Attila Fazekas4ba36582013-02-12 08:26:17 +0100315#TODO(afazekas): Negative tests with regular user
316
Tiago Melloeda03b52012-08-22 23:47:29 -0300317
James E. Blaire6d8ee12013-01-18 21:33:45 +0000318class FlavorsAdminTestXML(base.BaseComputeAdminTestXML,
319 base.BaseComputeTestXML,
320 FlavorsAdminTestBase):
Tiago Melloeda03b52012-08-22 23:47:29 -0300321
322 @classmethod
323 def setUpClass(cls):
James E. Blaire6d8ee12013-01-18 21:33:45 +0000324 super(FlavorsAdminTestXML, cls).setUpClass()
325 base.BaseComputeTestXML.setUpClass()
326 FlavorsAdminTestBase.setUpClass(cls)
327
328
329class FlavorsAdminTestJSON(base.BaseComputeAdminTestJSON,
330 base.BaseComputeTestJSON,
331 FlavorsAdminTestBase):
332
333 @classmethod
334 def setUpClass(cls):
335 super(FlavorsAdminTestJSON, cls).setUpClass()
336 base.BaseComputeTestJSON.setUpClass()
Tiago Melloeda03b52012-08-22 23:47:29 -0300337 FlavorsAdminTestBase.setUpClass(cls)