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
19 from snaps.openstack.tests.os_source_file_test import OSComponentTestCase
20 from snaps.openstack.utils import nova_utils
22 __author__ = 'spisarski'
25 class FlavorSettingsUnitTests(unittest.TestCase):
27 Tests the construction of the FlavorSettings class
30 def test_no_params(self):
31 with self.assertRaises(Exception):
34 def test_empty_config(self):
35 with self.assertRaises(Exception):
36 FlavorSettings(config=dict())
38 def test_name_only(self):
39 with self.assertRaises(Exception):
40 FlavorSettings(name='foo')
42 def test_config_with_name_only(self):
43 with self.assertRaises(Exception):
44 FlavorSettings(config={'name': 'foo'})
46 def test_name_ram_only(self):
47 with self.assertRaises(Exception):
48 FlavorSettings(name='foo', ram=1)
50 def test_config_with_name_ram_only(self):
51 with self.assertRaises(Exception):
52 FlavorSettings(config={'name': 'foo', 'ram': 1})
54 def test_name_ram_disk_only(self):
55 with self.assertRaises(Exception):
56 FlavorSettings(name='foo', ram=1, disk=1)
58 def test_config_with_name_ram_disk_only(self):
59 with self.assertRaises(Exception):
60 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 1})
62 def test_ram_string(self):
63 with self.assertRaises(Exception):
64 FlavorSettings(name='foo', ram='bar', disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0,
67 def test_config_ram_string(self):
68 with self.assertRaises(Exception):
69 FlavorSettings(config={'name': 'foo', 'ram': 'bar', 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
70 'rxtx_factor': 6.0, 'is_public': False})
72 def test_ram_float(self):
73 with self.assertRaises(Exception):
74 FlavorSettings(name='foo', ram=1.5, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0, is_public=False)
76 def test_config_ram_float(self):
77 with self.assertRaises(Exception):
78 FlavorSettings(config={'name': 'foo', 'ram': 1.5, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
79 'rxtx_factor': 6.0, 'is_public': False})
81 def test_disk_string(self):
82 with self.assertRaises(Exception):
83 FlavorSettings(name='foo', ram=1, disk='bar', vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0,
86 def test_config_disk_string(self):
87 with self.assertRaises(Exception):
88 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 'bar', 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
89 'rxtx_factor': 6.0, 'is_public': False})
91 def test_disk_float(self):
92 with self.assertRaises(Exception):
93 FlavorSettings(name='foo', ram=1, disk=2.5, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0, is_public=False)
95 def test_config_disk_float(self):
96 with self.assertRaises(Exception):
97 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2.5, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
98 'rxtx_factor': 6.0, 'is_public': False})
100 def test_vcpus_string(self):
101 with self.assertRaises(Exception):
102 FlavorSettings(name='foo', ram=1, disk=2, vcpus='bar', ephemeral=4, swap=5, rxtx_factor=6.0,
105 def test_config_vcpus_string(self):
106 with self.assertRaises(Exception):
107 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 'bar', 'ephemeral': 4, 'swap': 5,
108 'rxtx_factor': 6.0, 'is_public': False})
110 def test_ephemeral_string(self):
111 with self.assertRaises(Exception):
112 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral='bar', swap=5, rxtx_factor=6.0,
115 def test_config_ephemeral_string(self):
116 with self.assertRaises(Exception):
117 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 'bar', 'swap': 5,
118 'rxtx_factor': 6.0, 'is_public': False})
120 def test_ephemeral_float(self):
121 with self.assertRaises(Exception):
122 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4.5, swap=5, rxtx_factor=6.0, is_public=False)
124 def test_config_ephemeral_float(self):
125 with self.assertRaises(Exception):
126 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4.5, 'swap': 5,
127 'rxtx_factor': 6.0, 'is_public': False})
129 def test_swap_string(self):
130 with self.assertRaises(Exception):
131 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap='bar', rxtx_factor=6.0,
134 def test_config_swap_string(self):
135 with self.assertRaises(Exception):
136 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 'bar',
137 'rxtx_factor': 6.0, 'is_public': False})
139 def test_swap_float(self):
140 with self.assertRaises(Exception):
141 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5.5, rxtx_factor=6.0, is_public=False)
143 def test_config_swap_float(self):
144 with self.assertRaises(Exception):
145 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5.5,
146 'rxtx_factor': 6.0, 'is_public': False})
148 def test_rxtx_string(self):
149 with self.assertRaises(Exception):
150 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor='bar', is_public=False)
152 def test_config_rxtx_string(self):
153 with self.assertRaises(Exception):
154 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
155 'rxtx_factor': 'bar', 'is_public': False})
157 def test_is_pub_string(self):
158 with self.assertRaises(Exception):
159 FlavorSettings(name='foo', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5, rxtx_factor=6.0, is_public='bar')
161 def test_config_is_pub_string(self):
162 with self.assertRaises(Exception):
163 FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3, 'ephemeral': 4, 'swap': 5,
164 'rxtx_factor': 6.0, 'is_public': 'bar'})
166 def test_name_ram_disk_vcpus_only(self):
167 settings = FlavorSettings(name='foo', ram=1, disk=2, vcpus=3)
168 self.assertEqual('foo', settings.name)
169 self.assertEqual('auto', settings.flavor_id)
170 self.assertEqual(1, settings.ram)
171 self.assertEqual(2, settings.disk)
172 self.assertEqual(3, settings.vcpus)
173 self.assertEqual(0, settings.ephemeral)
174 self.assertEqual(0, settings.swap)
175 self.assertEqual(1.0, settings.rxtx_factor)
176 self.assertEqual(True, settings.is_public)
177 self.assertEqual(None, settings.metadata)
179 def test_config_with_name_ram_disk_vcpus_only(self):
180 settings = FlavorSettings(config={'name': 'foo', 'ram': 1, 'disk': 2, 'vcpus': 3})
181 self.assertEqual('foo', settings.name)
182 self.assertEqual('auto', settings.flavor_id)
183 self.assertEqual(1, settings.ram)
184 self.assertEqual(2, settings.disk)
185 self.assertEqual(3, settings.vcpus)
186 self.assertEqual(0, settings.ephemeral)
187 self.assertEqual(0, settings.swap)
188 self.assertEqual(1.0, settings.rxtx_factor)
189 self.assertEqual(True, settings.is_public)
190 self.assertEqual(None, settings.metadata)
193 metadata = {'foo': 'bar'}
194 settings = FlavorSettings(name='foo', flavor_id='bar', ram=1, disk=2, vcpus=3, ephemeral=4, swap=5,
195 rxtx_factor=6.0, is_public=False, metadata=metadata)
196 self.assertEqual('foo', settings.name)
197 self.assertEqual('bar', settings.flavor_id)
198 self.assertEqual(1, settings.ram)
199 self.assertEqual(2, settings.disk)
200 self.assertEqual(3, settings.vcpus)
201 self.assertEqual(4, settings.ephemeral)
202 self.assertEqual(5, settings.swap)
203 self.assertEqual(6.0, settings.rxtx_factor)
204 self.assertEqual(False, settings.is_public)
205 self.assertEqual(metadata, settings.metadata)
207 def test_config_all(self):
208 metadata = {'foo': 'bar'}
209 settings = FlavorSettings(config={'name': 'foo', 'flavor_id': 'bar', 'ram': 1, 'disk': 2, 'vcpus': 3,
210 'ephemeral': 4, 'swap': 5, 'rxtx_factor': 6.0, 'is_public': False,
211 'metadata': metadata})
212 self.assertEqual('foo', settings.name)
213 self.assertEqual('bar', settings.flavor_id)
214 self.assertEqual(1, settings.ram)
215 self.assertEqual(2, settings.disk)
216 self.assertEqual(3, settings.vcpus)
217 self.assertEqual(4, settings.ephemeral)
218 self.assertEqual(5, settings.swap)
219 self.assertEqual(6.0, settings.rxtx_factor)
220 self.assertEqual(False, settings.is_public)
221 self.assertEqual(metadata, settings.metadata)
224 class CreateFlavorTests(OSComponentTestCase):
226 Test for the CreateSecurityGroup class defined in create_security_group.py
231 Instantiates the CreateSecurityGroup object that is responsible for downloading and creating an OS image file
234 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
235 self.flavor_name = guid + 'name'
237 self.nova = nova_utils.nova_client(self.os_creds)
239 # Initialize for cleanup
240 self.flavor_creator = None
244 Cleans the image and downloaded image file
246 if self.flavor_creator:
247 self.flavor_creator.clean()
249 def test_create_flavor(self):
251 Tests the creation of an OpenStack flavor.
254 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
255 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
256 flavor = self.flavor_creator.create()
257 self.assertTrue(validate_flavor(flavor_settings, flavor))
259 def test_create_flavor_existing(self):
261 Tests the creation of an OpenStack flavor then starts another creator to ensure it has not been done twice.
264 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
265 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
266 flavor = self.flavor_creator.create()
267 self.assertTrue(validate_flavor(flavor_settings, flavor))
269 flavor_creator_2 = OpenStackFlavor(self.os_creds, flavor_settings)
270 flavor2 = flavor_creator_2.create()
272 self.assertEqual(flavor.id, flavor2.id)
274 def test_create_clean_flavor(self):
276 Tests the creation and cleanup of an OpenStack flavor.
279 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
280 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
281 flavor = self.flavor_creator.create()
282 self.assertTrue(validate_flavor(flavor_settings, flavor))
285 self.flavor_creator.clean()
287 self.assertIsNone(self.flavor_creator.get_flavor())
288 self.assertIsNone(nova_utils.get_flavor_by_name(self.nova, flavor_settings.name))
290 def test_create_delete_flavor(self):
292 Tests the creation of an OpenStack Security Group, the deletion, then cleanup to ensure clean() does not
293 raise any exceptions.
296 flavor_settings = FlavorSettings(name=self.flavor_name, ram=1, disk=1, vcpus=1)
297 self.flavor_creator = OpenStackFlavor(self.os_creds, flavor_settings)
298 flavor = self.flavor_creator.create()
299 self.assertTrue(validate_flavor(flavor_settings, flavor))
302 nova_utils.delete_flavor(self.nova, flavor)
303 self.assertIsNone(nova_utils.get_flavor_by_name(self.nova, flavor_settings.name))
306 self.flavor_creator.clean()
308 self.assertIsNone(self.flavor_creator.get_flavor())
310 # TODO - Add more tests to exercise all configuration options
313 def validate_flavor(flavor_settings, flavor):
315 Validates the flavor_settings against the OpenStack flavor object
316 :param flavor_settings: the settings used to create the flavor
317 :param flavor: the OpenStack flavor object
319 return flavor is not None \
320 and flavor_settings.name == flavor.name \
321 and flavor_settings.ram == flavor.ram \
322 and flavor_settings.disk == flavor.disk \
323 and flavor_settings.vcpus == flavor.vcpus