blob: 95e7ef18a31c3c5e2fa44b6a8f7164c7f1ff1c0a [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
Andrea Frittoli (andreaf)db9672e2016-02-23 14:07:24 -050020from tempest.lib import exceptions as lib_exc
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):
Ken'ichi Ohmichi88363cb2015-11-19 08:00:54 +000025 """Tests Flavors API Create and Delete that require admin privileges"""
Rohit Karajgi03530292012-04-24 17:00:50 -070026
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053027 @classmethod
Rohan Kanade60b73092015-02-04 17:58:19 +053028 def skip_checks(cls):
29 super(FlavorsAdminTestJSON, cls).skip_checks()
Ken'ichi Ohmichia7e68712014-05-06 10:47:26 +090030 if not test.is_extension_enabled('OS-FLV-EXT-DATA', 'compute'):
31 msg = "OS-FLV-EXT-DATA extension not enabled."
ivan-zhu1feeb382013-01-24 10:14:39 +080032 raise cls.skipException(msg)
Rohit Karajgi03530292012-04-24 17:00:50 -070033
Rohan Kanade60b73092015-02-04 17:58:19 +053034 @classmethod
35 def setup_clients(cls):
36 super(FlavorsAdminTestJSON, cls).setup_clients()
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
Rohan Kanade60b73092015-02-04 17:58:19 +053039
40 @classmethod
41 def resource_setup(cls):
42 super(FlavorsAdminTestJSON, cls).resource_setup()
43
Chris Yeoh8abacf32013-01-21 17:08:32 +103044 cls.flavor_name_prefix = 'test_flavor_'
Jay Pipesf38eaac2012-06-21 13:37:35 -040045 cls.ram = 512
46 cls.vcpus = 1
47 cls.disk = 10
48 cls.ephemeral = 10
Jay Pipesf38eaac2012-06-21 13:37:35 -040049 cls.swap = 1024
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +053050 cls.rxtx = 2
Rohit Karajgi03530292012-04-24 17:00:50 -070051
Attila Fazekas2883fd52013-03-10 12:05:21 +010052 def flavor_clean_up(self, flavor_id):
David Kranz2fa77b22015-02-09 11:39:50 -050053 self.client.delete_flavor(flavor_id)
Attila Fazekas2883fd52013-03-10 12:05:21 +010054 self.client.wait_for_resource_deletion(flavor_id)
55
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090056 def _create_flavor(self, flavor_id):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050057 # Create a flavor and ensure it is listed
58 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +090059 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
Chris Yeoh8abacf32013-01-21 17:08:32 +103060
Attila Fazekasf7f34f92013-08-01 17:01:44 +020061 # Create the flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +000062 flavor = self.client.create_flavor(name=flavor_name,
63 ram=self.ram, vcpus=self.vcpus,
64 disk=self.disk,
65 id=flavor_id,
David Kranz2fa77b22015-02-09 11:39:50 -050066 ephemeral=self.ephemeral,
67 swap=self.swap,
ghanshyam19973be2015-08-18 15:46:42 +090068 rxtx_factor=self.rxtx)['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +010069 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekas2883fd52013-03-10 12:05:21 +010070 self.assertEqual(flavor['name'], flavor_name)
71 self.assertEqual(flavor['vcpus'], self.vcpus)
72 self.assertEqual(flavor['disk'], self.disk)
73 self.assertEqual(flavor['ram'], self.ram)
Attila Fazekas2883fd52013-03-10 12:05:21 +010074 self.assertEqual(flavor['swap'], self.swap)
75 self.assertEqual(flavor['rxtx_factor'], self.rxtx)
76 self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
77 self.ephemeral)
ivan-zhuae7c7c52013-10-21 22:13:22 +080078 self.assertEqual(flavor['os-flavor-access:is_public'], True)
Rohit Karajgi03530292012-04-24 17:00:50 -070079
Attila Fazekasf7f34f92013-08-01 17:01:44 +020080 # Verify flavor is retrieved
ghanshyam19973be2015-08-18 15:46:42 +090081 flavor = self.client.show_flavor(flavor['id'])['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +010082 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
Chris Hoge7579c1a2015-02-26 14:12:15 -080086 @test.idempotent_id('8b4330e1-12c4-4554-9390-e6639971f086')
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
Chris Hoge7579c1a2015-02-26 14:12:15 -080092 @test.idempotent_id('94c9bb4e-2c2a-4f3c-bb1f-5f0daf918e6d')
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090093 def test_create_flavor_with_uuid_id(self):
Ken'ichi Ohmichid079c892016-04-19 11:23:36 -070094 flavor_id = data_utils.rand_uuid()
Ken'ichi Ohmichi35772602013-11-14 15:03:27 +090095 new_flavor_id = self._create_flavor(flavor_id)
96 self.assertEqual(new_flavor_id, flavor_id)
97
Chris Hoge7579c1a2015-02-26 14:12:15 -080098 @test.idempotent_id('f83fe669-6758-448a-a85e-32d351f36fe0')
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
Chris Hoge7579c1a2015-02-26 14:12:15 -0800106 @test.idempotent_id('8261d7b0-be58-43ec-a2e5-300573c3f6c5')
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
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000114 flavor = self.client.create_flavor(name=flavor_name,
115 ram=self.ram, vcpus=self.vcpus,
116 disk=self.disk,
117 id=new_flavor_id,
David Kranz2fa77b22015-02-09 11:39:50 -0500118 ephemeral=self.ephemeral,
119 swap=self.swap,
ghanshyam19973be2015-08-18 15:46:42 +0900120 rxtx_factor=self.rxtx)['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100121 self.addCleanup(self.flavor_clean_up, flavor['id'])
122 flag = False
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200123 # Verify flavor is retrieved
ghanshyam19973be2015-08-18 15:46:42 +0900124 flavors = self.client.list_flavors(detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100125 for flavor in flavors:
126 if flavor['name'] == flavor_name:
127 flag = True
128 self.assertTrue(flag)
Rohit Karajgi03530292012-04-24 17:00:50 -0700129
Chris Hoge7579c1a2015-02-26 14:12:15 -0800130 @test.idempotent_id('63dc64e6-2e79-4fdf-868f-85500d308d66')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530131 def test_create_list_flavor_without_extra_data(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200132 # Create a flavor and ensure it is listed
133 # This operation requires the user to have 'admin' role
ivan-zhuae7c7c52013-10-21 22:13:22 +0800134
135 def verify_flavor_response_extension(flavor):
136 # check some extensions for the flavor create/show/detail response
137 self.assertEqual(flavor['swap'], '')
138 self.assertEqual(int(flavor['rxtx_factor']), 1)
139 self.assertEqual(int(flavor['OS-FLV-EXT-DATA:ephemeral']), 0)
140 self.assertEqual(flavor['os-flavor-access:is_public'], True)
141
Masayuki Igawa259c1132013-10-31 17:48:44 +0900142 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
143 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030144
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200145 # Create the flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000146 flavor = self.client.create_flavor(name=flavor_name,
147 ram=self.ram, vcpus=self.vcpus,
148 disk=self.disk,
ghanshyam19973be2015-08-18 15:46:42 +0900149 id=new_flavor_id)['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100150 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekas2883fd52013-03-10 12:05:21 +0100151 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
ghanshyam19973be2015-08-18 15:46:42 +0900159 flavor = self.client.show_flavor(new_flavor_id)['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100160 self.assertEqual(flavor['name'], flavor_name)
ivan-zhuae7c7c52013-10-21 22:13:22 +0800161 verify_flavor_response_extension(flavor)
162
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200163 # Check if flavor is present in list
ghanshyam19973be2015-08-18 15:46:42 +0900164 flavors = self.user_client.list_flavors(detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100165 for flavor in flavors:
166 if flavor['name'] == flavor_name:
ivan-zhuae7c7c52013-10-21 22:13:22 +0800167 verify_flavor_response_extension(flavor)
Attila Fazekas2883fd52013-03-10 12:05:21 +0100168 flag = True
169 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530170
Chris Hoge7579c1a2015-02-26 14:12:15 -0800171 @test.idempotent_id('be6cc18c-7c5d-48c0-ac16-17eaf03c54eb')
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530172 def test_list_non_public_flavor(self):
Santiago Baldassin7f989162014-03-19 12:02:47 -0300173 # Create a flavor with os-flavor-access:is_public false.
174 # The flavor should not be present in list_details as the
175 # tenant is not automatically added access list.
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200176 # This operation requires the user to have 'admin' role
Masayuki Igawa259c1132013-10-31 17:48:44 +0900177 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
178 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030179
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200180 # Create the flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000181 flavor = self.client.create_flavor(name=flavor_name,
182 ram=self.ram, vcpus=self.vcpus,
183 disk=self.disk,
184 id=new_flavor_id,
ghanshyam19973be2015-08-18 15:46:42 +0900185 is_public="False")['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100186 self.addCleanup(self.flavor_clean_up, flavor['id'])
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200187 # Verify flavor is retrieved
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530188 flag = False
ghanshyam19973be2015-08-18 15:46:42 +0900189 flavors = self.client.list_flavors(detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100190 for flavor in flavors:
191 if flavor['name'] == flavor_name:
192 flag = True
Santiago Baldassin7f989162014-03-19 12:02:47 -0300193 self.assertFalse(flag)
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530194
195 # Verify flavor is not retrieved with other user
196 flag = False
ghanshyam19973be2015-08-18 15:46:42 +0900197 flavors = self.user_client.list_flavors(detail=True)['flavors']
Sumanth Nagadavalli3d955d92013-08-13 15:16:30 +0530198 for flavor in flavors:
199 if flavor['name'] == flavor_name:
200 flag = True
Attila Fazekas2883fd52013-03-10 12:05:21 +0100201 self.assertFalse(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530202
Chris Hoge7579c1a2015-02-26 14:12:15 -0800203 @test.idempotent_id('bcc418ef-799b-47cc-baa1-ce01368b8987')
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900204 def test_create_server_with_non_public_flavor(self):
205 # Create a flavor with os-flavor-access:is_public false
Masayuki Igawa259c1132013-10-31 17:48:44 +0900206 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
207 new_flavor_id = data_utils.rand_int_id(start=1000)
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900208
209 # Create the flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000210 flavor = self.client.create_flavor(name=flavor_name,
211 ram=self.ram, vcpus=self.vcpus,
212 disk=self.disk,
213 id=new_flavor_id,
ghanshyam19973be2015-08-18 15:46:42 +0900214 is_public="False")['flavor']
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900215 self.addCleanup(self.flavor_clean_up, flavor['id'])
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900216
217 # Verify flavor is not used by other user
Masayuki Igawa4b29e472015-02-16 10:41:54 +0900218 self.assertRaises(lib_exc.BadRequest,
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900219 self.os.servers_client.create_server,
Ken'ichi Ohmichif2d436e2015-09-03 01:13:16 +0000220 name='test', imageRef=self.image_ref,
221 flavorRef=flavor['id'])
Ken'ichi Ohmichi32b1e6c2013-09-06 12:07:07 +0900222
Chris Hoge7579c1a2015-02-26 14:12:15 -0800223 @test.idempotent_id('b345b196-bfbd-4231-8ac1-6d7fe15ff3a3')
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530224 def test_list_public_flavor_with_other_user(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200225 # Create a Flavor with public access.
226 # Try to List/Get flavor with another user
Masayuki Igawa259c1132013-10-31 17:48:44 +0900227 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
228 new_flavor_id = data_utils.rand_int_id(start=1000)
Chris Yeoh8abacf32013-01-21 17:08:32 +1030229
Matthew Treinishc795b9e2014-06-09 17:01:10 -0400230 # Create the flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000231 flavor = self.client.create_flavor(name=flavor_name,
232 ram=self.ram, vcpus=self.vcpus,
233 disk=self.disk,
234 id=new_flavor_id,
ghanshyam19973be2015-08-18 15:46:42 +0900235 is_public="True")['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100236 self.addCleanup(self.flavor_clean_up, flavor['id'])
237 flag = False
238 self.new_client = self.flavors_client
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200239 # Verify flavor is retrieved with new user
ghanshyam19973be2015-08-18 15:46:42 +0900240 flavors = self.new_client.list_flavors(detail=True)['flavors']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100241 for flavor in flavors:
242 if flavor['name'] == flavor_name:
243 flag = True
244 self.assertTrue(flag)
rajalakshmi-ganesanf344cc32012-12-31 20:02:27 +0530245
Chris Hoge7579c1a2015-02-26 14:12:15 -0800246 @test.idempotent_id('fb9cbde6-3a0e-41f2-a983-bdb0a823c44e')
Tiago Mello0d835d22013-02-06 13:57:50 -0500247 def test_is_public_string_variations(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900248 flavor_id_not_public = data_utils.rand_int_id(start=1000)
249 flavor_name_not_public = data_utils.rand_name(self.flavor_name_prefix)
250 flavor_id_public = data_utils.rand_int_id(start=1000)
251 flavor_name_public = data_utils.rand_name(self.flavor_name_prefix)
Tiago Mello0d835d22013-02-06 13:57:50 -0500252
Attila Fazekas2883fd52013-03-10 12:05:21 +0100253 # Create a non public flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000254 flavor = self.client.create_flavor(name=flavor_name_not_public,
255 ram=self.ram, vcpus=self.vcpus,
256 disk=self.disk,
257 id=flavor_id_not_public,
ghanshyam19973be2015-08-18 15:46:42 +0900258 is_public="False")['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100259 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500260
Attila Fazekas2883fd52013-03-10 12:05:21 +0100261 # Create a public flavor
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000262 flavor = self.client.create_flavor(name=flavor_name_public,
263 ram=self.ram, vcpus=self.vcpus,
264 disk=self.disk,
265 id=flavor_id_public,
ghanshyam19973be2015-08-18 15:46:42 +0900266 is_public="True")['flavor']
Attila Fazekas2883fd52013-03-10 12:05:21 +0100267 self.addCleanup(self.flavor_clean_up, flavor['id'])
Tiago Mello0d835d22013-02-06 13:57:50 -0500268
Attila Fazekas2883fd52013-03-10 12:05:21 +0100269 def _flavor_lookup(flavors, flavor_name):
270 for flavor in flavors:
271 if flavor['name'] == flavor_name:
272 return flavor
273 return None
Tiago Mello0d835d22013-02-06 13:57:50 -0500274
Attila Fazekas2883fd52013-03-10 12:05:21 +0100275 def _test_string_variations(variations, flavor_name):
276 for string in variations:
277 params = {'is_public': string}
ghanshyam19973be2015-08-18 15:46:42 +0900278 flavors = (self.client.list_flavors(detail=True, **params)
279 ['flavors'])
Attila Fazekas2883fd52013-03-10 12:05:21 +0100280 flavor = _flavor_lookup(flavors, flavor_name)
Ionuț Arțăriși7f7d4522013-08-21 11:47:47 +0200281 self.assertIsNotNone(flavor)
Tiago Mello0d835d22013-02-06 13:57:50 -0500282
Attila Fazekas2883fd52013-03-10 12:05:21 +0100283 _test_string_variations(['f', 'false', 'no', '0'],
284 flavor_name_not_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500285
Attila Fazekas2883fd52013-03-10 12:05:21 +0100286 _test_string_variations(['t', 'true', 'yes', '1'],
287 flavor_name_public)
Tiago Mello0d835d22013-02-06 13:57:50 -0500288
Chris Hoge7579c1a2015-02-26 14:12:15 -0800289 @test.idempotent_id('3b541a2e-2ac2-4b42-8b8d-ba6e22fcd4da')
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800290 def test_create_flavor_using_string_ram(self):
Masayuki Igawa259c1132013-10-31 17:48:44 +0900291 flavor_name = data_utils.rand_name(self.flavor_name_prefix)
292 new_flavor_id = data_utils.rand_int_id(start=1000)
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800293
Ken'ichi Ohmichi2d2d4d92014-10-29 05:10:24 +0000294 ram = "1024"
Ken'ichi Ohmichi96338c42015-07-17 06:25:14 +0000295 flavor = self.client.create_flavor(name=flavor_name,
296 ram=ram, vcpus=self.vcpus,
297 disk=self.disk,
ghanshyam19973be2015-08-18 15:46:42 +0900298 id=new_flavor_id)['flavor']
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800299 self.addCleanup(self.flavor_clean_up, flavor['id'])
Zhi Kun Liu20f13222013-09-03 00:36:38 +0800300 self.assertEqual(flavor['name'], flavor_name)
301 self.assertEqual(flavor['vcpus'], self.vcpus)
302 self.assertEqual(flavor['disk'], self.disk)
303 self.assertEqual(flavor['ram'], int(ram))
304 self.assertEqual(int(flavor['id']), new_flavor_id)