blob: d365f3a7181718afc1561843b4a5cd4dcfc35a7d [file] [log] [blame]
ZhiQiang Fan39f97222013-09-20 04:49:44 +08001# Copyright 2012 OpenStack Foundation
Jay Pipes13b479b2012-06-11 14:52:27 -04002# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090016import uuid
17
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.compute import base
Masayuki Igawa259c1132013-10-31 17:48:44 +090019from tempest.common.utils import data_utils
Tiago Mellodb525252013-02-07 14:51:38 -050020from tempest import exceptions
Matthew Treinishe3d26142013-11-26 19:14:58 +000021from tempest import test
Rohit Karajgi03530292012-04-24 17:00:50 -070022
23
ivan-zhuf2b00502013-10-18 10:06:52 +080024class FlavorsAdminTestJSON(base.BaseV2ComputeAdminTest):
Rohit Karajgi03530292012-04-24 17:00:50 -070025
26 """
27 Tests Flavors API Create and Delete that require admin privileges
28 """
29
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053030 @classmethod
Andrea Frittoli50bb80d2014-09-15 12:34:27 +010031 def resource_setup(cls):
32 super(FlavorsAdminTestJSON, cls).resource_setup()
Ken'ichi Ohmichia7e68712014-05-06 10:47:26 +090033 if not test.is_extension_enabled('OS-FLV-EXT-DATA', 'compute'):
34 msg = "OS-FLV-EXT-DATA extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080035 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070036
Attila Fazekas4ba36582013-02-12 08:26:17 +010037 cls.client = cls.os_adm.flavors_client
afazekascda40822013-03-25 16:50:41 +010038 cls.user_client = cls.os.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
Attila Fazekas2883fd52013-03-10 12:05:21 +010047 def flavor_clean_up(self, flavor_id):
48 resp, body = self.client.delete_flavor(flavor_id)
49 self.assertEqual(resp.status, 202)
50 self.client.wait_for_resource_deletion(flavor_id)
51
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090052 def _create_flavor(self, flavor_id):
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
Masayuki Igawa259c1132013-10-31 17:48:44 +090055 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +103056
Attila Fazekasf7f34f92013-08-01 17:01:44 +020057 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +010058 resp, flavor = self.client.create_flavor(flavor_name,
59 self.ram, self.vcpus,
60 self.disk,
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090061 flavor_id,
Attila Fazekas2883fd52013-03-10 12:05:21 +010062 ephemeral=self.ephemeral,
63 swap=self.swap,
64 rxtx=self.rxtx)
65 self.addCleanup(self.flavor_clean_up, flavor['id'])
66 self.assertEqual(200, resp.status)
67 self.assertEqual(flavor['name'], flavor_name)
68 self.assertEqual(flavor['vcpus'], self.vcpus)
69 self.assertEqual(flavor['disk'], self.disk)
70 self.assertEqual(flavor['ram'], self.ram)
Attila Fazekas2883fd52013-03-10 12:05:21 +010071 self.assertEqual(flavor['swap'], self.swap)
72 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
73 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
74 self.ephemeral)
ivan-zhuae7c7c52013-10-21 22:13:22 +080075 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070076
Attila Fazekasf7f34f92013-08-01 17:01:44 +020077 # Verify flavor is retrieved
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090078 resp, flavor = self.client.get_flavor_details(flavor['id'])
Attila Fazekas2883fd52013-03-10 12:05:21 +010079 self.assertEqual(resp.status, 200)
80 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070081
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090082 return flavor['id']
83
Matthew Treinishe3d26142013-11-26 19:14:58 +000084 @test.attr(type='gate')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090085 def test_create_flavor_with_int_id(self):
86 flavor_id = data_utils.rand_int_id(start=1000)
87 new_flavor_id = self._create_flavor(flavor_id)
88 self.assertEqual(new_flavor_id, str(flavor_id))
89
Matthew Treinishe3d26142013-11-26 19:14:58 +000090 @test.attr(type='gate')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090091 def test_create_flavor_with_uuid_id(self):
92 flavor_id = str(uuid.uuid4())
93 new_flavor_id = self._create_flavor(flavor_id)
94 self.assertEqual(new_flavor_id, flavor_id)
95
Matthew Treinishe3d26142013-11-26 19:14:58 +000096 @test.attr(type='gate')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090097 def test_create_flavor_with_none_id(self):
98 # If nova receives a request with None as flavor_id,
99 # nova generates flavor_id of uuid.
100 flavor_id = None
101 new_flavor_id = self._create_flavor(flavor_id)
102 self.assertEqual(new_flavor_id, str(uuid.UUID(new_flavor_id)))
103
Matthew Treinishe3d26142013-11-26 19:14:58 +0000104 @test.attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -0700105 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500106 # Create a flavor and ensure it's details are listed
107 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900108 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
109 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030110
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200111 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100112 resp, flavor = self.client.create_flavor(flavor_name,
113 self.ram, self.vcpus,
114 self.disk,
115 new_flavor_id,
116 ephemeral=self.ephemeral,
117 swap=self.swap,
118 rxtx=self.rxtx)
119 self.addCleanup(self.flavor_clean_up, flavor['id'])
120 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200121 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100122 resp, flavors = self.client.list_flavors_with_detail()
123 self.assertEqual(resp.status, 200)
124 for flavor in flavors:
125 if flavor['name'] == flavor_name:
126 flag = True
127 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700128
Matthew Treinishe3d26142013-11-26 19:14:58 +0000129 @test.attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530130 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200131 # Create a flavor and ensure it is listed
132 # This operation requires the user to have 'admin' role
ivan-zhuae7c7c52013-10-21 22:13:22 +0800133
134 def verify_flavor_response_extension(flavor):
135 # check some extensions for the flavor create/show/detail response
136 self.assertEqual(flavor['swap'], '')
137 self.assertEqual(int(flavor['rxtx_factor']), 1)
138 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
139 self.assertEqual(flavor['os-flavor-access:is_public'], True)
140
Masayuki Igawa259c1132013-10-31 17:48:44 +0900141 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
142 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030143
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200144 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100145 resp, flavor = self.client.create_flavor(flavor_name,
146 self.ram, self.vcpus,
147 self.disk,
148 new_flavor_id)
149 self.addCleanup(self.flavor_clean_up, flavor['id'])
150 self.assertEqual(200, resp.status)
151 self.assertEqual(flavor['name'], flavor_name)
152 self.assertEqual(flavor['ram'], self.ram)
153 self.assertEqual(flavor['vcpus'], self.vcpus)
154 self.assertEqual(flavor['disk'], self.disk)
155 self.assertEqual(int(flavor['id']), new_flavor_id)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800156 verify_flavor_response_extension(flavor)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530157
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200158 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100159 resp, flavor = self.client.get_flavor_details(new_flavor_id)
160 self.assertEqual(resp.status, 200)
161 self.assertEqual(flavor['name'], flavor_name)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800162 verify_flavor_response_extension(flavor)
163
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200164 # Check if flavor is present in list
ivan-zhuae7c7c52013-10-21 22:13:22 +0800165 resp, flavors = self.user_client.list_flavors_with_detail()
Attila Fazekas2883fd52013-03-10 12:05:21 +0100166 self.assertEqual(resp.status, 200)
167 for flavor in flavors:
168 if flavor['name'] == flavor_name:
ivan-zhuae7c7c52013-10-21 22:13:22 +0800169 verify_flavor_response_extension(flavor)
Attila Fazekas2883fd52013-03-10 12:05:21 +0100170 flag = True
171 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530172
Matthew Treinishe3d26142013-11-26 19:14:58 +0000173 @test.attr(type='gate')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530174 def test_list_non_public_flavor(self):
Santiago Baldassin7f989162014-03-19 12:02:47 -0300175 # Create a flavor with os-flavor-access:is_public false.
176 # The flavor should not be present in list_details as the
177 # tenant is not automatically added access list.
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200178 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900179 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
180 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030181
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200182 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100183 resp, flavor = self.client.create_flavor(flavor_name,
184 self.ram, self.vcpus,
185 self.disk,
186 new_flavor_id,
187 is_public="False")
188 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200189 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530190 flag = False
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
Santiago Baldassin7f989162014-03-19 12:02:47 -0300196 self.assertFalse(flag)
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530197
198 # Verify flavor is not retrieved with other user
199 flag = False
200 resp, flavors = self.user_client.list_flavors_with_detail()
201 self.assertEqual(resp.status, 200)
202 for flavor in flavors:
203 if flavor['name'] == flavor_name:
204 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100205 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530206
Matthew Treinishe3d26142013-11-26 19:14:58 +0000207 @test.attr(type='gate')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900208 def test_create_server_with_non_public_flavor(self):
209 # Create a flavor with os-flavor-access:is_public false
Masayuki Igawa259c1132013-10-31 17:48:44 +0900210 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
211 new_flavor_id = data_utils.rand_int_id(start=1000)
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900212
213 # Create the flavor
214 resp, flavor = self.client.create_flavor(flavor_name,
215 self.ram, self.vcpus,
216 self.disk,
217 new_flavor_id,
218 is_public="False")
219 self.addCleanup(self.flavor_clean_up, flavor['id'])
220 self.assertEqual(200, resp.status)
221
222 # Verify flavor is not used by other user
223 self.assertRaises(exceptions.BadRequest,
224 self.os.servers_client.create_server,
225 'test', self.image_ref, flavor['id'])
226
Matthew Treinishe3d26142013-11-26 19:14:58 +0000227 @test.attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530228 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200229 # Create a Flavor with public access.
230 # Try to List/Get flavor with another user
Masayuki Igawa259c1132013-10-31 17:48:44 +0900231 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
232 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030233
Matthew Treinishc795b9e2014-06-09 17:01:10 -0400234 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100235 resp, flavor = self.client.create_flavor(flavor_name,
236 self.ram, self.vcpus,
237 self.disk,
238 new_flavor_id,
239 is_public="True")
240 self.addCleanup(self.flavor_clean_up, flavor['id'])
241 flag = False
242 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200243 # Verify flavor is retrieved with new user
Attila Fazekas2883fd52013-03-10 12:05:21 +0100244 resp, flavors = self.new_client.list_flavors_with_detail()
245 self.assertEqual(resp.status, 200)
246 for flavor in flavors:
247 if flavor['name'] == flavor_name:
248 flag = True
249 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530250
Matthew Treinishe3d26142013-11-26 19:14:58 +0000251 @test.attr(type='gate')
Tiago Mello0d835d22013-02-06 13:57:50 -0500252 def test_is_public_string_variations(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900253 flavor_id_not_public = data_utils.rand_int_id(start=1000)
254 flavor_name_not_public = data_utils.rand_name(self.flavor_name_prefix)
255 flavor_id_public = data_utils.rand_int_id(start=1000)
256 flavor_name_public = data_utils.rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500257
Attila Fazekas2883fd52013-03-10 12:05:21 +0100258 # Create a non public flavor
259 resp, flavor = self.client.create_flavor(flavor_name_not_public,
260 self.ram, self.vcpus,
261 self.disk,
262 flavor_id_not_public,
263 is_public="False")
264 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500265
Attila Fazekas2883fd52013-03-10 12:05:21 +0100266 # Create a public flavor
267 resp, flavor = self.client.create_flavor(flavor_name_public,
268 self.ram, self.vcpus,
269 self.disk,
270 flavor_id_public,
271 is_public="True")
272 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500273
Attila Fazekas2883fd52013-03-10 12:05:21 +0100274 def _flavor_lookup(flavors, flavor_name):
275 for flavor in flavors:
276 if flavor['name'] == flavor_name:
277 return flavor
278 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500279
Attila Fazekas2883fd52013-03-10 12:05:21 +0100280 def _test_string_variations(variations, flavor_name):
281 for string in variations:
282 params = {'is_public': string}
283 r, flavors = self.client.list_flavors_with_detail(params)
284 self.assertEqual(r.status, 200)
285 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200286 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500287
Attila Fazekas2883fd52013-03-10 12:05:21 +0100288 _test_string_variations(['f', 'false', 'no', '0'],
289 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500290
Attila Fazekas2883fd52013-03-10 12:05:21 +0100291 _test_string_variations(['t', 'true', 'yes', '1'],
292 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500293
Matthew Treinishe3d26142013-11-26 19:14:58 +0000294 @test.attr(type='gate')
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800295 def test_create_flavor_using_string_ram(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900296 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
297 new_flavor_id = data_utils.rand_int_id(start=1000)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800298
299 ram = " 1024 "
300 resp, flavor = self.client.create_flavor(flavor_name,
301 ram, self.vcpus,
302 self.disk,
303 new_flavor_id)
304 self.addCleanup(self.flavor_clean_up, flavor['id'])
305 self.assertEqual(200, resp.status)
306 self.assertEqual(flavor['name'], flavor_name)
307 self.assertEqual(flavor['vcpus'], self.vcpus)
308 self.assertEqual(flavor['disk'], self.disk)
309 self.assertEqual(flavor['ram'], int(ram))
310 self.assertEqual(int(flavor['id']), new_flavor_id)
311
Tiago Melloeda03b52012-08-22 23:47:29 -0300312
Attila Fazekas19044d52013-02-16 07:35:06 +0100313class FlavorsAdminTestXML(FlavorsAdminTestJSON):
314 _interface = 'xml'