blob: 05b763a2e9590ce6e83eb0a73d52a7c8e1f09cc5 [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
Attila Fazekas19044d52013-02-16 07:35:06 +010031 def setUpClass(cls):
32 super(FlavorsAdminTestJSON, cls).setUpClass()
Matthew Treinishe3d26142013-11-26 19:14:58 +000033 if not test.is_extension_enabled('FlavorExtraData', 'compute'):
Jay Pipesf38eaac2012-06-21 13:37:35 -040034 msg = "FlavorExtraData 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):
175 # Create a flavor with os-flavor-access:is_public false should
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200176 # be present in list_details.
177 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900178 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
179 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030180
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200181 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100182 resp, flavor = self.client.create_flavor(flavor_name,
183 self.ram, self.vcpus,
184 self.disk,
185 new_flavor_id,
186 is_public="False")
187 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200188 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530189 flag = False
Attila Fazekas2883fd52013-03-10 12:05:21 +0100190 resp, flavors = self.client.list_flavors_with_detail()
191 self.assertEqual(resp.status, 200)
192 for flavor in flavors:
193 if flavor['name'] == flavor_name:
194 flag = True
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530195 self.assertTrue(flag)
196
197 # Verify flavor is not retrieved with other user
198 flag = False
199 resp, flavors = self.user_client.list_flavors_with_detail()
200 self.assertEqual(resp.status, 200)
201 for flavor in flavors:
202 if flavor['name'] == flavor_name:
203 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100204 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530205
Matthew Treinishe3d26142013-11-26 19:14:58 +0000206 @test.attr(type='gate')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900207 def test_create_server_with_non_public_flavor(self):
208 # Create a flavor with os-flavor-access:is_public false
Masayuki Igawa259c1132013-10-31 17:48:44 +0900209 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
210 new_flavor_id = data_utils.rand_int_id(start=1000)
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900211
212 # Create the flavor
213 resp, flavor = self.client.create_flavor(flavor_name,
214 self.ram, self.vcpus,
215 self.disk,
216 new_flavor_id,
217 is_public="False")
218 self.addCleanup(self.flavor_clean_up, flavor['id'])
219 self.assertEqual(200, resp.status)
220
221 # Verify flavor is not used by other user
222 self.assertRaises(exceptions.BadRequest,
223 self.os.servers_client.create_server,
224 'test', self.image_ref, flavor['id'])
225
Matthew Treinishe3d26142013-11-26 19:14:58 +0000226 @test.attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530227 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200228 # Create a Flavor with public access.
229 # Try to List/Get flavor with another user
Masayuki Igawa259c1132013-10-31 17:48:44 +0900230 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
231 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030232
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200233 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100234 resp, flavor = self.client.create_flavor(flavor_name,
235 self.ram, self.vcpus,
236 self.disk,
237 new_flavor_id,
238 is_public="True")
239 self.addCleanup(self.flavor_clean_up, flavor['id'])
240 flag = False
241 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200242 # Verify flavor is retrieved with new user
Attila Fazekas2883fd52013-03-10 12:05:21 +0100243 resp, flavors = self.new_client.list_flavors_with_detail()
244 self.assertEqual(resp.status, 200)
245 for flavor in flavors:
246 if flavor['name'] == flavor_name:
247 flag = True
248 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530249
Matthew Treinishe3d26142013-11-26 19:14:58 +0000250 @test.attr(type='gate')
Tiago Mello0d835d22013-02-06 13:57:50 -0500251 def test_is_public_string_variations(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900252 flavor_id_not_public = data_utils.rand_int_id(start=1000)
253 flavor_name_not_public = data_utils.rand_name(self.flavor_name_prefix)
254 flavor_id_public = data_utils.rand_int_id(start=1000)
255 flavor_name_public = data_utils.rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500256
Attila Fazekas2883fd52013-03-10 12:05:21 +0100257 # Create a non public flavor
258 resp, flavor = self.client.create_flavor(flavor_name_not_public,
259 self.ram, self.vcpus,
260 self.disk,
261 flavor_id_not_public,
262 is_public="False")
263 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500264
Attila Fazekas2883fd52013-03-10 12:05:21 +0100265 # Create a public flavor
266 resp, flavor = self.client.create_flavor(flavor_name_public,
267 self.ram, self.vcpus,
268 self.disk,
269 flavor_id_public,
270 is_public="True")
271 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500272
Attila Fazekas2883fd52013-03-10 12:05:21 +0100273 def _flavor_lookup(flavors, flavor_name):
274 for flavor in flavors:
275 if flavor['name'] == flavor_name:
276 return flavor
277 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500278
Attila Fazekas2883fd52013-03-10 12:05:21 +0100279 def _test_string_variations(variations, flavor_name):
280 for string in variations:
281 params = {'is_public': string}
282 r, flavors = self.client.list_flavors_with_detail(params)
283 self.assertEqual(r.status, 200)
284 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200285 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500286
Attila Fazekas2883fd52013-03-10 12:05:21 +0100287 _test_string_variations(['f', 'false', 'no', '0'],
288 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500289
Attila Fazekas2883fd52013-03-10 12:05:21 +0100290 _test_string_variations(['t', 'true', 'yes', '1'],
291 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500292
Matthew Treinishe3d26142013-11-26 19:14:58 +0000293 @test.attr(type='gate')
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800294 def test_create_flavor_using_string_ram(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900295 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
296 new_flavor_id = data_utils.rand_int_id(start=1000)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800297
298 ram = " 1024 "
299 resp, flavor = self.client.create_flavor(flavor_name,
300 ram, self.vcpus,
301 self.disk,
302 new_flavor_id)
303 self.addCleanup(self.flavor_clean_up, flavor['id'])
304 self.assertEqual(200, resp.status)
305 self.assertEqual(flavor['name'], flavor_name)
306 self.assertEqual(flavor['vcpus'], self.vcpus)
307 self.assertEqual(flavor['disk'], self.disk)
308 self.assertEqual(flavor['ram'], int(ram))
309 self.assertEqual(int(flavor['id']), new_flavor_id)
310
Tiago Melloeda03b52012-08-22 23:47:29 -0300311
Attila Fazekas19044d52013-02-16 07:35:06 +0100312class FlavorsAdminTestXML(FlavorsAdminTestJSON):
313 _interface = 'xml'