blob: f3a5e0128c4c866bce837af1317e7422fd8227f7 [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
Fei Long Wangd39431f2015-05-14 11:30:48 +120019from tempest.common.utils import data_utils
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080020from tempest.lib import decorators
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050021from tempest.lib import exceptions as lib_exc
Matthew Treinishe3d26142013-11-26 19:14:58 +000022from tempest import test
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()
Ken'ichi Ohmichia7e68712014-05-06 10:47:26 +090031 if not test.is_extension_enabled('OS-FLV-EXT-DATA', 'compute'):
32 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):
49 flavor_id = data_utils.rand_int_id(start=1000)
zhufl36eeab02017-01-18 11:49:04 +080050 new_flavor_id = self.create_flavor(ram=self.ram,
51 vcpus=self.vcpus,
52 disk=self.disk,
53 id=flavor_id)['id']
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090054 self.assertEqual(new_flavor_id, str(flavor_id))
55
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080056 @decorators.idempotent_id('94c9bb4e-2c2a-4f3c-bb1f-5f0daf918e6d')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090057 def test_create_flavor_with_uuid_id(self):
Ken'ichi Ohmichid079c892016-04-19 11:23:36 -070058 flavor_id = data_utils.rand_uuid()
zhufl36eeab02017-01-18 11:49:04 +080059 new_flavor_id = self.create_flavor(ram=self.ram,
60 vcpus=self.vcpus,
61 disk=self.disk,
62 id=flavor_id)['id']
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090063 self.assertEqual(new_flavor_id, flavor_id)
64
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080065 @decorators.idempotent_id('f83fe669-6758-448a-a85e-32d351f36fe0')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090066 def test_create_flavor_with_none_id(self):
67 # If nova receives a request with None as flavor_id,
68 # nova generates flavor_id of uuid.
69 flavor_id = None
zhufl36eeab02017-01-18 11:49:04 +080070 new_flavor_id = self.create_flavor(ram=self.ram,
71 vcpus=self.vcpus,
72 disk=self.disk,
73 id=flavor_id)['id']
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090074 self.assertEqual(new_flavor_id, str(uuid.UUID(new_flavor_id)))
75
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080076 @decorators.idempotent_id('8261d7b0-be58-43ec-a2e5-300573c3f6c5')
Rohit Karajgi03530292012-04-24 17:00:50 -070077 def test_create_flavor_verify_entry_in_list_details(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050078 # Create a flavor and ensure it's details are listed
79 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +090080 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +103081
Attila Fazekasf7f34f92013-08-01 17:01:44 +020082 # Create the flavor
zhufl36eeab02017-01-18 11:49:04 +080083 flavor = self.create_flavor(name=flavor_name,
84 ram=self.ram, vcpus=self.vcpus,
85 disk=self.disk,
86 ephemeral=self.ephemeral,
87 swap=self.swap,
88 rxtx_factor=self.rxtx)
Attila Fazekas2883fd52013-03-10 12:05:21 +010089 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +020090 # Verify flavor is retrieved
lkuchlaneb829d42017-02-13 12:57:04 +020091 flavors = self.admin_flavors_client.list_flavors(
92 detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +010093 for flavor in flavors:
94 if flavor['name'] == flavor_name:
95 flag = True
96 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -070097
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -080098 @decorators.idempotent_id('63dc64e6-2e79-4fdf-868f-85500d308d66')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053099 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200100 # Create a flavor and ensure it is listed
101 # This operation requires the user to have 'admin' role
ivan-zhuae7c7c52013-10-21 22:13:22 +0800102
103 def verify_flavor_response_extension(flavor):
104 # check some extensions for the flavor create/show/detail response
105 self.assertEqual(flavor['swap'], '')
106 self.assertEqual(int(flavor['rxtx_factor']), 1)
107 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
108 self.assertEqual(flavor['os-flavor-access:is_public'], True)
109
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
zhufl36eeab02017-01-18 11:49:04 +0800114 flavor = self.create_flavor(name=flavor_name,
115 ram=self.ram, vcpus=self.vcpus,
116 disk=self.disk,
117 id=new_flavor_id)
Attila Fazekas2883fd52013-03-10 12:05:21 +0100118 self.assertEqual(flavor['name'], flavor_name)
119 self.assertEqual(flavor['ram'], self.ram)
120 self.assertEqual(flavor['vcpus'], self.vcpus)
121 self.assertEqual(flavor['disk'], self.disk)
122 self.assertEqual(int(flavor['id']), new_flavor_id)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800123 verify_flavor_response_extension(flavor)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530124
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200125 # Verify flavor is retrieved
lkuchlaneb829d42017-02-13 12:57:04 +0200126 flavor = self.admin_flavors_client.show_flavor(new_flavor_id)['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100127 self.assertEqual(flavor['name'], flavor_name)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800128 verify_flavor_response_extension(flavor)
129
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200130 # Check if flavor is present in list
guo yunxian3f0dc9e2016-09-25 15:21:59 +0800131 flag = False
lkuchlaneb829d42017-02-13 12:57:04 +0200132 flavors = self.flavors_client.list_flavors(detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100133 for flavor in flavors:
134 if flavor['name'] == flavor_name:
ivan-zhuae7c7c52013-10-21 22:13:22 +0800135 verify_flavor_response_extension(flavor)
Attila Fazekas2883fd52013-03-10 12:05:21 +0100136 flag = True
137 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530138
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800139 @decorators.idempotent_id('be6cc18c-7c5d-48c0-ac16-17eaf03c54eb')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530140 def test_list_non_public_flavor(self):
Santiago Baldassin7f989162014-03-19 12:02:47 -0300141 # Create a flavor with os-flavor-access:is_public false.
142 # The flavor should not be present in list_details as the
143 # tenant is not automatically added access list.
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200144 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900145 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030146
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200147 # Create the flavor
zhufl36eeab02017-01-18 11:49:04 +0800148 flavor = self.create_flavor(name=flavor_name,
149 ram=self.ram, vcpus=self.vcpus,
150 disk=self.disk,
151 is_public="False")
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200152 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530153 flag = False
lkuchlaneb829d42017-02-13 12:57:04 +0200154 flavors = self.admin_flavors_client.list_flavors(
155 detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100156 for flavor in flavors:
157 if flavor['name'] == flavor_name:
158 flag = True
Santiago Baldassin7f989162014-03-19 12:02:47 -0300159 self.assertFalse(flag)
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530160
161 # Verify flavor is not retrieved with other user
162 flag = False
lkuchlaneb829d42017-02-13 12:57:04 +0200163 flavors = self.flavors_client.list_flavors(detail=True)['flavors']
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530164 for flavor in flavors:
165 if flavor['name'] == flavor_name:
166 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100167 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530168
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800169 @decorators.idempotent_id('bcc418ef-799b-47cc-baa1-ce01368b8987')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900170 def test_create_server_with_non_public_flavor(self):
171 # Create a flavor with os-flavor-access:is_public false
zhufl36eeab02017-01-18 11:49:04 +0800172 flavor = self.create_flavor(ram=self.ram, vcpus=self.vcpus,
173 disk=self.disk,
174 is_public="False")
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900175
176 # Verify flavor is not used by other user
Masayuki Igawa4b29e472015-02-16 10:41:54 +0900177 self.assertRaises(lib_exc.BadRequest,
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900178 self.os.servers_client.create_server,
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000179 name='test', imageRef=self.image_ref,
180 flavorRef=flavor['id'])
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900181
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800182 @decorators.idempotent_id('b345b196-bfbd-4231-8ac1-6d7fe15ff3a3')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530183 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200184 # Create a Flavor with public access.
185 # Try to List/Get flavor with another user
Masayuki Igawa259c1132013-10-31 17:48:44 +0900186 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030187
Matthew Treinishc795b9e2014-06-09 17:01:10 -0400188 # Create the flavor
zhufl36eeab02017-01-18 11:49:04 +0800189 flavor = self.create_flavor(name=flavor_name,
190 ram=self.ram, vcpus=self.vcpus,
191 disk=self.disk,
192 is_public="True")
Attila Fazekas2883fd52013-03-10 12:05:21 +0100193 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200194 # Verify flavor is retrieved with new user
lkuchlaneb829d42017-02-13 12:57:04 +0200195 flavors = self.flavors_client.list_flavors(detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100196 for flavor in flavors:
197 if flavor['name'] == flavor_name:
198 flag = True
199 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530200
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800201 @decorators.idempotent_id('fb9cbde6-3a0e-41f2-a983-bdb0a823c44e')
Tiago Mello0d835d22013-02-06 13:57:50 -0500202 def test_is_public_string_variations(self):
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 _flavor_lookup(flavors, flavor_name):
219 for flavor in flavors:
220 if flavor['name'] == flavor_name:
221 return flavor
222 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500223
Attila Fazekas2883fd52013-03-10 12:05:21 +0100224 def _test_string_variations(variations, flavor_name):
225 for string in variations:
226 params = {'is_public': string}
lkuchlaneb829d42017-02-13 12:57:04 +0200227 flavors = (self.admin_flavors_client.list_flavors(detail=True,
228 **params)
ghanshyam19973be2015-08-18 15:46:42 +0900229 ['flavors'])
Attila Fazekas2883fd52013-03-10 12:05:21 +0100230 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200231 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500232
Attila Fazekas2883fd52013-03-10 12:05:21 +0100233 _test_string_variations(['f', 'false', 'no', '0'],
234 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500235
Attila Fazekas2883fd52013-03-10 12:05:21 +0100236 _test_string_variations(['t', 'true', 'yes', '1'],
237 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500238
Ken'ichi Ohmichiebbfd1c2017-01-27 16:37:00 -0800239 @decorators.idempotent_id('3b541a2e-2ac2-4b42-8b8d-ba6e22fcd4da')
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800240 def test_create_flavor_using_string_ram(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900241 new_flavor_id = data_utils.rand_int_id(start=1000)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800242
Ken'ichi Ohmichi2d2d4d92014-10-29 05:10:24 +0000243 ram = "1024"
zhufl36eeab02017-01-18 11:49:04 +0800244 flavor = self.create_flavor(ram=ram, vcpus=self.vcpus,
245 disk=self.disk,
246 id=new_flavor_id)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800247 self.assertEqual(flavor['ram'], int(ram))
248 self.assertEqual(int(flavor['id']), new_flavor_id)