blob: d6b6b7e4723848526719a1d86513591496201191 [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
Andrea Frittolicd368412017-08-14 21:37:56 +010019from tempest.common import utils
Ken'ichi Ohmichi757833a2017-03-10 10:30:30 -080020from tempest.lib.common.utils import data_utils
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080021from tempest.lib import decorators
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050022from tempest.lib import exceptions as lib_exc
Rohit Karajgi03530292012-04-24 17:00:50 -070023
24
ivan-zhuf2b00502013-10-18 10:06:52 +080025class FlavorsAdminTestJSON(base.BaseV2ComputeAdminTest):
Ken'ichi Ohmichi88363cb2015-11-19 08:00:54 +000026 """Tests Flavors API Create and Delete that require admin privileges"""
Rohit Karajgi03530292012-04-24 17:00:50 -070027
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053028 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053029 def skip_checks(cls):
30 super(FlavorsAdminTestJSON, cls).skip_checks()
Andrea Frittolicd368412017-08-14 21:37:56 +010031 if not utils.is_extension_enabled('OS-FLV-EXT-DATA', 'compute'):
Ken'ichi Ohmichia7e68712014-05-06 10:47:26 +090032 msg = "OS-FLV-EXT-DATA extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080033 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070034
Rohan Kanade60b73092015-02-04 17:58:19 +053035 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053036 def resource_setup(cls):
37 super(FlavorsAdminTestJSON, cls).resource_setup()
38
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
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080047 @decorators.idempotent_id('8b4330e1-12c4-4554-9390-e6639971f086')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090048 def test_create_flavor_with_int_id(self):
zhufl1b3b03d2020-04-16 08:38:16 +080049 """Test creating flavor with id of type integer"""
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090050 flavor_id = data_utils.rand_int_id(start=1000)
zhufl36eeab02017-01-18 11:49:04 +080051 new_flavor_id = self.create_flavor(ram=self.ram,
52 vcpus=self.vcpus,
53 disk=self.disk,
54 id=flavor_id)['id']
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090055 self.assertEqual(new_flavor_id, str(flavor_id))
56
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080057 @decorators.idempotent_id('94c9bb4e-2c2a-4f3c-bb1f-5f0daf918e6d')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090058 def test_create_flavor_with_uuid_id(self):
zhufl1b3b03d2020-04-16 08:38:16 +080059 """Test creating flavor with id of type uuid"""
Ken'ichi Ohmichid079c892016-04-19 11:23:36 -070060 flavor_id = data_utils.rand_uuid()
zhufl36eeab02017-01-18 11:49:04 +080061 new_flavor_id = self.create_flavor(ram=self.ram,
62 vcpus=self.vcpus,
63 disk=self.disk,
64 id=flavor_id)['id']
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090065 self.assertEqual(new_flavor_id, flavor_id)
66
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080067 @decorators.idempotent_id('f83fe669-6758-448a-a85e-32d351f36fe0')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090068 def test_create_flavor_with_none_id(self):
zhufl1b3b03d2020-04-16 08:38:16 +080069 """Test creating flavor without id specified
70
71 If nova receives a request with None as flavor_id,
72 nova generates flavor_id of uuid.
73 """
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090074 flavor_id = None
zhufl36eeab02017-01-18 11:49:04 +080075 new_flavor_id = self.create_flavor(ram=self.ram,
76 vcpus=self.vcpus,
77 disk=self.disk,
78 id=flavor_id)['id']
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090079 self.assertEqual(new_flavor_id, str(uuid.UUID(new_flavor_id)))
80
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080081 @decorators.idempotent_id('8261d7b0-be58-43ec-a2e5-300573c3f6c5')
Rohit Karajgi03530292012-04-24 17:00:50 -070082 def test_create_flavor_verify_entry_in_list_details(self):
zhufl1b3b03d2020-04-16 08:38:16 +080083 """Create a flavor and ensure its details are listed
84
85 This operation requires the user to have 'admin' role
86 """
Masayuki Igawa259c1132013-10-31 17:48:44 +090087 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +103088
Attila Fazekasf7f34f92013-08-01 17:01:44 +020089 # Create the flavor
Jordan Pittierd5969792017-02-07 14:10:52 +010090 self.create_flavor(name=flavor_name,
91 ram=self.ram, vcpus=self.vcpus,
92 disk=self.disk,
93 ephemeral=self.ephemeral,
94 swap=self.swap,
95 rxtx_factor=self.rxtx)
96
97 # Check if flavor is present in list
98 flavors_list = self.admin_flavors_client.list_flavors(
lkuchlaneb829d42017-02-13 12:57:04 +020099 detail=True)['flavors']
Jordan Pittierd5969792017-02-07 14:10:52 +0100100 self.assertIn(flavor_name, [f['name'] for f in flavors_list])
Rohit Karajgi03530292012-04-24 17:00:50 -0700101
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800102 @decorators.idempotent_id('63dc64e6-2e79-4fdf-868f-85500d308d66')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530103 def test_create_list_flavor_without_extra_data(self):
zhufl1b3b03d2020-04-16 08:38:16 +0800104 """Create a flavor and ensure it is listed
ivan-zhuae7c7c52013-10-21 22:13:22 +0800105
zhufl1b3b03d2020-04-16 08:38:16 +0800106 This operation requires the user to have 'admin' role
107 """
ivan-zhuae7c7c52013-10-21 22:13:22 +0800108 def verify_flavor_response_extension(flavor):
109 # check some extensions for the flavor create/show/detail response
zhufld89c6cb2020-06-05 16:32:41 +0800110 if self.is_requested_microversion_compatible('2.74'):
111 self.assertEqual(flavor['swap'], '')
112 else:
113 self.assertEqual(flavor['swap'], 0)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800114 self.assertEqual(int(flavor['rxtx_factor']), 1)
zhufl44cdf152017-02-21 11:21:57 +0800115 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'], 0)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800116 self.assertEqual(flavor['os-flavor-access:is_public'], True)
117
Masayuki Igawa259c1132013-10-31 17:48:44 +0900118 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
119 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030120
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200121 # Create the flavor
zhufl36eeab02017-01-18 11:49:04 +0800122 flavor = self.create_flavor(name=flavor_name,
123 ram=self.ram, vcpus=self.vcpus,
124 disk=self.disk,
125 id=new_flavor_id)
Attila Fazekas2883fd52013-03-10 12:05:21 +0100126 self.assertEqual(flavor['name'], flavor_name)
127 self.assertEqual(flavor['ram'], self.ram)
128 self.assertEqual(flavor['vcpus'], self.vcpus)
129 self.assertEqual(flavor['disk'], self.disk)
130 self.assertEqual(int(flavor['id']), new_flavor_id)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800131 verify_flavor_response_extension(flavor)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530132
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200133 # Verify flavor is retrieved
lkuchlaneb829d42017-02-13 12:57:04 +0200134 flavor = self.admin_flavors_client.show_flavor(new_flavor_id)['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100135 self.assertEqual(flavor['name'], flavor_name)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800136 verify_flavor_response_extension(flavor)
137
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200138 # Check if flavor is present in list
Jordan Pittierd5969792017-02-07 14:10:52 +0100139 flavors_list = [
140 f for f in self.flavors_client.list_flavors(detail=True)['flavors']
141 if f['name'] == flavor_name
142 ]
143 self.assertNotEmpty(flavors_list)
144 verify_flavor_response_extension(flavors_list[0])
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530145
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800146 @decorators.idempotent_id('be6cc18c-7c5d-48c0-ac16-17eaf03c54eb')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530147 def test_list_non_public_flavor(self):
zhufl1b3b03d2020-04-16 08:38:16 +0800148 """Create a flavor with os-flavor-access:is_public false.
149
150 The flavor should not be present in list_details as the
151 tenant is not automatically added access list.
152 This operation requires the user to have 'admin' role
153 """
Masayuki Igawa259c1132013-10-31 17:48:44 +0900154 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030155
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200156 # Create the flavor
Jordan Pittierd5969792017-02-07 14:10:52 +0100157 self.create_flavor(name=flavor_name,
158 ram=self.ram, vcpus=self.vcpus,
159 disk=self.disk,
160 is_public="False")
161 # Verify flavor is not retrieved
162 flavors_list = self.admin_flavors_client.list_flavors(
lkuchlaneb829d42017-02-13 12:57:04 +0200163 detail=True)['flavors']
Jordan Pittierd5969792017-02-07 14:10:52 +0100164 self.assertNotIn(flavor_name, [f['name'] for f in flavors_list])
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530165
166 # Verify flavor is not retrieved with other user
Jordan Pittierd5969792017-02-07 14:10:52 +0100167 flavors_list = self.flavors_client.list_flavors(detail=True)['flavors']
168 self.assertNotIn(flavor_name, [f['name'] for f in flavors_list])
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530169
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800170 @decorators.idempotent_id('bcc418ef-799b-47cc-baa1-ce01368b8987')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900171 def test_create_server_with_non_public_flavor(self):
zhufl1b3b03d2020-04-16 08:38:16 +0800172 """Create a flavor with os-flavor-access:is_public false"""
zhufl36eeab02017-01-18 11:49:04 +0800173 flavor = self.create_flavor(ram=self.ram, vcpus=self.vcpus,
174 disk=self.disk,
175 is_public="False")
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900176
177 # Verify flavor is not used by other user
Masayuki Igawa4b29e472015-02-16 10:41:54 +0900178 self.assertRaises(lib_exc.BadRequest,
Jordan Pittier8160d312017-04-18 11:52:23 +0200179 self.os_primary.servers_client.create_server,
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000180 name='test', imageRef=self.image_ref,
181 flavorRef=flavor['id'])
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900182
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800183 @decorators.idempotent_id('b345b196-bfbd-4231-8ac1-6d7fe15ff3a3')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530184 def test_list_public_flavor_with_other_user(self):
zhufl1b3b03d2020-04-16 08:38:16 +0800185 """Create a Flavor with public access.
186
187 Try to List/Get flavor with another user
188 """
Masayuki Igawa259c1132013-10-31 17:48:44 +0900189 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030190
Matthew Treinishc795b9e2014-06-09 17:01:10 -0400191 # Create the flavor
Jordan Pittierd5969792017-02-07 14:10:52 +0100192 self.create_flavor(name=flavor_name,
193 ram=self.ram, vcpus=self.vcpus,
194 disk=self.disk,
195 is_public="True")
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200196 # Verify flavor is retrieved with new user
Jordan Pittierd5969792017-02-07 14:10:52 +0100197 flavors_list = self.flavors_client.list_flavors(detail=True)['flavors']
198 self.assertIn(flavor_name, [f['name'] for f in flavors_list])
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530199
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800200 @decorators.idempotent_id('fb9cbde6-3a0e-41f2-a983-bdb0a823c44e')
Tiago Mello0d835d22013-02-06 13:57:50 -0500201 def test_is_public_string_variations(self):
zhufl1b3b03d2020-04-16 08:38:16 +0800202 """Test creating public and non public flavors"""
Masayuki Igawa259c1132013-10-31 17:48:44 +0900203 flavor_name_not_public = data_utils.rand_name(self.flavor_name_prefix)
Masayuki Igawa259c1132013-10-31 17:48:44 +0900204 flavor_name_public = data_utils.rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500205
Attila Fazekas2883fd52013-03-10 12:05:21 +0100206 # Create a non public flavor
zhufl36eeab02017-01-18 11:49:04 +0800207 self.create_flavor(name=flavor_name_not_public,
208 ram=self.ram, vcpus=self.vcpus,
209 disk=self.disk,
210 is_public="False")
Tiago Mello0d835d22013-02-06 13:57:50 -0500211
Attila Fazekas2883fd52013-03-10 12:05:21 +0100212 # Create a public flavor
zhufl36eeab02017-01-18 11:49:04 +0800213 self.create_flavor(name=flavor_name_public,
214 ram=self.ram, vcpus=self.vcpus,
215 disk=self.disk,
216 is_public="True")
Tiago Mello0d835d22013-02-06 13:57:50 -0500217
Attila Fazekas2883fd52013-03-10 12:05:21 +0100218 def _test_string_variations(variations, flavor_name):
219 for string in variations:
220 params = {'is_public': string}
lkuchlaneb829d42017-02-13 12:57:04 +0200221 flavors = (self.admin_flavors_client.list_flavors(detail=True,
222 **params)
ghanshyam19973be2015-08-18 15:46:42 +0900223 ['flavors'])
Jordan Pittierd5969792017-02-07 14:10:52 +0100224 self.assertIn(flavor_name, [f['name'] for f in flavors])
Tiago Mello0d835d22013-02-06 13:57:50 -0500225
Attila Fazekas2883fd52013-03-10 12:05:21 +0100226 _test_string_variations(['f', 'false', 'no', '0'],
227 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500228
Attila Fazekas2883fd52013-03-10 12:05:21 +0100229 _test_string_variations(['t', 'true', 'yes', '1'],
230 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500231
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800232 @decorators.idempotent_id('3b541a2e-2ac2-4b42-8b8d-ba6e22fcd4da')
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800233 def test_create_flavor_using_string_ram(self):
zhufl1b3b03d2020-04-16 08:38:16 +0800234 """Test creating flavor with ram of type string"""
Masayuki Igawa259c1132013-10-31 17:48:44 +0900235 new_flavor_id = data_utils.rand_int_id(start=1000)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800236
Ken'ichi Ohmichi2d2d4d92014-10-29 05:10:24 +0000237 ram = "1024"
zhufl36eeab02017-01-18 11:49:04 +0800238 flavor = self.create_flavor(ram=ram, vcpus=self.vcpus,
239 disk=self.disk,
240 id=new_flavor_id)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800241 self.assertEqual(flavor['ram'], int(ram))
242 self.assertEqual(int(flavor['id']), new_flavor_id)