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.
22 from snaps.openstack.create_instance import VmInstanceSettings, OpenStackVmInstance, FloatingIpSettings
23 from snaps.openstack.create_flavor import OpenStackFlavor, FlavorSettings
24 from snaps.openstack.create_keypairs import OpenStackKeypair, KeypairSettings
25 from snaps.openstack.create_network import OpenStackNetwork, PortSettings
26 from snaps.openstack.create_router import OpenStackRouter
27 from snaps.openstack.create_image import OpenStackImage
28 from snaps.openstack.create_security_group import SecurityGroupSettings, OpenStackSecurityGroup
29 from snaps.openstack.tests import openstack_tests, validation_utils
30 from snaps.openstack.utils import nova_utils
31 from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase
33 __author__ = 'spisarski'
37 logger = logging.getLogger('create_instance_tests')
40 class VmInstanceSettingsUnitTests(unittest.TestCase):
42 Tests the construction of the VmInstanceSettings class
45 def test_no_params(self):
46 with self.assertRaises(Exception):
49 def test_empty_config(self):
50 with self.assertRaises(Exception):
51 VmInstanceSettings(config=dict())
53 def test_name_only(self):
54 with self.assertRaises(Exception):
55 VmInstanceSettings(name='foo')
57 def test_config_with_name_only(self):
58 with self.assertRaises(Exception):
59 VmInstanceSettings(config={'name': 'foo'})
61 def test_name_flavor_only(self):
62 with self.assertRaises(Exception):
63 VmInstanceSettings(name='foo', flavor='bar')
65 def test_config_with_name_flavor_only(self):
66 with self.assertRaises(Exception):
67 VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar'})
69 def test_name_flavor_port_only(self):
70 port_settings = PortSettings(name='foo-port', network_name='bar-net')
71 settings = VmInstanceSettings(name='foo', flavor='bar', port_settings=[port_settings])
72 self.assertEqual('foo', settings.name)
73 self.assertEqual('bar', settings.flavor)
74 self.assertEqual(1, len(settings.port_settings))
75 self.assertEqual('foo-port', settings.port_settings[0].name)
76 self.assertEqual('bar-net', settings.port_settings[0].network_name)
77 self.assertEqual(0, len(settings.security_group_names))
78 self.assertEqual(0, len(settings.floating_ip_settings))
79 self.assertIsNone(settings.sudo_user)
80 self.assertEqual(900, settings.vm_boot_timeout)
81 self.assertEqual(300, settings.vm_delete_timeout)
82 self.assertEqual(180, settings.ssh_connect_timeout)
83 self.assertIsNone(settings.availability_zone)
85 def test_config_with_name_flavor_port_only(self):
86 port_settings = PortSettings(name='foo-port', network_name='bar-net')
87 settings = VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar', 'ports': [port_settings]})
88 self.assertEqual('foo', settings.name)
89 self.assertEqual('bar', settings.flavor)
90 self.assertEqual(1, len(settings.port_settings))
91 self.assertEqual('foo-port', settings.port_settings[0].name)
92 self.assertEqual('bar-net', settings.port_settings[0].network_name)
93 self.assertEqual(0, len(settings.security_group_names))
94 self.assertEqual(0, len(settings.floating_ip_settings))
95 self.assertIsNone(settings.sudo_user)
96 self.assertEqual(900, settings.vm_boot_timeout)
97 self.assertEqual(300, settings.vm_delete_timeout)
98 self.assertEqual(180, settings.ssh_connect_timeout)
99 self.assertIsNone(settings.availability_zone)
102 port_settings = PortSettings(name='foo-port', network_name='bar-net')
103 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port', router_name='foo-bar-router')
105 settings = VmInstanceSettings(name='foo', flavor='bar', port_settings=[port_settings],
106 security_group_names=['sec_grp_1'], floating_ip_settings=[fip_settings],
107 sudo_user='joe', vm_boot_timeout=999, vm_delete_timeout=333,
108 ssh_connect_timeout=111, availability_zone='server name')
109 self.assertEqual('foo', settings.name)
110 self.assertEqual('bar', settings.flavor)
111 self.assertEqual(1, len(settings.port_settings))
112 self.assertEqual('foo-port', settings.port_settings[0].name)
113 self.assertEqual('bar-net', settings.port_settings[0].network_name)
114 self.assertEqual(1, len(settings.security_group_names))
115 self.assertEqual('sec_grp_1', settings.security_group_names[0])
116 self.assertEqual(1, len(settings.floating_ip_settings))
117 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
118 self.assertEqual('bar-port', settings.floating_ip_settings[0].port_name)
119 self.assertEqual('foo-bar-router', settings.floating_ip_settings[0].router_name)
120 self.assertEqual('joe', settings.sudo_user)
121 self.assertEqual(999, settings.vm_boot_timeout)
122 self.assertEqual(333, settings.vm_delete_timeout)
123 self.assertEqual(111, settings.ssh_connect_timeout)
124 self.assertEqual('server name', settings.availability_zone)
126 def test_config_all(self):
127 port_settings = PortSettings(name='foo-port', network_name='bar-net')
128 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port', router_name='foo-bar-router')
130 settings = VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar', 'ports': [port_settings],
131 'security_group_names': ['sec_grp_1'],
132 'floating_ips': [fip_settings], 'sudo_user': 'joe',
133 'vm_boot_timeout': 999, 'vm_delete_timeout': 333,
134 'ssh_connect_timeout': 111, 'availability_zone': 'server name'})
135 self.assertEqual('foo', settings.name)
136 self.assertEqual('bar', settings.flavor)
137 self.assertEqual(1, len(settings.port_settings))
138 self.assertEqual('foo-port', settings.port_settings[0].name)
139 self.assertEqual('bar-net', settings.port_settings[0].network_name)
140 self.assertEqual(1, len(settings.security_group_names))
141 self.assertEqual(1, len(settings.floating_ip_settings))
142 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
143 self.assertEqual('bar-port', settings.floating_ip_settings[0].port_name)
144 self.assertEqual('foo-bar-router', settings.floating_ip_settings[0].router_name)
145 self.assertEqual('joe', settings.sudo_user)
146 self.assertEqual(999, settings.vm_boot_timeout)
147 self.assertEqual(333, settings.vm_delete_timeout)
148 self.assertEqual(111, settings.ssh_connect_timeout)
149 self.assertEqual('server name', settings.availability_zone)
152 class FloatingIpSettingsUnitTests(unittest.TestCase):
154 Tests the construction of the FloatingIpSettings class
157 def test_no_params(self):
158 with self.assertRaises(Exception):
161 def test_empty_config(self):
162 with self.assertRaises(Exception):
163 FloatingIpSettings(config=dict())
165 def test_name_only(self):
166 with self.assertRaises(Exception):
167 FloatingIpSettings(name='foo')
169 def test_config_with_name_only(self):
170 with self.assertRaises(Exception):
171 FloatingIpSettings(config={'name': 'foo'})
173 def test_name_port_only(self):
174 with self.assertRaises(Exception):
175 FloatingIpSettings(name='foo', port_name='bar')
177 def test_config_with_name_port_only(self):
178 with self.assertRaises(Exception):
179 FloatingIpSettings(config={'name': 'foo', 'port_name': 'bar'})
181 def test_name_router_only(self):
182 with self.assertRaises(Exception):
183 FloatingIpSettings(name='foo', router_name='bar')
185 def test_config_with_name_router_only(self):
186 with self.assertRaises(Exception):
187 FloatingIpSettings(config={'name': 'foo', 'router_name': 'bar'})
189 def test_name_port_router_only(self):
190 settings = FloatingIpSettings(name='foo', port_name='foo-port', router_name='bar-router')
191 self.assertEqual('foo', settings.name)
192 self.assertEqual('foo-port', settings.port_name)
193 self.assertEqual('bar-router', settings.router_name)
194 self.assertIsNone(settings.subnet_name)
195 self.assertTrue(settings.provisioning)
197 def test_config_with_name_port_router_only(self):
198 settings = FloatingIpSettings(config={'name': 'foo', 'port_name': 'foo-port', 'router_name': 'bar-router'})
199 self.assertEqual('foo', settings.name)
200 self.assertEqual('foo-port', settings.port_name)
201 self.assertEqual('bar-router', settings.router_name)
202 self.assertIsNone(settings.subnet_name)
203 self.assertTrue(settings.provisioning)
206 settings = FloatingIpSettings(name='foo', port_name='foo-port', router_name='bar-router',
207 subnet_name='bar-subnet', provisioning=False)
208 self.assertEqual('foo', settings.name)
209 self.assertEqual('foo-port', settings.port_name)
210 self.assertEqual('bar-router', settings.router_name)
211 self.assertEqual('bar-subnet', settings.subnet_name)
212 self.assertFalse(settings.provisioning)
214 def test_config_all(self):
215 settings = FloatingIpSettings(config={'name': 'foo', 'port_name': 'foo-port', 'router_name': 'bar-router',
216 'subnet_name': 'bar-subnet', 'provisioning': False})
217 self.assertEqual('foo', settings.name)
218 self.assertEqual('foo-port', settings.port_name)
219 self.assertEqual('bar-router', settings.router_name)
220 self.assertEqual('bar-subnet', settings.subnet_name)
221 self.assertFalse(settings.provisioning)
224 class SimpleHealthCheck(OSIntegrationTestCase):
226 Test for the CreateInstance class with a single NIC/Port with Floating IPs
231 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
234 super(self.__class__, self).__start__()
236 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
237 self.keypair_priv_filepath = 'tmp/' + guid
238 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
239 self.keypair_name = guid + '-kp'
240 self.vm_inst_name = guid + '-inst'
241 self.port_1_name = guid + 'port-1'
242 self.port_2_name = guid + 'port-2'
243 self.floating_ip_name = guid + 'fip1'
245 # Initialize for tearDown()
246 self.image_creator = None
247 self.network_creator = None
248 self.flavor_creator = None
249 self.inst_creator = None
251 self.priv_net_config = openstack_tests.get_priv_net_config(
252 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
253 self.port_settings = PortSettings(
254 name=self.port_1_name, network_name=self.priv_net_config.network_settings.name)
257 # Set the default image settings, then set any custom parameters sent from the app
258 self.os_image_settings = openstack_tests.cirros_image_settings(
259 name=guid + '-image', image_metadata=self.image_metadata)
262 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
263 self.image_creator.create()
266 self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
267 self.network_creator.create()
270 self.flavor_creator = OpenStackFlavor(
272 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=1, metadata=self.flavor_metadata))
273 self.flavor_creator.create()
274 except Exception as e:
280 Cleans the created object
282 if self.inst_creator:
284 self.inst_creator.clean()
285 except Exception as e:
286 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
288 if os.path.isfile(self.keypair_pub_filepath):
289 os.remove(self.keypair_pub_filepath)
291 if os.path.isfile(self.keypair_priv_filepath):
292 os.remove(self.keypair_priv_filepath)
294 if self.network_creator:
296 self.network_creator.clean()
297 except Exception as e:
298 logger.error('Unexpected exception cleaning network with message - ' + str(e))
300 if self.flavor_creator:
302 self.flavor_creator.clean()
303 except Exception as e:
304 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
306 if self.image_creator:
308 self.image_creator.clean()
309 except Exception as e:
310 logger.error('Unexpected exception cleaning image with message - ' + str(e))
312 super(self.__class__, self).__clean__()
314 def test_check_vm_ip_dhcp(self):
316 Tests the creation of an OpenStack instance with a single port and ensures that it's assigned IP address is
319 instance_settings = VmInstanceSettings(
320 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
322 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
323 self.image_creator.image_settings)
324 vm = self.inst_creator.create()
326 ip = self.inst_creator.get_port_ip(self.port_settings.name)
327 self.assertIsNotNone(ip)
329 self.assertTrue(self.inst_creator.vm_active(block=True))
333 start_time = time.time()
335 logger.info("Looking for IP %s in the console log" % ip)
337 while timeout > time.time() - start_time:
338 output = vm.get_console_output()
339 full_log = full_log + output
340 if re.search(ip, output):
341 logger.info('DHCP lease obtained logged in console')
346 logger.error('Full console output -\n' + full_log)
348 logger.debug('Full console output -\n' + full_log)
350 self.assertTrue(found)
353 class CreateInstanceSimpleTests(OSIntegrationTestCase):
355 Simple instance creation tests without any other objects
359 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
362 super(self.__class__, self).__start__()
364 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
365 self.vm_inst_name = guid + '-inst'
366 self.nova = nova_utils.nova_client(self.os_creds)
367 self.os_image_settings = openstack_tests.cirros_image_settings(
368 name=guid + '-image', image_metadata=self.image_metadata)
370 net_config = openstack_tests.get_priv_net_config(
371 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
372 router_name=guid + '-pub-router', external_net=self.ext_net_name)
374 # Initialize for tearDown()
375 self.image_creator = None
376 self.flavor_creator = None
378 self.network_creator = None
379 self.inst_creator = None
383 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
384 self.image_creator.create()
387 self.flavor_creator = OpenStackFlavor(
389 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
390 self.flavor_creator.create()
393 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
394 self.network_creator.create()
396 self.port_settings = PortSettings(name=guid + '-port',
397 network_name=net_config.network_settings.name)
399 except Exception as e:
405 Cleans the created object
407 if self.inst_creator:
409 self.inst_creator.clean()
410 except Exception as e:
411 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
413 if self.flavor_creator:
415 self.flavor_creator.clean()
416 except Exception as e:
417 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
419 if self.network_creator:
421 self.network_creator.clean()
422 except Exception as e:
423 logger.error('Unexpected exception cleaning network with message - ' + str(e))
425 if self.image_creator:
427 self.image_creator.clean()
428 except Exception as e:
429 logger.error('Unexpected exception cleaning image with message - ' + str(e))
431 super(self.__class__, self).__clean__()
433 def test_create_delete_instance(self):
435 Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
437 instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
438 port_settings=[self.port_settings])
440 self.inst_creator = OpenStackVmInstance(
441 self.os_creds, instance_settings, self.image_creator.image_settings)
443 vm_inst = self.inst_creator.create()
444 self.assertEqual(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
447 nova_utils.delete_vm_instance(self.nova, vm_inst)
449 self.assertTrue(self.inst_creator.vm_deleted(block=True))
450 self.assertEqual(0, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
452 # Exception should not be thrown
453 self.inst_creator.clean()
456 class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
458 Test for the CreateInstance class with a single NIC/Port with Floating IPs
463 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
466 super(self.__class__, self).__start__()
468 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
469 self.keypair_priv_filepath = 'tmp/' + guid
470 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
471 self.keypair_name = guid + '-kp'
472 self.vm_inst_name = guid + '-inst'
473 self.port_1_name = guid + 'port-1'
474 self.port_2_name = guid + 'port-2'
475 self.floating_ip_name = guid + 'fip1'
477 # Initialize for tearDown()
478 self.image_creator = None
479 self.network_creator = None
480 self.router_creator = None
481 self.flavor_creator = None
482 self.keypair_creator = None
483 self.inst_creators = list()
485 self.pub_net_config = openstack_tests.get_pub_net_config(
486 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
487 router_name=guid + '-pub-router', external_net=self.ext_net_name)
488 self.os_image_settings = openstack_tests.cirros_image_settings(
489 name=guid + '-image', image_metadata=self.image_metadata)
492 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
493 self.image_creator.create()
496 self.network_creator = OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings)
497 self.network_creator.create()
500 self.router_creator = OpenStackRouter(self.os_creds, self.pub_net_config.router_settings)
501 self.router_creator.create()
504 self.flavor_creator = OpenStackFlavor(
506 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
507 self.flavor_creator.create()
509 self.keypair_creator = OpenStackKeypair(
510 self.os_creds, KeypairSettings(
511 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
512 private_filepath=self.keypair_priv_filepath))
513 self.keypair_creator.create()
514 except Exception as e:
520 Cleans the created object
522 for inst_creator in self.inst_creators:
525 except Exception as e:
526 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
528 if self.keypair_creator:
530 self.keypair_creator.clean()
531 except Exception as e:
532 logger.error('Unexpected exception cleaning keypair with message - ' + str(e))
534 if os.path.isfile(self.keypair_pub_filepath):
535 os.remove(self.keypair_pub_filepath)
537 if os.path.isfile(self.keypair_priv_filepath):
538 os.remove(self.keypair_priv_filepath)
540 if self.flavor_creator:
542 self.flavor_creator.clean()
543 except Exception as e:
544 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
546 if self.router_creator:
548 self.router_creator.clean()
549 except Exception as e:
550 logger.error('Unexpected exception cleaning router with message - ' + str(e))
552 if self.network_creator:
554 self.network_creator.clean()
555 except Exception as e:
556 logger.error('Unexpected exception cleaning network with message - ' + str(e))
558 if self.image_creator:
560 self.image_creator.clean()
561 except Exception as e:
562 logger.error('Unexpected exception cleaning image with message - ' + str(e))
564 super(self.__class__, self).__clean__()
566 def test_single_port_static(self):
568 Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
572 port_settings = PortSettings(
573 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name,
574 ip_addrs=[{'subnet_name': self.pub_net_config.network_settings.subnet_settings[0].name, 'ip': ip_1}])
576 instance_settings = VmInstanceSettings(
577 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
578 floating_ip_settings=[FloatingIpSettings(
579 name=self.floating_ip_name, port_name=self.port_1_name,
580 router_name=self.pub_net_config.router_settings.name)])
582 inst_creator = OpenStackVmInstance(
583 self.os_creds, instance_settings, self.image_creator.image_settings,
584 keypair_settings=self.keypair_creator.keypair_settings)
585 self.inst_creators.append(inst_creator)
586 vm_inst = inst_creator.create()
588 self.assertEqual(ip_1, inst_creator.get_port_ip(self.port_1_name))
589 self.assertTrue(inst_creator.vm_active(block=True))
590 self.assertEqual(vm_inst, inst_creator.get_vm_inst())
592 def test_ssh_client_fip_before_active(self):
594 Tests the ability to access a VM via SSH and a floating IP when it has been assigned prior to being active.
596 port_settings = PortSettings(
597 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name)
599 instance_settings = VmInstanceSettings(
600 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
601 floating_ip_settings=[FloatingIpSettings(
602 name=self.floating_ip_name, port_name=self.port_1_name,
603 router_name=self.pub_net_config.router_settings.name)])
605 inst_creator = OpenStackVmInstance(
606 self.os_creds, instance_settings, self.image_creator.image_settings,
607 keypair_settings=self.keypair_creator.keypair_settings)
608 self.inst_creators.append(inst_creator)
609 vm_inst = inst_creator.create()
610 self.assertIsNotNone(vm_inst)
612 self.assertTrue(inst_creator.vm_active(block=True))
613 self.assertEqual(vm_inst, inst_creator.get_vm_inst())
615 self.assertTrue(validate_ssh_client(inst_creator))
617 def test_ssh_client_fip_after_active(self):
619 Tests the ability to access a VM via SSH and a floating IP when it has been assigned prior to being active.
621 port_settings = PortSettings(
622 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name)
624 instance_settings = VmInstanceSettings(
625 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
626 floating_ip_settings=[FloatingIpSettings(
627 name=self.floating_ip_name, port_name=self.port_1_name,
628 router_name=self.pub_net_config.router_settings.name)])
630 inst_creator = OpenStackVmInstance(
631 self.os_creds, instance_settings, self.image_creator.image_settings,
632 keypair_settings=self.keypair_creator.keypair_settings)
633 self.inst_creators.append(inst_creator)
635 # block=True will force the create() method to block until the
636 vm_inst = inst_creator.create(block=True)
637 self.assertIsNotNone(vm_inst)
639 self.assertTrue(inst_creator.vm_active(block=True))
640 self.assertEqual(vm_inst, inst_creator.get_vm_inst())
642 self.assertTrue(validate_ssh_client(inst_creator))
645 class CreateInstancePortManipulationTests(OSIntegrationTestCase):
647 Test for the CreateInstance class with a single NIC/Port where mac and IP values are manually set
652 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
655 super(self.__class__, self).__start__()
657 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
658 self.vm_inst_name = guid + '-inst'
659 self.port_1_name = guid + 'port-1'
660 self.port_2_name = guid + 'port-2'
661 self.floating_ip_name = guid + 'fip1'
663 # Initialize for tearDown()
664 self.image_creator = None
665 self.network_creator = None
666 self.flavor_creator = None
667 self.inst_creator = None
669 self.net_config = openstack_tests.get_priv_net_config(
670 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
671 router_name=guid + '-pub-router', external_net=self.ext_net_name)
672 self.os_image_settings = openstack_tests.cirros_image_settings(
673 name=guid + '-image', image_metadata=self.image_metadata)
677 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
678 self.image_creator.create()
681 self.network_creator = OpenStackNetwork(self.os_creds, self.net_config.network_settings)
682 self.network_creator.create()
685 self.flavor_creator = OpenStackFlavor(
687 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
688 self.flavor_creator.create()
689 except Exception as e:
695 Cleans the created object
697 if self.inst_creator:
699 self.inst_creator.clean()
700 except Exception as e:
701 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
703 if self.flavor_creator:
705 self.flavor_creator.clean()
706 except Exception as e:
707 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
709 if self.network_creator:
711 self.network_creator.clean()
712 except Exception as e:
713 logger.error('Unexpected exception cleaning network with message - ' + str(e))
715 if self.image_creator:
717 self.image_creator.clean()
718 except Exception as e:
719 logger.error('Unexpected exception cleaning image with message - ' + str(e))
721 super(self.__class__, self).__clean__()
723 def test_set_custom_valid_ip_one_subnet(self):
725 Tests the creation of an OpenStack instance with a single port with a static IP on a network with one subnet.
728 port_settings = PortSettings(
729 name=self.port_1_name, network_name=self.net_config.network_settings.name,
730 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
732 instance_settings = VmInstanceSettings(
733 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
735 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
736 self.image_creator.image_settings)
737 self.inst_creator.create(block=True)
739 self.assertEqual(ip, self.inst_creator.get_port_ip(
740 self.port_1_name, subnet_name=self.net_config.network_settings.subnet_settings[0].name))
742 def test_set_custom_invalid_ip_one_subnet(self):
744 Tests the creation of an OpenStack instance with a single port with a static IP on a network with one subnet.
747 port_settings = PortSettings(
748 name=self.port_1_name, network_name=self.net_config.network_settings.name,
749 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
751 instance_settings = VmInstanceSettings(
752 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
754 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
755 self.image_creator.image_settings)
757 with self.assertRaises(Exception):
758 self.inst_creator.create()
760 def test_set_custom_valid_mac(self):
762 Tests the creation of an OpenStack instance with a single port where the MAC address is assigned.
764 mac_addr = '0a:1b:2c:3d:4e:5f'
765 port_settings = PortSettings(
766 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address=mac_addr)
768 instance_settings = VmInstanceSettings(
769 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
771 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
772 self.image_creator.image_settings)
773 self.inst_creator.create(block=True)
775 self.assertEqual(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
777 def test_set_custom_invalid_mac(self):
779 Tests the creation of an OpenStack instance with a single port where an invalid MAC address value is being
780 assigned. This should raise an Exception
782 port_settings = PortSettings(
783 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address='foo')
785 instance_settings = VmInstanceSettings(
786 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
788 self.inst_creator = OpenStackVmInstance(
789 self.os_creds, instance_settings, self.image_creator.image_settings)
791 with self.assertRaises(Exception):
792 self.inst_creator.create()
794 def test_set_custom_mac_and_ip(self):
796 Tests the creation of an OpenStack instance with a single port where the IP and MAC address is assigned.
799 mac_addr = '0a:1b:2c:3d:4e:5f'
800 port_settings = PortSettings(
801 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address=mac_addr,
802 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
804 instance_settings = VmInstanceSettings(
805 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
807 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
808 self.image_creator.image_settings)
809 self.inst_creator.create(block=True)
811 self.assertEqual(ip, self.inst_creator.get_port_ip(
812 self.port_1_name, subnet_name=self.net_config.network_settings.subnet_settings[0].name))
813 self.assertEqual(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
815 def test_set_allowed_address_pairs(self):
817 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set.
820 mac_addr = '0a:1b:2c:3d:4e:5f'
821 pair = {'ip_address': ip, 'mac_address': mac_addr}
822 port_settings = PortSettings(
823 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
825 instance_settings = VmInstanceSettings(
826 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
828 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
829 self.image_creator.image_settings)
830 self.inst_creator.create(block=True)
832 port = self.inst_creator.get_port_by_name(port_settings.name)
833 self.assertIsNotNone(port)
834 self.assertIsNotNone(port['port'].get('allowed_address_pairs'))
835 self.assertEqual(1, len(port['port']['allowed_address_pairs']))
836 validation_utils.objects_equivalent(pair, port['port']['allowed_address_pairs'][0])
838 def test_set_allowed_address_pairs_bad_mac(self):
840 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set with an
845 pair = {'ip_address': ip, 'mac_address': mac_addr}
847 pairs.add((ip, mac_addr))
848 port_settings = PortSettings(
849 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
851 instance_settings = VmInstanceSettings(
852 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
854 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
855 self.image_creator.image_settings)
856 with self.assertRaises(Exception):
857 self.inst_creator.create()
859 def test_set_allowed_address_pairs_bad_ip(self):
861 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set with an
865 mac_addr = '0a:1b:2c:3d:4e:5f'
866 pair = {'ip_address': ip, 'mac_address': mac_addr}
868 pairs.add((ip, mac_addr))
869 port_settings = PortSettings(
870 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
872 instance_settings = VmInstanceSettings(
873 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
875 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
876 self.image_creator.image_settings)
877 with self.assertRaises(Exception):
878 self.inst_creator.create()
881 class CreateInstanceOnComputeHost(OSIntegrationTestCase):
883 Test for the CreateInstance where one VM is deployed to each compute node
888 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
891 super(self.__class__, self).__start__()
893 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
894 self.vm_inst_name = guid + '-inst'
895 self.port_base_name = guid + 'port'
897 # Initialize for tearDown()
898 self.image_creator = None
899 self.flavor_creator = None
900 self.network_creator = None
901 self.inst_creators = list()
903 self.priv_net_config = openstack_tests.get_priv_net_config(
904 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
906 self.os_image_settings = openstack_tests.cirros_image_settings(
907 name=guid + '-image', image_metadata=self.image_metadata)
911 self.network_creator = OpenStackNetwork(self.admin_os_creds, self.priv_net_config.network_settings)
912 self.network_creator.create()
915 self.flavor_creator = OpenStackFlavor(
917 FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1, metadata=self.flavor_metadata))
918 self.flavor_creator.create()
921 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
922 self.image_creator.create()
924 except Exception as e:
930 Cleans the created object
932 for inst_creator in self.inst_creators:
935 except Exception as e:
936 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
938 if self.flavor_creator:
940 self.flavor_creator.clean()
941 except Exception as e:
942 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
944 if self.network_creator:
946 self.network_creator.clean()
947 except Exception as e:
948 logger.error('Unexpected exception cleaning network with message - ' + str(e))
950 if self.image_creator:
952 self.image_creator.clean()
953 except Exception as e:
954 logger.error('Unexpected exception cleaning image with message - ' + str(e))
956 super(self.__class__, self).__clean__()
958 def test_deploy_vm_to_each_compute_node(self):
960 Tests the creation of OpenStack VM instances to each compute node.
962 from snaps.openstack.utils import nova_utils
963 nova = nova_utils.nova_client(self.admin_os_creds)
964 zones = nova_utils.get_nova_availability_zones(nova)
966 # Create Instance on each server/zone
969 inst_name = self.vm_inst_name + '-' + zone
971 port_settings = PortSettings(name=self.port_base_name + '-' + str(ctr),
972 network_name=self.priv_net_config.network_settings.name)
974 instance_settings = VmInstanceSettings(
975 name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
976 port_settings=[port_settings])
977 inst_creator = OpenStackVmInstance(
978 self.admin_os_creds, instance_settings, self.image_creator.image_settings)
979 self.inst_creators.append(inst_creator)
980 inst_creator.create()
982 # Validate instances to ensure they've been deployed to the correct server
985 creator = self.inst_creators[index]
986 self.assertTrue(creator.vm_active(block=True))
987 vm = creator.get_vm_inst()
988 deployed_zone = vm._info['OS-EXT-AZ:availability_zone']
989 deployed_host = vm._info['OS-EXT-SRV-ATTR:host']
990 self.assertEqual(zone, deployed_zone + ':' + deployed_host)
994 class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
996 Test for the CreateInstance class with two NIC/Ports, eth0 with floating IP and eth1 w/o
997 These tests require a Centos image
1002 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1005 super(self.__class__, self).__start__()
1007 # Initialize for tearDown()
1008 self.image_creator = None
1009 self.network_creators = list()
1010 self.router_creators = list()
1011 self.flavor_creator = None
1012 self.keypair_creator = None
1013 self.inst_creator = None
1015 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1016 self.keypair_priv_filepath = 'tmp/' + self.guid
1017 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
1018 self.keypair_name = self.guid + '-kp'
1019 self.vm_inst_name = self.guid + '-inst'
1020 self.port_1_name = self.guid + '-port-1'
1021 self.port_2_name = self.guid + '-port-2'
1022 self.floating_ip_name = self.guid + 'fip1'
1023 self.priv_net_config = openstack_tests.get_priv_net_config(
1024 net_name=self.guid + '-priv-net', subnet_name=self.guid + '-priv-subnet',
1025 router_name=self.guid + '-priv-router', external_net=self.ext_net_name)
1026 self.pub_net_config = openstack_tests.get_pub_net_config(
1027 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1028 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1030 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
1031 self.os_image_settings = openstack_tests.centos_image_settings(name=image_name,
1032 image_metadata=self.image_metadata)
1036 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
1037 self.image_creator.create()
1039 # First network is public
1040 self.network_creators.append(OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings))
1041 # Second network is private
1042 self.network_creators.append(OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings))
1043 for network_creator in self.network_creators:
1044 network_creator.create()
1046 self.router_creators.append(OpenStackRouter(self.os_creds, self.pub_net_config.router_settings))
1047 self.router_creators.append(OpenStackRouter(self.os_creds, self.priv_net_config.router_settings))
1050 for router_creator in self.router_creators:
1051 router_creator.create()
1054 self.flavor_creator = OpenStackFlavor(
1055 self.admin_os_creds,
1056 FlavorSettings(name=self.guid + '-flavor-name', ram=512, disk=10, vcpus=2,
1057 metadata=self.flavor_metadata))
1058 self.flavor_creator.create()
1061 self.keypair_creator = OpenStackKeypair(
1062 self.os_creds, KeypairSettings(
1063 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
1064 private_filepath=self.keypair_priv_filepath))
1065 self.keypair_creator.create()
1066 except Exception as e:
1068 raise Exception(str(e))
1072 Cleans the created objects
1074 if self.inst_creator:
1076 self.inst_creator.clean()
1077 except Exception as e:
1078 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1080 if self.keypair_creator:
1082 self.keypair_creator.clean()
1083 except Exception as e:
1084 logger.error('Unexpected exception cleaning keypair with message - ' + str(e))
1086 if os.path.isfile(self.keypair_pub_filepath):
1087 os.remove(self.keypair_pub_filepath)
1089 if os.path.isfile(self.keypair_priv_filepath):
1090 os.remove(self.keypair_priv_filepath)
1092 if self.flavor_creator:
1094 self.flavor_creator.clean()
1095 except Exception as e:
1096 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1098 for router_creator in self.router_creators:
1100 router_creator.clean()
1101 except Exception as e:
1102 logger.error('Unexpected exception cleaning router with message - ' + str(e))
1104 for network_creator in self.network_creators:
1106 network_creator.clean()
1107 except Exception as e:
1108 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1110 if self.image_creator:
1112 self.image_creator.clean()
1113 except Exception as e:
1114 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1116 super(self.__class__, self).__clean__()
1118 def test_dual_ports_dhcp(self):
1120 Tests the creation of an OpenStack instance with a dual ports/NICs with a DHCP assigned IP.
1121 NOTE: This test and any others that call ansible will most likely fail unless you do one of
1123 1. Have a ~/.ansible.cfg (or alternate means) to set host_key_checking = False
1124 2. Set the following environment variable in your executing shell: ANSIBLE_HOST_KEY_CHECKING=False
1125 Should this not be performed, the creation of the host ssh key will cause your ansible calls to fail.
1127 # Create ports/NICs for instance
1130 for network_creator in self.network_creators:
1131 ports_settings.append(PortSettings(
1132 name=self.guid + '-port-' + str(ctr),
1133 network_name=network_creator.network_settings.name))
1137 instance_settings = VmInstanceSettings(
1138 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=ports_settings,
1139 floating_ip_settings=[FloatingIpSettings(
1140 name=self.floating_ip_name, port_name=self.port_1_name,
1141 router_name=self.pub_net_config.router_settings.name)])
1143 self.inst_creator = OpenStackVmInstance(
1144 self.os_creds, instance_settings, self.image_creator.image_settings,
1145 keypair_settings=self.keypair_creator.keypair_settings)
1147 vm_inst = self.inst_creator.create(block=True)
1149 self.assertEqual(vm_inst, self.inst_creator.get_vm_inst())
1151 # Effectively blocks until VM has been properly activated
1152 self.assertTrue(self.inst_creator.vm_active(block=True))
1154 # Effectively blocks until VM's ssh port has been opened
1155 self.assertTrue(self.inst_creator.vm_ssh_active(block=True))
1157 # TODO - Refactor config_nics() to return a status that can be validated here.
1158 self.inst_creator.config_nics()
1160 # TODO - *** ADD VALIDATION HERE ***
1161 # TODO - Add validation that both floating IPs work
1162 # TODO - Add tests where only one NIC has a floating IP
1163 # TODO - Add tests where one attempts to place a floating IP on a network/router without an external gateway
1166 class InstanceSecurityGroupTests(OSIntegrationTestCase):
1168 Tests that include, add, and remove security groups from VM instances
1172 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1175 super(self.__class__, self).__start__()
1177 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1178 self.vm_inst_name = self.guid + '-inst'
1179 self.nova = nova_utils.nova_client(self.os_creds)
1180 self.os_image_settings = openstack_tests.cirros_image_settings(
1181 name=self.guid + '-image', image_metadata=self.image_metadata)
1183 self.vm_inst_name = self.guid + '-inst'
1184 self.port_1_name = self.guid + 'port-1'
1185 self.port_2_name = self.guid + 'port-2'
1186 self.floating_ip_name = self.guid + 'fip1'
1188 net_config = openstack_tests.get_priv_net_config(
1189 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1190 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1192 # Initialize for tearDown()
1193 self.image_creator = None
1194 self.flavor_creator = None
1195 self.network_creator = None
1196 self.router_creator = None
1197 self.inst_creator = None
1198 self.sec_grp_creators = list()
1202 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
1203 self.image_creator.create()
1206 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1207 self.network_creator.create()
1210 self.flavor_creator = OpenStackFlavor(
1211 self.admin_os_creds,
1212 FlavorSettings(name=self.guid + '-flavor-name', ram=128, disk=10, vcpus=2,
1213 metadata=self.flavor_metadata))
1214 self.flavor_creator.create()
1216 self.port_settings = PortSettings(name=self.guid + '-port',
1217 network_name=net_config.network_settings.name)
1218 except Exception as e:
1224 Cleans the created object
1226 if self.inst_creator:
1228 self.inst_creator.clean()
1229 except Exception as e:
1230 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1232 for sec_grp_creator in self.sec_grp_creators:
1234 sec_grp_creator.clean()
1235 except Exception as e:
1236 logger.error('Unexpected exception cleaning security group with message - ' + str(e))
1238 if self.flavor_creator:
1240 self.flavor_creator.clean()
1241 except Exception as e:
1242 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1244 if self.network_creator:
1246 self.network_creator.clean()
1247 except Exception as e:
1248 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1250 if self.image_creator:
1252 self.image_creator.clean()
1253 except Exception as e:
1254 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1256 super(self.__class__, self).__clean__()
1258 def test_add_security_group(self):
1260 Tests the addition of a security group created after the instance.
1263 instance_settings = VmInstanceSettings(
1264 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1265 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1266 self.image_creator.image_settings)
1267 vm_inst = self.inst_creator.create(block=True)
1268 self.assertIsNotNone(vm_inst)
1270 # Create security group object to add to instance
1271 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1272 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1273 sec_grp = sec_grp_creator.create()
1274 self.sec_grp_creators.append(sec_grp_creator)
1276 # Check that group has not been added
1277 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1279 # Add security group to instance after activated
1280 self.inst_creator.add_security_group(sec_grp)
1282 # Validate that security group has been added
1283 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1285 def test_add_invalid_security_group(self):
1287 Tests the addition of a security group that no longer exists.
1290 instance_settings = VmInstanceSettings(
1291 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1292 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1293 self.image_creator.image_settings)
1294 vm_inst = self.inst_creator.create(block=True)
1295 self.assertIsNotNone(vm_inst)
1297 # Create security group object to add to instance
1298 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1299 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1300 sec_grp = sec_grp_creator.create()
1301 sec_grp_creator.clean()
1302 self.sec_grp_creators.append(sec_grp_creator)
1304 # Check that group has not been added
1305 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1307 # Add security group to instance after activated
1308 self.assertFalse(self.inst_creator.add_security_group(sec_grp))
1310 # Validate that security group has been added
1311 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1313 def test_remove_security_group(self):
1315 Tests the removal of a security group created before and added to the instance.
1317 # Create security group object to add to instance
1318 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1319 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1320 sec_grp = sec_grp_creator.create()
1321 self.sec_grp_creators.append(sec_grp_creator)
1324 instance_settings = VmInstanceSettings(
1325 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1326 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1327 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1328 self.image_creator.image_settings)
1329 vm_inst = self.inst_creator.create(block=True)
1330 self.assertIsNotNone(vm_inst)
1332 # Check that group has been added
1333 self.assertTrue(inst_has_sec_grp(vm_inst, sec_grp_settings.name))
1335 # Add security group to instance after activated
1336 self.assertTrue(self.inst_creator.remove_security_group(sec_grp))
1338 # Validate that security group has been added
1339 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1341 def test_remove_security_group_never_added(self):
1343 Tests the removal of a security group that was never added in the first place.
1345 # Create security group object to add to instance
1346 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1347 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1348 sec_grp = sec_grp_creator.create()
1349 self.sec_grp_creators.append(sec_grp_creator)
1352 instance_settings = VmInstanceSettings(
1353 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1354 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1355 self.image_creator.image_settings)
1356 vm_inst = self.inst_creator.create(block=True)
1357 self.assertIsNotNone(vm_inst)
1359 # Check that group has been added
1360 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1362 # Add security group to instance after activated
1363 self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
1365 # Validate that security group has been added
1366 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1368 def test_add_same_security_group(self):
1370 Tests the addition of a security group created before add added to the instance.
1372 # Create security group object to add to instance
1373 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1374 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1375 sec_grp = sec_grp_creator.create()
1376 self.sec_grp_creators.append(sec_grp_creator)
1379 instance_settings = VmInstanceSettings(
1380 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1381 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1382 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1383 self.image_creator.image_settings)
1384 vm_inst = self.inst_creator.create(block=True)
1385 self.assertIsNotNone(vm_inst)
1387 # Check that group has been added
1388 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1390 # Add security group to instance after activated
1391 self.assertTrue(self.inst_creator.add_security_group(sec_grp))
1393 # Validate that security group has been added
1394 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1397 def inst_has_sec_grp(vm_inst, sec_grp_name):
1399 Returns true if instance has a security group of a given name
1402 if not hasattr(vm_inst, 'security_groups'):
1406 for sec_grp_dict in vm_inst.security_groups:
1407 if sec_grp_name in sec_grp_dict['name']:
1413 def validate_ssh_client(instance_creator):
1415 Returns True if instance_creator returns an SSH client that is valid
1416 :param instance_creator: the object responsible for creating the VM instance
1419 ssh_active = instance_creator.vm_ssh_active(block=True)
1422 ssh_client = instance_creator.ssh_client()
1424 out = ssh_client.exec_command('pwd')[1]
1428 channel = out.channel
1429 in_buffer = channel.in_buffer
1430 pwd_out = in_buffer.read(1024)
1431 if not pwd_out or len(pwd_out) < 10:
1438 class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
1440 Test for the CreateInstance class for creating an image from a 3-part image
1445 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1448 super(self.__class__, self).__start__()
1450 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1451 self.image_name = guid
1452 self.vm_inst_name = guid + '-inst'
1453 self.nova = nova_utils.nova_client(self.os_creds)
1455 net_config = openstack_tests.get_priv_net_config(
1456 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
1457 router_name=guid + '-pub-router', external_net=self.ext_net_name)
1459 # Initialize for tearDown()
1460 self.image_creator = None
1461 self.network_creator = None
1462 self.flavor_creator = None
1463 self.inst_creator = None
1466 image_settings = openstack_tests.cirros_image_settings(
1467 name=self.image_name,
1468 image_metadata={'disk_url': 'http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img',
1469 'kernel_url': 'http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-kernel',
1470 'ramdisk_url': 'http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-initramfs'})
1472 self.image_creator = OpenStackImage(self.os_creds, image_settings)
1473 self.image_creator.create()
1476 self.flavor_creator = OpenStackFlavor(
1477 self.admin_os_creds,
1478 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
1479 self.flavor_creator.create()
1482 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1483 self.network_creator.create()
1485 self.port_settings = PortSettings(name=guid + '-port',
1486 network_name=net_config.network_settings.name)
1487 except Exception as e:
1493 Cleans the created object
1495 if self.inst_creator:
1497 self.inst_creator.clean()
1498 except Exception as e:
1499 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1501 if self.flavor_creator:
1503 self.flavor_creator.clean()
1504 except Exception as e:
1505 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1507 if self.network_creator:
1509 self.network_creator.clean()
1510 except Exception as e:
1511 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1513 if self.image_creator:
1515 self.image_creator.clean()
1516 except Exception as e:
1517 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1519 super(self.__class__, self).__clean__()
1521 def test_create_instance_from_three_part_image(self):
1523 Tests the creation of an OpenStack instance from a 3-part image.
1525 instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1526 port_settings=[self.port_settings])
1528 # The last created image is the main image from which we create the instance
1529 self.inst_creator = OpenStackVmInstance(
1530 self.os_creds, instance_settings, self.image_creator.image_settings)
1532 vm_inst = self.inst_creator.create()
1533 self.assertIsNotNone(vm_inst)
1534 self.assertTrue(self.inst_creator.vm_active(block=True))