blob: 6d0a5b5725a7b084c1b47537d551dda368a0e0d4 [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
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
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
Attila Fazekas2883fd52013-03-10 12:05:21 +010051 def flavor_clean_up(self, flavor_id):
52 resp, body = self.client.delete_flavor(flavor_id)
53 self.assertEqual(resp.status, 202)
54 self.client.wait_for_resource_deletion(flavor_id)
55
Giulio Fidenteba3985a2013-05-29 01:46:36 +020056 @attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -070057 def test_create_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050058 # Create a flavor and ensure it is listed
59 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103060 flavor_name = rand_name(self.flavor_name_prefix)
61 new_flavor_id = rand_int_id(start=1000)
62
Attila Fazekasf7f34f92013-08-01 17:01:44 +020063 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +010064 resp, flavor = self.client.create_flavor(flavor_name,
65 self.ram, self.vcpus,
66 self.disk,
67 new_flavor_id,
68 ephemeral=self.ephemeral,
69 swap=self.swap,
70 rxtx=self.rxtx)
71 self.addCleanup(self.flavor_clean_up, flavor['id'])
72 self.assertEqual(200, resp.status)
73 self.assertEqual(flavor['name'], flavor_name)
74 self.assertEqual(flavor['vcpus'], self.vcpus)
75 self.assertEqual(flavor['disk'], self.disk)
76 self.assertEqual(flavor['ram'], self.ram)
77 self.assertEqual(int(flavor['id']), new_flavor_id)
78 self.assertEqual(flavor['swap'], self.swap)
79 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
80 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
81 self.ephemeral)
82 if self._interface == "xml":
83 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
84 "flavor_access/api/v2"
85 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
86 self.assertEqual(flavor[key], "True")
87 if self._interface == "json":
88 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070089
Attila Fazekasf7f34f92013-08-01 17:01:44 +020090 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +010091 resp, flavor = self.client.get_flavor_details(new_flavor_id)
92 self.assertEqual(resp.status, 200)
93 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070094
Giulio Fidenteba3985a2013-05-29 01:46:36 +020095 @attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -070096 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050097 # Create a flavor and ensure it's details are listed
98 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +103099 flavor_name = rand_name(self.flavor_name_prefix)
100 new_flavor_id = rand_int_id(start=1000)
101
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200102 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100103 resp, flavor = self.client.create_flavor(flavor_name,
104 self.ram, self.vcpus,
105 self.disk,
106 new_flavor_id,
107 ephemeral=self.ephemeral,
108 swap=self.swap,
109 rxtx=self.rxtx)
110 self.addCleanup(self.flavor_clean_up, flavor['id'])
111 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200112 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100113 resp, flavors = self.client.list_flavors_with_detail()
114 self.assertEqual(resp.status, 200)
115 for flavor in flavors:
116 if flavor['name'] == flavor_name:
117 flag = True
118 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700119
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400120 @attr(type=['negative', 'gate'])
Rohit Karajgi03530292012-04-24 17:00:50 -0700121 def test_get_flavor_details_for_deleted_flavor(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500122 # Delete a flavor and ensure it is not listed
Rohit Karajgi03530292012-04-24 17:00:50 -0700123 # Create a test flavor
Chris Yeoh8abacf32013-01-21 17:08:32 +1030124 flavor_name = rand_name(self.flavor_name_prefix)
125 new_flavor_id = rand_int_id(start=1000)
126
127 resp, flavor = self.client.create_flavor(flavor_name,
Jay Pipesf38eaac2012-06-21 13:37:35 -0400128 self.ram,
129 self.vcpus, self.disk,
Chris Yeoh8abacf32013-01-21 17:08:32 +1030130 new_flavor_id,
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530131 ephemeral=self.ephemeral,
132 swap=self.swap,
133 rxtx=self.rxtx)
Rohit Karajgi03530292012-04-24 17:00:50 -0700134 # Delete the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100135 new_flavor_id = flavor['id']
136 resp_delete, body = self.client.delete_flavor(new_flavor_id)
137 self.assertEquals(200, resp.status)
138 self.assertEquals(202, resp_delete.status)
Rohit Karajgi03530292012-04-24 17:00:50 -0700139
Dan Prince8581f532012-05-30 17:11:55 -0400140 # Deleted flavors can be seen via detailed GET
Chris Yeoh8abacf32013-01-21 17:08:32 +1030141 resp, flavor = self.client.get_flavor_details(new_flavor_id)
Dan Prince8581f532012-05-30 17:11:55 -0400142 self.assertEqual(resp.status, 200)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030143 self.assertEqual(flavor['name'], flavor_name)
Dan Prince8581f532012-05-30 17:11:55 -0400144
145 # Deleted flavors should not show up in a list however
Jay Pipesf38eaac2012-06-21 13:37:35 -0400146 resp, flavors = self.client.list_flavors_with_detail()
Dan Prince8581f532012-05-30 17:11:55 -0400147 self.assertEqual(resp.status, 200)
148 flag = True
149 for flavor in flavors:
Chris Yeoh8abacf32013-01-21 17:08:32 +1030150 if flavor['name'] == flavor_name:
Dan Prince8581f532012-05-30 17:11:55 -0400151 flag = False
152 self.assertTrue(flag)
Tiago Melloeda03b52012-08-22 23:47:29 -0300153
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400154 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530155 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200156 # Create a flavor and ensure it is listed
157 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030158 flavor_name = rand_name(self.flavor_name_prefix)
159 new_flavor_id = rand_int_id(start=1000)
160
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200161 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100162 resp, flavor = self.client.create_flavor(flavor_name,
163 self.ram, self.vcpus,
164 self.disk,
165 new_flavor_id)
166 self.addCleanup(self.flavor_clean_up, flavor['id'])
167 self.assertEqual(200, resp.status)
168 self.assertEqual(flavor['name'], flavor_name)
169 self.assertEqual(flavor['ram'], self.ram)
170 self.assertEqual(flavor['vcpus'], self.vcpus)
171 self.assertEqual(flavor['disk'], self.disk)
172 self.assertEqual(int(flavor['id']), new_flavor_id)
173 self.assertEqual(flavor['swap'], '')
174 self.assertEqual(int(flavor['rxtx_factor']), 1)
175 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
176 if self._interface == "xml":
177 XMLNS_OS_FLV_ACCESS = "http://docs.openstack.org/compute/ext/"\
178 "flavor_access/api/v2"
179 key = "{" + XMLNS_OS_FLV_ACCESS + "}is_public"
180 self.assertEqual(flavor[key], "True")
181 if self._interface == "json":
182 self.assertEqual(flavor['os-flavor-access:is_public'], True)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530183
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200184 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100185 resp, flavor = self.client.get_flavor_details(new_flavor_id)
186 self.assertEqual(resp.status, 200)
187 self.assertEqual(flavor['name'], flavor_name)
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200188 # Check if flavor is present in list
Attila Fazekas2883fd52013-03-10 12:05:21 +0100189 resp, flavors = self.client.list_flavors_with_detail()
190 self.assertEqual(resp.status, 200)
191 for flavor in flavors:
192 if flavor['name'] == flavor_name:
193 flag = True
194 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530195
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200196 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530197 def test_flavor_not_public_verify_entry_not_in_list_details(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200198 # Create a flavor with os-flavor-access:is_public false should not
199 # be present in list_details.
200 # This operation requires the user to have 'admin' role
Chris Yeoh8abacf32013-01-21 17:08:32 +1030201 flavor_name = rand_name(self.flavor_name_prefix)
202 new_flavor_id = rand_int_id(start=1000)
203
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200204 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100205 resp, flavor = self.client.create_flavor(flavor_name,
206 self.ram, self.vcpus,
207 self.disk,
208 new_flavor_id,
209 is_public="False")
210 self.addCleanup(self.flavor_clean_up, flavor['id'])
211 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200212 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100213 resp, flavors = self.client.list_flavors_with_detail()
214 self.assertEqual(resp.status, 200)
215 for flavor in flavors:
216 if flavor['name'] == flavor_name:
217 flag = True
218 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530219
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400220 @attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530221 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200222 # Create a Flavor with public access.
223 # Try to List/Get flavor with another user
Chris Yeoh8abacf32013-01-21 17:08:32 +1030224 flavor_name = rand_name(self.flavor_name_prefix)
225 new_flavor_id = rand_int_id(start=1000)
226
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200227 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100228 resp, flavor = self.client.create_flavor(flavor_name,
229 self.ram, self.vcpus,
230 self.disk,
231 new_flavor_id,
232 is_public="True")
233 self.addCleanup(self.flavor_clean_up, flavor['id'])
234 flag = False
235 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200236 # Verify flavor is retrieved with new user
Attila Fazekas2883fd52013-03-10 12:05:21 +0100237 resp, flavors = self.new_client.list_flavors_with_detail()
238 self.assertEqual(resp.status, 200)
239 for flavor in flavors:
240 if flavor['name'] == flavor_name:
241 flag = True
242 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530243
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200244 @attr(type='gate')
Tiago Mello0d835d22013-02-06 13:57:50 -0500245 def test_is_public_string_variations(self):
Attila Fazekas2883fd52013-03-10 12:05:21 +0100246 flavor_id_not_public = rand_int_id(start=1000)
247 flavor_name_not_public = rand_name(self.flavor_name_prefix)
248 flavor_id_public = rand_int_id(start=1000)
249 flavor_name_public = rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500250
Attila Fazekas2883fd52013-03-10 12:05:21 +0100251 # Create a non public flavor
252 resp, flavor = self.client.create_flavor(flavor_name_not_public,
253 self.ram, self.vcpus,
254 self.disk,
255 flavor_id_not_public,
256 is_public="False")
257 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500258
Attila Fazekas2883fd52013-03-10 12:05:21 +0100259 # Create a public flavor
260 resp, flavor = self.client.create_flavor(flavor_name_public,
261 self.ram, self.vcpus,
262 self.disk,
263 flavor_id_public,
264 is_public="True")
265 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500266
Attila Fazekas2883fd52013-03-10 12:05:21 +0100267 def _flavor_lookup(flavors, flavor_name):
268 for flavor in flavors:
269 if flavor['name'] == flavor_name:
270 return flavor
271 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500272
Attila Fazekas2883fd52013-03-10 12:05:21 +0100273 def _test_string_variations(variations, flavor_name):
274 for string in variations:
275 params = {'is_public': string}
276 r, flavors = self.client.list_flavors_with_detail(params)
277 self.assertEqual(r.status, 200)
278 flavor = _flavor_lookup(flavors, flavor_name)
279 self.assertNotEqual(flavor, None)
Tiago Mello0d835d22013-02-06 13:57:50 -0500280
Attila Fazekas2883fd52013-03-10 12:05:21 +0100281 _test_string_variations(['f', 'false', 'no', '0'],
282 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500283
Attila Fazekas2883fd52013-03-10 12:05:21 +0100284 _test_string_variations(['t', 'true', 'yes', '1'],
285 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500286
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400287 @attr(type=['negative', 'gate'])
Tiago Mellodb525252013-02-07 14:51:38 -0500288 def test_invalid_is_public_string(self):
289 self.assertRaises(exceptions.BadRequest,
290 self.client.list_flavors_with_detail,
291 {'is_public': 'invalid'})
292
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400293 @attr(type=['negative', 'gate'])
afazekascda40822013-03-25 16:50:41 +0100294 def test_create_flavor_as_user(self):
295 flavor_name = rand_name(self.flavor_name_prefix)
296 new_flavor_id = rand_int_id(start=1000)
297
298 self.assertRaises(exceptions.Unauthorized,
299 self.user_client.create_flavor,
300 flavor_name, self.ram, self.vcpus, self.disk,
301 new_flavor_id, ephemeral=self.ephemeral,
302 swap=self.swap, rxtx=self.rxtx)
303
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400304 @attr(type=['negative', 'gate'])
afazekascda40822013-03-25 16:50:41 +0100305 def test_delete_flavor_as_user(self):
306 self.assertRaises(exceptions.Unauthorized,
307 self.user_client.delete_flavor,
308 self.flavor_ref_alt)
Attila Fazekas4ba36582013-02-12 08:26:17 +0100309
Tiago Melloeda03b52012-08-22 23:47:29 -0300310
Attila Fazekas19044d52013-02-16 07:35:06 +0100311class FlavorsAdminTestXML(FlavorsAdminTestJSON):
312 _interface = 'xml'