1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 # and others. All rights reserved.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
23 from neutronclient.common.exceptions import InvalidIpForSubnetClient
24 from novaclient.exceptions import BadRequest
26 from snaps import file_utils
27 from snaps.config.keypair import KeypairConfig
28 from snaps.openstack import create_network, create_router
29 from snaps.config.flavor import FlavorConfig
30 from snaps.openstack.create_flavor import OpenStackFlavor
31 from snaps.config.image import ImageConfig
32 from snaps.openstack.create_image import OpenStackImage
33 from snaps.openstack.create_instance import (
34 VmInstanceSettings, OpenStackVmInstance, FloatingIpSettings,
35 VmInstanceSettingsError, FloatingIpSettingsError)
36 from snaps.openstack.create_keypairs import OpenStackKeypair
37 from snaps.openstack.create_network import (
38 OpenStackNetwork, PortSettings, NetworkSettings, SubnetSettings)
39 from snaps.openstack.create_router import OpenStackRouter, RouterSettings
40 from snaps.openstack.create_security_group import (
41 SecurityGroupSettings, OpenStackSecurityGroup, SecurityGroupRuleSettings,
43 from snaps.openstack.create_volume import OpenStackVolume, VolumeSettings
44 from snaps.openstack.tests import openstack_tests, validation_utils
45 from snaps.openstack.tests.os_source_file_test import (
46 OSIntegrationTestCase, OSComponentTestCase)
47 from snaps.openstack.utils import nova_utils
49 __author__ = 'spisarski'
53 logger = logging.getLogger('create_instance_tests')
56 class VmInstanceSettingsUnitTests(unittest.TestCase):
58 Tests the construction of the VmInstanceSettings class
61 def test_no_params(self):
62 with self.assertRaises(VmInstanceSettingsError):
65 def test_empty_config(self):
66 with self.assertRaises(VmInstanceSettingsError):
67 VmInstanceSettings(config=dict())
69 def test_name_only(self):
70 with self.assertRaises(VmInstanceSettingsError):
71 VmInstanceSettings(name='foo')
73 def test_config_with_name_only(self):
74 with self.assertRaises(VmInstanceSettingsError):
75 VmInstanceSettings(config={'name': 'foo'})
77 def test_name_flavor_only(self):
78 with self.assertRaises(VmInstanceSettingsError):
79 VmInstanceSettings(name='foo', flavor='bar')
81 def test_config_with_name_flavor_only(self):
82 with self.assertRaises(VmInstanceSettingsError):
83 VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar'})
85 def test_name_flavor_port_only(self):
86 port_settings = PortSettings(name='foo-port', network_name='bar-net')
87 settings = VmInstanceSettings(name='foo', flavor='bar',
88 port_settings=[port_settings])
89 self.assertEqual('foo', settings.name)
90 self.assertEqual('bar', settings.flavor)
91 self.assertEqual(1, len(settings.port_settings))
92 self.assertEqual('foo-port', settings.port_settings[0].name)
93 self.assertEqual('bar-net', settings.port_settings[0].network_name)
94 self.assertEqual(0, len(settings.security_group_names))
95 self.assertEqual(0, len(settings.floating_ip_settings))
96 self.assertIsNone(settings.sudo_user)
97 self.assertEqual(900, settings.vm_boot_timeout)
98 self.assertEqual(300, settings.vm_delete_timeout)
99 self.assertEqual(180, settings.ssh_connect_timeout)
100 self.assertIsNone(settings.availability_zone)
101 self.assertIsNone(settings.volume_names)
103 def test_config_with_name_flavor_port_only(self):
104 port_settings = PortSettings(name='foo-port', network_name='bar-net')
105 settings = VmInstanceSettings(
106 **{'name': 'foo', 'flavor': 'bar', 'ports': [port_settings]})
107 self.assertEqual('foo', settings.name)
108 self.assertEqual('bar', settings.flavor)
109 self.assertEqual(1, len(settings.port_settings))
110 self.assertEqual('foo-port', settings.port_settings[0].name)
111 self.assertEqual('bar-net', settings.port_settings[0].network_name)
112 self.assertEqual(0, len(settings.security_group_names))
113 self.assertEqual(0, len(settings.floating_ip_settings))
114 self.assertIsNone(settings.sudo_user)
115 self.assertEqual(900, settings.vm_boot_timeout)
116 self.assertEqual(300, settings.vm_delete_timeout)
117 self.assertEqual(180, settings.ssh_connect_timeout)
118 self.assertIsNone(settings.availability_zone)
119 self.assertIsNone(settings.volume_names)
122 port_settings = PortSettings(name='foo-port', network_name='bar-net')
123 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port',
124 router_name='foo-bar-router')
126 settings = VmInstanceSettings(
127 name='foo', flavor='bar', port_settings=[port_settings],
128 security_group_names=['sec_grp_1'],
129 floating_ip_settings=[fip_settings], sudo_user='joe',
130 vm_boot_timeout=999, vm_delete_timeout=333,
131 ssh_connect_timeout=111, availability_zone='server name',
132 volume_names=['vol1'])
133 self.assertEqual('foo', settings.name)
134 self.assertEqual('bar', settings.flavor)
135 self.assertEqual(1, len(settings.port_settings))
136 self.assertEqual('foo-port', settings.port_settings[0].name)
137 self.assertEqual('bar-net', settings.port_settings[0].network_name)
138 self.assertEqual(1, len(settings.security_group_names))
139 self.assertEqual('sec_grp_1', settings.security_group_names[0])
140 self.assertEqual(1, len(settings.floating_ip_settings))
141 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
142 self.assertEqual('bar-port',
143 settings.floating_ip_settings[0].port_name)
144 self.assertEqual('foo-bar-router',
145 settings.floating_ip_settings[0].router_name)
146 self.assertEqual('joe', settings.sudo_user)
147 self.assertEqual(999, settings.vm_boot_timeout)
148 self.assertEqual(333, settings.vm_delete_timeout)
149 self.assertEqual(111, settings.ssh_connect_timeout)
150 self.assertEqual('server name', settings.availability_zone)
151 self.assertEqual('vol1', settings.volume_names[0])
153 def test_config_all(self):
154 port_settings = PortSettings(name='foo-port', network_name='bar-net')
155 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port',
156 router_name='foo-bar-router')
158 settings = VmInstanceSettings(
159 **{'name': 'foo', 'flavor': 'bar', 'ports': [port_settings],
160 'security_group_names': ['sec_grp_1'],
161 'floating_ips': [fip_settings], 'sudo_user': 'joe',
162 'vm_boot_timeout': 999, 'vm_delete_timeout': 333,
163 'ssh_connect_timeout': 111, 'availability_zone': 'server name',
164 'volume_names': ['vol2']})
165 self.assertEqual('foo', settings.name)
166 self.assertEqual('bar', settings.flavor)
167 self.assertEqual(1, len(settings.port_settings))
168 self.assertEqual('foo-port', settings.port_settings[0].name)
169 self.assertEqual('bar-net', settings.port_settings[0].network_name)
170 self.assertEqual(1, len(settings.security_group_names))
171 self.assertEqual(1, len(settings.floating_ip_settings))
172 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
173 self.assertEqual('bar-port',
174 settings.floating_ip_settings[0].port_name)
175 self.assertEqual('foo-bar-router',
176 settings.floating_ip_settings[0].router_name)
177 self.assertEqual('joe', settings.sudo_user)
178 self.assertEqual(999, settings.vm_boot_timeout)
179 self.assertEqual(333, settings.vm_delete_timeout)
180 self.assertEqual(111, settings.ssh_connect_timeout)
181 self.assertEqual('server name', settings.availability_zone)
182 self.assertEqual('vol2', settings.volume_names[0])
185 class FloatingIpSettingsUnitTests(unittest.TestCase):
187 Tests the construction of the FloatingIpSettings class
190 def test_no_params(self):
191 with self.assertRaises(FloatingIpSettingsError):
194 def test_empty_config(self):
195 with self.assertRaises(FloatingIpSettingsError):
196 FloatingIpSettings(**dict())
198 def test_name_only(self):
199 with self.assertRaises(FloatingIpSettingsError):
200 FloatingIpSettings(name='foo')
202 def test_config_with_name_only(self):
203 with self.assertRaises(FloatingIpSettingsError):
204 FloatingIpSettings(**{'name': 'foo'})
206 def test_name_port_only(self):
207 with self.assertRaises(FloatingIpSettingsError):
208 FloatingIpSettings(name='foo', port_name='bar')
210 def test_config_with_name_port_only(self):
211 with self.assertRaises(FloatingIpSettingsError):
212 FloatingIpSettings(**{'name': 'foo', 'port_name': 'bar'})
214 def test_name_router_only(self):
215 with self.assertRaises(FloatingIpSettingsError):
216 FloatingIpSettings(name='foo', router_name='bar')
218 def test_config_with_name_router_only(self):
219 with self.assertRaises(FloatingIpSettingsError):
220 FloatingIpSettings(**{'name': 'foo', 'router_name': 'bar'})
222 def test_name_port_router_name_only(self):
223 settings = FloatingIpSettings(name='foo', port_name='foo-port',
224 router_name='bar-router')
225 self.assertEqual('foo', settings.name)
226 self.assertEqual('foo-port', settings.port_name)
227 self.assertIsNone(settings.port_id)
228 self.assertEqual('bar-router', settings.router_name)
229 self.assertIsNone(settings.subnet_name)
230 self.assertTrue(settings.provisioning)
232 def test_name_port_router_id_only(self):
233 settings = FloatingIpSettings(name='foo', port_id='foo-port',
234 router_name='bar-router')
235 self.assertEqual('foo', settings.name)
236 self.assertEqual('foo-port', settings.port_id)
237 self.assertIsNone(settings.port_name)
238 self.assertEqual('bar-router', settings.router_name)
239 self.assertIsNone(settings.subnet_name)
240 self.assertTrue(settings.provisioning)
242 def test_config_with_name_port_router_only(self):
243 settings = FloatingIpSettings(
244 **{'name': 'foo', 'port_name': 'foo-port',
245 'router_name': 'bar-router'})
246 self.assertEqual('foo', settings.name)
247 self.assertEqual('foo-port', settings.port_name)
248 self.assertIsNone(settings.port_id)
249 self.assertEqual('bar-router', settings.router_name)
250 self.assertIsNone(settings.subnet_name)
251 self.assertTrue(settings.provisioning)
254 settings = FloatingIpSettings(name='foo', port_name='foo-port',
255 router_name='bar-router',
256 subnet_name='bar-subnet',
258 self.assertEqual('foo', settings.name)
259 self.assertEqual('foo-port', settings.port_name)
260 self.assertIsNone(settings.port_id)
261 self.assertEqual('bar-router', settings.router_name)
262 self.assertEqual('bar-subnet', settings.subnet_name)
263 self.assertFalse(settings.provisioning)
265 def test_config_all(self):
266 settings = FloatingIpSettings(
267 **{'name': 'foo', 'port_name': 'foo-port',
268 'router_name': 'bar-router', 'subnet_name': 'bar-subnet',
269 'provisioning': False})
270 self.assertEqual('foo', settings.name)
271 self.assertEqual('foo-port', settings.port_name)
272 self.assertIsNone(settings.port_id)
273 self.assertEqual('bar-router', settings.router_name)
274 self.assertEqual('bar-subnet', settings.subnet_name)
275 self.assertFalse(settings.provisioning)
278 class SimpleHealthCheck(OSIntegrationTestCase):
280 Test for the CreateInstance class with a single NIC/Port with Floating IPs
285 Instantiates the CreateImage object that is responsible for downloading
286 and creating an OS image file
289 super(self.__class__, self).__start__()
291 self.nova = nova_utils.nova_client(self.os_creds)
292 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
293 self.vm_inst_name = guid + '-inst'
294 self.port_1_name = guid + 'port-1'
296 # Initialize for tearDown()
297 self.image_creator = None
298 self.network_creator = None
299 self.flavor_creator = None
300 self.inst_creator = None
302 self.priv_net_config = openstack_tests.get_priv_net_config(
303 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
304 self.port_settings = PortSettings(
305 name=self.port_1_name,
306 network_name=self.priv_net_config.network_settings.name)
309 # Set the default image settings, then set any custom parameters sent
311 os_image_settings = openstack_tests.cirros_image_settings(
312 name=guid + '-image', image_metadata=self.image_metadata)
315 self.image_creator = OpenStackImage(self.os_creds,
317 self.image_creator.create()
320 self.network_creator = OpenStackNetwork(
321 self.os_creds, self.priv_net_config.network_settings)
322 self.network_creator.create()
325 self.flavor_creator = OpenStackFlavor(
327 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
328 vcpus=1, metadata=self.flavor_metadata))
329 self.flavor_creator.create()
330 except Exception as e:
336 Cleans the created object
338 if self.inst_creator:
340 self.inst_creator.clean()
341 except Exception as e:
343 'Unexpected exception cleaning VM instance with message'
346 if self.network_creator:
348 self.network_creator.clean()
349 except Exception as e:
351 'Unexpected exception cleaning network with message - %s',
354 if self.flavor_creator:
356 self.flavor_creator.clean()
357 except Exception as e:
359 'Unexpected exception cleaning flavor with message - %s',
362 if self.image_creator and not self.image_creator.image_settings.exists:
364 self.image_creator.clean()
365 except Exception as e:
367 'Unexpected exception cleaning image with message - %s',
370 super(self.__class__, self).__clean__()
372 def test_check_vm_ip_dhcp(self):
374 Tests the creation of an OpenStack instance with a single port and
375 ensures that it's assigned IP address is the actual.
377 instance_settings = VmInstanceSettings(
378 name=self.vm_inst_name,
379 flavor=self.flavor_creator.flavor_settings.name,
380 port_settings=[self.port_settings])
382 self.inst_creator = OpenStackVmInstance(
383 self.os_creds, instance_settings,
384 self.image_creator.image_settings)
385 self.inst_creator.create()
387 ip = self.inst_creator.get_port_ip(self.port_settings.name)
388 self.assertIsNotNone(ip)
390 self.assertTrue(self.inst_creator.vm_active(block=True))
392 self.assertTrue(check_dhcp_lease(self.inst_creator, ip))
395 class CreateInstanceSimpleTests(OSIntegrationTestCase):
397 Simple instance creation tests without any other objects
402 Instantiates the CreateImage object that is responsible for downloading
403 and creating an OS image file
406 super(self.__class__, self).__start__()
408 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
409 self.vm_inst_name = guid + '-inst'
410 self.nova = nova_utils.nova_client(self.os_creds)
411 os_image_settings = openstack_tests.cirros_image_settings(
412 name=guid + '-image', image_metadata=self.image_metadata)
414 net_config = openstack_tests.get_priv_net_config(
415 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
416 router_name=guid + '-pub-router', external_net=self.ext_net_name)
418 # Initialize for tearDown()
419 self.image_creator = None
420 self.flavor_creator = None
422 self.network_creator = None
423 self.inst_creator = None
427 self.image_creator = OpenStackImage(self.os_creds,
429 self.image_creator.create()
432 self.flavor_creator = OpenStackFlavor(
434 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
435 vcpus=2, metadata=self.flavor_metadata))
436 self.flavor_creator.create()
439 self.network_creator = OpenStackNetwork(
440 self.os_creds, net_config.network_settings)
441 self.network_creator.create()
443 self.port_settings = PortSettings(
445 network_name=net_config.network_settings.name)
447 except Exception as e:
453 Cleans the created object
455 if self.inst_creator:
457 self.inst_creator.clean()
458 except Exception as e:
460 'Unexpected exception cleaning VM instance with message '
463 if self.flavor_creator:
465 self.flavor_creator.clean()
466 except Exception as e:
468 'Unexpected exception cleaning flavor with message - %s',
471 if self.network_creator:
473 self.network_creator.clean()
474 except Exception as e:
476 'Unexpected exception cleaning network with message - %s',
479 if self.image_creator and not self.image_creator.image_settings.exists:
481 self.image_creator.clean()
482 except Exception as e:
484 'Unexpected exception cleaning image with message - %s', e)
486 super(self.__class__, self).__clean__()
488 def test_create_delete_instance(self):
490 Tests the creation of an OpenStack instance with a single port with a
491 static IP without a Floating IP.
493 instance_settings = VmInstanceSettings(
494 name=self.vm_inst_name,
495 flavor=self.flavor_creator.flavor_settings.name,
496 port_settings=[self.port_settings])
498 self.inst_creator = OpenStackVmInstance(
499 self.os_creds, instance_settings,
500 self.image_creator.image_settings)
502 vm_inst = self.inst_creator.create()
503 self.assertIsNotNone(nova_utils.get_server(
504 self.nova, vm_inst_settings=instance_settings))
507 nova_utils.delete_vm_instance(self.nova, vm_inst)
509 self.assertTrue(self.inst_creator.vm_deleted(block=True))
510 self.assertIsNone(nova_utils.get_server(
511 self.nova, vm_inst_settings=instance_settings))
513 # Exception should not be thrown
514 self.inst_creator.clean()
517 class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
519 Test for the CreateInstance class with a single NIC/Port with Floating IPs
524 Instantiates the CreateImage object that is responsible for downloading
525 and creating an OS image file within OpenStack
527 super(self.__class__, self).__start__()
529 self.nova = nova_utils.nova_client(self.os_creds)
530 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
531 self.keypair_priv_filepath = 'tmp/' + guid
532 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
533 self.keypair_name = guid + '-kp'
534 self.vm_inst_name = guid + '-inst'
535 self.port_1_name = guid + 'port-1'
536 self.port_2_name = guid + 'port-2'
537 self.floating_ip_name = guid + 'fip1'
539 # Initialize for tearDown()
540 self.image_creator = None
541 self.network_creator = None
542 self.router_creator = None
543 self.flavor_creator = None
544 self.keypair_creator = None
545 self.sec_grp_creator = None
546 self.inst_creators = list()
548 self.pub_net_config = openstack_tests.get_pub_net_config(
549 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
550 router_name=guid + '-pub-router', external_net=self.ext_net_name)
551 os_image_settings = openstack_tests.cirros_image_settings(
552 name=guid + '-image', image_metadata=self.image_metadata)
555 self.image_creator = OpenStackImage(self.os_creds,
557 self.image_creator.create()
560 self.network_creator = OpenStackNetwork(
561 self.os_creds, self.pub_net_config.network_settings)
562 self.network_creator.create()
565 self.router_creator = OpenStackRouter(
566 self.os_creds, self.pub_net_config.router_settings)
567 self.router_creator.create()
570 self.flavor_creator = OpenStackFlavor(
572 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
573 vcpus=2, metadata=self.flavor_metadata))
574 self.flavor_creator.create()
576 self.keypair_creator = OpenStackKeypair(
577 self.os_creds, KeypairConfig(
578 name=self.keypair_name,
579 public_filepath=self.keypair_pub_filepath,
580 private_filepath=self.keypair_priv_filepath))
581 self.keypair_creator.create()
583 sec_grp_name = guid + '-sec-grp'
584 rule1 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
585 direction=Direction.ingress,
586 protocol=Protocol.icmp)
587 rule2 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
588 direction=Direction.ingress,
589 protocol=Protocol.tcp,
592 self.sec_grp_creator = OpenStackSecurityGroup(
594 SecurityGroupSettings(name=sec_grp_name,
595 rule_settings=[rule1, rule2]))
596 self.sec_grp_creator.create()
597 except Exception as e:
603 Cleans the created object
605 for inst_creator in self.inst_creators:
608 except Exception as e:
610 'Unexpected exception cleaning VM instance with message '
613 if self.keypair_creator:
615 self.keypair_creator.clean()
616 except Exception as e:
618 'Unexpected exception cleaning keypair with message - %s',
621 if self.flavor_creator:
623 self.flavor_creator.clean()
624 except Exception as e:
626 'Unexpected exception cleaning flavor with message - %s',
629 if self.sec_grp_creator:
631 self.sec_grp_creator.clean()
632 except Exception as e:
634 'Unexpected exception cleaning security group with message'
637 if self.router_creator:
639 self.router_creator.clean()
640 except Exception as e:
642 'Unexpected exception cleaning router with message - %s',
645 if self.network_creator:
647 self.network_creator.clean()
648 except Exception as e:
650 'Unexpected exception cleaning network with message - %s',
653 if self.image_creator and not self.image_creator.image_settings.exists:
655 self.image_creator.clean()
656 except Exception as e:
658 'Unexpected exception cleaning image with message - %s', e)
660 super(self.__class__, self).__clean__()
662 def test_single_port_static(self):
664 Tests the creation of an OpenStack instance with a single port with a
665 static IP without a Floating IP.
668 sub_settings = self.pub_net_config.network_settings.subnet_settings
669 port_settings = PortSettings(
670 name=self.port_1_name,
671 network_name=self.pub_net_config.network_settings.name,
673 {'subnet_name': sub_settings[0].name, 'ip': ip_1}])
675 instance_settings = VmInstanceSettings(
676 name=self.vm_inst_name,
677 flavor=self.flavor_creator.flavor_settings.name,
678 port_settings=[port_settings],
679 floating_ip_settings=[FloatingIpSettings(
680 name=self.floating_ip_name, port_name=self.port_1_name,
681 router_name=self.pub_net_config.router_settings.name)])
683 inst_creator = OpenStackVmInstance(
684 self.os_creds, instance_settings,
685 self.image_creator.image_settings,
686 keypair_settings=self.keypair_creator.keypair_settings)
687 self.inst_creators.append(inst_creator)
688 vm_inst = inst_creator.create(block=True)
690 self.assertEqual(ip_1, inst_creator.get_port_ip(self.port_1_name))
691 self.assertTrue(inst_creator.vm_active(block=True))
692 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
694 def test_ssh_client_fip_before_active(self):
696 Tests the ability to access a VM via SSH and a floating IP when it has
697 been assigned prior to being active.
699 port_settings = PortSettings(
700 name=self.port_1_name,
701 network_name=self.pub_net_config.network_settings.name)
703 instance_settings = VmInstanceSettings(
704 name=self.vm_inst_name,
705 flavor=self.flavor_creator.flavor_settings.name,
706 port_settings=[port_settings],
707 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
708 floating_ip_settings=[FloatingIpSettings(
709 name=self.floating_ip_name, port_name=self.port_1_name,
710 router_name=self.pub_net_config.router_settings.name)])
712 inst_creator = OpenStackVmInstance(
713 self.os_creds, instance_settings,
714 self.image_creator.image_settings,
715 keypair_settings=self.keypair_creator.keypair_settings)
716 self.inst_creators.append(inst_creator)
717 vm_inst = inst_creator.create()
718 self.assertIsNotNone(vm_inst)
720 self.assertTrue(inst_creator.vm_active(block=True))
722 ip = inst_creator.get_port_ip(port_settings.name)
723 self.assertTrue(check_dhcp_lease(inst_creator, ip))
725 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
727 self.assertTrue(validate_ssh_client(inst_creator))
729 def test_ssh_client_fip_after_active(self):
731 Tests the ability to access a VM via SSH and a floating IP when it has
732 been assigned prior to being active.
734 port_settings = PortSettings(
735 name=self.port_1_name,
736 network_name=self.pub_net_config.network_settings.name)
738 instance_settings = VmInstanceSettings(
739 name=self.vm_inst_name,
740 flavor=self.flavor_creator.flavor_settings.name,
741 port_settings=[port_settings],
742 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
743 floating_ip_settings=[FloatingIpSettings(
744 name=self.floating_ip_name, port_name=self.port_1_name,
745 router_name=self.pub_net_config.router_settings.name)])
747 inst_creator = OpenStackVmInstance(
748 self.os_creds, instance_settings,
749 self.image_creator.image_settings,
750 keypair_settings=self.keypair_creator.keypair_settings)
751 self.inst_creators.append(inst_creator)
753 # block=True will force the create() method to block until the
754 vm_inst = inst_creator.create(block=True)
755 self.assertIsNotNone(vm_inst)
757 self.assertTrue(inst_creator.vm_active(block=True))
759 ip = inst_creator.get_port_ip(port_settings.name)
760 self.assertTrue(check_dhcp_lease(inst_creator, ip))
762 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
764 self.assertTrue(validate_ssh_client(inst_creator))
766 def test_ssh_client_fip_second_creator(self):
768 Tests the ability to access a VM via SSH and a floating IP via a
769 creator that is identical to the original creator.
771 port_settings = PortSettings(
772 name=self.port_1_name,
773 network_name=self.pub_net_config.network_settings.name)
775 instance_settings = VmInstanceSettings(
776 name=self.vm_inst_name,
777 flavor=self.flavor_creator.flavor_settings.name,
778 port_settings=[port_settings],
779 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
780 floating_ip_settings=[FloatingIpSettings(
781 name=self.floating_ip_name, port_name=self.port_1_name,
782 router_name=self.pub_net_config.router_settings.name)])
784 inst_creator = OpenStackVmInstance(
785 self.os_creds, instance_settings,
786 self.image_creator.image_settings,
787 keypair_settings=self.keypair_creator.keypair_settings)
788 self.inst_creators.append(inst_creator)
790 # block=True will force the create() method to block until the
791 vm_inst = inst_creator.create(block=True)
792 self.assertIsNotNone(vm_inst)
794 self.assertTrue(inst_creator.vm_active(block=True))
796 ip = inst_creator.get_port_ip(port_settings.name)
797 self.assertTrue(check_dhcp_lease(inst_creator, ip))
799 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
801 self.assertTrue(validate_ssh_client(inst_creator))
803 inst_creator2 = OpenStackVmInstance(
804 self.os_creds, instance_settings,
805 self.image_creator.image_settings,
806 keypair_settings=self.keypair_creator.keypair_settings)
807 inst_creator2.create()
808 self.assertTrue(validate_ssh_client(inst_creator2))
811 class CreateInstanceIPv6NetworkTests(OSIntegrationTestCase):
813 Test for the CreateInstance class with a single NIC/Port with Floating IPs
818 Instantiates the CreateImage object that is responsible for downloading
819 and creating an OS image file within OpenStack
821 super(self.__class__, self).__start__()
823 self.nova = nova_utils.nova_client(self.os_creds)
824 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
825 self.keypair_priv_filepath = 'tmp/' + self.guid
826 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
827 self.keypair_name = self.guid + '-kp'
828 self.vm_inst_name = self.guid + '-inst'
829 self.port1_name = self.guid + 'port1'
830 self.port2_name = self.guid + 'port2'
832 # Initialize for tearDown()
833 self.image_creator = None
834 self.network_creator = None
835 self.router_creator = None
836 self.flavor_creator = None
837 self.keypair_creator = None
838 self.sec_grp_creator = None
839 self.inst_creator = None
841 os_image_settings = openstack_tests.cirros_image_settings(
842 name=self.guid + '-image', image_metadata=self.image_metadata)
844 self.image_creator = OpenStackImage(
845 self.os_creds, os_image_settings)
846 self.image_creator.create()
848 self.flavor_creator = OpenStackFlavor(
851 name=self.guid + '-flavor-name', ram=256, disk=10, vcpus=2,
852 metadata=self.flavor_metadata))
853 self.flavor_creator.create()
855 self.keypair_creator = OpenStackKeypair(
856 self.os_creds, KeypairConfig(
857 name=self.keypair_name,
858 public_filepath=self.keypair_pub_filepath,
859 private_filepath=self.keypair_priv_filepath))
860 self.keypair_creator.create()
862 sec_grp_name = self.guid + '-sec-grp'
863 rule1 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
864 direction=Direction.ingress,
865 protocol=Protocol.icmp)
866 rule2 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
867 direction=Direction.ingress,
868 protocol=Protocol.tcp,
871 self.sec_grp_creator = OpenStackSecurityGroup(
873 SecurityGroupSettings(name=sec_grp_name,
874 rule_settings=[rule1, rule2]))
875 self.sec_grp_creator.create()
876 except Exception as e:
882 Cleans the created object
884 if self.inst_creator:
886 self.inst_creator.clean()
887 except Exception as e:
889 'Unexpected exception cleaning VM instance with message '
892 if self.keypair_creator:
894 self.keypair_creator.clean()
895 except Exception as e:
897 'Unexpected exception cleaning keypair with message - %s',
900 if self.flavor_creator:
902 self.flavor_creator.clean()
903 except Exception as e:
905 'Unexpected exception cleaning flavor with message - %s',
908 if self.sec_grp_creator:
910 self.sec_grp_creator.clean()
911 except Exception as e:
913 'Unexpected exception cleaning security group with message'
916 if self.router_creator:
918 self.router_creator.clean()
919 except Exception as e:
921 'Unexpected exception cleaning router with message - %s',
924 if self.network_creator:
926 self.network_creator.clean()
927 except Exception as e:
929 'Unexpected exception cleaning network with message - %s',
932 if self.image_creator and not self.image_creator.image_settings.exists:
934 self.image_creator.clean()
935 except Exception as e:
937 'Unexpected exception cleaning image with message - %s', e)
939 super(self.__class__, self).__clean__()
941 def test_v4fip_v6overlay(self):
943 Tests the ability to assign an IPv4 floating IP to an IPv6 overlay
944 network when the external network does not have an IPv6 subnet.
946 subnet_settings = SubnetSettings(
947 name=self.guid + '-subnet', cidr='1:1:0:0:0:0:0:0/64',
949 network_settings = NetworkSettings(
950 name=self.guid + '-net', subnet_settings=[subnet_settings])
951 router_settings = RouterSettings(
952 name=self.guid + '-router', external_gateway=self.ext_net_name,
953 internal_subnets=[subnet_settings.name])
956 self.network_creator = OpenStackNetwork(
957 self.os_creds, network_settings)
958 self.network_creator.create()
961 self.router_creator = OpenStackRouter(
962 self.os_creds, router_settings)
963 self.router_creator.create()
965 port_settings = PortSettings(
966 name=self.port1_name, network_name=network_settings.name)
968 instance_settings = VmInstanceSettings(
969 name=self.vm_inst_name,
970 flavor=self.flavor_creator.flavor_settings.name,
971 port_settings=[port_settings],
972 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
973 floating_ip_settings=[FloatingIpSettings(
974 name='fip1', port_name=self.port1_name,
975 router_name=router_settings.name)])
977 self.inst_creator = OpenStackVmInstance(
978 self.os_creds, instance_settings,
979 self.image_creator.image_settings,
980 keypair_settings=self.keypair_creator.keypair_settings)
982 with self.assertRaises(BadRequest):
983 self.inst_creator.create(block=True)
985 def test_fip_v4and6_overlay(self):
987 Tests the ability to assign an IPv4 floating IP to an IPv6 overlay
988 network when the external network does not have an IPv6 subnet.
990 subnet4_settings = SubnetSettings(
991 name=self.guid + '-subnet4', cidr='10.0.1.0/24',
993 subnet6_settings = SubnetSettings(
994 name=self.guid + '-subnet6', cidr='1:1:0:0:0:0:0:0/64',
996 network_settings = NetworkSettings(
997 name=self.guid + '-net',
998 subnet_settings=[subnet4_settings, subnet6_settings])
999 router_settings = RouterSettings(
1000 name=self.guid + '-router', external_gateway=self.ext_net_name,
1001 internal_subnets=[subnet4_settings.name])
1004 self.network_creator = OpenStackNetwork(
1005 self.os_creds, network_settings)
1006 self.network_creator.create()
1009 self.router_creator = OpenStackRouter(
1010 self.os_creds, router_settings)
1011 self.router_creator.create()
1013 port_settings = PortSettings(
1014 name=self.port1_name, network_name=network_settings.name)
1016 instance_settings = VmInstanceSettings(
1017 name=self.vm_inst_name,
1018 flavor=self.flavor_creator.flavor_settings.name,
1019 port_settings=[port_settings],
1020 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
1021 floating_ip_settings=[FloatingIpSettings(
1022 name='fip1', port_name=self.port1_name,
1023 router_name=router_settings.name)])
1025 self.inst_creator = OpenStackVmInstance(
1026 self.os_creds, instance_settings,
1027 self.image_creator.image_settings,
1028 keypair_settings=self.keypair_creator.keypair_settings)
1030 self.inst_creator.create(block=True)
1031 ssh_client = self.inst_creator.ssh_client()
1032 self.assertIsNotNone(ssh_client)
1035 class CreateInstancePortManipulationTests(OSIntegrationTestCase):
1037 Test for the CreateInstance class with a single NIC/Port where mac and IP
1038 values are manually set
1043 Instantiates the CreateImage object that is responsible for downloading
1044 and creating an OS image file within OpenStack
1046 super(self.__class__, self).__start__()
1048 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1049 self.vm_inst_name = guid + '-inst'
1050 self.port_1_name = guid + 'port-1'
1051 self.port_2_name = guid + 'port-2'
1052 self.floating_ip_name = guid + 'fip1'
1054 # Initialize for tearDown()
1055 self.image_creator = None
1056 self.network_creator = None
1057 self.flavor_creator = None
1058 self.inst_creator = None
1060 self.net_config = openstack_tests.get_priv_net_config(
1061 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
1062 router_name=guid + '-pub-router', external_net=self.ext_net_name)
1063 os_image_settings = openstack_tests.cirros_image_settings(
1064 name=guid + '-image', image_metadata=self.image_metadata)
1068 self.image_creator = OpenStackImage(self.os_creds,
1070 self.image_creator.create()
1073 self.network_creator = OpenStackNetwork(
1074 self.os_creds, self.net_config.network_settings)
1075 self.network_creator.create()
1078 self.flavor_creator = OpenStackFlavor(
1079 self.admin_os_creds,
1080 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
1081 vcpus=2, metadata=self.flavor_metadata))
1082 self.flavor_creator.create()
1083 except Exception as e:
1089 Cleans the created object
1091 if self.inst_creator:
1093 self.inst_creator.clean()
1094 except Exception as e:
1096 'Unexpected exception cleaning VM instance with message '
1099 if self.flavor_creator:
1101 self.flavor_creator.clean()
1102 except Exception as e:
1104 'Unexpected exception cleaning flavor with message - %s',
1107 if self.network_creator:
1109 self.network_creator.clean()
1110 except Exception as e:
1112 'Unexpected exception cleaning network with message - %s',
1115 if self.image_creator and not self.image_creator.image_settings.exists:
1117 self.image_creator.clean()
1118 except Exception as e:
1120 'Unexpected exception cleaning image with message - %s', e)
1122 super(self.__class__, self).__clean__()
1124 def test_set_custom_valid_ip_one_subnet(self):
1126 Tests the creation of an OpenStack instance with a single port with a
1127 static IP on a network with one subnet.
1130 sub_settings = self.net_config.network_settings.subnet_settings
1131 port_settings = PortSettings(
1132 name=self.port_1_name,
1133 network_name=self.net_config.network_settings.name,
1134 ip_addrs=[{'subnet_name': sub_settings[0].name, 'ip': ip}])
1136 instance_settings = VmInstanceSettings(
1137 name=self.vm_inst_name,
1138 flavor=self.flavor_creator.flavor_settings.name,
1139 port_settings=[port_settings])
1141 self.inst_creator = OpenStackVmInstance(
1142 self.os_creds, instance_settings,
1143 self.image_creator.image_settings)
1144 self.inst_creator.create(block=True)
1146 self.assertEqual(ip, self.inst_creator.get_port_ip(
1148 subnet_name=self.net_config.network_settings.subnet_settings[
1151 def test_set_custom_invalid_ip_one_subnet(self):
1153 Tests the creation of an OpenStack instance with a single port with a
1154 static IP on a network with one subnet.
1157 sub_settings = self.net_config.network_settings.subnet_settings
1158 port_settings = PortSettings(
1159 name=self.port_1_name,
1160 network_name=self.net_config.network_settings.name,
1161 ip_addrs=[{'subnet_name': sub_settings[0].name, 'ip': ip}])
1163 instance_settings = VmInstanceSettings(
1164 name=self.vm_inst_name,
1165 flavor=self.flavor_creator.flavor_settings.name,
1166 port_settings=[port_settings])
1168 self.inst_creator = OpenStackVmInstance(
1169 self.os_creds, instance_settings,
1170 self.image_creator.image_settings)
1172 with self.assertRaises(InvalidIpForSubnetClient):
1173 self.inst_creator.create()
1175 def test_set_custom_valid_mac(self):
1177 Tests the creation of an OpenStack instance with a single port where
1178 the MAC address is assigned.
1180 mac_addr = '0a:1b:2c:3d:4e:5f'
1181 port_settings = PortSettings(
1182 name=self.port_1_name,
1183 network_name=self.net_config.network_settings.name,
1184 mac_address=mac_addr)
1186 instance_settings = VmInstanceSettings(
1187 name=self.vm_inst_name,
1188 flavor=self.flavor_creator.flavor_settings.name,
1189 port_settings=[port_settings])
1191 self.inst_creator = OpenStackVmInstance(
1192 self.os_creds, instance_settings,
1193 self.image_creator.image_settings)
1194 self.inst_creator.create(block=True)
1196 self.assertEqual(mac_addr,
1197 self.inst_creator.get_port_mac(self.port_1_name))
1199 def test_set_custom_invalid_mac(self):
1201 Tests the creation of an OpenStack instance with a single port where an
1202 invalid MAC address value is being
1203 assigned. This should raise an Exception
1205 port_settings = PortSettings(
1206 name=self.port_1_name,
1207 network_name=self.net_config.network_settings.name,
1210 instance_settings = VmInstanceSettings(
1211 name=self.vm_inst_name,
1212 flavor=self.flavor_creator.flavor_settings.name,
1213 port_settings=[port_settings])
1215 self.inst_creator = OpenStackVmInstance(
1216 self.os_creds, instance_settings,
1217 self.image_creator.image_settings)
1219 with self.assertRaises(Exception):
1220 self.inst_creator.create()
1222 def test_set_custom_mac_and_ip(self):
1224 Tests the creation of an OpenStack instance with a single port where
1225 the IP and MAC address is assigned.
1228 mac_addr = '0a:1b:2c:3d:4e:5f'
1229 sub_settings = self.net_config.network_settings.subnet_settings
1230 port_settings = PortSettings(
1231 name=self.port_1_name,
1232 network_name=self.net_config.network_settings.name,
1233 mac_address=mac_addr,
1234 ip_addrs=[{'subnet_name': sub_settings[0].name, 'ip': ip}])
1236 instance_settings = VmInstanceSettings(
1237 name=self.vm_inst_name,
1238 flavor=self.flavor_creator.flavor_settings.name,
1239 port_settings=[port_settings])
1241 self.inst_creator = OpenStackVmInstance(
1242 self.os_creds, instance_settings,
1243 self.image_creator.image_settings)
1244 self.inst_creator.create(block=True)
1246 self.assertEqual(ip, self.inst_creator.get_port_ip(
1248 subnet_name=self.net_config.network_settings.subnet_settings[
1250 self.assertEqual(mac_addr,
1251 self.inst_creator.get_port_mac(self.port_1_name))
1253 def test_set_allowed_address_pairs(self):
1255 Tests the creation of an OpenStack instance with a single port where
1256 max_allowed_address_pair is set.
1259 mac_addr = '0a:1b:2c:3d:4e:5f'
1260 pair = {'ip_address': ip, 'mac_address': mac_addr}
1261 port_settings = PortSettings(
1262 name=self.port_1_name,
1263 network_name=self.net_config.network_settings.name,
1264 allowed_address_pairs=[pair])
1266 instance_settings = VmInstanceSettings(
1267 name=self.vm_inst_name,
1268 flavor=self.flavor_creator.flavor_settings.name,
1269 port_settings=[port_settings])
1271 self.inst_creator = OpenStackVmInstance(
1272 self.os_creds, instance_settings,
1273 self.image_creator.image_settings)
1274 self.inst_creator.create(block=True)
1276 port = self.inst_creator.get_port_by_name(port_settings.name)
1277 self.assertIsNotNone(port)
1278 self.assertIsNotNone(port.allowed_address_pairs)
1279 self.assertEqual(1, len(port.allowed_address_pairs))
1280 validation_utils.objects_equivalent(pair,
1281 port.allowed_address_pairs[0])
1283 def test_set_allowed_address_pairs_bad_mac(self):
1285 Tests the creation of an OpenStack instance with a single port where
1286 max_allowed_address_pair is set with an invalid MAC address.
1290 pair = {'ip_address': ip, 'mac_address': mac_addr}
1292 pairs.add((ip, mac_addr))
1293 port_settings = PortSettings(
1294 name=self.port_1_name,
1295 network_name=self.net_config.network_settings.name,
1296 allowed_address_pairs=[pair])
1298 instance_settings = VmInstanceSettings(
1299 name=self.vm_inst_name,
1300 flavor=self.flavor_creator.flavor_settings.name,
1301 port_settings=[port_settings])
1303 self.inst_creator = OpenStackVmInstance(
1304 self.os_creds, instance_settings,
1305 self.image_creator.image_settings)
1306 with self.assertRaises(Exception):
1307 self.inst_creator.create()
1309 def test_set_allowed_address_pairs_bad_ip(self):
1311 Tests the creation of an OpenStack instance with a single port where
1312 max_allowed_address_pair is set with an invalid MAC address.
1315 mac_addr = '0a:1b:2c:3d:4e:5f'
1316 pair = {'ip_address': ip, 'mac_address': mac_addr}
1318 pairs.add((ip, mac_addr))
1319 port_settings = PortSettings(
1320 name=self.port_1_name,
1321 network_name=self.net_config.network_settings.name,
1322 allowed_address_pairs=[pair])
1324 instance_settings = VmInstanceSettings(
1325 name=self.vm_inst_name,
1326 flavor=self.flavor_creator.flavor_settings.name,
1327 port_settings=[port_settings])
1329 self.inst_creator = OpenStackVmInstance(
1330 self.os_creds, instance_settings,
1331 self.image_creator.image_settings)
1332 with self.assertRaises(Exception):
1333 self.inst_creator.create()
1336 class CreateInstanceOnComputeHost(OSIntegrationTestCase):
1338 Test for the CreateInstance where one VM is deployed to each compute node
1343 Instantiates the CreateImage object that is responsible for downloading
1344 and creating an OS image file within OpenStack
1346 super(self.__class__, self).__start__()
1348 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1349 self.vm_inst_name = guid + '-inst'
1350 self.port_base_name = guid + 'port'
1352 # Initialize for tearDown()
1353 self.image_creator = None
1354 self.flavor_creator = None
1355 self.network_creator = None
1356 self.inst_creators = list()
1358 self.priv_net_config = openstack_tests.get_priv_net_config(
1359 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
1361 os_image_settings = openstack_tests.cirros_image_settings(
1362 name=guid + '-image', image_metadata=self.image_metadata)
1366 self.network_creator = OpenStackNetwork(
1367 self.admin_os_creds, self.priv_net_config.network_settings)
1368 self.network_creator.create()
1371 self.flavor_creator = OpenStackFlavor(
1372 self.admin_os_creds,
1373 FlavorConfig(name=guid + '-flavor-name', ram=512, disk=1,
1374 vcpus=1, metadata=self.flavor_metadata))
1375 self.flavor_creator.create()
1378 self.image_creator = OpenStackImage(self.os_creds,
1380 self.image_creator.create()
1382 except Exception as e:
1388 Cleans the created object
1390 for inst_creator in self.inst_creators:
1392 inst_creator.clean()
1393 except Exception as e:
1395 'Unexpected exception cleaning VM instance with message '
1398 if self.flavor_creator:
1400 self.flavor_creator.clean()
1401 except Exception as e:
1403 'Unexpected exception cleaning flavor with message - %s',
1406 if self.network_creator:
1408 self.network_creator.clean()
1409 except Exception as e:
1411 'Unexpected exception cleaning network with message - %s',
1414 if self.image_creator and not self.image_creator.image_settings.exists:
1416 self.image_creator.clean()
1417 except Exception as e:
1419 'Unexpected exception cleaning image with message - %s', e)
1421 super(self.__class__, self).__clean__()
1423 def test_deploy_vm_to_each_compute_node(self):
1425 Tests the creation of OpenStack VM instances to each compute node.
1427 from snaps.openstack.utils import nova_utils
1428 nova = nova_utils.nova_client(self.admin_os_creds)
1429 zone_hosts = nova_utils.get_availability_zone_hosts(nova)
1431 # Create Instance on each server/zone
1433 for zone in zone_hosts:
1434 inst_name = self.vm_inst_name + '-' + zone
1436 port_settings = PortSettings(
1437 name=self.port_base_name + '-' + str(ctr),
1438 network_name=self.priv_net_config.network_settings.name)
1440 instance_settings = VmInstanceSettings(
1442 flavor=self.flavor_creator.flavor_settings.name,
1443 availability_zone=zone,
1444 port_settings=[port_settings])
1445 inst_creator = OpenStackVmInstance(
1446 self.admin_os_creds, instance_settings,
1447 self.image_creator.image_settings)
1448 self.inst_creators.append(inst_creator)
1449 inst_creator.create()
1451 # Validate instances to ensure they've been deployed to the correct
1454 for zone in zone_hosts:
1455 creator = self.inst_creators[index]
1456 self.assertTrue(creator.vm_active(block=True))
1457 info = creator.get_vm_info()
1458 deployed_zone = info['OS-EXT-AZ:availability_zone']
1459 deployed_host = info['OS-EXT-SRV-ATTR:host']
1460 self.assertEqual(zone, deployed_zone + ':' + deployed_host)
1464 class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
1466 Test for the CreateInstance class with two NIC/Ports, eth0 with floating IP
1468 These tests require a Centos image
1473 Instantiates the CreateImage object that is responsible for downloading
1474 and creating an OS image file within OpenStack
1476 super(self.__class__, self).__start__()
1478 self.nova = nova_utils.nova_client(self.os_creds)
1480 # Initialize for tearDown()
1481 self.image_creator = None
1482 self.network_creators = list()
1483 self.router_creators = list()
1484 self.flavor_creator = None
1485 self.keypair_creator = None
1486 self.sec_grp_creator = None
1487 self.inst_creator = None
1489 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1490 self.keypair_priv_filepath = 'tmp/' + self.guid
1491 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
1492 self.keypair_name = self.guid + '-kp'
1493 self.vm_inst_name = self.guid + '-inst'
1494 self.port_1_name = self.guid + '-port-1'
1495 self.port_2_name = self.guid + '-port-2'
1496 self.floating_ip_name = self.guid + 'fip1'
1497 self.priv_net_config = openstack_tests.get_priv_net_config(
1498 net_name=self.guid + '-priv-net',
1499 subnet_name=self.guid + '-priv-subnet',
1500 router_name=self.guid + '-priv-router',
1501 external_net=self.ext_net_name)
1502 self.pub_net_config = openstack_tests.get_pub_net_config(
1503 net_name=self.guid + '-pub-net',
1504 subnet_name=self.guid + '-pub-subnet',
1505 router_name=self.guid + '-pub-router',
1506 external_net=self.ext_net_name)
1508 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
1509 os_image_settings = openstack_tests.centos_image_settings(
1510 name=image_name, image_metadata=self.image_metadata)
1514 self.image_creator = OpenStackImage(self.os_creds,
1516 self.image_creator.create()
1518 # First network is public
1519 self.network_creators.append(OpenStackNetwork(
1520 self.os_creds, self.pub_net_config.network_settings))
1521 # Second network is private
1522 self.network_creators.append(OpenStackNetwork(
1523 self.os_creds, self.priv_net_config.network_settings))
1524 for network_creator in self.network_creators:
1525 network_creator.create()
1527 self.router_creators.append(OpenStackRouter(
1528 self.os_creds, self.pub_net_config.router_settings))
1529 self.router_creators.append(OpenStackRouter(
1530 self.os_creds, self.priv_net_config.router_settings))
1533 for router_creator in self.router_creators:
1534 router_creator.create()
1537 self.flavor_creator = OpenStackFlavor(
1538 self.admin_os_creds,
1539 FlavorConfig(name=self.guid + '-flavor-name', ram=512,
1541 metadata=self.flavor_metadata))
1542 self.flavor_creator.create()
1545 self.keypair_creator = OpenStackKeypair(
1546 self.os_creds, KeypairConfig(
1547 name=self.keypair_name,
1548 public_filepath=self.keypair_pub_filepath,
1549 private_filepath=self.keypair_priv_filepath))
1550 self.keypair_creator.create()
1552 sec_grp_name = self.guid + '-sec-grp'
1553 rule1 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
1554 direction=Direction.ingress,
1555 protocol=Protocol.icmp)
1556 rule2 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
1557 direction=Direction.ingress,
1558 protocol=Protocol.tcp,
1561 self.sec_grp_creator = OpenStackSecurityGroup(
1563 SecurityGroupSettings(name=sec_grp_name,
1564 rule_settings=[rule1, rule2]))
1565 self.sec_grp_creator.create()
1572 Cleans the created objects
1574 if self.inst_creator:
1576 self.inst_creator.clean()
1577 except Exception as e:
1579 'Unexpected exception cleaning VM instance with message '
1582 if self.keypair_creator:
1584 self.keypair_creator.clean()
1585 except Exception as e:
1587 'Unexpected exception cleaning keypair with message - %s',
1590 if self.flavor_creator:
1592 self.flavor_creator.clean()
1593 except Exception as e:
1595 'Unexpected exception cleaning flavor with message - %s',
1598 for router_creator in self.router_creators:
1600 router_creator.clean()
1601 except Exception as e:
1603 'Unexpected exception cleaning router with message - %s',
1606 for network_creator in self.network_creators:
1608 network_creator.clean()
1609 except Exception as e:
1611 'Unexpected exception cleaning network with message - %s',
1614 if self.sec_grp_creator:
1616 self.sec_grp_creator.clean()
1617 except Exception as e:
1619 'Unexpected exception cleaning security group with message'
1622 if self.image_creator and not self.image_creator.image_settings.exists:
1624 self.image_creator.clean()
1625 except Exception as e:
1627 'Unexpected exception cleaning image with message - %s', e)
1629 super(self.__class__, self).__clean__()
1631 def test_dual_ports_dhcp(self):
1633 Tests the creation of an OpenStack instance with a dual ports/NICs with
1635 NOTE: This test and any others that call ansible will most likely fail
1636 unless you do one of two things:
1637 1. Have a ~/.ansible.cfg (or alternate means) to
1638 set host_key_checking = False
1639 2. Set the following environment variable in your executing shell:
1640 ANSIBLE_HOST_KEY_CHECKING=False
1641 Should this not be performed, the creation of the host ssh key will
1642 cause your ansible calls to fail.
1644 # Create ports/NICs for instance
1647 for network_creator in self.network_creators:
1648 ports_settings.append(PortSettings(
1649 name=self.guid + '-port-' + str(ctr),
1650 network_name=network_creator.network_settings.name))
1654 instance_settings = VmInstanceSettings(
1655 name=self.vm_inst_name,
1656 flavor=self.flavor_creator.flavor_settings.name,
1657 port_settings=ports_settings,
1658 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
1659 floating_ip_settings=[FloatingIpSettings(
1660 name=self.floating_ip_name, port_name=self.port_1_name,
1661 router_name=self.pub_net_config.router_settings.name)])
1663 self.inst_creator = OpenStackVmInstance(
1664 self.os_creds, instance_settings,
1665 self.image_creator.image_settings,
1666 keypair_settings=self.keypair_creator.keypair_settings)
1668 vm_inst = self.inst_creator.create(block=True)
1670 self.assertEqual(vm_inst.id, self.inst_creator.get_vm_inst().id)
1672 # Effectively blocks until VM has been properly activated
1673 self.assertTrue(self.inst_creator.vm_active(block=True))
1675 ip = self.inst_creator.get_port_ip(ports_settings[0].name)
1676 self.assertTrue(check_dhcp_lease(self.inst_creator, ip))
1678 # Effectively blocks until VM's ssh port has been opened
1679 self.assertTrue(self.inst_creator.vm_ssh_active(block=True))
1681 self.assertEqual(0, self.inst_creator.config_nics())
1684 class InstanceSecurityGroupTests(OSIntegrationTestCase):
1686 Tests that include, add, and remove security groups from VM instances
1691 Instantiates the CreateImage object that is responsible for downloading
1692 and creating an OS image file within OpenStack
1694 super(self.__class__, self).__start__()
1696 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1697 self.vm_inst_name = self.guid + '-inst'
1698 self.nova = nova_utils.nova_client(self.os_creds)
1699 os_image_settings = openstack_tests.cirros_image_settings(
1700 name=self.guid + '-image', image_metadata=self.image_metadata)
1702 self.vm_inst_name = self.guid + '-inst'
1703 self.port_1_name = self.guid + 'port-1'
1704 self.port_2_name = self.guid + 'port-2'
1705 self.floating_ip_name = self.guid + 'fip1'
1707 net_config = openstack_tests.get_priv_net_config(
1708 net_name=self.guid + '-pub-net',
1709 subnet_name=self.guid + '-pub-subnet',
1710 router_name=self.guid + '-pub-router',
1711 external_net=self.ext_net_name)
1713 # Initialize for tearDown()
1714 self.image_creator = None
1715 self.flavor_creator = None
1716 self.network_creator = None
1717 self.router_creator = None
1718 self.inst_creator = None
1719 self.sec_grp_creators = list()
1723 self.image_creator = OpenStackImage(self.os_creds,
1725 self.image_creator.create()
1728 self.network_creator = OpenStackNetwork(
1729 self.os_creds, net_config.network_settings)
1730 self.network_creator.create()
1733 self.flavor_creator = OpenStackFlavor(
1734 self.admin_os_creds,
1735 FlavorConfig(name=self.guid + '-flavor-name', ram=256,
1737 metadata=self.flavor_metadata))
1738 self.flavor_creator.create()
1740 self.port_settings = PortSettings(
1741 name=self.guid + '-port',
1742 network_name=net_config.network_settings.name)
1743 except Exception as e:
1749 Cleans the created object
1751 if self.inst_creator:
1753 self.inst_creator.clean()
1754 except Exception as e:
1756 'Unexpected exception cleaning VM instance with message -'
1759 for sec_grp_creator in self.sec_grp_creators:
1761 sec_grp_creator.clean()
1762 except Exception as e:
1764 'Unexpected exception cleaning security group with message'
1767 if self.flavor_creator:
1769 self.flavor_creator.clean()
1770 except Exception as e:
1772 'Unexpected exception cleaning flavor with message - %s',
1775 if self.network_creator:
1777 self.network_creator.clean()
1778 except Exception as e:
1780 'Unexpected exception cleaning network with message - %s',
1783 if self.image_creator and not self.image_creator.image_settings.exists:
1785 self.image_creator.clean()
1786 except Exception as e:
1788 'Unexpected exception cleaning image with message - %s', e)
1790 super(self.__class__, self).__clean__()
1792 def test_add_security_group(self):
1794 Tests the addition of a security group created after the instance.
1797 instance_settings = VmInstanceSettings(
1798 name=self.vm_inst_name,
1799 flavor=self.flavor_creator.flavor_settings.name,
1800 port_settings=[self.port_settings])
1801 self.inst_creator = OpenStackVmInstance(
1802 self.os_creds, instance_settings,
1803 self.image_creator.image_settings)
1804 vm_inst = self.inst_creator.create(block=True)
1805 self.assertIsNotNone(vm_inst)
1807 # Create security group object to add to instance
1808 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name',
1809 description='hello group')
1810 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1812 sec_grp = sec_grp_creator.create()
1813 self.sec_grp_creators.append(sec_grp_creator)
1815 # Check that group has not been added
1816 self.assertFalse(inst_has_sec_grp(
1817 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1819 # Add security group to instance after activated
1820 self.inst_creator.add_security_group(sec_grp)
1822 # Validate that security group has been added
1823 self.assertTrue(inst_has_sec_grp(
1824 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1826 def test_add_invalid_security_group(self):
1828 Tests the addition of a security group that no longer exists.
1831 instance_settings = VmInstanceSettings(
1832 name=self.vm_inst_name,
1833 flavor=self.flavor_creator.flavor_settings.name,
1834 port_settings=[self.port_settings])
1835 self.inst_creator = OpenStackVmInstance(
1836 self.os_creds, instance_settings,
1837 self.image_creator.image_settings)
1838 vm_inst = self.inst_creator.create(block=True)
1839 self.assertIsNotNone(vm_inst)
1841 # Create security group object to add to instance
1842 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name',
1843 description='hello group')
1844 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1846 sec_grp = sec_grp_creator.create()
1847 sec_grp_creator.clean()
1848 self.sec_grp_creators.append(sec_grp_creator)
1850 # Check that group has not been added
1851 self.assertFalse(inst_has_sec_grp(
1852 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1854 # Add security group to instance after activated
1855 self.assertFalse(self.inst_creator.add_security_group(sec_grp))
1857 # Validate that security group has been added
1858 self.assertFalse(inst_has_sec_grp(
1859 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1861 def test_remove_security_group(self):
1863 Tests the removal of a security group created before and added to the
1866 # Create security group object to add to instance
1867 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name',
1868 description='hello group')
1869 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1871 sec_grp = sec_grp_creator.create()
1872 self.sec_grp_creators.append(sec_grp_creator)
1875 instance_settings = VmInstanceSettings(
1876 name=self.vm_inst_name,
1877 flavor=self.flavor_creator.flavor_settings.name,
1878 security_group_names=[sec_grp_settings.name],
1879 port_settings=[self.port_settings])
1880 self.inst_creator = OpenStackVmInstance(
1881 self.os_creds, instance_settings,
1882 self.image_creator.image_settings)
1883 vm_inst = self.inst_creator.create(block=True)
1884 self.assertIsNotNone(vm_inst)
1886 # Check that group has been added
1887 self.assertTrue(inst_has_sec_grp(
1888 self.nova, vm_inst, sec_grp_settings.name))
1890 # Add security group to instance after activated
1891 self.assertTrue(self.inst_creator.remove_security_group(sec_grp))
1893 # Validate that security group has been added
1894 self.assertFalse(inst_has_sec_grp(
1895 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1897 def test_remove_security_group_never_added(self):
1899 Tests the removal of a security group that was never added in the first
1902 # Create security group object to add to instance
1903 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name',
1904 description='hello group')
1905 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1907 sec_grp = sec_grp_creator.create()
1908 self.sec_grp_creators.append(sec_grp_creator)
1911 instance_settings = VmInstanceSettings(
1912 name=self.vm_inst_name,
1913 flavor=self.flavor_creator.flavor_settings.name,
1914 port_settings=[self.port_settings])
1915 self.inst_creator = OpenStackVmInstance(
1916 self.os_creds, instance_settings,
1917 self.image_creator.image_settings)
1918 vm_inst = self.inst_creator.create(block=True)
1919 self.assertIsNotNone(vm_inst)
1921 # Check that group has been added
1922 self.assertFalse(inst_has_sec_grp(
1923 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1925 # Add security group to instance after activated
1926 self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
1928 # Validate that security group has been added
1929 self.assertFalse(inst_has_sec_grp(
1930 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1932 def test_add_same_security_group(self):
1934 Tests the addition of a security group created before add added to the
1937 # Create security group object to add to instance
1938 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name',
1939 description='hello group')
1940 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1942 sec_grp = sec_grp_creator.create()
1943 self.sec_grp_creators.append(sec_grp_creator)
1946 instance_settings = VmInstanceSettings(
1947 name=self.vm_inst_name,
1948 flavor=self.flavor_creator.flavor_settings.name,
1949 security_group_names=[sec_grp_settings.name],
1950 port_settings=[self.port_settings])
1951 self.inst_creator = OpenStackVmInstance(
1952 self.os_creds, instance_settings,
1953 self.image_creator.image_settings)
1954 vm_inst = self.inst_creator.create(block=True)
1955 self.assertIsNotNone(vm_inst)
1957 # Check that group has been added
1958 self.assertTrue(inst_has_sec_grp(
1959 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1961 # Add security group to instance after activated
1962 self.assertTrue(self.inst_creator.add_security_group(sec_grp))
1964 # Validate that security group has been added
1965 self.assertTrue(inst_has_sec_grp(
1966 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1969 def inst_has_sec_grp(nova, vm_inst, sec_grp_name):
1971 Returns true if instance has a security group of a given name
1972 :param nova: the nova client
1973 :param vm_inst: the VmInst domain object
1974 :param sec_grp_name: the name of the security group to validate
1977 sec_grp_names = nova_utils.get_server_security_group_names(nova, vm_inst)
1978 for name in sec_grp_names:
1979 if sec_grp_name == name:
1984 def validate_ssh_client(instance_creator):
1986 Returns True if instance_creator returns an SSH client that is valid
1987 :param instance_creator: the object responsible for creating the VM
1991 ssh_active = instance_creator.vm_ssh_active(block=True)
1994 ssh_client = instance_creator.ssh_client()
1997 out = ssh_client.exec_command('pwd')[1]
1998 channel = out.channel
1999 in_buffer = channel.in_buffer
2000 pwd_out = in_buffer.read(1024)
2001 if not pwd_out or len(pwd_out) < 10:
2012 class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
2014 Test for the CreateInstance class for creating an image from a 3-part image
2019 Instantiates the CreateImage object that is responsible for downloading
2020 and creating an OS image file within OpenStack
2022 super(self.__class__, self).__start__()
2024 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2025 self.image_name = guid
2026 self.vm_inst_name = guid + '-inst'
2027 self.nova = nova_utils.nova_client(self.os_creds)
2029 net_config = openstack_tests.get_priv_net_config(
2030 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
2031 router_name=guid + '-pub-router', external_net=self.ext_net_name)
2033 # Initialize for tearDown()
2034 self.image_creator = None
2035 self.network_creator = None
2036 self.flavor_creator = None
2037 self.inst_creator = None
2040 if self.image_metadata and 'disk_file' in self.image_metadata:
2041 metadata = self.image_metadata
2042 elif self.image_metadata and 'cirros' in self.image_metadata \
2043 and 'disk_file' in self.image_metadata['cirros']:
2044 metadata = self.image_metadata['cirros']
2047 'disk_url': openstack_tests.CIRROS_DEFAULT_IMAGE_URL,
2049 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL,
2051 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL}
2053 image_settings = openstack_tests.cirros_image_settings(
2054 name=self.image_name,
2055 image_metadata=metadata)
2057 if not image_settings.ramdisk_image_settings or not \
2058 image_settings.kernel_image_settings:
2060 '3 Part image will not be tested. Image metadata has '
2061 'overridden this functionality')
2063 self.image_creator = OpenStackImage(self.os_creds, image_settings)
2064 self.image_creator.create()
2067 self.flavor_creator = OpenStackFlavor(
2068 self.admin_os_creds,
2069 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
2070 vcpus=2, metadata=self.flavor_metadata))
2071 self.flavor_creator.create()
2074 self.network_creator = OpenStackNetwork(
2075 self.os_creds, net_config.network_settings)
2076 self.network_creator.create()
2078 self.port_settings = PortSettings(
2079 name=guid + '-port',
2080 network_name=net_config.network_settings.name)
2081 except Exception as e:
2087 Cleans the created object
2089 if self.inst_creator:
2091 self.inst_creator.clean()
2092 except Exception as e:
2094 'Unexpected exception cleaning VM instance with message -'
2097 if self.flavor_creator:
2099 self.flavor_creator.clean()
2100 except Exception as e:
2102 'Unexpected exception cleaning flavor with message - %s',
2105 if self.network_creator:
2107 self.network_creator.clean()
2108 except Exception as e:
2110 'Unexpected exception cleaning network with message - %s',
2113 if self.image_creator and not self.image_creator.image_settings.exists:
2115 self.image_creator.clean()
2116 except Exception as e:
2118 'Unexpected exception cleaning image with message - %s', e)
2120 super(self.__class__, self).__clean__()
2122 def test_create_instance_from_three_part_image(self):
2124 Tests the creation of an OpenStack instance from a 3-part image.
2126 instance_settings = VmInstanceSettings(
2127 name=self.vm_inst_name,
2128 flavor=self.flavor_creator.flavor_settings.name,
2129 port_settings=[self.port_settings])
2131 # The last created image is the main image from which we create the
2133 self.inst_creator = OpenStackVmInstance(
2134 self.os_creds, instance_settings,
2135 self.image_creator.image_settings)
2137 vm_inst = self.inst_creator.create()
2138 self.assertIsNotNone(vm_inst)
2139 self.assertTrue(self.inst_creator.vm_active(block=True))
2142 class CreateInstanceMockOfflineTests(OSComponentTestCase):
2144 Tests the custom image_metadata that can be set by clients for handling
2145 images differently than the default behavior of the existing tests
2146 primarily for offline testing
2151 Instantiates the CreateImage object that is responsible for downloading
2152 and creating an OS image file within OpenStack
2154 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2156 self.tmpDir = 'tmp/' + str(self.guid)
2157 if not os.path.exists(self.tmpDir):
2158 os.makedirs(self.tmpDir)
2160 self.image_name = self.guid + '-image'
2161 self.vm_inst_name = self.guid + '-inst'
2162 self.port_1_name = self.guid + 'port-1'
2164 # Initialize for tearDown()
2165 self.image_creator = None
2166 self.network_creator = None
2167 self.flavor_creator = None
2168 self.inst_creator = None
2170 self.priv_net_config = openstack_tests.get_priv_net_config(
2171 net_name=self.guid + '-priv-net',
2172 subnet_name=self.guid + '-priv-subnet')
2173 self.port_settings = PortSettings(
2174 name=self.port_1_name,
2175 network_name=self.priv_net_config.network_settings.name)
2178 # Download image file
2179 self.image_file = file_utils.download(
2180 openstack_tests.CIRROS_DEFAULT_IMAGE_URL, self.tmpDir)
2183 self.network_creator = OpenStackNetwork(
2184 self.os_creds, self.priv_net_config.network_settings)
2185 self.network_creator.create()
2188 self.flavor_creator = OpenStackFlavor(
2191 name=self.guid + '-flavor-name', ram=256, disk=10,
2193 self.flavor_creator.create()
2194 except Exception as e:
2200 Cleans the created object
2202 if self.inst_creator:
2204 self.inst_creator.clean()
2205 except Exception as e:
2207 'Unexpected exception cleaning VM instance with message - '
2210 if self.network_creator:
2212 self.network_creator.clean()
2213 except Exception as e:
2215 'Unexpected exception cleaning network with message - %s',
2218 if self.flavor_creator:
2220 self.flavor_creator.clean()
2221 except Exception as e:
2223 'Unexpected exception cleaning flavor with message - %s',
2226 if self.image_creator:
2228 self.image_creator.clean()
2229 except Exception as e:
2231 'Unexpected exception cleaning image with message - %s', e)
2233 if os.path.exists(self.tmpDir) and os.path.isdir(self.tmpDir):
2234 shutil.rmtree(self.tmpDir)
2236 def test_inst_from_file_image_simple_flat(self):
2238 Creates a VM instance from a locally sourced file image using simply
2239 the 'disk_file' attribute vs. using the 'config' option which
2240 completely overrides all image settings
2243 metadata = {'disk_file': self.image_file.name}
2245 os_image_settings = openstack_tests.cirros_image_settings(
2246 name=self.image_name, image_metadata=metadata)
2247 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2248 self.assertEqual(openstack_tests.CIRROS_USER,
2249 os_image_settings.image_user)
2250 self.assertIsNone(os_image_settings.url)
2251 self.assertFalse(os_image_settings.exists)
2252 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2253 os_image_settings.format)
2255 self.assertIsNone(os_image_settings.kernel_image_settings)
2256 self.assertIsNone(os_image_settings.ramdisk_image_settings)
2258 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2259 self.image_creator.create()
2261 instance_settings = VmInstanceSettings(
2262 name=self.vm_inst_name,
2263 flavor=self.flavor_creator.flavor_settings.name,
2264 port_settings=[self.port_settings])
2265 self.inst_creator = OpenStackVmInstance(
2266 self.os_creds, instance_settings,
2267 self.image_creator.image_settings)
2268 self.inst_creator.create()
2270 self.assertTrue(self.inst_creator.vm_active(block=True))
2272 def test_inst_from_file_image_simple_nested(self):
2274 Creates a VM instance from a locally sourced file image using simply
2275 the 'disk_file' attribute under 'cirros' vs. using the 'config' option
2276 which completely overrides all image settings
2279 metadata = {'cirros': {'disk_file': self.image_file.name}}
2281 os_image_settings = openstack_tests.cirros_image_settings(
2282 name=self.image_name, image_metadata=metadata)
2283 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2284 self.assertEqual(openstack_tests.CIRROS_USER,
2285 os_image_settings.image_user)
2286 self.assertIsNone(os_image_settings.url)
2287 self.assertFalse(os_image_settings.exists)
2288 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2289 os_image_settings.format)
2291 self.assertIsNone(os_image_settings.kernel_image_settings)
2292 self.assertIsNone(os_image_settings.ramdisk_image_settings)
2294 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2295 self.image_creator.create()
2297 instance_settings = VmInstanceSettings(
2298 name=self.vm_inst_name,
2299 flavor=self.flavor_creator.flavor_settings.name,
2300 port_settings=[self.port_settings])
2301 self.inst_creator = OpenStackVmInstance(
2302 self.os_creds, instance_settings,
2303 self.image_creator.image_settings)
2304 self.inst_creator.create()
2306 self.assertTrue(self.inst_creator.vm_active(block=True))
2308 def test_inst_from_existing(self):
2310 Creates a VM instance from a image creator that has been configured to
2311 use an existing image
2314 os_image_settings = openstack_tests.cirros_image_settings(
2315 name=self.image_name)
2316 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2317 self.image_creator.create()
2319 image_settings = self.image_creator.image_settings
2320 test_image_creator = OpenStackImage(
2323 name=image_settings.name, image_user=image_settings.image_user,
2325 test_image_creator.create()
2326 self.assertEqual(self.image_creator.get_image().id,
2327 test_image_creator.get_image().id)
2329 instance_settings = VmInstanceSettings(
2330 name=self.vm_inst_name,
2331 flavor=self.flavor_creator.flavor_settings.name,
2332 port_settings=[self.port_settings])
2333 self.inst_creator = OpenStackVmInstance(
2334 self.os_creds, instance_settings,
2335 test_image_creator.image_settings)
2336 self.inst_creator.create()
2338 self.assertTrue(self.inst_creator.vm_active(block=True))
2340 def test_inst_from_file_image_complex(self):
2342 Creates a VM instance from a locally sourced file image by overriding
2343 the default settings by using a dict() that can be read in by
2348 os_image_settings = openstack_tests.cirros_image_settings(
2349 name=self.image_name)
2350 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2351 self.image_creator.create()
2356 'name': os_image_settings.name,
2357 'image_user': os_image_settings.image_user,
2359 test_image_settings = openstack_tests.cirros_image_settings(
2360 image_metadata=metadata)
2361 test_image = OpenStackImage(self.os_creds, test_image_settings)
2364 instance_settings = VmInstanceSettings(
2365 name=self.vm_inst_name,
2366 flavor=self.flavor_creator.flavor_settings.name,
2367 port_settings=[self.port_settings])
2368 self.inst_creator = OpenStackVmInstance(self.os_creds,
2370 test_image_settings)
2371 self.inst_creator.create()
2373 self.assertTrue(self.inst_creator.vm_active(block=True))
2375 def test_inst_from_file_3part_image_complex(self):
2377 Creates a VM instance from a locally sourced file image by overriding
2378 the default settings by using a dict() that can be read in by
2383 kernel_file = file_utils.download(
2384 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2385 ramdisk_file = file_utils.download(
2386 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2391 'name': self.image_name,
2392 'image_user': openstack_tests.CIRROS_USER,
2393 'image_file': self.image_file.name,
2394 'format': openstack_tests.DEFAULT_IMAGE_FORMAT,
2395 'kernel_image_settings': {
2396 'name': self.image_name + '-kernel',
2397 'image_user': openstack_tests.CIRROS_USER,
2398 'image_file': kernel_file.name,
2399 'format': openstack_tests.DEFAULT_IMAGE_FORMAT},
2400 'ramdisk_image_settings': {
2401 'name': self.image_name + '-ramdisk',
2402 'image_user': openstack_tests.CIRROS_USER,
2403 'image_file': ramdisk_file.name,
2404 'format': openstack_tests.DEFAULT_IMAGE_FORMAT}}}}
2406 os_image_settings = openstack_tests.cirros_image_settings(
2407 name=self.image_name, image_metadata=metadata)
2408 self.assertEqual(self.image_name, os_image_settings.name)
2409 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2410 self.assertEqual(openstack_tests.CIRROS_USER,
2411 os_image_settings.image_user)
2412 self.assertIsNone(os_image_settings.url)
2413 self.assertFalse(os_image_settings.exists)
2414 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2415 os_image_settings.format)
2417 self.assertIsNotNone(os_image_settings.kernel_image_settings)
2418 self.assertEqual(self.image_name + '-kernel',
2419 os_image_settings.kernel_image_settings.name)
2420 self.assertEqual(kernel_file.name,
2421 os_image_settings.kernel_image_settings.image_file)
2422 self.assertEqual(openstack_tests.CIRROS_USER,
2423 os_image_settings.kernel_image_settings.image_user)
2424 self.assertIsNone(os_image_settings.kernel_image_settings.url)
2425 self.assertFalse(os_image_settings.kernel_image_settings.exists)
2426 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2427 os_image_settings.kernel_image_settings.format)
2429 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
2430 self.assertEqual(self.image_name + '-ramdisk',
2431 os_image_settings.ramdisk_image_settings.name)
2432 self.assertEqual(ramdisk_file.name,
2433 os_image_settings.ramdisk_image_settings.image_file)
2434 self.assertEqual(openstack_tests.CIRROS_USER,
2435 os_image_settings.ramdisk_image_settings.image_user)
2436 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
2437 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
2438 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2439 os_image_settings.ramdisk_image_settings.format)
2441 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2442 self.image_creator.create()
2444 instance_settings = VmInstanceSettings(
2445 name=self.vm_inst_name,
2446 flavor=self.flavor_creator.flavor_settings.name,
2447 port_settings=[self.port_settings])
2448 self.inst_creator = OpenStackVmInstance(
2449 self.os_creds, instance_settings,
2450 self.image_creator.image_settings)
2451 self.inst_creator.create()
2453 self.assertTrue(self.inst_creator.vm_active(block=True))
2455 def test_inst_from_file_3part_image_simple_flat(self):
2457 Creates a VM instance from a 3-part image locally sourced from file
2458 images using simply the 'disk_file', 'kernel_file', and 'ramdisk_file'
2459 attributes vs. using the 'config' option which completely overrides all
2463 kernel_file = file_utils.download(
2464 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2465 ramdisk_file = file_utils.download(
2466 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2468 metadata = {'disk_file': self.image_file.name,
2469 'kernel_file': kernel_file.name,
2470 'ramdisk_file': ramdisk_file.name}
2472 os_image_settings = openstack_tests.cirros_image_settings(
2473 name=self.image_name, image_metadata=metadata)
2475 self.assertEqual(self.image_name, os_image_settings.name)
2476 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2477 self.assertEqual(openstack_tests.CIRROS_USER,
2478 os_image_settings.image_user)
2479 self.assertIsNone(os_image_settings.url)
2480 self.assertFalse(os_image_settings.exists)
2481 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2482 os_image_settings.format)
2484 self.assertIsNotNone(os_image_settings.kernel_image_settings)
2485 self.assertEqual(self.image_name + '-kernel',
2486 os_image_settings.kernel_image_settings.name)
2487 self.assertEqual(kernel_file.name,
2488 os_image_settings.kernel_image_settings.image_file)
2489 self.assertEqual(openstack_tests.CIRROS_USER,
2490 os_image_settings.kernel_image_settings.image_user)
2491 self.assertIsNone(os_image_settings.kernel_image_settings.url)
2492 self.assertFalse(os_image_settings.kernel_image_settings.exists)
2493 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2494 os_image_settings.kernel_image_settings.format)
2496 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
2497 self.assertEqual(self.image_name + '-ramdisk',
2498 os_image_settings.ramdisk_image_settings.name)
2499 self.assertEqual(ramdisk_file.name,
2500 os_image_settings.ramdisk_image_settings.image_file)
2501 self.assertEqual(openstack_tests.CIRROS_USER,
2502 os_image_settings.ramdisk_image_settings.image_user)
2503 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
2504 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
2505 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2506 os_image_settings.ramdisk_image_settings.format)
2508 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2509 self.image_creator.create()
2511 self.assertIsNotNone(self.image_creator.get_kernel_image())
2512 self.assertIsNotNone(self.image_creator.get_ramdisk_image())
2514 instance_settings = VmInstanceSettings(
2515 name=self.vm_inst_name,
2516 flavor=self.flavor_creator.flavor_settings.name,
2517 port_settings=[self.port_settings])
2518 self.inst_creator = OpenStackVmInstance(
2519 self.os_creds, instance_settings,
2520 self.image_creator.image_settings)
2521 self.inst_creator.create()
2523 self.assertTrue(self.inst_creator.vm_active(block=True))
2525 def test_inst_from_file_3part_image_simple_nested(self):
2527 Creates a VM instance from a 3-part image locally sourced from file
2528 images using simply the 'disk_file', 'kernel_file', and 'ramdisk_file'
2529 attributes under 'cirros' vs. using the 'config' option which
2530 completely overrides all image settings
2533 kernel_file = file_utils.download(
2534 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2535 ramdisk_file = file_utils.download(
2536 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2538 metadata = {'cirros': {'disk_file': self.image_file.name,
2539 'kernel_file': kernel_file.name,
2540 'ramdisk_file': ramdisk_file.name}}
2542 os_image_settings = openstack_tests.cirros_image_settings(
2543 name=self.image_name, image_metadata=metadata)
2545 self.assertEqual(self.image_name, os_image_settings.name)
2546 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2547 self.assertEqual(openstack_tests.CIRROS_USER,
2548 os_image_settings.image_user)
2549 self.assertIsNone(os_image_settings.url)
2550 self.assertFalse(os_image_settings.exists)
2551 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2552 os_image_settings.format)
2554 self.assertIsNotNone(os_image_settings.kernel_image_settings)
2555 self.assertEqual(self.image_name + '-kernel',
2556 os_image_settings.kernel_image_settings.name)
2557 self.assertEqual(kernel_file.name,
2558 os_image_settings.kernel_image_settings.image_file)
2559 self.assertEqual(openstack_tests.CIRROS_USER,
2560 os_image_settings.kernel_image_settings.image_user)
2561 self.assertIsNone(os_image_settings.kernel_image_settings.url)
2562 self.assertFalse(os_image_settings.kernel_image_settings.exists)
2563 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2564 os_image_settings.kernel_image_settings.format)
2566 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
2567 self.assertEqual(self.image_name + '-ramdisk',
2568 os_image_settings.ramdisk_image_settings.name)
2569 self.assertEqual(ramdisk_file.name,
2570 os_image_settings.ramdisk_image_settings.image_file)
2571 self.assertEqual(openstack_tests.CIRROS_USER,
2572 os_image_settings.ramdisk_image_settings.image_user)
2573 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
2574 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
2575 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2576 os_image_settings.ramdisk_image_settings.format)
2578 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2579 self.image_creator.create()
2581 self.assertIsNotNone(self.image_creator.get_kernel_image())
2582 self.assertIsNotNone(self.image_creator.get_ramdisk_image())
2584 instance_settings = VmInstanceSettings(
2585 name=self.vm_inst_name,
2586 flavor=self.flavor_creator.flavor_settings.name,
2587 port_settings=[self.port_settings])
2588 self.inst_creator = OpenStackVmInstance(
2589 self.os_creds, instance_settings,
2590 self.image_creator.image_settings)
2591 self.inst_creator.create()
2593 self.assertTrue(self.inst_creator.vm_active(block=True))
2595 def test_inst_from_file_3part_image_existing(self):
2597 Creates a VM instance from a 3-part image that is existing
2600 kernel_file = file_utils.download(
2601 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2602 ramdisk_file = file_utils.download(
2603 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2605 metadata = {'cirros': {'disk_file': self.image_file.name,
2606 'kernel_file': kernel_file.name,
2607 'ramdisk_file': ramdisk_file.name}}
2609 os_image_settings = openstack_tests.cirros_image_settings(
2610 name=self.image_name, image_metadata=metadata)
2611 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2612 self.image_creator.create()
2614 image_settings = self.image_creator.image_settings
2615 test_image_creator = OpenStackImage(
2618 name=image_settings.name, image_user=image_settings.image_user,
2620 test_image_creator.create()
2621 self.assertEqual(self.image_creator.get_image().id,
2622 test_image_creator.get_image().id)
2624 instance_settings = VmInstanceSettings(
2625 name=self.vm_inst_name,
2626 flavor=self.flavor_creator.flavor_settings.name,
2627 port_settings=[self.port_settings])
2628 self.inst_creator = OpenStackVmInstance(
2629 self.os_creds, instance_settings,
2630 test_image_creator.image_settings)
2631 self.inst_creator.create()
2633 self.assertTrue(self.inst_creator.vm_active(block=True))
2636 class CreateInstanceTwoNetTests(OSIntegrationTestCase):
2638 Tests the ability of two VMs to communicate when attached to separate
2639 private networks that are tied together with a router.
2644 Instantiates the CreateImage object that is responsible for downloading
2645 and creating an OS image file within OpenStack
2647 super(self.__class__, self).__start__()
2649 cidr1 = '10.200.201.0/24'
2650 cidr2 = '10.200.202.0/24'
2651 static_gateway_ip1 = '10.200.201.1'
2652 static_gateway_ip2 = '10.200.202.1'
2653 self.ip1 = '10.200.201.5'
2654 self.ip2 = '10.200.202.5'
2656 self.nova = nova_utils.nova_client(self.os_creds)
2658 # Initialize for tearDown()
2659 self.image_creator = None
2660 self.network_creators = list()
2661 self.router_creator = None
2662 self.flavor_creator = None
2663 self.sec_grp_creator = None
2664 self.inst_creators = list()
2666 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2667 self.vm_inst1_name = self.guid + '-inst1'
2668 self.vm_inst2_name = self.guid + '-inst2'
2669 self.port_1_name = self.guid + '-vm1-port'
2670 self.port_2_name = self.guid + '-vm2-port'
2671 self.net_config_1 = NetworkSettings(
2672 name=self.guid + '-net1',
2674 create_network.SubnetSettings(
2675 cidr=cidr1, name=self.guid + '-subnet1',
2676 gateway_ip=static_gateway_ip1)])
2677 self.net_config_2 = NetworkSettings(
2678 name=self.guid + '-net2',
2680 create_network.SubnetSettings(
2681 cidr=cidr2, name=self.guid + '-subnet2',
2682 gateway_ip=static_gateway_ip2)])
2684 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
2685 os_image_settings = openstack_tests.cirros_image_settings(
2686 name=image_name, image_metadata=self.image_metadata)
2690 self.image_creator = OpenStackImage(self.os_creds,
2692 self.image_creator.create()
2694 # First network is public
2695 self.network_creators.append(OpenStackNetwork(
2696 self.os_creds, self.net_config_1))
2697 # Second network is private
2698 self.network_creators.append(OpenStackNetwork(
2699 self.os_creds, self.net_config_2))
2700 for network_creator in self.network_creators:
2701 network_creator.create()
2704 create_network.PortSettings(
2705 name=self.guid + '-router-port1',
2708 self.net_config_1.subnet_settings[0].name,
2709 'ip': static_gateway_ip1
2711 network_name=self.net_config_1.name,
2712 project_name=self.os_creds.project_name),
2713 create_network.PortSettings(
2714 name=self.guid + '-router-port2',
2717 self.net_config_2.subnet_settings[0].name,
2718 'ip': static_gateway_ip2
2720 network_name=self.net_config_2.name,
2721 project_name=self.os_creds.project_name)]
2723 router_settings = RouterSettings(name=self.guid + '-pub-router',
2724 port_settings=port_settings)
2725 self.router_creator = create_router.OpenStackRouter(
2726 self.os_creds, router_settings)
2727 self.router_creator.create()
2730 self.flavor_creator = OpenStackFlavor(
2731 self.admin_os_creds,
2732 FlavorConfig(name=self.guid + '-flavor-name', ram=512,
2734 metadata=self.flavor_metadata))
2735 self.flavor_creator.create()
2737 sec_grp_name = self.guid + '-sec-grp'
2738 rule1 = SecurityGroupRuleSettings(sec_grp_name=sec_grp_name,
2739 direction=Direction.ingress,
2740 protocol=Protocol.icmp)
2741 self.sec_grp_creator = OpenStackSecurityGroup(
2743 SecurityGroupSettings(name=sec_grp_name,
2744 rule_settings=[rule1]))
2745 self.sec_grp_creator.create()
2752 Cleans the created objects
2754 for inst_creator in self.inst_creators:
2756 inst_creator.clean()
2757 except Exception as e:
2759 'Unexpected exception cleaning VM instance with message '
2762 if self.flavor_creator:
2764 self.flavor_creator.clean()
2765 except Exception as e:
2767 'Unexpected exception cleaning flavor with message - %s',
2770 if self.router_creator:
2772 self.router_creator.clean()
2773 except Exception as e:
2775 'Unexpected exception cleaning router with message - %s',
2778 for network_creator in self.network_creators:
2780 network_creator.clean()
2781 except Exception as e:
2783 'Unexpected exception cleaning network with message - %s',
2786 if self.sec_grp_creator:
2788 self.sec_grp_creator.clean()
2789 except Exception as e:
2791 'Unexpected exception cleaning security group with message'
2794 if self.image_creator and not self.image_creator.image_settings.exists:
2796 self.image_creator.clean()
2797 except Exception as e:
2799 'Unexpected exception cleaning image with message - %s', e)
2801 super(self.__class__, self).__clean__()
2803 def test_ping_via_router(self):
2805 Tests the creation of two OpenStack instances with one port on
2806 different private networks wit a router in between to ensure that they
2810 # Create ports/NICs for instance
2813 for network_creator in self.network_creators:
2814 ports_settings.append(PortSettings(
2815 name=self.guid + '-port-' + str(ctr),
2816 network_name=network_creator.network_settings.name))
2819 # Configure instances
2820 instance1_settings = VmInstanceSettings(
2821 name=self.vm_inst1_name,
2822 flavor=self.flavor_creator.flavor_settings.name,
2823 userdata=_get_ping_userdata(self.ip2),
2824 port_settings=[PortSettings(
2825 name=self.port_1_name,
2828 self.net_config_1.subnet_settings[0].name,
2831 network_name=self.network_creators[0].network_settings.name)])
2832 instance2_settings = VmInstanceSettings(
2833 name=self.vm_inst2_name,
2834 flavor=self.flavor_creator.flavor_settings.name,
2835 userdata=_get_ping_userdata(self.ip1),
2836 port_settings=[PortSettings(
2837 name=self.port_2_name,
2840 self.net_config_2.subnet_settings[0].name,
2843 network_name=self.network_creators[1].network_settings.name)])
2846 self.inst_creators.append(OpenStackVmInstance(
2847 self.os_creds, instance1_settings,
2848 self.image_creator.image_settings))
2849 self.inst_creators.append(OpenStackVmInstance(
2850 self.os_creds, instance2_settings,
2851 self.image_creator.image_settings))
2853 for inst_creator in self.inst_creators:
2854 inst_creator.create(block=True)
2856 # Check for DHCP lease
2857 self.assertTrue(check_dhcp_lease(self.inst_creators[0], self.ip1))
2858 self.assertTrue(check_dhcp_lease(self.inst_creators[1], self.ip2))
2860 # Effectively blocks until VM has been properly activated
2861 self.assertTrue(check_ping(self.inst_creators[0]))
2862 self.assertTrue(check_ping(self.inst_creators[1]))
2865 class CreateInstanceVolumeTests(OSIntegrationTestCase):
2867 Simple instance creation with an attached volume
2872 Instantiates the CreateImage object that is responsible for downloading
2873 and creating an OS image file
2876 super(self.__class__, self).__start__()
2878 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2879 self.vm_inst_name = guid + '-inst'
2880 self.nova = nova_utils.nova_client(self.os_creds)
2881 os_image_settings = openstack_tests.cirros_image_settings(
2882 name=guid + '-image', image_metadata=self.image_metadata)
2884 net_config = openstack_tests.get_priv_net_config(
2885 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
2886 router_name=guid + '-pub-router', external_net=self.ext_net_name)
2888 self.volume_settings1 = VolumeSettings(
2889 name=self.__class__.__name__ + '-' + str(guid) + '-1')
2890 self.volume_settings2 = VolumeSettings(
2891 name=self.__class__.__name__ + '-' + str(guid) + '-2')
2893 # Initialize for tearDown()
2894 self.image_creator = None
2895 self.flavor_creator = None
2897 self.network_creator = None
2898 self.inst_creator = None
2899 self.volume_creator1 = None
2900 self.volume_creator2 = None
2904 self.image_creator = OpenStackImage(self.os_creds,
2906 self.image_creator.create()
2909 self.flavor_creator = OpenStackFlavor(
2910 self.admin_os_creds,
2911 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=1,
2912 vcpus=2, metadata=self.flavor_metadata))
2913 self.flavor_creator.create()
2916 self.network_creator = OpenStackNetwork(
2917 self.os_creds, net_config.network_settings)
2918 self.network_creator.create()
2920 self.port_settings = PortSettings(
2921 name=guid + '-port',
2922 network_name=net_config.network_settings.name)
2924 self.volume_creator1 = OpenStackVolume(
2925 self.os_creds, self.volume_settings1)
2926 self.volume_creator1.create(block=True)
2928 self.volume_creator2 = OpenStackVolume(
2929 self.os_creds, self.volume_settings2)
2930 self.volume_creator2.create(block=True)
2932 except Exception as e:
2938 Cleans the created object
2940 if self.inst_creator:
2942 self.inst_creator.clean()
2943 except Exception as e:
2945 'Unexpected exception cleaning VM instance with message '
2948 if self.flavor_creator:
2950 self.flavor_creator.clean()
2951 except Exception as e:
2953 'Unexpected exception cleaning flavor with message - %s',
2956 if self.network_creator:
2958 self.network_creator.clean()
2959 except Exception as e:
2961 'Unexpected exception cleaning network with message - %s',
2964 if self.volume_creator2:
2966 self.volume_creator2.clean()
2967 except Exception as e:
2969 'Unexpected exception cleaning volume with message - %s',
2972 if self.volume_creator1:
2974 self.volume_creator1.clean()
2975 except Exception as e:
2977 'Unexpected exception cleaning volume with message - %s',
2980 if self.image_creator and not self.image_creator.image_settings.exists:
2982 self.image_creator.clean()
2983 except Exception as e:
2985 'Unexpected exception cleaning image with message - %s', e)
2987 super(self.__class__, self).__clean__()
2989 def test_create_instance_with_one_volume(self):
2991 Tests the creation of an OpenStack instance with a single volume.
2993 instance_settings = VmInstanceSettings(
2994 name=self.vm_inst_name,
2995 flavor=self.flavor_creator.flavor_settings.name,
2996 port_settings=[self.port_settings],
2997 volume_names=[self.volume_settings1.name])
2999 self.inst_creator = OpenStackVmInstance(
3000 self.os_creds, instance_settings,
3001 self.image_creator.image_settings)
3003 vm_inst = self.inst_creator.create(block=True)
3004 self.assertIsNotNone(nova_utils.get_server(
3005 self.nova, vm_inst_settings=instance_settings))
3007 self.assertIsNotNone(vm_inst)
3008 self.assertEqual(1, len(vm_inst.volume_ids))
3009 self.assertEqual(self.volume_creator1.get_volume().id,
3010 vm_inst.volume_ids[0]['id'])
3012 def test_create_instance_with_two_volumes(self):
3014 Tests the creation of an OpenStack instance with a single volume.
3016 instance_settings = VmInstanceSettings(
3017 name=self.vm_inst_name,
3018 flavor=self.flavor_creator.flavor_settings.name,
3019 port_settings=[self.port_settings],
3020 volume_names=[self.volume_settings1.name,
3021 self.volume_settings2.name])
3023 self.inst_creator = OpenStackVmInstance(
3024 self.os_creds, instance_settings,
3025 self.image_creator.image_settings)
3027 vm_inst = self.inst_creator.create(block=True)
3028 self.assertIsNotNone(nova_utils.get_server(
3029 self.nova, vm_inst_settings=instance_settings))
3031 self.assertIsNotNone(vm_inst)
3032 self.assertEqual(2, len(vm_inst.volume_ids))
3033 self.assertEqual(self.volume_creator1.get_volume().id,
3034 vm_inst.volume_ids[0]['id'])
3035 self.assertEqual(self.volume_creator2.get_volume().id,
3036 vm_inst.volume_ids[1]['id'])
3039 def check_dhcp_lease(inst_creator, ip, timeout=160):
3041 Returns true if the expected DHCP lease has been acquired
3042 :param inst_creator: the SNAPS OpenStackVmInstance object
3043 :param ip: the IP address to look for
3044 :param timeout: how long to query for IP address
3048 start_time = time.time()
3050 logger.info("Looking for IP %s in the console log" % ip)
3052 while timeout > time.time() - start_time:
3053 output = inst_creator.get_console_output()
3054 full_log = full_log + output
3055 if re.search(ip, output):
3056 logger.info('DHCP lease obtained logged in console')
3061 logger.error('Full console output -\n' + full_log)
3063 logger.debug('Full console output -\n' + full_log)
3068 def _get_ping_userdata(test_ip):
3070 Returns the post VM creation script to be added into the VM's userdata
3071 :param test_ip: the IP value to substitute into the script
3072 :return: the bash script contents
3075 return ("#!/bin/sh\n\n"
3077 " ping -c 1 %s 2>&1 >/dev/null\n"
3079 " if [ \"Z$RES\" = \"Z0\" ] ; then\n"
3080 " echo 'vPing OK'\n"
3083 " echo 'vPing KO'\n"
3090 def check_ping(vm_creator, timeout=160):
3092 Check for VM for ping result
3096 while tries < timeout:
3098 p_console = vm_creator.get_console_output()
3099 if "vPing OK" in p_console:
3101 elif "failed to read iid from metadata" in p_console or tries > 5: