1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 # and others. All rights reserved.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
18 from snaps.openstack.create_flavor import FlavorSettings, OpenStackFlavor, \
20 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
21 from snaps.openstack.utils import nova_utils
23 __author__ = 'spisarski'
26 class FlavorSettingsUnitTests(unittest.TestCase):
28 Tests the construction of the FlavorSettings class
31 def test_no_params(self):
32 with self.assertRaises(FlavorSettingsError):
35 def test_empty_config(self):
36 with self.assertRaises(FlavorSettingsError):
37 FlavorSettings(config=dict())
39 def test_name_only(self):
40 with self.assertRaises(FlavorSettingsError):
41 FlavorSettings(name='foo')
43 def test_config_with_name_only(self):
44 with self.assertRaises(FlavorSettingsError):
45 FlavorSettings(config={'name': 'foo'})
47 def test_name_ram_only(self):
48 with self.assertRaises(FlavorSettingsError):
49 FlavorSettings(name='foo', ram=1)
51 def test_config_with_name_ram_only(self):
52 with self.assertRaises(FlavorSettingsError):
53 FlavorSettings(config={'name': 'foo', 'ram': 1})
55 def test_name_ram_disk_only(self):
56 with self.assertRaises(FlavorSettingsError):
57 FlavorSettings(name='foo', ram=1, disk=1)
59 def test_config_with_name_ram_disk_only(self):
60 with self.assertRaises(FlavorSettingsError):
61 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 1})
63 def test_ram_string(self):
64 with self.assertRaises(FlavorSettingsError):
65 FlavorSettings(name='foo', ram='bar', disk=2, vcpus=3, ephemeral=4,
66 swap=5, rxtx_factor=6.0,
69 def test_config_ram_string(self):
70 with self.assertRaises(FlavorSettingsError):
72 config={'name': 'foo', 'ram': 'bar', 'disk': 2, 'vcpus': 3,
73 'ephemeral': 4, 'swap': 5,
74 'rxtx_factor': 6.0, 'is_public': False})
76 def test_ram_float(self):
77 with self.assertRaises(FlavorSettingsError):
78 FlavorSettings(name='foo', ram=1.5, disk=2, vcpus=3, ephemeral=4,
79 swap=5, rxtx_factor=6.0, is_public=False)
81 def test_config_ram_float(self):
82 with self.assertRaises(FlavorSettingsError):
84 config={'name': 'foo', 'ram': 1.5, 'disk': 2, 'vcpus': 3,
85 'ephemeral': 4, 'swap': 5,
86 'rxtx_factor': 6.0, 'is_public': False})
88 def test_disk_string(self):
89 with self.assertRaises(FlavorSettingsError):
90 FlavorSettings(name='foo', ram=1, disk='bar', vcpus=3, ephemeral=4,
91 swap=5, rxtx_factor=6.0,
94 def test_config_disk_string(self):
95 with self.assertRaises(FlavorSettingsError):
97 config={'name': 'foo', 'ram': 1, 'disk': 'bar', 'vcpus': 3,
98 'ephemeral': 4, 'swap': 5,
99 'rxtx_factor': 6.0, 'is_public': False})
101 def test_disk_float(self):
102 with self.assertRaises(FlavorSettingsError):
103 FlavorSettings(name='foo', ram=1, disk=2.5, vcpus=3, ephemeral=4,
104 swap=5, rxtx_factor=6.0, is_public=False)
106 def test_config_disk_float(self):
107 with self.assertRaises(FlavorSettingsError):
109 config={'name': 'foo', 'ram': 1, 'disk': 2.5, 'vcpus': 3,
110 'ephemeral': 4, 'swap': 5,
111 'rxtx_factor': 6.0, 'is_public': False})
113 def test_vcpus_string(self):
114 with self.assertRaises(FlavorSettingsError):
115 FlavorSettings(name='foo', ram=1, disk=2, vcpus='bar', ephemeral=4,
116 swap=5, rxtx_factor=6.0,
119 def test_config_vcpus_string(self):
120 with self.assertRaises(FlavorSettingsError):
122 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 'bar',
123 'ephemeral': 4, 'swap': 5,
124 'rxtx_factor': 6.0, 'is_public': False})
126 def test_ephemeral_string(self):
127 with self.assertRaises(FlavorSettingsError):
128 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral='bar',
129 swap=5, rxtx_factor=6.0,
132 def test_config_ephemeral_string(self):
133 with self.assertRaises(FlavorSettingsError):
135 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3,
136 'ephemeral': 'bar', 'swap': 5,
137 'rxtx_factor': 6.0, 'is_public': False})
139 def test_ephemeral_float(self):
140 with self.assertRaises(FlavorSettingsError):
141 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4.5,
142 swap=5, rxtx_factor=6.0, is_public=False)
144 def test_config_ephemeral_float(self):
145 with self.assertRaises(FlavorSettingsError):
147 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3,
148 'ephemeral': 4.5, 'swap': 5,
149 'rxtx_factor': 6.0, 'is_public': False})
151 def test_swap_string(self):
152 with self.assertRaises(FlavorSettingsError):
153 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4,
154 swap='bar', rxtx_factor=6.0,
157 def test_config_swap_string(self):
158 with self.assertRaises(FlavorSettingsError):
160 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3,
161 'ephemeral': 4, 'swap': 'bar',
162 'rxtx_factor': 6.0, 'is_public': False})
164 def test_swap_float(self):
165 with self.assertRaises(FlavorSettingsError):
166 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4,
167 swap=5.5, rxtx_factor=6.0, is_public=False)
169 def test_config_swap_float(self):
170 with self.assertRaises(FlavorSettingsError):
172 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3,
173 'ephemeral': 4, 'swap': 5.5,
174 'rxtx_factor': 6.0, 'is_public': False})
176 def test_rxtx_string(self):
177 with self.assertRaises(FlavorSettingsError):
178 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4,
179 swap=5, rxtx_factor='bar', is_public=False)
181 def test_config_rxtx_string(self):
182 with self.assertRaises(FlavorSettingsError):
184 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3,
185 'ephemeral': 4, 'swap': 5,
186 'rxtx_factor': 'bar', 'is_public': False})
188 def test_is_pub_string(self):
189 with self.assertRaises(FlavorSettingsError):
190 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4,
191 swap=5, rxtx_factor=6.0, is_public='bar')
193 def test_config_is_pub_string(self):
194 with self.assertRaises(FlavorSettingsError):
196 config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3,
197 'ephemeral': 4, 'swap': 5,
198 'rxtx_factor': 6.0, 'is_public': 'bar'})
200 def test_name_ram_disk_vcpus_only(self):
201 settings = FlavorSettings(name='foo', ram=1, disk=2, vcpus=3)
202 self.assertEqual('foo', settings.name)
203 self.assertEqual('auto', settings.flavor_id)
204 self.assertEqual(1, settings.ram)
205 self.assertEqual(2, settings.disk)
206 self.assertEqual(3, settings.vcpus)
207 self.assertEqual(0, settings.ephemeral)
208 self.assertEqual(0, settings.swap)
209 self.assertEqual(1.0, settings.rxtx_factor)
210 self.assertEqual(True, settings.is_public)
211 self.assertEqual(None, settings.metadata)
213 def test_config_with_name_ram_disk_vcpus_only(self):
214 settings = FlavorSettings(
215 **{'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3})
216 self.assertEqual('foo', settings.name)
217 self.assertEqual('auto', settings.flavor_id)
218 self.assertEqual(1, settings.ram)
219 self.assertEqual(2, settings.disk)
220 self.assertEqual(3, settings.vcpus)
221 self.assertEqual(0, settings.ephemeral)
222 self.assertEqual(0, settings.swap)
223 self.assertEqual(1.0, settings.rxtx_factor)
224 self.assertEqual(True, settings.is_public)
225 self.assertEqual(None, settings.metadata)
228 metadata = {'foo': 'bar'}
229 settings = FlavorSettings(
230 name='foo', flavor_id='bar', ram=1, disk=2, vcpus=3, ephemeral=4,
231 swap=5, rxtx_factor=6.0, is_public=False, metadata=metadata)
232 self.assertEqual('foo', settings.name)
233 self.assertEqual('bar', settings.flavor_id)
234 self.assertEqual(1, settings.ram)
235 self.assertEqual(2, settings.disk)
236 self.assertEqual(3, settings.vcpus)
237 self.assertEqual(4, settings.ephemeral)
238 self.assertEqual(5, settings.swap)
239 self.assertEqual(6.0, settings.rxtx_factor)
240 self.assertEqual(False, settings.is_public)
241 self.assertEqual(metadata, settings.metadata)
243 def test_config_all(self):
244 metadata = {'foo': 'bar'}
245 settings = FlavorSettings(
246 **{'name': 'foo', 'flavor_id': 'bar', 'ram': 1, 'disk': 2,
248 'ephemeral': 4, 'swap': 5, 'rxtx_factor': 6.0,
250 'metadata': metadata})
251 self.assertEqual('foo', settings.name)
252 self.assertEqual('bar', settings.flavor_id)
253 self.assertEqual(1, settings.ram)
254 self.assertEqual(2, settings.disk)
255 self.assertEqual(3, settings.vcpus)
256 self.assertEqual(4, settings.ephemeral)
257 self.assertEqual(5, settings.swap)
258 self.assertEqual(6.0, settings.rxtx_factor)
259 self.assertEqual(False, settings.is_public)
260 self.assertEqual(metadata, settings.metadata)
263 class CreateFlavorTests(OSComponentTestCase):
265 Test for the CreateSecurityGroup class defined in create_security_group.py
270 Instantiates the CreateSecurityGroup object that is responsible for
271 downloading and creating an OS image file within OpenStack
273 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
274 self.flavor_name = guid + 'name'
276 self.nova = nova_utils.nova_client(self.os_creds)
278 # Initialize for cleanup
279 self.flavor_creator = None
283 Cleans the image and downloaded image file
285 if self.flavor_creator:
286 self.flavor_creator.clean()
288 def test_create_flavor(self):
290 Tests the creation of an OpenStack flavor.
293 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1,
295 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
296 flavor = self.flavor_creator.create()
297 self.assertTrue(validate_flavor(flavor_settings, flavor))
299 def test_create_flavor_existing(self):
301 Tests the creation of an OpenStack flavor then starts another creator
302 to ensure it has not been done twice.
305 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1,
307 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
308 flavor = self.flavor_creator.create()
309 self.assertTrue(validate_flavor(flavor_settings, flavor))
311 flavor_creator_2 = OpenStackFlavor(self.os_creds, flavor_settings)
312 flavor2 = flavor_creator_2.create()
314 self.assertEqual(flavor.id, flavor2.id)
316 def test_create_clean_flavor(self):
318 Tests the creation and cleanup of an OpenStack flavor.
321 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1,
323 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
324 flavor = self.flavor_creator.create()
325 self.assertTrue(validate_flavor(flavor_settings, flavor))
328 self.flavor_creator.clean()
330 self.assertIsNone(self.flavor_creator.get_flavor())
332 nova_utils.get_flavor_by_name(self.nova, flavor_settings.name))
334 def test_create_delete_flavor(self):
336 Tests the creation of an OpenStack Security Group, the deletion, then
337 cleanup to ensure clean() does not
338 raise any exceptions.
341 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1,
343 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
344 flavor = self.flavor_creator.create()
345 self.assertTrue(validate_flavor(flavor_settings, flavor))
348 nova_utils.delete_flavor(self.nova, flavor)
350 nova_utils.get_flavor_by_name(self.nova, flavor_settings.name))
353 self.flavor_creator.clean()
355 self.assertIsNone(self.flavor_creator.get_flavor())
357 # TODO - Add more tests to exercise all configuration options
360 def validate_flavor(flavor_settings, flavor):
362 Validates the flavor_settings against the OpenStack flavor object
363 :param flavor_settings: the settings used to create the flavor
364 :param flavor: the OpenStack flavor object
366 return flavor is not None \
367 and flavor_settings.name == flavor.name \
368 and flavor_settings.ram == flavor.ram \
369 and flavor_settings.disk == flavor.disk \
370 and flavor_settings.vcpus == flavor.vcpus