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 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, metadata=self.flavor_metadata))
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, metadata=self.flavor_metadata))
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, metadata=self.flavor_metadata))
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, metadata=self.flavor_metadata))
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(OSIntegrationTestCase):
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 super(self.__class__, self).__start__()
963 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
964 self.vm_inst_name = guid + '-inst'
965 self.port_base_name = guid + 'port'
967 # Initialize for tearDown()
968 self.image_creator = None
969 self.flavor_creator = None
970 self.network_creator = None
971 self.inst_creators = list()
973 self.priv_net_config = openstack_tests.get_priv_net_config(
974 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
976 self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image')
980 self.network_creator = OpenStackNetwork(self.admin_os_creds, self.priv_net_config.network_settings)
981 self.network_creator.create()
984 self.flavor_creator = OpenStackFlavor(
986 FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1, metadata=self.flavor_metadata))
987 self.flavor_creator.create()
990 self.image_creator = OpenStackImage(self.admin_os_creds, self.os_image_settings)
991 self.image_creator.create()
993 except Exception as e:
999 Cleans the created object
1001 for inst_creator in self.inst_creators:
1003 inst_creator.clean()
1004 except Exception as e:
1005 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1007 if self.flavor_creator:
1009 self.flavor_creator.clean()
1010 except Exception as e:
1011 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1013 if self.network_creator:
1015 self.network_creator.clean()
1016 except Exception as e:
1017 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1019 if self.image_creator:
1021 self.image_creator.clean()
1022 except Exception as e:
1023 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1025 super(self.__class__, self).__clean__()
1027 def test_deploy_vm_to_each_compute_node(self):
1029 Tests the creation of OpenStack VM instances to each compute node.
1031 from snaps.openstack.utils import nova_utils
1032 nova = nova_utils.nova_client(self.admin_os_creds)
1033 zones = nova_utils.get_nova_availability_zones(nova)
1035 # Create Instance on each server/zone
1038 inst_name = self.vm_inst_name + '-' + zone
1040 port_settings = PortSettings(name=self.port_base_name + '-' + str(ctr),
1041 network_name=self.priv_net_config.network_settings.name)
1043 instance_settings = VmInstanceSettings(
1044 name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
1045 port_settings=[port_settings])
1046 inst_creator = OpenStackVmInstance(
1047 self.admin_os_creds, instance_settings, self.image_creator.image_settings)
1048 self.inst_creators.append(inst_creator)
1049 inst_creator.create()
1051 # Validate instances to ensure they've been deployed to the correct server
1054 creator = self.inst_creators[index]
1055 self.assertTrue(creator.vm_active(block=True))
1056 vm = creator.get_vm_inst()
1057 deployed_zone = vm._info['OS-EXT-AZ:availability_zone']
1058 deployed_host = vm._info['OS-EXT-SRV-ATTR:host']
1059 self.assertEquals(zone, deployed_zone + ':' + deployed_host)
1063 class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
1065 Test for the CreateInstance class with two NIC/Ports, eth0 with floating IP and eth1 w/o
1066 These tests require a Centos image
1071 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1074 super(self.__class__, self).__start__()
1076 # Initialize for tearDown()
1077 self.image_creator = None
1078 self.network_creators = list()
1079 self.router_creators = list()
1080 self.flavor_creator = None
1081 self.keypair_creator = None
1082 self.inst_creator = None
1084 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1085 self.keypair_priv_filepath = 'tmp/' + self.guid
1086 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
1087 self.keypair_name = self.guid + '-kp'
1088 self.vm_inst_name = self.guid + '-inst'
1089 self.port_1_name = self.guid + '-port-1'
1090 self.port_2_name = self.guid + '-port-2'
1091 self.floating_ip_name = self.guid + 'fip1'
1092 self.priv_net_config = openstack_tests.get_priv_net_config(
1093 net_name=self.guid + '-priv-net', subnet_name=self.guid + '-priv-subnet',
1094 router_name=self.guid + '-priv-router', external_net=self.ext_net_name)
1095 self.pub_net_config = openstack_tests.get_pub_net_config(
1096 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1097 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1098 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
1099 self.os_image_settings = openstack_tests.centos_url_image(name=image_name)
1103 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
1104 self.image_creator.create()
1106 # First network is public
1107 self.network_creators.append(OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings))
1108 # Second network is private
1109 self.network_creators.append(OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings))
1110 for network_creator in self.network_creators:
1111 network_creator.create()
1113 self.router_creators.append(OpenStackRouter(self.os_creds, self.pub_net_config.router_settings))
1114 self.router_creators.append(OpenStackRouter(self.os_creds, self.priv_net_config.router_settings))
1117 for router_creator in self.router_creators:
1118 router_creator.create()
1121 self.flavor_creator = OpenStackFlavor(
1122 self.admin_os_creds,
1123 FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
1124 metadata=self.flavor_metadata))
1125 self.flavor_creator.create()
1128 self.keypair_creator = OpenStackKeypair(
1129 self.os_creds, KeypairSettings(
1130 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
1131 private_filepath=self.keypair_priv_filepath))
1132 self.keypair_creator.create()
1133 except Exception as e:
1135 raise Exception(e.message)
1139 Cleans the created objects
1141 if self.inst_creator:
1143 self.inst_creator.clean()
1144 except Exception as e:
1145 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1147 if self.keypair_creator:
1149 self.keypair_creator.clean()
1150 except Exception as e:
1151 logger.error('Unexpected exception cleaning keypair with message - ' + e.message)
1153 if os.path.isfile(self.keypair_pub_filepath):
1154 os.remove(self.keypair_pub_filepath)
1156 if os.path.isfile(self.keypair_priv_filepath):
1157 os.remove(self.keypair_priv_filepath)
1159 if self.flavor_creator:
1161 self.flavor_creator.clean()
1162 except Exception as e:
1163 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1165 for router_creator in self.router_creators:
1167 router_creator.clean()
1168 except Exception as e:
1169 logger.error('Unexpected exception cleaning router with message - ' + e.message)
1171 for network_creator in self.network_creators:
1173 network_creator.clean()
1174 except Exception as e:
1175 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1177 if self.image_creator:
1179 self.image_creator.clean()
1180 except Exception as e:
1181 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1183 super(self.__class__, self).__clean__()
1185 def test_dual_ports_dhcp(self):
1187 Tests the creation of an OpenStack instance with a dual ports/NICs with a DHCP assigned IP.
1188 NOTE: This test and any others that call ansible will most likely fail unless you do one of
1190 1. Have a ~/.ansible.cfg (or alternate means) to set host_key_checking = False
1191 2. Set the following environment variable in your executing shell: ANSIBLE_HOST_KEY_CHECKING=False
1192 Should this not be performed, the creation of the host ssh key will cause your ansible calls to fail.
1194 # Create ports/NICs for instance
1197 for network_creator in self.network_creators:
1198 ports_settings.append(PortSettings(
1199 name=self.guid + '-port-' + str(ctr),
1200 network_name=network_creator.network_settings.name))
1204 instance_settings = VmInstanceSettings(
1205 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=ports_settings,
1206 floating_ip_settings=[FloatingIpSettings(
1207 name=self.floating_ip_name, port_name=self.port_1_name,
1208 router_name=self.pub_net_config.router_settings.name)])
1210 self.inst_creator = OpenStackVmInstance(
1211 self.os_creds, instance_settings, self.image_creator.image_settings,
1212 keypair_settings=self.keypair_creator.keypair_settings)
1214 vm_inst = self.inst_creator.create(block=True)
1216 self.assertEquals(vm_inst, self.inst_creator.get_vm_inst())
1218 # Effectively blocks until VM has been properly activated
1219 self.assertTrue(self.inst_creator.vm_active(block=True))
1221 # Effectively blocks until VM's ssh port has been opened
1222 self.assertTrue(self.inst_creator.vm_ssh_active(block=True))
1224 self.inst_creator.config_nics()
1226 # TODO - *** ADD VALIDATION HERE ***
1227 # TODO - Add validation that both floating IPs work
1228 # TODO - Add tests where only one NIC has a floating IP
1229 # TODO - Add tests where one attempts to place a floating IP on a network/router without an external gateway
1232 class InstanceSecurityGroupTests(OSIntegrationTestCase):
1234 Tests that include, add, and remove security groups from VM instances
1238 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1241 super(self.__class__, self).__start__()
1243 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1244 self.vm_inst_name = self.guid + '-inst'
1245 self.nova = nova_utils.nova_client(self.os_creds)
1246 self.os_image_settings = openstack_tests.cirros_url_image(name=self.guid + '-image')
1248 self.vm_inst_name = self.guid + '-inst'
1249 self.port_1_name = self.guid + 'port-1'
1250 self.port_2_name = self.guid + 'port-2'
1251 self.floating_ip_name = self.guid + 'fip1'
1253 net_config = openstack_tests.get_priv_net_config(
1254 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1255 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1257 # Initialize for tearDown()
1258 self.image_creator = None
1259 self.flavor_creator = None
1260 self.network_creator = None
1261 self.router_creator = None
1262 self.inst_creator = None
1263 self.sec_grp_creators = list()
1267 self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings)
1268 self.image_creator.create()
1271 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1272 self.network_creator.create()
1275 self.flavor_creator = OpenStackFlavor(
1276 self.admin_os_creds,
1277 FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2,
1278 metadata=self.flavor_metadata))
1279 self.flavor_creator.create()
1281 self.port_settings = PortSettings(name=self.guid + '-port',
1282 network_name=net_config.network_settings.name)
1283 except Exception as e:
1289 Cleans the created object
1291 if self.inst_creator:
1293 self.inst_creator.clean()
1294 except Exception as e:
1295 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1297 for sec_grp_creator in self.sec_grp_creators:
1299 sec_grp_creator.clean()
1300 except Exception as e:
1301 logger.error('Unexpected exception cleaning security group with message - ' + e.message)
1303 if self.flavor_creator:
1305 self.flavor_creator.clean()
1306 except Exception as e:
1307 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1309 if self.network_creator:
1311 self.network_creator.clean()
1312 except Exception as e:
1313 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1315 if self.image_creator:
1317 self.image_creator.clean()
1318 except Exception as e:
1319 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1321 super(self.__class__, self).__clean__()
1323 def test_add_security_group(self):
1325 Tests the addition of a security group created after the instance.
1328 instance_settings = VmInstanceSettings(
1329 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1330 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1331 vm_inst = self.inst_creator.create(block=True)
1332 self.assertIsNotNone(vm_inst)
1334 # Create security group object to add to instance
1335 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1336 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1337 sec_grp = sec_grp_creator.create()
1338 self.sec_grp_creators.append(sec_grp_creator)
1340 # Check that group has not been added
1341 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1343 # Add security group to instance after activated
1344 self.inst_creator.add_security_group(sec_grp)
1346 # Validate that security group has been added
1347 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1349 def test_add_invalid_security_group(self):
1351 Tests the addition of a security group that no longer exists.
1354 instance_settings = VmInstanceSettings(
1355 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1356 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1357 vm_inst = self.inst_creator.create(block=True)
1358 self.assertIsNotNone(vm_inst)
1360 # Create security group object to add to instance
1361 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1362 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1363 sec_grp = sec_grp_creator.create()
1364 sec_grp_creator.clean()
1365 self.sec_grp_creators.append(sec_grp_creator)
1367 # Check that group has not been added
1368 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1370 # Add security group to instance after activated
1371 self.assertFalse(self.inst_creator.add_security_group(sec_grp))
1373 # Validate that security group has been added
1374 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1376 def test_remove_security_group(self):
1378 Tests the removal of a security group created before and added to the instance.
1380 # Create security group object to add to instance
1381 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1382 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1383 sec_grp = sec_grp_creator.create()
1384 self.sec_grp_creators.append(sec_grp_creator)
1387 instance_settings = VmInstanceSettings(
1388 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1389 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1390 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1391 vm_inst = self.inst_creator.create(block=True)
1392 self.assertIsNotNone(vm_inst)
1394 # Check that group has been added
1395 self.assertTrue(inst_has_sec_grp(vm_inst, sec_grp_settings.name))
1397 # Add security group to instance after activated
1398 self.assertTrue(self.inst_creator.remove_security_group(sec_grp))
1400 # Validate that security group has been added
1401 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1403 def test_remove_security_group_never_added(self):
1405 Tests the removal of a security group that was never added in the first place.
1407 # Create security group object to add to instance
1408 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1409 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1410 sec_grp = sec_grp_creator.create()
1411 self.sec_grp_creators.append(sec_grp_creator)
1414 instance_settings = VmInstanceSettings(
1415 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1416 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1417 vm_inst = self.inst_creator.create(block=True)
1418 self.assertIsNotNone(vm_inst)
1420 # Check that group has been added
1421 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1423 # Add security group to instance after activated
1424 self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
1426 # Validate that security group has been added
1427 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1429 def test_add_same_security_group(self):
1431 Tests the addition of a security group created before add added to the instance.
1433 # Create security group object to add to instance
1434 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1435 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1436 sec_grp = sec_grp_creator.create()
1437 self.sec_grp_creators.append(sec_grp_creator)
1440 instance_settings = VmInstanceSettings(
1441 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1442 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1443 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1444 vm_inst = self.inst_creator.create(block=True)
1445 self.assertIsNotNone(vm_inst)
1447 # Check that group has been added
1448 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1450 # Add security group to instance after activated
1451 self.assertTrue(self.inst_creator.add_security_group(sec_grp))
1453 # Validate that security group has been added
1454 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1457 def inst_has_sec_grp(vm_inst, sec_grp_name):
1459 Returns true if instance has a security group of a given name
1462 if not hasattr(vm_inst, 'security_groups'):
1466 for sec_grp_dict in vm_inst.security_groups:
1467 if sec_grp_name in sec_grp_dict['name']:
1473 def validate_ssh_client(instance_creator):
1475 Returns True if instance_creator returns an SSH client that is valid
1476 :param instance_creator: the object responsible for creating the VM instance
1479 ssh_active = instance_creator.vm_ssh_active(block=True)
1482 ssh_client = instance_creator.ssh_client()
1484 out = ssh_client.exec_command('pwd')[1]
1488 channel = out.channel
1489 in_buffer = channel.in_buffer
1490 pwd_out = in_buffer.read(1024)
1491 if not pwd_out or len(pwd_out) < 10:
1498 class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
1500 Test for the CreateInstance class for creating an image from a 3-part image
1505 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1508 super(self.__class__, self).__start__()
1510 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1511 self.image_name = guid
1512 self.vm_inst_name = guid + '-inst'
1513 self.nova = nova_utils.nova_client(self.os_creds)
1515 net_config = openstack_tests.get_priv_net_config(
1516 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
1517 router_name=guid + '-pub-router', external_net=self.ext_net_name)
1519 # Initialize for tearDown()
1520 self.image_creators = list()
1521 self.network_creator = None
1522 self.flavor_creator = None
1523 self.inst_creator = None
1527 # Create the kernel image
1528 kernel_image_settings = openstack_tests.cirros_url_image(
1529 name=self.image_name+'_kernel',
1530 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-kernel')
1531 self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings))
1532 kernel_image = self.image_creators[-1].create()
1534 # Create the ramdisk image
1535 ramdisk_image_settings = openstack_tests.cirros_url_image(
1536 name=self.image_name+'_ramdisk',
1537 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-initramfs')
1538 self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings))
1539 ramdisk_image = self.image_creators[-1].create()
1540 self.assertIsNotNone(ramdisk_image)
1542 # Create the main image
1543 os_image_settings = openstack_tests.cirros_url_image(
1544 name=self.image_name,
1545 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img')
1547 properties['kernel_id'] = kernel_image.id
1548 properties['ramdisk_id'] = ramdisk_image.id
1549 os_image_settings.extra_properties = properties
1550 self.image_creators.append(OpenStackImage(self.os_creds, os_image_settings))
1551 created_image = self.image_creators[-1].create()
1552 self.assertIsNotNone(created_image)
1555 self.flavor_creator = OpenStackFlavor(
1556 self.admin_os_creds,
1557 FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2, metadata=self.flavor_metadata))
1558 self.flavor_creator.create()
1561 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1562 self.network_creator.create()
1564 self.port_settings = PortSettings(name=guid + '-port',
1565 network_name=net_config.network_settings.name)
1566 except Exception as e:
1572 Cleans the created object
1574 if self.inst_creator:
1576 self.inst_creator.clean()
1577 except Exception as e:
1578 logger.error('Unexpected exception cleaning VM instance with message - ' + e.message)
1580 if self.flavor_creator:
1582 self.flavor_creator.clean()
1583 except Exception as e:
1584 logger.error('Unexpected exception cleaning flavor with message - ' + e.message)
1586 if self.network_creator:
1588 self.network_creator.clean()
1589 except Exception as e:
1590 logger.error('Unexpected exception cleaning network with message - ' + e.message)
1592 if self.image_creators:
1594 while self.image_creators:
1595 self.image_creators[0].clean()
1596 self.image_creators.pop(0)
1597 except Exception as e:
1598 logger.error('Unexpected exception cleaning image with message - ' + e.message)
1600 super(self.__class__, self).__clean__()
1602 def test_create_delete_instance_from_three_part_image(self):
1604 Tests the creation of an OpenStack instance from a 3-part image.
1606 instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1607 port_settings=[self.port_settings])
1609 # The last created image is the main image from which we create the instance
1610 self.inst_creator = OpenStackVmInstance(
1611 self.os_creds, instance_settings, self.image_creators[-1].image_settings)
1613 vm_inst = self.inst_creator.create()
1614 self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
1617 nova_utils.delete_vm_instance(self.nova, vm_inst)
1619 self.assertTrue(self.inst_creator.vm_deleted(block=True))
1620 self.assertEquals(0, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
1622 # Exception should not be thrown
1623 self.inst_creator.clean()