1 # Copyright (c) 2016 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 OSComponentTestCase, 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.assertEquals('foo', settings.name)
73 self.assertEquals('bar', settings.flavor)
74 self.assertEquals(1, len(settings.port_settings))
75 self.assertEquals('foo-port', settings.port_settings[0].name)
76 self.assertEquals('bar-net', settings.port_settings[0].network_name)
77 self.assertEquals(0, len(settings.security_group_names))
78 self.assertEquals(0, len(settings.floating_ip_settings))
79 self.assertIsNone(settings.sudo_user)
80 self.assertEquals(900, settings.vm_boot_timeout)
81 self.assertEquals(300, settings.vm_delete_timeout)
82 self.assertEquals(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.assertEquals('foo', settings.name)
89 self.assertEquals('bar', settings.flavor)
90 self.assertEquals(1, len(settings.port_settings))
91 self.assertEquals('foo-port', settings.port_settings[0].name)
92 self.assertEquals('bar-net', settings.port_settings[0].network_name)
93 self.assertEquals(0, len(settings.security_group_names))
94 self.assertEquals(0, len(settings.floating_ip_settings))
95 self.assertIsNone(settings.sudo_user)
96 self.assertEquals(900, settings.vm_boot_timeout)
97 self.assertEquals(300, settings.vm_delete_timeout)
98 self.assertEquals(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.assertEquals('foo', settings.name)
110 self.assertEquals('bar', settings.flavor)
111 self.assertEquals(1, len(settings.port_settings))
112 self.assertEquals('foo-port', settings.port_settings[0].name)
113 self.assertEquals('bar-net', settings.port_settings[0].network_name)
114 self.assertEquals(1, len(settings.security_group_names))
115 self.assertEquals('sec_grp_1', settings.security_group_names[0])
116 self.assertEquals(1, len(settings.floating_ip_settings))
117 self.assertEquals('foo-fip', settings.floating_ip_settings[0].name)
118 self.assertEquals('bar-port', settings.floating_ip_settings[0].port_name)
119 self.assertEquals('foo-bar-router', settings.floating_ip_settings[0].router_name)
120 self.assertEquals('joe', settings.sudo_user)
121 self.assertEquals(999, settings.vm_boot_timeout)
122 self.assertEquals(333, settings.vm_delete_timeout)
123 self.assertEquals(111, settings.ssh_connect_timeout)
124 self.assertEquals('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.assertEquals('foo', settings.name)
136 self.assertEquals('bar', settings.flavor)
137 self.assertEquals(1, len(settings.port_settings))
138 self.assertEquals('foo-port', settings.port_settings[0].name)
139 self.assertEquals('bar-net', settings.port_settings[0].network_name)
140 self.assertEquals(1, len(settings.security_group_names))
141 self.assertEquals(1, len(settings.floating_ip_settings))
142 self.assertEquals('foo-fip', settings.floating_ip_settings[0].name)
143 self.assertEquals('bar-port', settings.floating_ip_settings[0].port_name)
144 self.assertEquals('foo-bar-router', settings.floating_ip_settings[0].router_name)
145 self.assertEquals('joe', settings.sudo_user)
146 self.assertEquals(999, settings.vm_boot_timeout)
147 self.assertEquals(333, settings.vm_delete_timeout)
148 self.assertEquals(111, settings.ssh_connect_timeout)
149 self.assertEquals('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.assertEquals('foo', settings.name)
192 self.assertEquals('foo-port', settings.port_name)
193 self.assertEquals('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.assertEquals('foo', settings.name)
200 self.assertEquals('foo-port', settings.port_name)
201 self.assertEquals('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.assertEquals('foo', settings.name)
209 self.assertEquals('foo-port', settings.port_name)
210 self.assertEquals('bar-router', settings.router_name)
211 self.assertEquals('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.assertEquals('foo', settings.name)
218 self.assertEquals('foo-port', settings.port_name)
219 self.assertEquals('bar-router', settings.router_name)
220 self.assertEquals('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)
256 self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
260 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
261 self.image_creator.create()
264 self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
265 self.network_creator.create()
268 self.flavor_creator = OpenStackFlavor(
270 FlavorSettings(name=guid + '-flavor-name', ram=1024, disk=10, vcpus=1))
271 self.flavor_creator.create()
272 except Exception as e:
278 Cleans the created object
280 if self.inst_creator:
282 self.inst_creator.clean()
283 except Exception as e:
284 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
286 if os.path.isfile(self.keypair_pub_filepath):
287 os.remove(self.keypair_pub_filepath)
289 if os.path.isfile(self.keypair_priv_filepath):
290 os.remove(self.keypair_priv_filepath)
292 if self.flavor_creator:
294 self.flavor_creator.clean()
295 except Exception as e:
296 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
298 if self.network_creator:
300 self.network_creator.clean()
301 except Exception as e:
302 logger.error('Unexpected exception cleaning network with message - ' + e.message)
304 if self.image_creator:
306 self.image_creator.clean()
307 except Exception as e:
308 logger.error('Unexpected exception cleaning image with message - ' + e.message)
310 super(self.__class__, self).__clean__()
312 def test_check_vm_ip_dhcp(self):
314 Tests the creation of an OpenStack instance with a single port and ensures that it's assigned IP address is
317 instance_settings = VmInstanceSettings(
318 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
320 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
321 vm = self.inst_creator.create()
323 ip = self.inst_creator.get_port_ip(self.port_settings.name)
324 self.assertIsNotNone(ip)
326 self.assertTrue(self.inst_creator.vm_active(block=True))
330 start_time = time.time()
331 match_value = 'Lease of.*obtained'
333 logger.info("Looking for expression %s in the console log" % match_value)
334 while timeout > time.time() - start_time:
335 output = vm.get_console_output()
336 if re.search(match_value, output):
337 logger.info('DHCP lease obtained logged in console')
339 logger.info('With correct IP address')
342 logger.error('With incorrect IP address')
345 self.assertTrue(found)
348 class CreateInstanceSimpleTests(OSIntegrationTestCase):
350 Simple instance creation tests without any other objects
354 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
357 super(self.__class__, self).__start__()
359 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
360 self.vm_inst_name = guid + '-inst'
361 self.nova = nova_utils.nova_client(self.os_creds)
362 self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
364 net_config = openstack_tests.get_priv_net_config(
365 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
366 router_name=guid + '-pub-router', external_net=self.ext_net_name)
368 # Initialize for tearDown()
369 self.image_creator = None
370 self.flavor_creator = None
372 self.net_creator = None
373 self.inst_creator = None
377 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
378 self.image_creator.create()
381 self.flavor_creator = OpenStackFlavor(
383 FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
384 self.flavor_creator.create()
387 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
388 self.network_creator.create()
390 self.port_settings = PortSettings(name=guid + '-port',
391 network_name=net_config.network_settings.name)
393 except Exception as e:
399 Cleans the created object
401 if self.inst_creator:
403 self.inst_creator.clean()
404 except Exception as e:
405 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
407 if self.flavor_creator:
409 self.flavor_creator.clean()
410 except Exception as e:
411 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
415 self.net_creator.clean()
416 except Exception as e:
417 logger.error('Unexpected exception cleaning network with message - ' + e.message)
419 if self.image_creator:
421 self.image_creator.clean()
422 except Exception as e:
423 logger.error('Unexpected exception cleaning image with message - ' + e.message)
425 super(self.__class__, self).__clean__()
427 def test_create_delete_instance(self):
429 Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
431 instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
432 port_settings=[self.port_settings])
434 self.inst_creator = OpenStackVmInstance(
435 self.os_creds, instance_settings, self.image_creator.image_settings)
437 vm_inst = self.inst_creator.create()
438 self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
441 nova_utils.delete_vm_instance(self.nova, vm_inst)
443 self.assertTrue(self.inst_creator.vm_deleted(block=True))
444 self.assertEquals(0, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
446 # Exception should not be thrown
447 self.inst_creator.clean()
450 class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
452 Test for the CreateInstance class with a single NIC/Port with Floating IPs
457 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
460 super(self.__class__, self).__start__()
462 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
463 self.keypair_priv_filepath = 'tmp/' + guid
464 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
465 self.keypair_name = guid + '-kp'
466 self.vm_inst_name = guid + '-inst'
467 self.port_1_name = guid + 'port-1'
468 self.port_2_name = guid + 'port-2'
469 self.floating_ip_name = guid + 'fip1'
471 # Initialize for tearDown()
472 self.image_creator = None
473 self.network_creator = None
474 self.router_creator = None
475 self.flavor_creator = None
476 self.keypair_creator = None
477 self.inst_creators = list()
479 self.pub_net_config = openstack_tests.get_pub_net_config(
480 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
481 router_name=guid + '-pub-router', external_net=self.ext_net_name)
482 self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
486 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
487 self.image_creator.create()
490 self.network_creator = OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings)
491 self.network_creator.create()
494 self.router_creator = OpenStackRouter(self.os_creds, self.pub_net_config.router_settings)
495 self.router_creator.create()
498 self.flavor_creator = OpenStackFlavor(
500 FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
501 self.flavor_creator.create()
503 self.keypair_creator = OpenStackKeypair(
504 self.os_creds, KeypairSettings(
505 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
506 private_filepath=self.keypair_priv_filepath))
507 self.keypair_creator.create()
508 except Exception as e:
514 Cleans the created object
516 for inst_creator in self.inst_creators:
519 except Exception as e:
520 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
522 if self.keypair_creator:
524 self.keypair_creator.clean()
525 except Exception as e:
526 logger.error('Unexpected exception cleaning keypair with message - ' + e.message)
528 if os.path.isfile(self.keypair_pub_filepath):
529 os.remove(self.keypair_pub_filepath)
531 if os.path.isfile(self.keypair_priv_filepath):
532 os.remove(self.keypair_priv_filepath)
534 if self.flavor_creator:
536 self.flavor_creator.clean()
537 except Exception as e:
538 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
540 if self.router_creator:
542 self.router_creator.clean()
543 except Exception as e:
544 logger.error('Unexpected exception cleaning router with message - ' + e.message)
546 if self.network_creator:
548 self.network_creator.clean()
549 except Exception as e:
550 logger.error('Unexpected exception cleaning network with message - ' + e.message)
552 if self.image_creator:
554 self.image_creator.clean()
555 except Exception as e:
556 logger.error('Unexpected exception cleaning image with message - ' + e.message)
558 super(self.__class__, self).__clean__()
560 def test_single_port_static(self):
562 Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
566 port_settings = PortSettings(
567 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name,
568 ip_addrs=[{'subnet_name': self.pub_net_config.network_settings.subnet_settings[0].name, 'ip': ip_1}])
570 instance_settings = VmInstanceSettings(
571 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
572 floating_ip_settings=[FloatingIpSettings(
573 name=self.floating_ip_name, port_name=self.port_1_name,
574 router_name=self.pub_net_config.router_settings.name)])
576 inst_creator = OpenStackVmInstance(
577 self.os_creds, instance_settings, self.image_creator.image_settings,
578 keypair_settings=self.keypair_creator.keypair_settings)
579 self.inst_creators.append(inst_creator)
580 vm_inst = inst_creator.create()
582 self.assertEquals(ip_1, inst_creator.get_port_ip(self.port_1_name))
583 self.assertTrue(inst_creator.vm_active(block=True))
584 self.assertEquals(vm_inst, inst_creator.get_vm_inst())
586 def test_ssh_client_fip_before_active(self):
588 Tests the ability to access a VM via SSH and a floating IP when it has been assigned prior to being active.
590 port_settings = PortSettings(
591 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name)
593 instance_settings = VmInstanceSettings(
594 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
595 floating_ip_settings=[FloatingIpSettings(
596 name=self.floating_ip_name, port_name=self.port_1_name,
597 router_name=self.pub_net_config.router_settings.name)])
599 inst_creator = OpenStackVmInstance(
600 self.os_creds, instance_settings, self.image_creator.image_settings,
601 keypair_settings=self.keypair_creator.keypair_settings)
602 self.inst_creators.append(inst_creator)
603 vm_inst = inst_creator.create()
604 self.assertIsNotNone(vm_inst)
606 self.assertTrue(inst_creator.vm_active(block=True))
607 self.assertEquals(vm_inst, inst_creator.get_vm_inst())
609 validate_ssh_client(inst_creator)
611 def test_ssh_client_fip_after_active(self):
613 Tests the ability to access a VM via SSH and a floating IP when it has been assigned prior to being active.
615 port_settings = PortSettings(
616 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name)
618 instance_settings = VmInstanceSettings(
619 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
620 floating_ip_settings=[FloatingIpSettings(
621 name=self.floating_ip_name, port_name=self.port_1_name,
622 router_name=self.pub_net_config.router_settings.name)])
624 inst_creator = OpenStackVmInstance(
625 self.os_creds, instance_settings, self.image_creator.image_settings,
626 keypair_settings=self.keypair_creator.keypair_settings)
627 self.inst_creators.append(inst_creator)
629 # block=True will force the create() method to block until the
630 vm_inst = inst_creator.create(block=True)
631 self.assertIsNotNone(vm_inst)
633 self.assertTrue(inst_creator.vm_active(block=True))
634 self.assertEquals(vm_inst, inst_creator.get_vm_inst())
636 validate_ssh_client(inst_creator)
638 # TODO - Determine how allowed_address_pairs is supposed to operate before continuing this test
639 # see http://docs.openstack.org/developer/dragonflow/specs/allowed_address_pairs.html for a functional description
640 # def test_allowed_address_port_access(self):
642 # Tests to ensure that setting allowed_address_pairs on a port functions as designed
644 # port_settings_1 = PortSettings(
645 # name=self.port_1_name + '-1', network_name=self.pub_net_config.network_settings.name)
647 # instance_settings_1 = VmInstanceSettings(
648 # name=self.vm_inst_name + '-1', flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings_1],
649 # floating_ip_settings=[FloatingIpSettings(
650 # name=self.floating_ip_name + '-1', port_name=port_settings_1.name,
651 # router_name=self.pub_net_config.router_settings.name)])
653 # inst_creator_1 = OpenStackVmInstance(
654 # self.os_creds, instance_settings_1, self.image_creator.image_settings,
655 # keypair_settings=self.keypair_creator.keypair_settings)
656 # self.inst_creators.append(inst_creator_1)
658 # # block=True will force the create() method to block until the
659 # vm_inst_1 = inst_creator_1.create(block=True)
660 # self.assertIsNotNone(vm_inst_1)
662 # port_settings_1 = PortSettings(
663 # name=self.port_1_name + '-1', network_name=self.pub_net_config.network_settings.name)
665 # instance_settings_1 = VmInstanceSettings(
666 # name=self.vm_inst_name + '-1', flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings_1],
667 # floating_ip_settings=[FloatingIpSettings(
668 # name=self.floating_ip_name + '-1', port_name=port_settings_1.name,
669 # router_name=self.pub_net_config.router_settings.name)])
671 # inst_creator_1 = OpenStackVmInstance(
672 # self.os_creds, instance_settings_1, self.image_creator.image_settings,
673 # keypair_settings=self.keypair_creator.keypair_settings)
674 # self.inst_creators.append(inst_creator_1)
675 # inst_creator_1.create(block=True)
677 # ip = inst_creator_1.get_port_ip(port_settings_1.name,
678 # subnet_name=self.pub_net_config.network_settings.subnet_settings[0].name)
679 # self.assertIsNotNone(ip)
680 # mac_addr = inst_creator_1.get_port_mac(port_settings_1.name)
681 # self.assertIsNotNone(mac_addr)
683 # allowed_address_pairs = [{'ip_address': ip, 'mac_address': mac_addr}]
685 # # Create VM that can be accessed by vm_inst_1
686 # port_settings_2 = PortSettings(
687 # name=self.port_1_name + '-2', network_name=self.pub_net_config.network_settings.name,
688 # allowed_address_pairs=allowed_address_pairs)
690 # instance_settings_2 = VmInstanceSettings(
691 # name=self.vm_inst_name + '-2', flavor=self.flavor_creator.flavor_settings.name,
692 # port_settings=[port_settings_2])
694 # inst_creator_2 = OpenStackVmInstance(
695 # self.os_creds, instance_settings_2, self.image_creator.image_settings)
696 # self.inst_creators.append(inst_creator_2)
697 # inst_creator_2.create(block=True)
699 # # Create VM that cannot be accessed by vm_inst_1
701 # mac_addr = '0a:1b:2c:3d:4e:5f'
702 # invalid_address_pairs = [{'ip_address': ip, 'mac_address': mac_addr}]
704 # port_settings_3 = PortSettings(
705 # name=self.port_1_name + '-3', network_name=self.pub_net_config.network_settings.name,
706 # allowed_address_pairs=invalid_address_pairs)
708 # instance_settings_3 = VmInstanceSettings(
709 # name=self.vm_inst_name + '-3', flavor=self.flavor_creator.flavor_settings.name,
710 # port_settings=[port_settings_3])
712 # inst_creator_3 = OpenStackVmInstance(
713 # self.os_creds, instance_settings_3, self.image_creator.image_settings)
714 # self.inst_creators.append(inst_creator_3)
715 # inst_creator_3.create(block=True)
718 # I expected that this feature would block/allow traffic from specific endpoints (VMs). In this case, I would expect
719 # inst_1 to be able to access inst_2 but not inst_3; however, they all can access each other.
720 # TODO - Add validation
723 class CreateInstancePortManipulationTests(OSIntegrationTestCase):
725 Test for the CreateInstance class with a single NIC/Port where mac and IP values are manually set
730 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
733 super(self.__class__, self).__start__()
735 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
736 self.vm_inst_name = guid + '-inst'
737 self.port_1_name = guid + 'port-1'
738 self.port_2_name = guid + 'port-2'
739 self.floating_ip_name = guid + 'fip1'
741 # Initialize for tearDown()
742 self.image_creator = None
743 self.network_creator = None
744 self.flavor_creator = None
745 self.inst_creator = None
747 self.net_config = openstack_tests.get_priv_net_config(
748 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
749 router_name=guid + '-pub-router', external_net=self.ext_net_name)
750 self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
754 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
755 self.image_creator.create()
758 self.network_creator = OpenStackNetwork(self.os_creds, self.net_config.network_settings)
759 self.network_creator.create()
762 self.flavor_creator = OpenStackFlavor(
764 FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
765 self.flavor_creator.create()
766 except Exception as e:
772 Cleans the created object
774 if self.inst_creator:
776 self.inst_creator.clean()
777 except Exception as e:
778 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
780 if self.flavor_creator:
782 self.flavor_creator.clean()
783 except Exception as e:
784 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
786 if self.network_creator:
788 self.network_creator.clean()
789 except Exception as e:
790 logger.error('Unexpected exception cleaning network with message - ' + e.message)
792 if self.image_creator:
794 self.image_creator.clean()
795 except Exception as e:
796 logger.error('Unexpected exception cleaning image with message - ' + e.message)
798 super(self.__class__, self).__clean__()
800 def test_set_custom_valid_ip_one_subnet(self):
802 Tests the creation of an OpenStack instance with a single port with a static IP on a network with one subnet.
805 port_settings = PortSettings(
806 name=self.port_1_name, network_name=self.net_config.network_settings.name,
807 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
809 instance_settings = VmInstanceSettings(
810 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
812 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
813 self.inst_creator.create()
815 self.assertEquals(ip, self.inst_creator.get_port_ip(
816 self.port_1_name, subnet_name=self.net_config.network_settings.subnet_settings[0].name))
818 def test_set_custom_invalid_ip_one_subnet(self):
820 Tests the creation of an OpenStack instance with a single port with a static IP on a network with one subnet.
823 port_settings = PortSettings(
824 name=self.port_1_name, network_name=self.net_config.network_settings.name,
825 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
827 instance_settings = VmInstanceSettings(
828 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
830 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
832 with self.assertRaises(Exception):
833 self.inst_creator.create()
835 def test_set_custom_valid_mac(self):
837 Tests the creation of an OpenStack instance with a single port where the MAC address is assigned.
839 mac_addr = '0a:1b:2c:3d:4e:5f'
840 port_settings = PortSettings(
841 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address=mac_addr)
843 instance_settings = VmInstanceSettings(
844 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
846 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
847 self.inst_creator.create()
849 self.assertEquals(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
851 def test_set_custom_invalid_mac(self):
853 Tests the creation of an OpenStack instance with a single port where an invalid MAC address value is being
854 assigned. This should raise an Exception
856 port_settings = PortSettings(
857 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address='foo')
859 instance_settings = VmInstanceSettings(
860 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
862 self.inst_creator = OpenStackVmInstance(
863 self.os_creds, instance_settings, self.image_creator.image_settings)
865 with self.assertRaises(Exception):
866 self.inst_creator.create()
868 def test_set_custom_mac_and_ip(self):
870 Tests the creation of an OpenStack instance with a single port where the IP and MAC address is assigned.
873 mac_addr = '0a:1b:2c:3d:4e:5f'
874 port_settings = PortSettings(
875 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address=mac_addr,
876 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
878 instance_settings = VmInstanceSettings(
879 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
881 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
882 self.inst_creator.create()
884 self.assertEquals(ip, self.inst_creator.get_port_ip(
885 self.port_1_name, subnet_name=self.net_config.network_settings.subnet_settings[0].name))
886 self.assertEquals(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
888 def test_set_allowed_address_pairs(self):
890 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set.
893 mac_addr = '0a:1b:2c:3d:4e:5f'
894 pair = {'ip_address': ip, 'mac_address': mac_addr}
895 port_settings = PortSettings(
896 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
898 instance_settings = VmInstanceSettings(
899 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
901 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
902 self.inst_creator.create()
904 port = self.inst_creator.get_port_by_name(port_settings.name)
905 self.assertIsNotNone(port)
906 self.assertIsNotNone(port['port'].get('allowed_address_pairs'))
907 self.assertEquals(1, len(port['port']['allowed_address_pairs']))
908 validation_utils.objects_equivalent(pair, port['port']['allowed_address_pairs'][0])
910 def test_set_allowed_address_pairs_bad_mac(self):
912 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set with an
917 pair = {'ip_address': ip, 'mac_address': mac_addr}
919 pairs.add((ip, mac_addr))
920 port_settings = PortSettings(
921 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
923 instance_settings = VmInstanceSettings(
924 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
926 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
927 with self.assertRaises(Exception):
928 self.inst_creator.create()
930 def test_set_allowed_address_pairs_bad_ip(self):
932 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set with an
936 mac_addr = '0a:1b:2c:3d:4e:5f'
937 pair = {'ip_address': ip, 'mac_address': mac_addr}
939 pairs.add((ip, mac_addr))
940 port_settings = PortSettings(
941 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
943 instance_settings = VmInstanceSettings(
944 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
946 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
947 with self.assertRaises(Exception):
948 self.inst_creator.create()
951 class CreateInstanceOnComputeHost(OSComponentTestCase):
953 Test for the CreateInstance where one VM is deployed to each compute node
958 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
961 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
962 self.vm_inst_name = guid + '-inst'
963 self.port_base_name = guid + 'port'
965 # Initialize for tearDown()
966 self.image_creator = None
967 self.flavor_creator = None
968 self.network_creator = None
969 self.inst_creators = list()
971 self.priv_net_config = openstack_tests.get_priv_net_config(
972 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
974 self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
978 self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
979 self.network_creator.create()
982 self.flavor_creator = OpenStackFlavor(
984 FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1))
985 self.flavor_creator.create()
988 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
989 self.image_creator.create()
991 except Exception as e:
997 Cleans the created object
999 for inst_creator in self.inst_creators:
1001 inst_creator.clean()
1002 except Exception as e:
1003 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1005 if self.flavor_creator:
1007 self.flavor_creator.clean()
1008 except Exception as e:
1009 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1011 if self.network_creator:
1013 self.network_creator.clean()
1014 except Exception as e:
1015 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1017 if self.image_creator:
1019 self.image_creator.clean()
1020 except Exception as e:
1021 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1023 def test_deploy_vm_to_each_compute_node(self):
1025 Tests the creation of OpenStack VM instances to each compute node.
1027 from snaps.openstack.utils import nova_utils
1028 nova = nova_utils.nova_client(self.os_creds)
1029 zones = nova_utils.get_nova_availability_zones(nova)
1031 # Create Instance on each server/zone
1034 inst_name = self.vm_inst_name + '-' + zone
1036 port_settings = PortSettings(name=self.port_base_name + '-' + str(ctr),
1037 network_name=self.priv_net_config.network_settings.name)
1039 instance_settings = VmInstanceSettings(
1040 name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
1041 port_settings=[port_settings])
1042 inst_creator = OpenStackVmInstance(
1043 self.os_creds, instance_settings, self.image_creator.image_settings)
1044 self.inst_creators.append(inst_creator)
1045 inst_creator.create()
1047 # Validate instances to ensure they've been deployed to the correct server
1050 creator = self.inst_creators[index]
1051 self.assertTrue(creator.vm_active(block=True))
1052 vm = creator.get_vm_inst()
1053 deployed_zone = vm._info['OS-EXT-AZ:availability_zone']
1054 deployed_host = vm._info['OS-EXT-SRV-ATTR:host']
1055 self.assertEquals(zone, deployed_zone + ':' + deployed_host)
1059 class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
1061 Test for the CreateInstance class with two NIC/Ports, eth0 with floating IP and eth1 w/o
1062 These tests require a Centos image
1067 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1070 super(self.__class__, self).__start__()
1072 # Initialize for tearDown()
1073 self.image_creator = None
1074 self.network_creators = list()
1075 self.router_creators = list()
1076 self.flavor_creator = None
1077 self.keypair_creator = None
1078 self.inst_creator = None
1080 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1081 self.keypair_priv_filepath = 'tmp/' + self.guid
1082 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
1083 self.keypair_name = self.guid + '-kp'
1084 self.vm_inst_name = self.guid + '-inst'
1085 self.port_1_name = self.guid + '-port-1'
1086 self.port_2_name = self.guid + '-port-2'
1087 self.floating_ip_name = self.guid + 'fip1'
1088 self.priv_net_config = openstack_tests.get_priv_net_config(
1089 net_name=self.guid + '-priv-net', subnet_name=self.guid + '-priv-subnet',
1090 router_name=self.guid + '-priv-router', external_net=self.ext_net_name)
1091 self.pub_net_config = openstack_tests.get_pub_net_config(
1092 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1093 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1094 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
1095 self.os_image_settings = openstack_tests.centos_url_image(name=image_name)
1099 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
1100 self.image_creator.create()
1102 # First network is public
1103 self.network_creators.append(OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings))
1104 # Second network is private
1105 self.network_creators.append(OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings))
1106 for network_creator in self.network_creators:
1107 network_creator.create()
1109 self.router_creators.append(OpenStackRouter(self.os_creds, self.pub_net_config.router_settings))
1110 self.router_creators.append(OpenStackRouter(self.os_creds, self.priv_net_config.router_settings))
1113 for router_creator in self.router_creators:
1114 router_creator.create()
1117 self.flavor_creator = OpenStackFlavor(
1118 self.admin_os_creds,
1119 FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
1120 self.flavor_creator.create()
1123 self.keypair_creator = OpenStackKeypair(
1124 self.os_creds, KeypairSettings(
1125 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
1126 private_filepath=self.keypair_priv_filepath))
1127 self.keypair_creator.create()
1128 except Exception as e:
1130 raise Exception(e.message)
1134 Cleans the created objects
1136 if self.inst_creator:
1138 self.inst_creator.clean()
1139 except Exception as e:
1140 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1142 if self.keypair_creator:
1144 self.keypair_creator.clean()
1145 except Exception as e:
1146 logger.error('Unexpected exception cleaning keypair with message - ' + e.message)
1148 if os.path.isfile(self.keypair_pub_filepath):
1149 os.remove(self.keypair_pub_filepath)
1151 if os.path.isfile(self.keypair_priv_filepath):
1152 os.remove(self.keypair_priv_filepath)
1154 if self.flavor_creator:
1156 self.flavor_creator.clean()
1157 except Exception as e:
1158 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1160 for router_creator in self.router_creators:
1162 router_creator.clean()
1163 except Exception as e:
1164 logger.error('Unexpected exception cleaning router with message - ' + e.message)
1166 for network_creator in self.network_creators:
1168 network_creator.clean()
1169 except Exception as e:
1170 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1172 if self.image_creator:
1174 self.image_creator.clean()
1175 except Exception as e:
1176 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1178 super(self.__class__, self).__clean__()
1180 def test_dual_ports_dhcp(self):
1182 Tests the creation of an OpenStack instance with a dual ports/NICs with a DHCP assigned IP.
1183 NOTE: This test and any others that call ansible will most likely fail unless you do one of
1185 1. Have a ~/.ansible.cfg (or alternate means) to set host_key_checking = False
1186 2. Set the following environment variable in your executing shell: ANSIBLE_HOST_KEY_CHECKING=False
1187 Should this not be performed, the creation of the host ssh key will cause your ansible calls to fail.
1189 # Create ports/NICs for instance
1192 for network_creator in self.network_creators:
1193 ports_settings.append(PortSettings(
1194 name=self.guid + '-port-' + str(ctr),
1195 network_name=network_creator.network_settings.name))
1199 instance_settings = VmInstanceSettings(
1200 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=ports_settings,
1201 floating_ip_settings=[FloatingIpSettings(
1202 name=self.floating_ip_name, port_name=self.port_1_name,
1203 router_name=self.pub_net_config.router_settings.name)])
1205 self.inst_creator = OpenStackVmInstance(
1206 self.os_creds, instance_settings, self.image_creator.image_settings,
1207 keypair_settings=self.keypair_creator.keypair_settings)
1209 vm_inst = self.inst_creator.create(block=True)
1211 self.assertEquals(vm_inst, self.inst_creator.get_vm_inst())
1213 # Effectively blocks until VM has been properly activated
1214 self.assertTrue(self.inst_creator.vm_active(block=True))
1216 # Effectively blocks until VM's ssh port has been opened
1217 self.assertTrue(self.inst_creator.vm_ssh_active(block=True))
1219 self.inst_creator.config_nics()
1221 # TODO - *** ADD VALIDATION HERE ***
1222 # TODO - Add validation that both floating IPs work
1223 # TODO - Add tests where only one NIC has a floating IP
1224 # TODO - Add tests where one attempts to place a floating IP on a network/router without an external gateway
1227 class InstanceSecurityGroupTests(OSIntegrationTestCase):
1229 Tests that include, add, and remove security groups from VM instances
1233 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1236 super(self.__class__, self).__start__()
1238 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1239 self.vm_inst_name = self.guid + '-inst'
1240 self.nova = nova_utils.nova_client(self.os_creds)
1241 self.os_image_settings = openstack_tests.cirros_url_image(name=self.guid + '-image')
1243 self.vm_inst_name = self.guid + '-inst'
1244 self.port_1_name = self.guid + 'port-1'
1245 self.port_2_name = self.guid + 'port-2'
1246 self.floating_ip_name = self.guid + 'fip1'
1248 net_config = openstack_tests.get_priv_net_config(
1249 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1250 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1252 # Initialize for tearDown()
1253 self.image_creator = None
1254 self.flavor_creator = None
1255 self.network_creator = None
1256 self.router_creator = None
1257 self.inst_creator = None
1258 self.sec_grp_creators = list()
1262 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
1263 self.image_creator.create()
1266 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1267 self.network_creator.create()
1270 self.flavor_creator = OpenStackFlavor(
1271 self.admin_os_creds,
1272 FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2))
1273 self.flavor_creator.create()
1275 self.port_settings = PortSettings(name=self.guid + '-port',
1276 network_name=net_config.network_settings.name)
1277 except Exception as e:
1283 Cleans the created object
1285 if self.inst_creator:
1287 self.inst_creator.clean()
1288 except Exception as e:
1289 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1291 for sec_grp_creator in self.sec_grp_creators:
1293 sec_grp_creator.clean()
1294 except Exception as e:
1295 logger.error('Unexpected exception cleaning security group with message - ' + e.message)
1297 if self.flavor_creator:
1299 self.flavor_creator.clean()
1300 except Exception as e:
1301 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1303 if self.network_creator:
1305 self.network_creator.clean()
1306 except Exception as e:
1307 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1309 if self.image_creator:
1311 self.image_creator.clean()
1312 except Exception as e:
1313 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1315 super(self.__class__, self).__clean__()
1317 def test_add_security_group(self):
1319 Tests the addition of a security group created after the instance.
1322 instance_settings = VmInstanceSettings(
1323 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1324 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1325 vm_inst = self.inst_creator.create(block=True)
1326 self.assertIsNotNone(vm_inst)
1328 # Create security group object to add to instance
1329 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1330 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1331 sec_grp = sec_grp_creator.create()
1332 self.sec_grp_creators.append(sec_grp_creator)
1334 # Check that group has not been added
1335 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1337 # Add security group to instance after activated
1338 self.inst_creator.add_security_group(sec_grp)
1340 # Validate that security group has been added
1341 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1343 def test_add_invalid_security_group(self):
1345 Tests the addition of a security group that no longer exists.
1348 instance_settings = VmInstanceSettings(
1349 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1350 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1351 vm_inst = self.inst_creator.create(block=True)
1352 self.assertIsNotNone(vm_inst)
1354 # Create security group object to add to instance
1355 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1356 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1357 sec_grp = sec_grp_creator.create()
1358 sec_grp_creator.clean()
1359 self.sec_grp_creators.append(sec_grp_creator)
1361 # Check that group has not been added
1362 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1364 # Add security group to instance after activated
1365 self.assertFalse(self.inst_creator.add_security_group(sec_grp))
1367 # Validate that security group has been added
1368 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1370 def test_remove_security_group(self):
1372 Tests the removal of a security group created before and added to the instance.
1374 # Create security group object to add to instance
1375 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1376 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1377 sec_grp = sec_grp_creator.create()
1378 self.sec_grp_creators.append(sec_grp_creator)
1381 instance_settings = VmInstanceSettings(
1382 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1383 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1384 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1385 vm_inst = self.inst_creator.create(block=True)
1386 self.assertIsNotNone(vm_inst)
1388 # Check that group has been added
1389 self.assertTrue(inst_has_sec_grp(vm_inst, sec_grp_settings.name))
1391 # Add security group to instance after activated
1392 self.assertTrue(self.inst_creator.remove_security_group(sec_grp))
1394 # Validate that security group has been added
1395 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1397 def test_remove_security_group_never_added(self):
1399 Tests the removal of a security group that was never added in the first place.
1401 # Create security group object to add to instance
1402 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1403 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1404 sec_grp = sec_grp_creator.create()
1405 self.sec_grp_creators.append(sec_grp_creator)
1408 instance_settings = VmInstanceSettings(
1409 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1410 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1411 vm_inst = self.inst_creator.create(block=True)
1412 self.assertIsNotNone(vm_inst)
1414 # Check that group has been added
1415 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1417 # Add security group to instance after activated
1418 self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
1420 # Validate that security group has been added
1421 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1423 def test_add_same_security_group(self):
1425 Tests the addition of a security group created before add added to the instance.
1427 # Create security group object to add to instance
1428 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1429 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1430 sec_grp = sec_grp_creator.create()
1431 self.sec_grp_creators.append(sec_grp_creator)
1434 instance_settings = VmInstanceSettings(
1435 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1436 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1437 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1438 vm_inst = self.inst_creator.create(block=True)
1439 self.assertIsNotNone(vm_inst)
1441 # Check that group has been added
1442 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1444 # Add security group to instance after activated
1445 self.assertTrue(self.inst_creator.add_security_group(sec_grp))
1447 # Validate that security group has been added
1448 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1451 def inst_has_sec_grp(vm_inst, sec_grp_name):
1453 Returns true if instance has a security group of a given name
1456 if not hasattr(vm_inst, 'security_groups'):
1460 for sec_grp_dict in vm_inst.security_groups:
1461 if sec_grp_name in sec_grp_dict['name']:
1467 def validate_ssh_client(instance_creator):
1469 Returns True if instance_creator returns an SSH client that is valid
1470 :param instance_creator: the object responsible for creating the VM instance
1473 ssh_active = instance_creator.vm_ssh_active(block=True)
1476 ssh_client = instance_creator.ssh_client()
1478 out = ssh_client.exec_command('pwd')[1]
1482 channel = out.channel
1483 in_buffer = channel.in_buffer
1484 pwd_out = in_buffer.read(1024)
1485 if not pwd_out or len(pwd_out) < 10: