blob: 3e13bf8f9c500cd7be7d57c065b635817b1539c3 [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
Attila Fazekas19044d52013-02-16 07:35:06 +010030 _interface = 'json'
31
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053032 @classmethod
Attila Fazekas19044d52013-02-16 07:35:06 +010033 def setUpClass(cls):
34 super(FlavorsAdminTestJSON, cls).setUpClass()
Matthew Treinishe3d26142013-11-26 19:14:58 +000035 if not test.is_extension_enabled('FlavorExtraData', 'compute'):
Jay Pipesf38eaac2012-06-21 13:37:35 -040036 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
Attila Fazekas4ba36582013-02-12 08:26:17 +010039 cls.client = cls.os_adm.flavors_client
afazekascda40822013-03-25 16:50:41 +010040 cls.user_client = cls.os.flavors_client
Chris Yeoh8abacf32013-01-21 17:08:32 +103041 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040042 cls.ram = 512
43 cls.vcpus = 1
44 cls.disk = 10
45 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040046 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053047 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070048
Attila Fazekas2883fd52013-03-10 12:05:21 +010049 def flavor_clean_up(self, flavor_id):
50 resp, body = self.client.delete_flavor(flavor_id)
51 self.assertEqual(resp.status, 202)
52 self.client.wait_for_resource_deletion(flavor_id)
53
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090054 def _create_flavor(self, flavor_id):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050055 # Create a flavor and ensure it is listed
56 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +090057 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +103058
Attila Fazekasf7f34f92013-08-01 17:01:44 +020059 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +010060 resp, flavor = self.client.create_flavor(flavor_name,
61 self.ram, self.vcpus,
62 self.disk,
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090063 flavor_id,
Attila Fazekas2883fd52013-03-10 12:05:21 +010064 ephemeral=self.ephemeral,
65 swap=self.swap,
66 rxtx=self.rxtx)
67 self.addCleanup(self.flavor_clean_up, flavor['id'])
68 self.assertEqual(200, resp.status)
69 self.assertEqual(flavor['name'], flavor_name)
70 self.assertEqual(flavor['vcpus'], self.vcpus)
71 self.assertEqual(flavor['disk'], self.disk)
72 self.assertEqual(flavor['ram'], self.ram)
Attila Fazekas2883fd52013-03-10 12:05:21 +010073 self.assertEqual(flavor['swap'], self.swap)
74 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
75 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
76 self.ephemeral)
ivan-zhuae7c7c52013-10-21 22:13:22 +080077 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070078
Attila Fazekasf7f34f92013-08-01 17:01:44 +020079 # Verify flavor is retrieved
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090080 resp, flavor = self.client.get_flavor_details(flavor['id'])
Attila Fazekas2883fd52013-03-10 12:05:21 +010081 self.assertEqual(resp.status, 200)
82 self.assertEqual(flavor['name'], flavor_name)
Rohit Karajgi03530292012-04-24 17:00:50 -070083
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090084 return flavor['id']
85
Matthew Treinishe3d26142013-11-26 19:14:58 +000086 @test.attr(type='gate')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090087 def test_create_flavor_with_int_id(self):
88 flavor_id = data_utils.rand_int_id(start=1000)
89 new_flavor_id = self._create_flavor(flavor_id)
90 self.assertEqual(new_flavor_id, str(flavor_id))
91
Matthew Treinishe3d26142013-11-26 19:14:58 +000092 @test.attr(type='gate')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090093 def test_create_flavor_with_uuid_id(self):
94 flavor_id = str(uuid.uuid4())
95 new_flavor_id = self._create_flavor(flavor_id)
96 self.assertEqual(new_flavor_id, flavor_id)
97
Matthew Treinishe3d26142013-11-26 19:14:58 +000098 @test.attr(type='gate')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090099 def test_create_flavor_with_none_id(self):
100 # If nova receives a request with None as flavor_id,
101 # nova generates flavor_id of uuid.
102 flavor_id = None
103 new_flavor_id = self._create_flavor(flavor_id)
104 self.assertEqual(new_flavor_id, str(uuid.UUID(new_flavor_id)))
105
Matthew Treinishe3d26142013-11-26 19:14:58 +0000106 @test.attr(type='gate')
Rohit Karajgi03530292012-04-24 17:00:50 -0700107 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500108 # Create a flavor and ensure it's details are listed
109 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900110 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
111 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030112
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200113 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100114 resp, flavor = self.client.create_flavor(flavor_name,
115 self.ram, self.vcpus,
116 self.disk,
117 new_flavor_id,
118 ephemeral=self.ephemeral,
119 swap=self.swap,
120 rxtx=self.rxtx)
121 self.addCleanup(self.flavor_clean_up, flavor['id'])
122 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200123 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100124 resp, flavors = self.client.list_flavors_with_detail()
125 self.assertEqual(resp.status, 200)
126 for flavor in flavors:
127 if flavor['name'] == flavor_name:
128 flag = True
129 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700130
Matthew Treinishe3d26142013-11-26 19:14:58 +0000131 @test.attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530132 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200133 # Create a flavor and ensure it is listed
134 # This operation requires the user to have 'admin' role
ivan-zhuae7c7c52013-10-21 22:13:22 +0800135
136 def verify_flavor_response_extension(flavor):
137 # check some extensions for the flavor create/show/detail response
138 self.assertEqual(flavor['swap'], '')
139 self.assertEqual(int(flavor['rxtx_factor']), 1)
140 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
141 self.assertEqual(flavor['os-flavor-access:is_public'], True)
142
Masayuki Igawa259c1132013-10-31 17:48:44 +0900143 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
144 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030145
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200146 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100147 resp, flavor = self.client.create_flavor(flavor_name,
148 self.ram, self.vcpus,
149 self.disk,
150 new_flavor_id)
151 self.addCleanup(self.flavor_clean_up, flavor['id'])
152 self.assertEqual(200, resp.status)
153 self.assertEqual(flavor['name'], flavor_name)
154 self.assertEqual(flavor['ram'], self.ram)
155 self.assertEqual(flavor['vcpus'], self.vcpus)
156 self.assertEqual(flavor['disk'], self.disk)
157 self.assertEqual(int(flavor['id']), new_flavor_id)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800158 verify_flavor_response_extension(flavor)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530159
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200160 # Verify flavor is retrieved
Attila Fazekas2883fd52013-03-10 12:05:21 +0100161 resp, flavor = self.client.get_flavor_details(new_flavor_id)
162 self.assertEqual(resp.status, 200)
163 self.assertEqual(flavor['name'], flavor_name)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800164 verify_flavor_response_extension(flavor)
165
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200166 # Check if flavor is present in list
ivan-zhuae7c7c52013-10-21 22:13:22 +0800167 resp, flavors = self.user_client.list_flavors_with_detail()
Attila Fazekas2883fd52013-03-10 12:05:21 +0100168 self.assertEqual(resp.status, 200)
169 for flavor in flavors:
170 if flavor['name'] == flavor_name:
ivan-zhuae7c7c52013-10-21 22:13:22 +0800171 verify_flavor_response_extension(flavor)
Attila Fazekas2883fd52013-03-10 12:05:21 +0100172 flag = True
173 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530174
Matthew Treinishe3d26142013-11-26 19:14:58 +0000175 @test.attr(type='gate')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530176 def test_list_non_public_flavor(self):
177 # Create a flavor with os-flavor-access:is_public false should
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200178 # be present in list_details.
179 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900180 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
181 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030182
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200183 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100184 resp, flavor = self.client.create_flavor(flavor_name,
185 self.ram, self.vcpus,
186 self.disk,
187 new_flavor_id,
188 is_public="False")
189 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200190 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530191 flag = False
Attila Fazekas2883fd52013-03-10 12:05:21 +0100192 resp, flavors = self.client.list_flavors_with_detail()
193 self.assertEqual(resp.status, 200)
194 for flavor in flavors:
195 if flavor['name'] == flavor_name:
196 flag = True
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530197 self.assertTrue(flag)
198
199 # Verify flavor is not retrieved with other user
200 flag = False
201 resp, flavors = self.user_client.list_flavors_with_detail()
202 self.assertEqual(resp.status, 200)
203 for flavor in flavors:
204 if flavor['name'] == flavor_name:
205 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100206 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530207
Matthew Treinishe3d26142013-11-26 19:14:58 +0000208 @test.attr(type='gate')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900209 def test_create_server_with_non_public_flavor(self):
210 # Create a flavor with os-flavor-access:is_public false
Masayuki Igawa259c1132013-10-31 17:48:44 +0900211 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
212 new_flavor_id = data_utils.rand_int_id(start=1000)
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900213
214 # Create the flavor
215 resp, flavor = self.client.create_flavor(flavor_name,
216 self.ram, self.vcpus,
217 self.disk,
218 new_flavor_id,
219 is_public="False")
220 self.addCleanup(self.flavor_clean_up, flavor['id'])
221 self.assertEqual(200, resp.status)
222
223 # Verify flavor is not used by other user
224 self.assertRaises(exceptions.BadRequest,
225 self.os.servers_client.create_server,
226 'test', self.image_ref, flavor['id'])
227
Matthew Treinishe3d26142013-11-26 19:14:58 +0000228 @test.attr(type='gate')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530229 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200230 # Create a Flavor with public access.
231 # Try to List/Get flavor with another user
Masayuki Igawa259c1132013-10-31 17:48:44 +0900232 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
233 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030234
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200235 # Create the flavor
Attila Fazekas2883fd52013-03-10 12:05:21 +0100236 resp, flavor = self.client.create_flavor(flavor_name,
237 self.ram, self.vcpus,
238 self.disk,
239 new_flavor_id,
240 is_public="True")
241 self.addCleanup(self.flavor_clean_up, flavor['id'])
242 flag = False
243 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200244 # Verify flavor is retrieved with new user
Attila Fazekas2883fd52013-03-10 12:05:21 +0100245 resp, flavors = self.new_client.list_flavors_with_detail()
246 self.assertEqual(resp.status, 200)
247 for flavor in flavors:
248 if flavor['name'] == flavor_name:
249 flag = True
250 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530251
Matthew Treinishe3d26142013-11-26 19:14:58 +0000252 @test.attr(type='gate')
Tiago Mello0d835d22013-02-06 13:57:50 -0500253 def test_is_public_string_variations(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900254 flavor_id_not_public = data_utils.rand_int_id(start=1000)
255 flavor_name_not_public = data_utils.rand_name(self.flavor_name_prefix)
256 flavor_id_public = data_utils.rand_int_id(start=1000)
257 flavor_name_public = data_utils.rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500258
Attila Fazekas2883fd52013-03-10 12:05:21 +0100259 # Create a non public flavor
260 resp, flavor = self.client.create_flavor(flavor_name_not_public,
261 self.ram, self.vcpus,
262 self.disk,
263 flavor_id_not_public,
264 is_public="False")
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 # Create a public flavor
268 resp, flavor = self.client.create_flavor(flavor_name_public,
269 self.ram, self.vcpus,
270 self.disk,
271 flavor_id_public,
272 is_public="True")
273 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500274
Attila Fazekas2883fd52013-03-10 12:05:21 +0100275 def _flavor_lookup(flavors, flavor_name):
276 for flavor in flavors:
277 if flavor['name'] == flavor_name:
278 return flavor
279 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500280
Attila Fazekas2883fd52013-03-10 12:05:21 +0100281 def _test_string_variations(variations, flavor_name):
282 for string in variations:
283 params = {'is_public': string}
284 r, flavors = self.client.list_flavors_with_detail(params)
285 self.assertEqual(r.status, 200)
286 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200287 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500288
Attila Fazekas2883fd52013-03-10 12:05:21 +0100289 _test_string_variations(['f', 'false', 'no', '0'],
290 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500291
Attila Fazekas2883fd52013-03-10 12:05:21 +0100292 _test_string_variations(['t', 'true', 'yes', '1'],
293 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500294
Matthew Treinishe3d26142013-11-26 19:14:58 +0000295 @test.attr(type='gate')
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800296 def test_create_flavor_using_string_ram(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900297 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
298 new_flavor_id = data_utils.rand_int_id(start=1000)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800299
300 ram = " 1024 "
301 resp, flavor = self.client.create_flavor(flavor_name,
302 ram, self.vcpus,
303 self.disk,
304 new_flavor_id)
305 self.addCleanup(self.flavor_clean_up, flavor['id'])
306 self.assertEqual(200, resp.status)
307 self.assertEqual(flavor['name'], flavor_name)
308 self.assertEqual(flavor['vcpus'], self.vcpus)
309 self.assertEqual(flavor['disk'], self.disk)
310 self.assertEqual(flavor['ram'], int(ram))
311 self.assertEqual(int(flavor['id']), new_flavor_id)
312
Tiago Melloeda03b52012-08-22 23:47:29 -0300313
Attila Fazekas19044d52013-02-16 07:35:06 +0100314class FlavorsAdminTestXML(FlavorsAdminTestJSON):
315 _interface = 'xml'