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.flavor import FlavorConfig
28 from snaps.config.image import ImageConfig
29 from snaps.config.keypair import KeypairConfig
30 from snaps.config.network import PortConfig, NetworkConfig, SubnetConfig
31 from snaps.config.router import RouterConfig
32 from snaps.config.security_group import (
33 Protocol, SecurityGroupRuleConfig, Direction, SecurityGroupConfig)
34 from snaps.config.vm_inst import (
35 VmInstanceConfig, FloatingIpConfig, VmInstanceConfigError,
36 FloatingIpConfigError)
37 from snaps.config.volume import VolumeConfig
38 from snaps.openstack import create_network, create_router, create_instance
39 from snaps.openstack.create_flavor import OpenStackFlavor
40 from snaps.openstack.create_image import OpenStackImage
41 from snaps.openstack.create_instance import (
42 VmInstanceSettings, OpenStackVmInstance, FloatingIpSettings)
43 from snaps.openstack.create_keypairs import OpenStackKeypair
44 from snaps.openstack.create_network import OpenStackNetwork
45 from snaps.openstack.create_router import OpenStackRouter
46 from snaps.openstack.create_security_group import OpenStackSecurityGroup
47 from snaps.openstack.create_volume import OpenStackVolume
48 from snaps.openstack.tests import openstack_tests, validation_utils
49 from snaps.openstack.tests.os_source_file_test import (
50 OSIntegrationTestCase, OSComponentTestCase)
51 from snaps.openstack.utils import nova_utils
52 from snaps.openstack.utils.nova_utils import RebootType
53 from snaps.openstack.utils import nova_utils, settings_utils, neutron_utils
55 __author__ = 'spisarski'
59 logger = logging.getLogger('create_instance_tests')
62 class VmInstanceSettingsUnitTests(unittest.TestCase):
64 Tests the construction of the VmInstanceSettings class
67 def test_no_params(self):
68 with self.assertRaises(VmInstanceConfigError):
71 def test_empty_config(self):
72 with self.assertRaises(VmInstanceConfigError):
73 VmInstanceSettings(config=dict())
75 def test_name_only(self):
76 with self.assertRaises(VmInstanceConfigError):
77 VmInstanceSettings(name='foo')
79 def test_config_with_name_only(self):
80 with self.assertRaises(VmInstanceConfigError):
81 VmInstanceSettings(config={'name': 'foo'})
83 def test_name_flavor_only(self):
84 with self.assertRaises(VmInstanceConfigError):
85 VmInstanceSettings(name='foo', flavor='bar')
87 def test_config_with_name_flavor_only(self):
88 with self.assertRaises(VmInstanceConfigError):
89 VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar'})
91 def test_name_flavor_port_only(self):
92 port_settings = PortConfig(name='foo-port', network_name='bar-net')
93 settings = VmInstanceSettings(name='foo', flavor='bar',
94 port_settings=[port_settings])
95 self.assertEqual('foo', settings.name)
96 self.assertEqual('bar', settings.flavor)
97 self.assertEqual(1, len(settings.port_settings))
98 self.assertEqual('foo-port', settings.port_settings[0].name)
99 self.assertEqual('bar-net', settings.port_settings[0].network_name)
100 self.assertEqual(0, len(settings.security_group_names))
101 self.assertEqual(0, len(settings.floating_ip_settings))
102 self.assertIsNone(settings.sudo_user)
103 self.assertEqual(900, settings.vm_boot_timeout)
104 self.assertEqual(300, settings.vm_delete_timeout)
105 self.assertEqual(180, settings.ssh_connect_timeout)
106 self.assertIsNone(settings.availability_zone)
107 self.assertIsNone(settings.volume_names)
109 def test_config_with_name_flavor_port_only(self):
110 port_settings = PortConfig(name='foo-port', network_name='bar-net')
111 settings = VmInstanceSettings(
112 **{'name': 'foo', 'flavor': 'bar', 'ports': [port_settings]})
113 self.assertEqual('foo', settings.name)
114 self.assertEqual('bar', settings.flavor)
115 self.assertEqual(1, len(settings.port_settings))
116 self.assertEqual('foo-port', settings.port_settings[0].name)
117 self.assertEqual('bar-net', settings.port_settings[0].network_name)
118 self.assertEqual(0, len(settings.security_group_names))
119 self.assertEqual(0, len(settings.floating_ip_settings))
120 self.assertIsNone(settings.sudo_user)
121 self.assertEqual(900, settings.vm_boot_timeout)
122 self.assertEqual(300, settings.vm_delete_timeout)
123 self.assertEqual(180, settings.ssh_connect_timeout)
124 self.assertIsNone(settings.availability_zone)
125 self.assertIsNone(settings.volume_names)
128 port_settings = PortConfig(name='foo-port', network_name='bar-net')
129 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port',
130 router_name='foo-bar-router')
132 settings = VmInstanceSettings(
133 name='foo', flavor='bar', port_settings=[port_settings],
134 security_group_names=['sec_grp_1'],
135 floating_ip_settings=[fip_settings], sudo_user='joe',
136 vm_boot_timeout=999, vm_delete_timeout=333,
137 ssh_connect_timeout=111, availability_zone='server name',
138 volume_names=['vol1'])
139 self.assertEqual('foo', settings.name)
140 self.assertEqual('bar', settings.flavor)
141 self.assertEqual(1, len(settings.port_settings))
142 self.assertEqual('foo-port', settings.port_settings[0].name)
143 self.assertEqual('bar-net', settings.port_settings[0].network_name)
144 self.assertEqual(1, len(settings.security_group_names))
145 self.assertEqual('sec_grp_1', settings.security_group_names[0])
146 self.assertEqual(1, len(settings.floating_ip_settings))
147 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
148 self.assertEqual('bar-port',
149 settings.floating_ip_settings[0].port_name)
150 self.assertEqual('foo-bar-router',
151 settings.floating_ip_settings[0].router_name)
152 self.assertEqual('joe', settings.sudo_user)
153 self.assertEqual(999, settings.vm_boot_timeout)
154 self.assertEqual(333, settings.vm_delete_timeout)
155 self.assertEqual(111, settings.ssh_connect_timeout)
156 self.assertEqual('server name', settings.availability_zone)
157 self.assertEqual('vol1', settings.volume_names[0])
159 def test_config_all(self):
160 port_settings = PortConfig(name='foo-port', network_name='bar-net')
161 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port',
162 router_name='foo-bar-router')
164 settings = VmInstanceSettings(
165 **{'name': 'foo', 'flavor': 'bar', 'ports': [port_settings],
166 'security_group_names': ['sec_grp_1'],
167 'floating_ips': [fip_settings], 'sudo_user': 'joe',
168 'vm_boot_timeout': 999, 'vm_delete_timeout': 333,
169 'ssh_connect_timeout': 111, 'availability_zone': 'server name',
170 'volume_names': ['vol2']})
171 self.assertEqual('foo', settings.name)
172 self.assertEqual('bar', settings.flavor)
173 self.assertEqual(1, len(settings.port_settings))
174 self.assertEqual('foo-port', settings.port_settings[0].name)
175 self.assertEqual('bar-net', settings.port_settings[0].network_name)
176 self.assertEqual(1, len(settings.security_group_names))
177 self.assertEqual(1, len(settings.floating_ip_settings))
178 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
179 self.assertEqual('bar-port',
180 settings.floating_ip_settings[0].port_name)
181 self.assertEqual('foo-bar-router',
182 settings.floating_ip_settings[0].router_name)
183 self.assertEqual('joe', settings.sudo_user)
184 self.assertEqual(999, settings.vm_boot_timeout)
185 self.assertEqual(333, settings.vm_delete_timeout)
186 self.assertEqual(111, settings.ssh_connect_timeout)
187 self.assertEqual('server name', settings.availability_zone)
188 self.assertEqual('vol2', settings.volume_names[0])
191 class FloatingIpSettingsUnitTests(unittest.TestCase):
193 Tests the construction of the FloatingIpSettings class
196 def test_no_params(self):
197 with self.assertRaises(FloatingIpConfigError):
200 def test_empty_config(self):
201 with self.assertRaises(FloatingIpConfigError):
202 FloatingIpSettings(**dict())
204 def test_name_only(self):
205 with self.assertRaises(FloatingIpConfigError):
206 FloatingIpSettings(name='foo')
208 def test_config_with_name_only(self):
209 with self.assertRaises(FloatingIpConfigError):
210 FloatingIpSettings(**{'name': 'foo'})
212 def test_name_port_only(self):
213 with self.assertRaises(FloatingIpConfigError):
214 FloatingIpSettings(name='foo', port_name='bar')
216 def test_config_with_name_port_only(self):
217 with self.assertRaises(FloatingIpConfigError):
218 FloatingIpSettings(**{'name': 'foo', 'port_name': 'bar'})
220 def test_name_router_only(self):
221 with self.assertRaises(FloatingIpConfigError):
222 FloatingIpSettings(name='foo', router_name='bar')
224 def test_config_with_name_router_only(self):
225 with self.assertRaises(FloatingIpConfigError):
226 FloatingIpSettings(**{'name': 'foo', 'router_name': 'bar'})
228 def test_name_port_router_name_only(self):
229 settings = FloatingIpSettings(name='foo', port_name='foo-port',
230 router_name='bar-router')
231 self.assertEqual('foo', settings.name)
232 self.assertEqual('foo-port', settings.port_name)
233 self.assertIsNone(settings.port_id)
234 self.assertEqual('bar-router', settings.router_name)
235 self.assertIsNone(settings.subnet_name)
236 self.assertTrue(settings.provisioning)
238 def test_name_port_router_id_only(self):
239 settings = FloatingIpSettings(name='foo', port_id='foo-port',
240 router_name='bar-router')
241 self.assertEqual('foo', settings.name)
242 self.assertEqual('foo-port', settings.port_id)
243 self.assertIsNone(settings.port_name)
244 self.assertEqual('bar-router', settings.router_name)
245 self.assertIsNone(settings.subnet_name)
246 self.assertTrue(settings.provisioning)
248 def test_config_with_name_port_router_only(self):
249 settings = FloatingIpSettings(
250 **{'name': 'foo', 'port_name': 'foo-port',
251 'router_name': 'bar-router'})
252 self.assertEqual('foo', settings.name)
253 self.assertEqual('foo-port', settings.port_name)
254 self.assertIsNone(settings.port_id)
255 self.assertEqual('bar-router', settings.router_name)
256 self.assertIsNone(settings.subnet_name)
257 self.assertTrue(settings.provisioning)
260 settings = FloatingIpSettings(name='foo', port_name='foo-port',
261 router_name='bar-router',
262 subnet_name='bar-subnet',
264 self.assertEqual('foo', settings.name)
265 self.assertEqual('foo-port', settings.port_name)
266 self.assertIsNone(settings.port_id)
267 self.assertEqual('bar-router', settings.router_name)
268 self.assertEqual('bar-subnet', settings.subnet_name)
269 self.assertFalse(settings.provisioning)
271 def test_config_all(self):
272 settings = FloatingIpSettings(
273 **{'name': 'foo', 'port_name': 'foo-port',
274 'router_name': 'bar-router', 'subnet_name': 'bar-subnet',
275 'provisioning': False})
276 self.assertEqual('foo', settings.name)
277 self.assertEqual('foo-port', settings.port_name)
278 self.assertIsNone(settings.port_id)
279 self.assertEqual('bar-router', settings.router_name)
280 self.assertEqual('bar-subnet', settings.subnet_name)
281 self.assertFalse(settings.provisioning)
284 class SimpleHealthCheck(OSIntegrationTestCase):
286 Test for the CreateInstance class with a single NIC/Port with Floating IPs
291 Instantiates the CreateImage object that is responsible for downloading
292 and creating an OS image file
295 super(self.__class__, self).__start__()
297 self.nova = nova_utils.nova_client(self.os_creds)
298 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
299 self.vm_inst_name = guid + '-inst'
300 self.port_1_name = guid + 'port-1'
302 # Initialize for tearDown()
303 self.image_creator = None
304 self.network_creator = None
305 self.flavor_creator = None
306 self.inst_creator = None
308 self.priv_net_config = openstack_tests.get_priv_net_config(
309 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
310 self.port_settings = PortConfig(
311 name=self.port_1_name,
312 network_name=self.priv_net_config.network_settings.name)
315 # Set the default image settings, then set any custom parameters sent
317 os_image_settings = openstack_tests.cirros_image_settings(
318 name=guid + '-image', image_metadata=self.image_metadata)
321 self.image_creator = OpenStackImage(self.os_creds,
323 self.image_creator.create()
326 self.network_creator = OpenStackNetwork(
327 self.os_creds, self.priv_net_config.network_settings)
328 self.network_creator.create()
331 self.flavor_ram = 256
332 if (self.flavor_metadata and
333 self.flavor_metadata.get('hw:mem_page_size') == 'large'):
334 self.flavor_ram = 1024
335 self.flavor_creator = OpenStackFlavor(
337 FlavorConfig(name=guid + '-flavor-name', ram=self.flavor_ram,
338 disk=10, vcpus=1, metadata=self.flavor_metadata))
339 self.flavor_creator.create()
340 except Exception as e:
346 Cleans the created object
348 if self.inst_creator:
350 self.inst_creator.clean()
351 except Exception as e:
353 'Unexpected exception cleaning VM instance with message'
356 if self.network_creator:
358 self.network_creator.clean()
359 except Exception as e:
361 'Unexpected exception cleaning network with message - %s',
364 if self.flavor_creator:
366 self.flavor_creator.clean()
367 except Exception as e:
369 'Unexpected exception cleaning flavor with message - %s',
372 if self.image_creator and not self.image_creator.image_settings.exists:
374 self.image_creator.clean()
375 except Exception as e:
377 'Unexpected exception cleaning image with message - %s',
380 super(self.__class__, self).__clean__()
382 def test_check_vm_ip_dhcp(self):
384 Tests the creation of an OpenStack instance with a single port and
385 ensures that it's assigned IP address is the actual.
387 instance_settings = VmInstanceConfig(
388 name=self.vm_inst_name,
389 flavor=self.flavor_creator.flavor_settings.name,
390 port_settings=[self.port_settings])
392 self.inst_creator = OpenStackVmInstance(
393 self.os_creds, instance_settings,
394 self.image_creator.image_settings)
395 self.inst_creator.create()
397 ip = self.inst_creator.get_port_ip(self.port_settings.name)
398 self.assertIsNotNone(ip)
400 self.assertTrue(self.inst_creator.vm_active(block=True))
402 self.assertTrue(check_dhcp_lease(self.inst_creator, ip))
405 class CreateInstanceSimpleTests(OSIntegrationTestCase):
407 Simple instance creation tests without any other objects
412 Instantiates the CreateImage object that is responsible for downloading
413 and creating an OS image file
416 super(self.__class__, self).__start__()
418 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
419 self.vm_inst_name = guid + '-inst'
420 self.nova = nova_utils.nova_client(self.os_creds)
421 self.neutron = neutron_utils.neutron_client(self.os_creds)
422 os_image_settings = openstack_tests.cirros_image_settings(
423 name=guid + '-image', image_metadata=self.image_metadata)
425 net_config = openstack_tests.get_priv_net_config(
426 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
427 router_name=guid + '-pub-router', external_net=self.ext_net_name)
429 # Initialize for tearDown()
430 self.image_creator = None
431 self.flavor_creator = None
433 self.network_creator = None
434 self.inst_creator = None
438 self.image_creator = OpenStackImage(self.os_creds,
440 self.image_creator.create()
443 self.flavor_creator = OpenStackFlavor(
445 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
446 vcpus=2, metadata=self.flavor_metadata))
447 self.flavor_creator.create()
450 self.network_creator = OpenStackNetwork(
451 self.os_creds, net_config.network_settings)
452 self.network_creator.create()
454 self.port_settings = PortConfig(
456 network_name=net_config.network_settings.name)
458 except Exception as e:
464 Cleans the created object
466 if self.inst_creator:
468 self.inst_creator.clean()
469 except Exception as e:
471 'Unexpected exception cleaning VM instance with message '
474 if self.flavor_creator:
476 self.flavor_creator.clean()
477 except Exception as e:
479 'Unexpected exception cleaning flavor with message - %s',
482 if self.network_creator:
484 self.network_creator.clean()
485 except Exception as e:
487 'Unexpected exception cleaning network with message - %s',
490 if self.image_creator and not self.image_creator.image_settings.exists:
492 self.image_creator.clean()
493 except Exception as e:
495 'Unexpected exception cleaning image with message - %s', e)
497 super(self.__class__, self).__clean__()
499 def test_create_delete_instance(self):
501 Tests the creation of an OpenStack instance with a single port with a
502 static IP without a Floating IP.
504 instance_settings = VmInstanceConfig(
505 name=self.vm_inst_name,
506 flavor=self.flavor_creator.flavor_settings.name,
507 port_settings=[self.port_settings])
509 self.inst_creator = OpenStackVmInstance(
510 self.os_creds, instance_settings,
511 self.image_creator.image_settings)
513 vm_inst = self.inst_creator.create()
514 self.assertIsNotNone(nova_utils.get_server(
515 self.nova, self.neutron, vm_inst_settings=instance_settings))
518 nova_utils.delete_vm_instance(self.nova, vm_inst)
520 self.assertTrue(self.inst_creator.vm_deleted(block=True))
521 self.assertIsNone(nova_utils.get_server(
522 self.nova, self.neutron, vm_inst_settings=instance_settings))
524 # Exception should not be thrown
525 self.inst_creator.clean()
528 class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
530 Test for the CreateInstance class with a single NIC/Port with Floating IPs
535 Instantiates the CreateImage object that is responsible for downloading
536 and creating an OS image file within OpenStack
538 super(self.__class__, self).__start__()
540 self.nova = nova_utils.nova_client(self.os_creds)
541 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
542 self.keypair_priv_filepath = 'tmp/' + guid
543 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
544 self.keypair_name = guid + '-kp'
545 self.vm_inst_name = guid + '-inst'
546 self.port_1_name = guid + 'port-1'
547 self.port_2_name = guid + 'port-2'
548 self.floating_ip_name = guid + 'fip1'
550 # Initialize for tearDown()
551 self.image_creator = None
552 self.network_creator = None
553 self.router_creator = None
554 self.flavor_creator = None
555 self.keypair_creator = None
556 self.sec_grp_creator = None
557 self.inst_creators = list()
559 self.pub_net_config = openstack_tests.get_pub_net_config(
560 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
561 router_name=guid + '-pub-router', external_net=self.ext_net_name)
562 os_image_settings = openstack_tests.cirros_image_settings(
563 name=guid + '-image', image_metadata=self.image_metadata)
566 self.image_creator = OpenStackImage(self.os_creds,
568 self.image_creator.create()
571 self.network_creator = OpenStackNetwork(
572 self.os_creds, self.pub_net_config.network_settings)
573 self.network_creator.create()
576 self.router_creator = OpenStackRouter(
577 self.os_creds, self.pub_net_config.router_settings)
578 self.router_creator.create()
581 self.flavor_creator = OpenStackFlavor(
583 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
584 vcpus=2, metadata=self.flavor_metadata))
585 self.flavor_creator.create()
587 self.keypair_creator = OpenStackKeypair(
588 self.os_creds, KeypairConfig(
589 name=self.keypair_name,
590 public_filepath=self.keypair_pub_filepath,
591 private_filepath=self.keypair_priv_filepath))
592 self.keypair_creator.create()
594 sec_grp_name = guid + '-sec-grp'
595 rule1 = SecurityGroupRuleConfig(
596 sec_grp_name=sec_grp_name, direction=Direction.ingress,
597 protocol=Protocol.icmp)
598 rule2 = SecurityGroupRuleConfig(
599 sec_grp_name=sec_grp_name, direction=Direction.ingress,
600 protocol=Protocol.tcp, port_range_min=22, port_range_max=22)
601 self.sec_grp_creator = OpenStackSecurityGroup(
604 name=sec_grp_name, rule_settings=[rule1, rule2]))
605 self.sec_grp_creator.create()
606 except Exception as e:
612 Cleans the created object
614 for inst_creator in self.inst_creators:
617 except Exception as e:
619 'Unexpected exception cleaning VM instance with message '
622 if self.keypair_creator:
624 self.keypair_creator.clean()
625 except Exception as e:
627 'Unexpected exception cleaning keypair with message - %s',
630 if self.flavor_creator:
632 self.flavor_creator.clean()
633 except Exception as e:
635 'Unexpected exception cleaning flavor with message - %s',
638 if self.sec_grp_creator:
640 self.sec_grp_creator.clean()
641 except Exception as e:
643 'Unexpected exception cleaning security group with message'
646 if self.router_creator:
648 self.router_creator.clean()
649 except Exception as e:
651 'Unexpected exception cleaning router with message - %s',
654 if self.network_creator:
656 self.network_creator.clean()
657 except Exception as e:
659 'Unexpected exception cleaning network with message - %s',
662 if self.image_creator and not self.image_creator.image_settings.exists:
664 self.image_creator.clean()
665 except Exception as e:
667 'Unexpected exception cleaning image with message - %s', e)
669 super(self.__class__, self).__clean__()
671 def test_single_port_static(self):
673 Tests the creation of an OpenStack instance with a single port with a
674 static IP without a Floating IP.
677 sub_settings = self.pub_net_config.network_settings.subnet_settings
678 port_settings = PortConfig(
679 name=self.port_1_name,
680 network_name=self.pub_net_config.network_settings.name,
682 {'subnet_name': sub_settings[0].name, 'ip': ip_1}])
684 instance_settings = VmInstanceConfig(
685 name=self.vm_inst_name,
686 flavor=self.flavor_creator.flavor_settings.name,
687 port_settings=[port_settings],
688 floating_ip_settings=[FloatingIpConfig(
689 name=self.floating_ip_name, port_name=self.port_1_name,
690 router_name=self.pub_net_config.router_settings.name)])
692 inst_creator = OpenStackVmInstance(
693 self.os_creds, instance_settings,
694 self.image_creator.image_settings,
695 keypair_settings=self.keypair_creator.keypair_settings)
696 self.inst_creators.append(inst_creator)
697 vm_inst = inst_creator.create(block=True)
699 self.assertEqual(ip_1, inst_creator.get_port_ip(self.port_1_name))
700 self.assertTrue(inst_creator.vm_active(block=True))
701 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
703 def test_ssh_client_fip_before_active(self):
705 Tests the ability to access a VM via SSH and a floating IP when it has
706 been assigned prior to being active.
708 port_settings = PortConfig(
709 name=self.port_1_name,
710 network_name=self.pub_net_config.network_settings.name)
712 instance_settings = VmInstanceConfig(
713 name=self.vm_inst_name,
714 flavor=self.flavor_creator.flavor_settings.name,
715 port_settings=[port_settings],
716 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
717 floating_ip_settings=[FloatingIpConfig(
718 name=self.floating_ip_name, port_name=self.port_1_name,
719 router_name=self.pub_net_config.router_settings.name)])
721 inst_creator = OpenStackVmInstance(
722 self.os_creds, instance_settings,
723 self.image_creator.image_settings,
724 keypair_settings=self.keypair_creator.keypair_settings)
725 self.inst_creators.append(inst_creator)
726 vm_inst = inst_creator.create()
727 self.assertIsNotNone(vm_inst)
729 self.assertTrue(inst_creator.vm_active(block=True))
731 ip = inst_creator.get_port_ip(port_settings.name)
732 self.assertTrue(check_dhcp_lease(inst_creator, ip))
734 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
736 self.assertTrue(validate_ssh_client(inst_creator))
738 def test_ssh_client_fip_after_active(self):
740 Tests the ability to access a VM via SSH and a floating IP when it has
741 been assigned prior to being active.
743 port_settings = PortConfig(
744 name=self.port_1_name,
745 network_name=self.pub_net_config.network_settings.name)
747 instance_settings = VmInstanceConfig(
748 name=self.vm_inst_name,
749 flavor=self.flavor_creator.flavor_settings.name,
750 port_settings=[port_settings],
751 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
752 floating_ip_settings=[FloatingIpConfig(
753 name=self.floating_ip_name, port_name=self.port_1_name,
754 router_name=self.pub_net_config.router_settings.name)])
756 inst_creator = OpenStackVmInstance(
757 self.os_creds, instance_settings,
758 self.image_creator.image_settings,
759 keypair_settings=self.keypair_creator.keypair_settings)
760 self.inst_creators.append(inst_creator)
762 # block=True will force the create() method to block until the
763 vm_inst = inst_creator.create(block=True)
764 self.assertIsNotNone(vm_inst)
766 self.assertTrue(inst_creator.vm_active(block=True))
768 ip = inst_creator.get_port_ip(port_settings.name)
769 self.assertTrue(check_dhcp_lease(inst_creator, ip))
771 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
773 self.assertTrue(validate_ssh_client(inst_creator))
775 def test_ssh_client_fip_after_reboot(self):
777 Tests the ability to access a VM via SSH and a floating IP after it has
780 port_settings = PortConfig(
781 name=self.port_1_name,
782 network_name=self.pub_net_config.network_settings.name)
784 instance_settings = VmInstanceConfig(
785 name=self.vm_inst_name,
786 flavor=self.flavor_creator.flavor_settings.name,
787 port_settings=[port_settings],
788 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
789 floating_ip_settings=[FloatingIpConfig(
790 name=self.floating_ip_name, port_name=self.port_1_name,
791 router_name=self.pub_net_config.router_settings.name)])
793 inst_creator = OpenStackVmInstance(
794 self.os_creds, instance_settings,
795 self.image_creator.image_settings,
796 keypair_settings=self.keypair_creator.keypair_settings)
797 self.inst_creators.append(inst_creator)
799 # block=True will force the create() method to block until the
800 vm_inst = inst_creator.create(block=True)
801 self.assertIsNotNone(vm_inst)
803 self.assertTrue(inst_creator.vm_active(block=True))
805 ip = inst_creator.get_port_ip(port_settings.name)
806 self.assertTrue(check_dhcp_lease(inst_creator, ip))
808 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
810 self.assertTrue(validate_ssh_client(inst_creator))
812 # Test default reboot which should be 'SOFT'
813 inst_creator.reboot()
814 # Lag time to allow for shutdown routine to take effect
816 self.assertTrue(check_dhcp_lease(inst_creator, ip))
817 self.assertTrue(validate_ssh_client(inst_creator))
820 inst_creator.reboot(reboot_type=RebootType.soft)
822 self.assertTrue(check_dhcp_lease(inst_creator, ip))
823 self.assertTrue(validate_ssh_client(inst_creator))
826 inst_creator.reboot(reboot_type=RebootType.hard)
828 self.assertTrue(check_dhcp_lease(inst_creator, ip))
829 self.assertTrue(validate_ssh_client(inst_creator))
831 def test_ssh_client_fip_after_init(self):
833 Tests the ability to assign a floating IP to an already initialized
834 OpenStackVmInstance object. After the floating IP has been allocated
835 and assigned, this test will ensure that it can be accessed via SSH.
837 port_settings = PortConfig(
838 name=self.port_1_name,
839 network_name=self.pub_net_config.network_settings.name)
841 instance_settings = VmInstanceConfig(
842 name=self.vm_inst_name,
843 flavor=self.flavor_creator.flavor_settings.name,
844 port_settings=[port_settings],
845 security_group_names=[self.sec_grp_creator.sec_grp_settings.name])
847 inst_creator = OpenStackVmInstance(
848 self.os_creds, instance_settings,
849 self.image_creator.image_settings,
850 keypair_settings=self.keypair_creator.keypair_settings)
851 self.inst_creators.append(inst_creator)
853 # block=True will force the create() method to block until the
854 vm_inst = inst_creator.create(block=True)
855 self.assertIsNotNone(vm_inst)
857 self.assertTrue(inst_creator.vm_active(block=True))
858 ip = inst_creator.get_port_ip(port_settings.name)
859 self.assertTrue(check_dhcp_lease(inst_creator, ip))
860 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
862 inst_creator.add_floating_ip(FloatingIpConfig(
863 name=self.floating_ip_name, port_name=self.port_1_name,
864 router_name=self.pub_net_config.router_settings.name))
866 self.assertTrue(validate_ssh_client(inst_creator))
868 def test_ssh_client_fip_reverse_engineer(self):
870 Tests the ability to assign a floating IP to a reverse engineered
871 OpenStackVmInstance object. After the floating IP has been allocated
872 and assigned, this test will ensure that it can be accessed via SSH.
874 port_settings = PortConfig(
875 name=self.port_1_name,
876 network_name=self.pub_net_config.network_settings.name)
878 instance_settings = VmInstanceConfig(
879 name=self.vm_inst_name,
880 flavor=self.flavor_creator.flavor_settings.name,
881 port_settings=[port_settings],
882 security_group_names=[self.sec_grp_creator.sec_grp_settings.name])
884 inst_creator = OpenStackVmInstance(
885 self.os_creds, instance_settings,
886 self.image_creator.image_settings,
887 keypair_settings=self.keypair_creator.keypair_settings)
888 self.inst_creators.append(inst_creator)
890 # block=True will force the create() method to block until the
891 vm_inst = inst_creator.create(block=True)
892 self.assertIsNotNone(vm_inst)
894 self.assertTrue(inst_creator.vm_active(block=True))
896 derived_inst_creator = create_instance.generate_creator(
897 self.os_creds, vm_inst, self.image_creator.image_settings,
898 self.keypair_creator.keypair_settings)
900 derived_inst_creator.add_floating_ip(FloatingIpConfig(
901 name=self.floating_ip_name, port_name=self.port_1_name,
902 router_name=self.pub_net_config.router_settings.name))
903 self.inst_creators.append(derived_inst_creator)
905 self.assertTrue(validate_ssh_client(
906 derived_inst_creator, fip_name=self.floating_ip_name))
908 def test_ssh_client_fip_second_creator(self):
910 Tests the ability to access a VM via SSH and a floating IP via a
911 creator that is identical to the original creator.
913 port_settings = PortConfig(
914 name=self.port_1_name,
915 network_name=self.pub_net_config.network_settings.name)
917 instance_settings = VmInstanceConfig(
918 name=self.vm_inst_name,
919 flavor=self.flavor_creator.flavor_settings.name,
920 port_settings=[port_settings],
921 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
922 floating_ip_settings=[FloatingIpConfig(
923 name=self.floating_ip_name, port_name=self.port_1_name,
924 router_name=self.pub_net_config.router_settings.name)])
926 inst_creator = OpenStackVmInstance(
927 self.os_creds, instance_settings,
928 self.image_creator.image_settings,
929 keypair_settings=self.keypair_creator.keypair_settings)
930 self.inst_creators.append(inst_creator)
932 # block=True will force the create() method to block until the
933 vm_inst = inst_creator.create(block=True)
934 self.assertIsNotNone(vm_inst)
936 self.assertTrue(inst_creator.vm_active(block=True))
938 ip = inst_creator.get_port_ip(port_settings.name)
939 self.assertTrue(check_dhcp_lease(inst_creator, ip))
941 self.assertEqual(vm_inst.id, inst_creator.get_vm_inst().id)
943 self.assertTrue(validate_ssh_client(inst_creator))
945 inst_creator2 = OpenStackVmInstance(
946 self.os_creds, instance_settings,
947 self.image_creator.image_settings,
948 keypair_settings=self.keypair_creator.keypair_settings)
949 inst_creator2.create()
950 self.assertTrue(validate_ssh_client(inst_creator2))
953 class CreateInstanceIPv6NetworkTests(OSIntegrationTestCase):
955 Test for the CreateInstance class with a single NIC/Port with Floating IPs
960 Instantiates the CreateImage object that is responsible for downloading
961 and creating an OS image file within OpenStack
963 super(self.__class__, self).__start__()
965 self.nova = nova_utils.nova_client(self.os_creds)
966 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
967 self.keypair_priv_filepath = 'tmp/' + self.guid
968 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
969 self.keypair_name = self.guid + '-kp'
970 self.vm_inst_name = self.guid + '-inst'
971 self.port1_name = self.guid + 'port1'
972 self.port2_name = self.guid + 'port2'
974 # Initialize for tearDown()
975 self.image_creator = None
976 self.network_creator = None
977 self.router_creator = None
978 self.flavor_creator = None
979 self.keypair_creator = None
980 self.sec_grp_creator = None
981 self.inst_creator = None
983 os_image_settings = openstack_tests.cirros_image_settings(
984 name=self.guid + '-image', image_metadata=self.image_metadata)
986 self.image_creator = OpenStackImage(
987 self.os_creds, os_image_settings)
988 self.image_creator.create()
990 self.flavor_creator = OpenStackFlavor(
993 name=self.guid + '-flavor-name', ram=256, disk=10, vcpus=2,
994 metadata=self.flavor_metadata))
995 self.flavor_creator.create()
997 self.keypair_creator = OpenStackKeypair(
998 self.os_creds, KeypairConfig(
999 name=self.keypair_name,
1000 public_filepath=self.keypair_pub_filepath,
1001 private_filepath=self.keypair_priv_filepath))
1002 self.keypair_creator.create()
1004 sec_grp_name = self.guid + '-sec-grp'
1005 rule1 = SecurityGroupRuleConfig(
1006 sec_grp_name=sec_grp_name, direction=Direction.ingress,
1007 protocol=Protocol.icmp)
1008 rule2 = SecurityGroupRuleConfig(
1009 sec_grp_name=sec_grp_name, direction=Direction.ingress,
1010 protocol=Protocol.tcp, port_range_min=22, port_range_max=22)
1011 self.sec_grp_creator = OpenStackSecurityGroup(
1013 SecurityGroupConfig(
1014 name=sec_grp_name, rule_settings=[rule1, rule2]))
1015 self.sec_grp_creator.create()
1016 except Exception as e:
1022 Cleans the created object
1024 if self.inst_creator:
1026 self.inst_creator.clean()
1027 except Exception as e:
1029 'Unexpected exception cleaning VM instance with message '
1032 if self.keypair_creator:
1034 self.keypair_creator.clean()
1035 except Exception as e:
1037 'Unexpected exception cleaning keypair with message - %s',
1040 if self.flavor_creator:
1042 self.flavor_creator.clean()
1043 except Exception as e:
1045 'Unexpected exception cleaning flavor with message - %s',
1048 if self.sec_grp_creator:
1050 self.sec_grp_creator.clean()
1051 except Exception as e:
1053 'Unexpected exception cleaning security group with message'
1056 if self.router_creator:
1058 self.router_creator.clean()
1059 except Exception as e:
1061 'Unexpected exception cleaning router with message - %s',
1064 if self.network_creator:
1066 self.network_creator.clean()
1067 except Exception as e:
1069 'Unexpected exception cleaning network with message - %s',
1072 if self.image_creator and not self.image_creator.image_settings.exists:
1074 self.image_creator.clean()
1075 except Exception as e:
1077 'Unexpected exception cleaning image with message - %s', e)
1079 super(self.__class__, self).__clean__()
1081 def test_v4fip_v6overlay(self):
1083 Tests the ability to assign an IPv4 floating IP to an IPv6 overlay
1084 network when the external network does not have an IPv6 subnet.
1086 subnet_settings = SubnetConfig(
1087 name=self.guid + '-subnet', cidr='1:1:0:0:0:0:0:0/64',
1089 network_settings = NetworkConfig(
1090 name=self.guid + '-net', subnet_settings=[subnet_settings])
1091 router_settings = RouterConfig(
1092 name=self.guid + '-router', external_gateway=self.ext_net_name,
1093 internal_subnets=[subnet_settings.name])
1096 self.network_creator = OpenStackNetwork(
1097 self.os_creds, network_settings)
1098 self.network_creator.create()
1101 self.router_creator = OpenStackRouter(
1102 self.os_creds, router_settings)
1103 self.router_creator.create()
1105 port_settings = PortConfig(
1106 name=self.port1_name, network_name=network_settings.name)
1108 instance_settings = VmInstanceConfig(
1109 name=self.vm_inst_name,
1110 flavor=self.flavor_creator.flavor_settings.name,
1111 port_settings=[port_settings],
1112 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
1113 floating_ip_settings=[FloatingIpConfig(
1114 name='fip1', port_name=self.port1_name,
1115 router_name=router_settings.name)])
1117 self.inst_creator = OpenStackVmInstance(
1118 self.os_creds, instance_settings,
1119 self.image_creator.image_settings,
1120 keypair_settings=self.keypair_creator.keypair_settings)
1122 with self.assertRaises(BadRequest):
1123 self.inst_creator.create(block=True)
1125 def test_fip_v4and6_overlay(self):
1127 Tests the ability to assign an IPv4 floating IP to an IPv6 overlay
1128 network when the external network does not have an IPv6 subnet.
1130 subnet4_settings = SubnetConfig(
1131 name=self.guid + '-subnet4', cidr='10.0.1.0/24',
1133 subnet6_settings = SubnetConfig(
1134 name=self.guid + '-subnet6', cidr='1:1:0:0:0:0:0:0/64',
1136 network_settings = NetworkConfig(
1137 name=self.guid + '-net',
1138 subnet_settings=[subnet4_settings, subnet6_settings])
1139 router_settings = RouterConfig(
1140 name=self.guid + '-router', external_gateway=self.ext_net_name,
1141 internal_subnets=[subnet4_settings.name])
1144 self.network_creator = OpenStackNetwork(
1145 self.os_creds, network_settings)
1146 self.network_creator.create()
1149 self.router_creator = OpenStackRouter(
1150 self.os_creds, router_settings)
1151 self.router_creator.create()
1153 port_settings = PortConfig(
1154 name=self.port1_name, network_name=network_settings.name)
1156 instance_settings = VmInstanceConfig(
1157 name=self.vm_inst_name,
1158 flavor=self.flavor_creator.flavor_settings.name,
1159 port_settings=[port_settings],
1160 security_group_names=[self.sec_grp_creator.sec_grp_settings.name],
1161 floating_ip_settings=[FloatingIpConfig(
1162 name='fip1', port_name=self.port1_name,
1163 router_name=router_settings.name)])
1165 self.inst_creator = OpenStackVmInstance(
1166 self.os_creds, instance_settings,
1167 self.image_creator.image_settings,
1168 keypair_settings=self.keypair_creator.keypair_settings)
1170 self.inst_creator.create(block=True)
1171 ssh_client = self.inst_creator.ssh_client()
1172 self.assertIsNotNone(ssh_client)
1175 class CreateInstancePortManipulationTests(OSIntegrationTestCase):
1177 Test for the CreateInstance class with a single NIC/Port where mac and IP
1178 values are manually set
1183 Instantiates the CreateImage object that is responsible for downloading
1184 and creating an OS image file within OpenStack
1186 super(self.__class__, self).__start__()
1188 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1189 self.vm_inst_name = guid + '-inst'
1190 self.port_1_name = guid + 'port-1'
1191 self.port_2_name = guid + 'port-2'
1192 self.floating_ip_name = guid + 'fip1'
1194 # Initialize for tearDown()
1195 self.image_creator = None
1196 self.network_creator = None
1197 self.flavor_creator = None
1198 self.inst_creator = None
1200 self.net_config = openstack_tests.get_priv_net_config(
1201 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
1202 router_name=guid + '-pub-router', external_net=self.ext_net_name)
1203 os_image_settings = openstack_tests.cirros_image_settings(
1204 name=guid + '-image', image_metadata=self.image_metadata)
1208 self.image_creator = OpenStackImage(self.os_creds,
1210 self.image_creator.create()
1213 self.network_creator = OpenStackNetwork(
1214 self.os_creds, self.net_config.network_settings)
1215 self.network_creator.create()
1218 self.flavor_creator = OpenStackFlavor(
1219 self.admin_os_creds,
1220 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
1221 vcpus=2, metadata=self.flavor_metadata))
1222 self.flavor_creator.create()
1223 except Exception as e:
1229 Cleans the created object
1231 if self.inst_creator:
1233 self.inst_creator.clean()
1234 except Exception as e:
1236 'Unexpected exception cleaning VM instance with message '
1239 if self.flavor_creator:
1241 self.flavor_creator.clean()
1242 except Exception as e:
1244 'Unexpected exception cleaning flavor with message - %s',
1247 if self.network_creator:
1249 self.network_creator.clean()
1250 except Exception as e:
1252 'Unexpected exception cleaning network with message - %s',
1255 if self.image_creator and not self.image_creator.image_settings.exists:
1257 self.image_creator.clean()
1258 except Exception as e:
1260 'Unexpected exception cleaning image with message - %s', e)
1262 super(self.__class__, self).__clean__()
1264 def test_set_custom_valid_ip_one_subnet(self):
1266 Tests the creation of an OpenStack instance with a single port with a
1267 static IP on a network with one subnet.
1270 sub_settings = self.net_config.network_settings.subnet_settings
1271 port_settings = PortConfig(
1272 name=self.port_1_name,
1273 network_name=self.net_config.network_settings.name,
1274 ip_addrs=[{'subnet_name': sub_settings[0].name, 'ip': ip}])
1276 instance_settings = VmInstanceConfig(
1277 name=self.vm_inst_name,
1278 flavor=self.flavor_creator.flavor_settings.name,
1279 port_settings=[port_settings])
1281 self.inst_creator = OpenStackVmInstance(
1282 self.os_creds, instance_settings,
1283 self.image_creator.image_settings)
1284 self.inst_creator.create(block=True)
1286 self.assertEqual(ip, self.inst_creator.get_port_ip(
1288 subnet_name=self.net_config.network_settings.subnet_settings[
1291 def test_set_custom_invalid_ip_one_subnet(self):
1293 Tests the creation of an OpenStack instance with a single port with a
1294 static IP on a network with one subnet.
1297 sub_settings = self.net_config.network_settings.subnet_settings
1298 port_settings = PortConfig(
1299 name=self.port_1_name,
1300 network_name=self.net_config.network_settings.name,
1301 ip_addrs=[{'subnet_name': sub_settings[0].name, 'ip': ip}])
1303 instance_settings = VmInstanceConfig(
1304 name=self.vm_inst_name,
1305 flavor=self.flavor_creator.flavor_settings.name,
1306 port_settings=[port_settings])
1308 self.inst_creator = OpenStackVmInstance(
1309 self.os_creds, instance_settings,
1310 self.image_creator.image_settings)
1312 with self.assertRaises(InvalidIpForSubnetClient):
1313 self.inst_creator.create()
1315 def test_set_custom_valid_mac(self):
1317 Tests the creation of an OpenStack instance with a single port where
1318 the MAC address is assigned.
1320 mac_addr = '0a:1b:2c:3d:4e:5f'
1321 port_settings = PortConfig(
1322 name=self.port_1_name,
1323 network_name=self.net_config.network_settings.name,
1324 mac_address=mac_addr)
1326 instance_settings = VmInstanceConfig(
1327 name=self.vm_inst_name,
1328 flavor=self.flavor_creator.flavor_settings.name,
1329 port_settings=[port_settings])
1331 self.inst_creator = OpenStackVmInstance(
1332 self.os_creds, instance_settings,
1333 self.image_creator.image_settings)
1334 self.inst_creator.create(block=True)
1336 self.assertEqual(mac_addr,
1337 self.inst_creator.get_port_mac(self.port_1_name))
1339 def test_set_custom_invalid_mac(self):
1341 Tests the creation of an OpenStack instance with a single port where an
1342 invalid MAC address value is being
1343 assigned. This should raise an Exception
1345 port_settings = PortConfig(
1346 name=self.port_1_name,
1347 network_name=self.net_config.network_settings.name,
1350 instance_settings = VmInstanceConfig(
1351 name=self.vm_inst_name,
1352 flavor=self.flavor_creator.flavor_settings.name,
1353 port_settings=[port_settings])
1355 self.inst_creator = OpenStackVmInstance(
1356 self.os_creds, instance_settings,
1357 self.image_creator.image_settings)
1359 with self.assertRaises(Exception):
1360 self.inst_creator.create()
1362 def test_set_custom_mac_and_ip(self):
1364 Tests the creation of an OpenStack instance with a single port where
1365 the IP and MAC address is assigned.
1368 mac_addr = '0a:1b:2c:3d:4e:5f'
1369 sub_settings = self.net_config.network_settings.subnet_settings
1370 port_settings = PortConfig(
1371 name=self.port_1_name,
1372 network_name=self.net_config.network_settings.name,
1373 mac_address=mac_addr,
1374 ip_addrs=[{'subnet_name': sub_settings[0].name, 'ip': ip}])
1376 instance_settings = VmInstanceConfig(
1377 name=self.vm_inst_name,
1378 flavor=self.flavor_creator.flavor_settings.name,
1379 port_settings=[port_settings])
1381 self.inst_creator = OpenStackVmInstance(
1382 self.os_creds, instance_settings,
1383 self.image_creator.image_settings)
1384 self.inst_creator.create(block=True)
1386 self.assertEqual(ip, self.inst_creator.get_port_ip(
1388 subnet_name=self.net_config.network_settings.subnet_settings[
1390 self.assertEqual(mac_addr,
1391 self.inst_creator.get_port_mac(self.port_1_name))
1393 def test_set_allowed_address_pairs(self):
1395 Tests the creation of an OpenStack instance with a single port where
1396 max_allowed_address_pair is set.
1399 mac_addr = '0a:1b:2c:3d:4e:5f'
1400 pair = {'ip_address': ip, 'mac_address': mac_addr}
1401 port_settings = PortConfig(
1402 name=self.port_1_name,
1403 network_name=self.net_config.network_settings.name,
1404 allowed_address_pairs=[pair])
1406 instance_settings = VmInstanceConfig(
1407 name=self.vm_inst_name,
1408 flavor=self.flavor_creator.flavor_settings.name,
1409 port_settings=[port_settings])
1411 self.inst_creator = OpenStackVmInstance(
1412 self.os_creds, instance_settings,
1413 self.image_creator.image_settings)
1414 self.inst_creator.create(block=True)
1416 port = self.inst_creator.get_port_by_name(port_settings.name)
1417 self.assertIsNotNone(port)
1418 self.assertIsNotNone(port.allowed_address_pairs)
1419 self.assertEqual(1, len(port.allowed_address_pairs))
1420 validation_utils.objects_equivalent(pair,
1421 port.allowed_address_pairs[0])
1423 def test_set_allowed_address_pairs_bad_mac(self):
1425 Tests the creation of an OpenStack instance with a single port where
1426 max_allowed_address_pair is set with an invalid MAC address.
1430 pair = {'ip_address': ip, 'mac_address': mac_addr}
1432 pairs.add((ip, mac_addr))
1433 port_settings = PortConfig(
1434 name=self.port_1_name,
1435 network_name=self.net_config.network_settings.name,
1436 allowed_address_pairs=[pair])
1438 instance_settings = VmInstanceConfig(
1439 name=self.vm_inst_name,
1440 flavor=self.flavor_creator.flavor_settings.name,
1441 port_settings=[port_settings])
1443 self.inst_creator = OpenStackVmInstance(
1444 self.os_creds, instance_settings,
1445 self.image_creator.image_settings)
1446 with self.assertRaises(Exception):
1447 self.inst_creator.create()
1449 def test_set_allowed_address_pairs_bad_ip(self):
1451 Tests the creation of an OpenStack instance with a single port where
1452 max_allowed_address_pair is set with an invalid MAC address.
1455 mac_addr = '0a:1b:2c:3d:4e:5f'
1456 pair = {'ip_address': ip, 'mac_address': mac_addr}
1458 pairs.add((ip, mac_addr))
1459 port_settings = PortConfig(
1460 name=self.port_1_name,
1461 network_name=self.net_config.network_settings.name,
1462 allowed_address_pairs=[pair])
1464 instance_settings = VmInstanceConfig(
1465 name=self.vm_inst_name,
1466 flavor=self.flavor_creator.flavor_settings.name,
1467 port_settings=[port_settings])
1469 self.inst_creator = OpenStackVmInstance(
1470 self.os_creds, instance_settings,
1471 self.image_creator.image_settings)
1472 with self.assertRaises(Exception):
1473 self.inst_creator.create()
1476 class CreateInstanceOnComputeHost(OSIntegrationTestCase):
1478 Test for the CreateInstance where one VM is deployed to each compute node
1483 Instantiates the CreateImage object that is responsible for downloading
1484 and creating an OS image file within OpenStack
1486 super(self.__class__, self).__start__()
1488 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1489 self.vm_inst_name = guid + '-inst'
1490 self.port_base_name = guid + 'port'
1492 # Initialize for tearDown()
1493 self.image_creator = None
1494 self.flavor_creator = None
1495 self.network_creator = None
1496 self.inst_creators = list()
1498 self.priv_net_config = openstack_tests.get_priv_net_config(
1499 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
1501 os_image_settings = openstack_tests.cirros_image_settings(
1502 name=guid + '-image', image_metadata=self.image_metadata)
1506 self.network_creator = OpenStackNetwork(
1507 self.admin_os_creds, self.priv_net_config.network_settings)
1508 self.network_creator.create()
1511 self.flavor_creator = OpenStackFlavor(
1512 self.admin_os_creds,
1513 FlavorConfig(name=guid + '-flavor-name', ram=512, disk=1,
1514 vcpus=1, metadata=self.flavor_metadata))
1515 self.flavor_creator.create()
1518 self.image_creator = OpenStackImage(self.os_creds,
1520 self.image_creator.create()
1522 except Exception as e:
1528 Cleans the created object
1530 for inst_creator in self.inst_creators:
1532 inst_creator.clean()
1533 except Exception as e:
1535 'Unexpected exception cleaning VM instance with message '
1538 if self.flavor_creator:
1540 self.flavor_creator.clean()
1541 except Exception as e:
1543 'Unexpected exception cleaning flavor with message - %s',
1546 if self.network_creator:
1548 self.network_creator.clean()
1549 except Exception as e:
1551 'Unexpected exception cleaning network with message - %s',
1554 if self.image_creator and not self.image_creator.image_settings.exists:
1556 self.image_creator.clean()
1557 except Exception as e:
1559 'Unexpected exception cleaning image with message - %s', e)
1561 super(self.__class__, self).__clean__()
1563 def test_deploy_vm_to_each_compute_node(self):
1565 Tests the creation of OpenStack VM instances to each compute node.
1567 from snaps.openstack.utils import nova_utils
1568 nova = nova_utils.nova_client(self.admin_os_creds)
1569 zone_hosts = nova_utils.get_availability_zone_hosts(nova)
1571 # Create Instance on each server/zone
1573 for zone in zone_hosts:
1574 inst_name = self.vm_inst_name + '-' + zone
1576 port_settings = PortConfig(
1577 name=self.port_base_name + '-' + str(ctr),
1578 network_name=self.priv_net_config.network_settings.name)
1580 instance_settings = VmInstanceConfig(
1582 flavor=self.flavor_creator.flavor_settings.name,
1583 availability_zone=zone,
1584 port_settings=[port_settings])
1585 inst_creator = OpenStackVmInstance(
1586 self.admin_os_creds, instance_settings,
1587 self.image_creator.image_settings)
1588 self.inst_creators.append(inst_creator)
1589 inst_creator.create()
1591 # Validate instances to ensure they've been deployed to the correct
1594 for zone in zone_hosts:
1595 creator = self.inst_creators[index]
1596 self.assertTrue(creator.vm_active(block=True))
1597 info = creator.get_vm_info()
1598 deployed_zone = info['OS-EXT-AZ:availability_zone']
1599 deployed_host = info['OS-EXT-SRV-ATTR:host']
1600 self.assertEqual(zone, deployed_zone + ':' + deployed_host)
1604 class InstanceSecurityGroupTests(OSIntegrationTestCase):
1606 Tests that include, add, and remove security groups from VM instances
1611 Instantiates the CreateImage object that is responsible for downloading
1612 and creating an OS image file within OpenStack
1614 super(self.__class__, self).__start__()
1616 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1617 self.vm_inst_name = self.guid + '-inst'
1618 self.nova = nova_utils.nova_client(self.os_creds)
1619 os_image_settings = openstack_tests.cirros_image_settings(
1620 name=self.guid + '-image', image_metadata=self.image_metadata)
1622 self.vm_inst_name = self.guid + '-inst'
1623 self.port_1_name = self.guid + 'port-1'
1624 self.port_2_name = self.guid + 'port-2'
1625 self.floating_ip_name = self.guid + 'fip1'
1627 net_config = openstack_tests.get_priv_net_config(
1628 net_name=self.guid + '-pub-net',
1629 subnet_name=self.guid + '-pub-subnet',
1630 router_name=self.guid + '-pub-router',
1631 external_net=self.ext_net_name)
1633 # Initialize for tearDown()
1634 self.image_creator = None
1635 self.flavor_creator = None
1636 self.network_creator = None
1637 self.router_creator = None
1638 self.inst_creator = None
1639 self.sec_grp_creators = list()
1643 self.image_creator = OpenStackImage(self.os_creds,
1645 self.image_creator.create()
1648 self.network_creator = OpenStackNetwork(
1649 self.os_creds, net_config.network_settings)
1650 self.network_creator.create()
1653 self.flavor_creator = OpenStackFlavor(
1654 self.admin_os_creds,
1655 FlavorConfig(name=self.guid + '-flavor-name', ram=256,
1657 metadata=self.flavor_metadata))
1658 self.flavor_creator.create()
1660 self.port_settings = PortConfig(
1661 name=self.guid + '-port',
1662 network_name=net_config.network_settings.name)
1663 except Exception as e:
1669 Cleans the created object
1671 if self.inst_creator:
1673 self.inst_creator.clean()
1674 except Exception as e:
1676 'Unexpected exception cleaning VM instance with message -'
1679 for sec_grp_creator in self.sec_grp_creators:
1681 sec_grp_creator.clean()
1682 except Exception as e:
1684 'Unexpected exception cleaning security group with message'
1687 if self.flavor_creator:
1689 self.flavor_creator.clean()
1690 except Exception as e:
1692 'Unexpected exception cleaning flavor with message - %s',
1695 if self.network_creator:
1697 self.network_creator.clean()
1698 except Exception as e:
1700 'Unexpected exception cleaning network with message - %s',
1703 if self.image_creator and not self.image_creator.image_settings.exists:
1705 self.image_creator.clean()
1706 except Exception as e:
1708 'Unexpected exception cleaning image with message - %s', e)
1710 super(self.__class__, self).__clean__()
1712 def test_add_security_group(self):
1714 Tests the addition of a security group created after the instance.
1717 instance_settings = VmInstanceConfig(
1718 name=self.vm_inst_name,
1719 flavor=self.flavor_creator.flavor_settings.name,
1720 port_settings=[self.port_settings])
1721 self.inst_creator = OpenStackVmInstance(
1722 self.os_creds, instance_settings,
1723 self.image_creator.image_settings)
1724 vm_inst = self.inst_creator.create(block=True)
1725 self.assertIsNotNone(vm_inst)
1727 # Create security group object to add to instance
1728 sec_grp_settings = SecurityGroupConfig(
1729 name=self.guid + '-name', description='hello group')
1730 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1732 sec_grp = sec_grp_creator.create()
1733 self.sec_grp_creators.append(sec_grp_creator)
1735 # Check that group has not been added
1736 self.assertFalse(inst_has_sec_grp(
1737 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1739 # Add security group to instance after activated
1740 self.inst_creator.add_security_group(sec_grp)
1742 # Validate that security group has been added
1743 self.assertTrue(inst_has_sec_grp(
1744 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1746 def test_add_invalid_security_group(self):
1748 Tests the addition of a security group that no longer exists.
1751 instance_settings = VmInstanceConfig(
1752 name=self.vm_inst_name,
1753 flavor=self.flavor_creator.flavor_settings.name,
1754 port_settings=[self.port_settings])
1755 self.inst_creator = OpenStackVmInstance(
1756 self.os_creds, instance_settings,
1757 self.image_creator.image_settings)
1758 vm_inst = self.inst_creator.create(block=True)
1759 self.assertIsNotNone(vm_inst)
1761 # Create security group object to add to instance
1762 sec_grp_settings = SecurityGroupConfig(
1763 name=self.guid + '-name', description='hello group')
1764 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1766 sec_grp = sec_grp_creator.create()
1767 sec_grp_creator.clean()
1768 self.sec_grp_creators.append(sec_grp_creator)
1770 # Check that group has not been added
1771 self.assertFalse(inst_has_sec_grp(
1772 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1774 # Add security group to instance after activated
1775 self.assertFalse(self.inst_creator.add_security_group(sec_grp))
1777 # Validate that security group has been added
1778 self.assertFalse(inst_has_sec_grp(
1779 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1781 def test_remove_security_group(self):
1783 Tests the removal of a security group created before and added to the
1786 # Create security group object to add to instance
1787 sec_grp_settings = SecurityGroupConfig(
1788 name=self.guid + '-name', description='hello group')
1789 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1791 sec_grp = sec_grp_creator.create()
1792 self.sec_grp_creators.append(sec_grp_creator)
1795 instance_settings = VmInstanceConfig(
1796 name=self.vm_inst_name,
1797 flavor=self.flavor_creator.flavor_settings.name,
1798 security_group_names=[sec_grp_settings.name],
1799 port_settings=[self.port_settings])
1800 self.inst_creator = OpenStackVmInstance(
1801 self.os_creds, instance_settings,
1802 self.image_creator.image_settings)
1803 vm_inst = self.inst_creator.create(block=True)
1804 self.assertIsNotNone(vm_inst)
1806 # Check that group has been added
1807 self.assertTrue(inst_has_sec_grp(
1808 self.nova, vm_inst, sec_grp_settings.name))
1810 # Add security group to instance after activated
1811 self.assertTrue(self.inst_creator.remove_security_group(sec_grp))
1813 # Validate that security group has been added
1814 self.assertFalse(inst_has_sec_grp(
1815 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1817 def test_remove_security_group_never_added(self):
1819 Tests the removal of a security group that was never added in the first
1822 # Create security group object to add to instance
1823 sec_grp_settings = SecurityGroupConfig(
1824 name=self.guid + '-name', description='hello group')
1825 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1827 sec_grp = sec_grp_creator.create()
1828 self.sec_grp_creators.append(sec_grp_creator)
1831 instance_settings = VmInstanceConfig(
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 # Check that group has been added
1842 self.assertFalse(inst_has_sec_grp(
1843 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1845 # Add security group to instance after activated
1846 self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
1848 # Validate that security group has been added
1849 self.assertFalse(inst_has_sec_grp(
1850 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1852 def test_add_same_security_group(self):
1854 Tests the addition of a security group created before add added to the
1857 # Create security group object to add to instance
1858 sec_grp_settings = SecurityGroupConfig(
1859 name=self.guid + '-name', description='hello group')
1860 sec_grp_creator = OpenStackSecurityGroup(self.os_creds,
1862 sec_grp = sec_grp_creator.create()
1863 self.sec_grp_creators.append(sec_grp_creator)
1866 instance_settings = VmInstanceConfig(
1867 name=self.vm_inst_name,
1868 flavor=self.flavor_creator.flavor_settings.name,
1869 security_group_names=[sec_grp_settings.name],
1870 port_settings=[self.port_settings])
1871 self.inst_creator = OpenStackVmInstance(
1872 self.os_creds, instance_settings,
1873 self.image_creator.image_settings)
1874 vm_inst = self.inst_creator.create(block=True)
1875 self.assertIsNotNone(vm_inst)
1877 # Check that group has been added
1878 self.assertTrue(inst_has_sec_grp(
1879 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1881 # Add security group to instance after activated
1882 self.assertTrue(self.inst_creator.add_security_group(sec_grp))
1884 # Validate that security group has been added
1885 self.assertTrue(inst_has_sec_grp(
1886 self.nova, self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1889 def inst_has_sec_grp(nova, vm_inst, sec_grp_name):
1891 Returns true if instance has a security group of a given name
1892 :param nova: the nova client
1893 :param vm_inst: the VmInst domain object
1894 :param sec_grp_name: the name of the security group to validate
1897 sec_grp_names = nova_utils.get_server_security_group_names(nova, vm_inst)
1898 for name in sec_grp_names:
1899 if sec_grp_name == name:
1904 def validate_ssh_client(instance_creator, fip_name=None):
1906 Returns True if instance_creator returns an SSH client that is valid
1907 :param instance_creator: the object responsible for creating the VM
1909 :param fip_name: the name of the floating IP to use
1912 ssh_active = instance_creator.vm_ssh_active(block=True)
1915 ssh_client = instance_creator.ssh_client(fip_name=fip_name)
1918 out = ssh_client.exec_command('pwd')[1]
1919 channel = out.channel
1920 in_buffer = channel.in_buffer
1921 pwd_out = in_buffer.read(1024)
1922 if not pwd_out or len(pwd_out) < 10:
1933 class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
1935 Test for the CreateInstance class for creating an image from a 3-part image
1940 Instantiates the CreateImage object that is responsible for downloading
1941 and creating an OS image file within OpenStack
1943 super(self.__class__, self).__start__()
1945 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1946 self.image_name = guid
1947 self.vm_inst_name = guid + '-inst'
1948 self.nova = nova_utils.nova_client(self.os_creds)
1950 net_config = openstack_tests.get_priv_net_config(
1951 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
1952 router_name=guid + '-pub-router', external_net=self.ext_net_name)
1954 # Initialize for tearDown()
1955 self.image_creator = None
1956 self.network_creator = None
1957 self.flavor_creator = None
1958 self.inst_creator = None
1961 if self.image_metadata and 'disk_file' in self.image_metadata:
1962 metadata = self.image_metadata
1963 elif self.image_metadata and 'cirros' in self.image_metadata \
1964 and 'disk_file' in self.image_metadata['cirros']:
1965 metadata = self.image_metadata['cirros']
1968 'disk_url': openstack_tests.CIRROS_DEFAULT_IMAGE_URL,
1970 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL,
1972 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL}
1974 image_settings = openstack_tests.cirros_image_settings(
1975 name=self.image_name,
1976 image_metadata=metadata)
1978 if not image_settings.ramdisk_image_settings or not \
1979 image_settings.kernel_image_settings:
1981 '3 Part image will not be tested. Image metadata has '
1982 'overridden this functionality')
1984 self.image_creator = OpenStackImage(self.os_creds, image_settings)
1985 self.image_creator.create()
1988 self.flavor_creator = OpenStackFlavor(
1989 self.admin_os_creds,
1990 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=10,
1991 vcpus=2, metadata=self.flavor_metadata))
1992 self.flavor_creator.create()
1995 self.network_creator = OpenStackNetwork(
1996 self.os_creds, net_config.network_settings)
1997 self.network_creator.create()
1999 self.port_settings = PortConfig(
2000 name=guid + '-port',
2001 network_name=net_config.network_settings.name)
2002 except Exception as e:
2008 Cleans the created object
2010 if self.inst_creator:
2012 self.inst_creator.clean()
2013 except Exception as e:
2015 'Unexpected exception cleaning VM instance with message -'
2018 if self.flavor_creator:
2020 self.flavor_creator.clean()
2021 except Exception as e:
2023 'Unexpected exception cleaning flavor with message - %s',
2026 if self.network_creator:
2028 self.network_creator.clean()
2029 except Exception as e:
2031 'Unexpected exception cleaning network with message - %s',
2034 if self.image_creator and not self.image_creator.image_settings.exists:
2036 self.image_creator.clean()
2037 except Exception as e:
2039 'Unexpected exception cleaning image with message - %s', e)
2041 super(self.__class__, self).__clean__()
2043 def test_create_instance_from_three_part_image(self):
2045 Tests the creation of an OpenStack instance from a 3-part image.
2047 instance_settings = VmInstanceConfig(
2048 name=self.vm_inst_name,
2049 flavor=self.flavor_creator.flavor_settings.name,
2050 port_settings=[self.port_settings])
2052 # The last created image is the main image from which we create the
2054 self.inst_creator = OpenStackVmInstance(
2055 self.os_creds, instance_settings,
2056 self.image_creator.image_settings)
2058 vm_inst = self.inst_creator.create()
2059 self.assertIsNotNone(vm_inst)
2060 self.assertTrue(self.inst_creator.vm_active(block=True))
2063 class CreateInstanceMockOfflineTests(OSComponentTestCase):
2065 Tests the custom image_metadata that can be set by clients for handling
2066 images differently than the default behavior of the existing tests
2067 primarily for offline testing
2072 Instantiates the CreateImage object that is responsible for downloading
2073 and creating an OS image file within OpenStack
2075 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2077 self.tmpDir = 'tmp/' + str(self.guid)
2078 if not os.path.exists(self.tmpDir):
2079 os.makedirs(self.tmpDir)
2081 self.image_name = self.guid + '-image'
2082 self.vm_inst_name = self.guid + '-inst'
2083 self.port_1_name = self.guid + 'port-1'
2085 # Initialize for tearDown()
2086 self.image_creator = None
2087 self.network_creator = None
2088 self.flavor_creator = None
2089 self.inst_creator = None
2091 self.priv_net_config = openstack_tests.get_priv_net_config(
2092 net_name=self.guid + '-priv-net',
2093 subnet_name=self.guid + '-priv-subnet')
2094 self.port_settings = PortConfig(
2095 name=self.port_1_name,
2096 network_name=self.priv_net_config.network_settings.name)
2099 # Download image file
2100 self.image_file = file_utils.download(
2101 openstack_tests.CIRROS_DEFAULT_IMAGE_URL, self.tmpDir)
2104 self.network_creator = OpenStackNetwork(
2105 self.os_creds, self.priv_net_config.network_settings)
2106 self.network_creator.create()
2109 self.flavor_creator = OpenStackFlavor(
2112 name=self.guid + '-flavor-name', ram=256, disk=10,
2114 self.flavor_creator.create()
2115 except Exception as e:
2121 Cleans the created object
2123 if self.inst_creator:
2125 self.inst_creator.clean()
2126 except Exception as e:
2128 'Unexpected exception cleaning VM instance with message - '
2131 if self.network_creator:
2133 self.network_creator.clean()
2134 except Exception as e:
2136 'Unexpected exception cleaning network with message - %s',
2139 if self.flavor_creator:
2141 self.flavor_creator.clean()
2142 except Exception as e:
2144 'Unexpected exception cleaning flavor with message - %s',
2147 if self.image_creator:
2149 self.image_creator.clean()
2150 except Exception as e:
2152 'Unexpected exception cleaning image with message - %s', e)
2154 if os.path.exists(self.tmpDir) and os.path.isdir(self.tmpDir):
2155 shutil.rmtree(self.tmpDir)
2157 def test_inst_from_file_image_simple_flat(self):
2159 Creates a VM instance from a locally sourced file image using simply
2160 the 'disk_file' attribute vs. using the 'config' option which
2161 completely overrides all image settings
2164 metadata = {'disk_file': self.image_file.name}
2166 os_image_settings = openstack_tests.cirros_image_settings(
2167 name=self.image_name, image_metadata=metadata)
2168 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2169 self.assertEqual(openstack_tests.CIRROS_USER,
2170 os_image_settings.image_user)
2171 self.assertIsNone(os_image_settings.url)
2172 self.assertFalse(os_image_settings.exists)
2173 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2174 os_image_settings.format)
2176 self.assertIsNone(os_image_settings.kernel_image_settings)
2177 self.assertIsNone(os_image_settings.ramdisk_image_settings)
2179 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2180 self.image_creator.create()
2182 instance_settings = VmInstanceConfig(
2183 name=self.vm_inst_name,
2184 flavor=self.flavor_creator.flavor_settings.name,
2185 port_settings=[self.port_settings])
2186 self.inst_creator = OpenStackVmInstance(
2187 self.os_creds, instance_settings,
2188 self.image_creator.image_settings)
2189 self.inst_creator.create()
2191 self.assertTrue(self.inst_creator.vm_active(block=True))
2193 def test_inst_from_file_image_simple_nested(self):
2195 Creates a VM instance from a locally sourced file image using simply
2196 the 'disk_file' attribute under 'cirros' vs. using the 'config' option
2197 which completely overrides all image settings
2200 metadata = {'cirros': {'disk_file': self.image_file.name}}
2202 os_image_settings = openstack_tests.cirros_image_settings(
2203 name=self.image_name, image_metadata=metadata)
2204 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2205 self.assertEqual(openstack_tests.CIRROS_USER,
2206 os_image_settings.image_user)
2207 self.assertIsNone(os_image_settings.url)
2208 self.assertFalse(os_image_settings.exists)
2209 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2210 os_image_settings.format)
2212 self.assertIsNone(os_image_settings.kernel_image_settings)
2213 self.assertIsNone(os_image_settings.ramdisk_image_settings)
2215 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2216 self.image_creator.create()
2218 instance_settings = VmInstanceConfig(
2219 name=self.vm_inst_name,
2220 flavor=self.flavor_creator.flavor_settings.name,
2221 port_settings=[self.port_settings])
2222 self.inst_creator = OpenStackVmInstance(
2223 self.os_creds, instance_settings,
2224 self.image_creator.image_settings)
2225 self.inst_creator.create()
2227 self.assertTrue(self.inst_creator.vm_active(block=True))
2229 def test_inst_from_existing(self):
2231 Creates a VM instance from a image creator that has been configured to
2232 use an existing image
2235 os_image_settings = openstack_tests.cirros_image_settings(
2236 name=self.image_name)
2237 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2238 self.image_creator.create()
2240 image_settings = self.image_creator.image_settings
2241 test_image_creator = OpenStackImage(
2244 name=image_settings.name, image_user=image_settings.image_user,
2246 test_image_creator.create()
2247 self.assertEqual(self.image_creator.get_image().id,
2248 test_image_creator.get_image().id)
2250 instance_settings = VmInstanceConfig(
2251 name=self.vm_inst_name,
2252 flavor=self.flavor_creator.flavor_settings.name,
2253 port_settings=[self.port_settings])
2254 self.inst_creator = OpenStackVmInstance(
2255 self.os_creds, instance_settings,
2256 test_image_creator.image_settings)
2257 self.inst_creator.create()
2259 self.assertTrue(self.inst_creator.vm_active(block=True))
2261 def test_inst_from_file_image_complex(self):
2263 Creates a VM instance from a locally sourced file image by overriding
2264 the default settings by using a dict() that can be read in by
2269 os_image_settings = openstack_tests.cirros_image_settings(
2270 name=self.image_name)
2271 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2272 self.image_creator.create()
2277 'name': os_image_settings.name,
2278 'image_user': os_image_settings.image_user,
2280 test_image_settings = openstack_tests.cirros_image_settings(
2281 image_metadata=metadata)
2282 test_image = OpenStackImage(self.os_creds, test_image_settings)
2285 instance_settings = VmInstanceConfig(
2286 name=self.vm_inst_name,
2287 flavor=self.flavor_creator.flavor_settings.name,
2288 port_settings=[self.port_settings])
2289 self.inst_creator = OpenStackVmInstance(self.os_creds,
2291 test_image_settings)
2292 self.inst_creator.create()
2294 self.assertTrue(self.inst_creator.vm_active(block=True))
2296 def test_inst_from_file_3part_image_complex(self):
2298 Creates a VM instance from a locally sourced file image by overriding
2299 the default settings by using a dict() that can be read in by
2304 kernel_file = file_utils.download(
2305 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2306 ramdisk_file = file_utils.download(
2307 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2312 'name': self.image_name,
2313 'image_user': openstack_tests.CIRROS_USER,
2314 'image_file': self.image_file.name,
2315 'format': openstack_tests.DEFAULT_IMAGE_FORMAT,
2316 'kernel_image_settings': {
2317 'name': self.image_name + '-kernel',
2318 'image_user': openstack_tests.CIRROS_USER,
2319 'image_file': kernel_file.name,
2320 'format': openstack_tests.DEFAULT_IMAGE_FORMAT},
2321 'ramdisk_image_settings': {
2322 'name': self.image_name + '-ramdisk',
2323 'image_user': openstack_tests.CIRROS_USER,
2324 'image_file': ramdisk_file.name,
2325 'format': openstack_tests.DEFAULT_IMAGE_FORMAT}}}}
2327 os_image_settings = openstack_tests.cirros_image_settings(
2328 name=self.image_name, image_metadata=metadata)
2329 self.assertEqual(self.image_name, os_image_settings.name)
2330 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2331 self.assertEqual(openstack_tests.CIRROS_USER,
2332 os_image_settings.image_user)
2333 self.assertIsNone(os_image_settings.url)
2334 self.assertFalse(os_image_settings.exists)
2335 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2336 os_image_settings.format)
2338 self.assertIsNotNone(os_image_settings.kernel_image_settings)
2339 self.assertEqual(self.image_name + '-kernel',
2340 os_image_settings.kernel_image_settings.name)
2341 self.assertEqual(kernel_file.name,
2342 os_image_settings.kernel_image_settings.image_file)
2343 self.assertEqual(openstack_tests.CIRROS_USER,
2344 os_image_settings.kernel_image_settings.image_user)
2345 self.assertIsNone(os_image_settings.kernel_image_settings.url)
2346 self.assertFalse(os_image_settings.kernel_image_settings.exists)
2347 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2348 os_image_settings.kernel_image_settings.format)
2350 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
2351 self.assertEqual(self.image_name + '-ramdisk',
2352 os_image_settings.ramdisk_image_settings.name)
2353 self.assertEqual(ramdisk_file.name,
2354 os_image_settings.ramdisk_image_settings.image_file)
2355 self.assertEqual(openstack_tests.CIRROS_USER,
2356 os_image_settings.ramdisk_image_settings.image_user)
2357 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
2358 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
2359 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2360 os_image_settings.ramdisk_image_settings.format)
2362 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2363 self.image_creator.create()
2365 instance_settings = VmInstanceConfig(
2366 name=self.vm_inst_name,
2367 flavor=self.flavor_creator.flavor_settings.name,
2368 port_settings=[self.port_settings])
2369 self.inst_creator = OpenStackVmInstance(
2370 self.os_creds, instance_settings,
2371 self.image_creator.image_settings)
2372 self.inst_creator.create()
2374 self.assertTrue(self.inst_creator.vm_active(block=True))
2376 def test_inst_from_file_3part_image_simple_flat(self):
2378 Creates a VM instance from a 3-part image locally sourced from file
2379 images using simply the 'disk_file', 'kernel_file', and 'ramdisk_file'
2380 attributes vs. using the 'config' option which completely overrides all
2384 kernel_file = file_utils.download(
2385 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2386 ramdisk_file = file_utils.download(
2387 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2389 metadata = {'disk_file': self.image_file.name,
2390 'kernel_file': kernel_file.name,
2391 'ramdisk_file': ramdisk_file.name}
2393 os_image_settings = openstack_tests.cirros_image_settings(
2394 name=self.image_name, image_metadata=metadata)
2396 self.assertEqual(self.image_name, os_image_settings.name)
2397 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2398 self.assertEqual(openstack_tests.CIRROS_USER,
2399 os_image_settings.image_user)
2400 self.assertIsNone(os_image_settings.url)
2401 self.assertFalse(os_image_settings.exists)
2402 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2403 os_image_settings.format)
2405 self.assertIsNotNone(os_image_settings.kernel_image_settings)
2406 self.assertEqual(self.image_name + '-kernel',
2407 os_image_settings.kernel_image_settings.name)
2408 self.assertEqual(kernel_file.name,
2409 os_image_settings.kernel_image_settings.image_file)
2410 self.assertEqual(openstack_tests.CIRROS_USER,
2411 os_image_settings.kernel_image_settings.image_user)
2412 self.assertIsNone(os_image_settings.kernel_image_settings.url)
2413 self.assertFalse(os_image_settings.kernel_image_settings.exists)
2414 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2415 os_image_settings.kernel_image_settings.format)
2417 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
2418 self.assertEqual(self.image_name + '-ramdisk',
2419 os_image_settings.ramdisk_image_settings.name)
2420 self.assertEqual(ramdisk_file.name,
2421 os_image_settings.ramdisk_image_settings.image_file)
2422 self.assertEqual(openstack_tests.CIRROS_USER,
2423 os_image_settings.ramdisk_image_settings.image_user)
2424 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
2425 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
2426 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2427 os_image_settings.ramdisk_image_settings.format)
2429 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2430 self.image_creator.create()
2432 self.assertIsNotNone(self.image_creator.get_kernel_image())
2433 self.assertIsNotNone(self.image_creator.get_ramdisk_image())
2435 instance_settings = VmInstanceConfig(
2436 name=self.vm_inst_name,
2437 flavor=self.flavor_creator.flavor_settings.name,
2438 port_settings=[self.port_settings])
2439 self.inst_creator = OpenStackVmInstance(
2440 self.os_creds, instance_settings,
2441 self.image_creator.image_settings)
2442 self.inst_creator.create()
2444 self.assertTrue(self.inst_creator.vm_active(block=True))
2446 def test_inst_from_file_3part_image_simple_nested(self):
2448 Creates a VM instance from a 3-part image locally sourced from file
2449 images using simply the 'disk_file', 'kernel_file', and 'ramdisk_file'
2450 attributes under 'cirros' vs. using the 'config' option which
2451 completely overrides all image settings
2454 kernel_file = file_utils.download(
2455 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2456 ramdisk_file = file_utils.download(
2457 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2459 metadata = {'cirros': {'disk_file': self.image_file.name,
2460 'kernel_file': kernel_file.name,
2461 'ramdisk_file': ramdisk_file.name}}
2463 os_image_settings = openstack_tests.cirros_image_settings(
2464 name=self.image_name, image_metadata=metadata)
2466 self.assertEqual(self.image_name, os_image_settings.name)
2467 self.assertEqual(self.image_file.name, os_image_settings.image_file)
2468 self.assertEqual(openstack_tests.CIRROS_USER,
2469 os_image_settings.image_user)
2470 self.assertIsNone(os_image_settings.url)
2471 self.assertFalse(os_image_settings.exists)
2472 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2473 os_image_settings.format)
2475 self.assertIsNotNone(os_image_settings.kernel_image_settings)
2476 self.assertEqual(self.image_name + '-kernel',
2477 os_image_settings.kernel_image_settings.name)
2478 self.assertEqual(kernel_file.name,
2479 os_image_settings.kernel_image_settings.image_file)
2480 self.assertEqual(openstack_tests.CIRROS_USER,
2481 os_image_settings.kernel_image_settings.image_user)
2482 self.assertIsNone(os_image_settings.kernel_image_settings.url)
2483 self.assertFalse(os_image_settings.kernel_image_settings.exists)
2484 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2485 os_image_settings.kernel_image_settings.format)
2487 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
2488 self.assertEqual(self.image_name + '-ramdisk',
2489 os_image_settings.ramdisk_image_settings.name)
2490 self.assertEqual(ramdisk_file.name,
2491 os_image_settings.ramdisk_image_settings.image_file)
2492 self.assertEqual(openstack_tests.CIRROS_USER,
2493 os_image_settings.ramdisk_image_settings.image_user)
2494 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
2495 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
2496 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
2497 os_image_settings.ramdisk_image_settings.format)
2499 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2500 self.image_creator.create()
2502 self.assertIsNotNone(self.image_creator.get_kernel_image())
2503 self.assertIsNotNone(self.image_creator.get_ramdisk_image())
2505 instance_settings = VmInstanceConfig(
2506 name=self.vm_inst_name,
2507 flavor=self.flavor_creator.flavor_settings.name,
2508 port_settings=[self.port_settings])
2509 self.inst_creator = OpenStackVmInstance(
2510 self.os_creds, instance_settings,
2511 self.image_creator.image_settings)
2512 self.inst_creator.create()
2514 self.assertTrue(self.inst_creator.vm_active(block=True))
2516 def test_inst_from_file_3part_image_existing(self):
2518 Creates a VM instance from a 3-part image that is existing
2521 kernel_file = file_utils.download(
2522 openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
2523 ramdisk_file = file_utils.download(
2524 openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
2526 metadata = {'cirros': {'disk_file': self.image_file.name,
2527 'kernel_file': kernel_file.name,
2528 'ramdisk_file': ramdisk_file.name}}
2530 os_image_settings = openstack_tests.cirros_image_settings(
2531 name=self.image_name, image_metadata=metadata)
2532 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
2533 self.image_creator.create()
2535 image_settings = self.image_creator.image_settings
2536 test_image_creator = OpenStackImage(
2539 name=image_settings.name, image_user=image_settings.image_user,
2541 test_image_creator.create()
2542 self.assertEqual(self.image_creator.get_image().id,
2543 test_image_creator.get_image().id)
2545 instance_settings = VmInstanceConfig(
2546 name=self.vm_inst_name,
2547 flavor=self.flavor_creator.flavor_settings.name,
2548 port_settings=[self.port_settings])
2549 self.inst_creator = OpenStackVmInstance(
2550 self.os_creds, instance_settings,
2551 test_image_creator.image_settings)
2552 self.inst_creator.create()
2554 self.assertTrue(self.inst_creator.vm_active(block=True))
2557 class CreateInstanceTwoNetTests(OSIntegrationTestCase):
2559 Tests the ability of two VMs to communicate when attached to separate
2560 private networks that are tied together with a router.
2565 Instantiates the CreateImage object that is responsible for downloading
2566 and creating an OS image file within OpenStack
2568 super(self.__class__, self).__start__()
2570 cidr1 = '10.200.201.0/24'
2571 cidr2 = '10.200.202.0/24'
2572 static_gateway_ip1 = '10.200.201.1'
2573 static_gateway_ip2 = '10.200.202.1'
2574 self.ip1 = '10.200.201.5'
2575 self.ip2 = '10.200.202.5'
2577 self.nova = nova_utils.nova_client(self.os_creds)
2579 # Initialize for tearDown()
2580 self.image_creator = None
2581 self.network_creators = list()
2582 self.router_creator = None
2583 self.flavor_creator = None
2584 self.sec_grp_creator = None
2585 self.inst_creators = list()
2587 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2588 self.vm_inst1_name = self.guid + '-inst1'
2589 self.vm_inst2_name = self.guid + '-inst2'
2590 self.port_1_name = self.guid + '-vm1-port'
2591 self.port_2_name = self.guid + '-vm2-port'
2592 self.net_config_1 = NetworkConfig(
2593 name=self.guid + '-net1',
2595 create_network.SubnetConfig(
2596 cidr=cidr1, name=self.guid + '-subnet1',
2597 gateway_ip=static_gateway_ip1)])
2598 self.net_config_2 = NetworkConfig(
2599 name=self.guid + '-net2',
2601 create_network.SubnetConfig(
2602 cidr=cidr2, name=self.guid + '-subnet2',
2603 gateway_ip=static_gateway_ip2)])
2605 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
2606 os_image_settings = openstack_tests.cirros_image_settings(
2607 name=image_name, image_metadata=self.image_metadata)
2611 self.image_creator = OpenStackImage(self.os_creds,
2613 self.image_creator.create()
2615 # First network is public
2616 self.network_creators.append(OpenStackNetwork(
2617 self.os_creds, self.net_config_1))
2618 # Second network is private
2619 self.network_creators.append(OpenStackNetwork(
2620 self.os_creds, self.net_config_2))
2621 for network_creator in self.network_creators:
2622 network_creator.create()
2625 create_network.PortConfig(
2626 name=self.guid + '-router-port1',
2629 self.net_config_1.subnet_settings[0].name,
2630 'ip': static_gateway_ip1
2632 network_name=self.net_config_1.name,
2633 project_name=self.os_creds.project_name),
2634 create_network.PortConfig(
2635 name=self.guid + '-router-port2',
2638 self.net_config_2.subnet_settings[0].name,
2639 'ip': static_gateway_ip2
2641 network_name=self.net_config_2.name,
2642 project_name=self.os_creds.project_name)]
2644 router_settings = RouterConfig(
2645 name=self.guid + '-pub-router', port_settings=port_settings)
2646 self.router_creator = create_router.OpenStackRouter(
2647 self.os_creds, router_settings)
2648 self.router_creator.create()
2651 self.flavor_creator = OpenStackFlavor(
2652 self.admin_os_creds,
2653 FlavorConfig(name=self.guid + '-flavor-name', ram=512,
2655 metadata=self.flavor_metadata))
2656 self.flavor_creator.create()
2658 sec_grp_name = self.guid + '-sec-grp'
2659 rule1 = SecurityGroupRuleConfig(
2660 sec_grp_name=sec_grp_name, direction=Direction.ingress,
2661 protocol=Protocol.icmp)
2662 self.sec_grp_creator = OpenStackSecurityGroup(
2664 SecurityGroupConfig(
2665 name=sec_grp_name, rule_settings=[rule1]))
2666 self.sec_grp_creator.create()
2673 Cleans the created objects
2675 for inst_creator in self.inst_creators:
2677 inst_creator.clean()
2678 except Exception as e:
2680 'Unexpected exception cleaning VM instance with message '
2683 if self.flavor_creator:
2685 self.flavor_creator.clean()
2686 except Exception as e:
2688 'Unexpected exception cleaning flavor with message - %s',
2691 if self.router_creator:
2693 self.router_creator.clean()
2694 except Exception as e:
2696 'Unexpected exception cleaning router with message - %s',
2699 for network_creator in self.network_creators:
2701 network_creator.clean()
2702 except Exception as e:
2704 'Unexpected exception cleaning network with message - %s',
2707 if self.sec_grp_creator:
2709 self.sec_grp_creator.clean()
2710 except Exception as e:
2712 'Unexpected exception cleaning security group with message'
2715 if self.image_creator and not self.image_creator.image_settings.exists:
2717 self.image_creator.clean()
2718 except Exception as e:
2720 'Unexpected exception cleaning image with message - %s', e)
2722 super(self.__class__, self).__clean__()
2724 def test_ping_via_router(self):
2726 Tests the creation of two OpenStack instances with one port on
2727 different private networks wit a router in between to ensure that they
2731 # Create ports/NICs for instance
2734 for network_creator in self.network_creators:
2735 ports_settings.append(PortConfig(
2736 name=self.guid + '-port-' + str(ctr),
2737 network_name=network_creator.network_settings.name))
2740 # Configure instances
2741 instance1_settings = VmInstanceConfig(
2742 name=self.vm_inst1_name,
2743 flavor=self.flavor_creator.flavor_settings.name,
2744 userdata=_get_ping_userdata(self.ip2),
2745 port_settings=[PortConfig(
2746 name=self.port_1_name,
2749 self.net_config_1.subnet_settings[0].name,
2752 network_name=self.network_creators[0].network_settings.name)])
2753 instance2_settings = VmInstanceConfig(
2754 name=self.vm_inst2_name,
2755 flavor=self.flavor_creator.flavor_settings.name,
2756 userdata=_get_ping_userdata(self.ip1),
2757 port_settings=[PortConfig(
2758 name=self.port_2_name,
2761 self.net_config_2.subnet_settings[0].name,
2764 network_name=self.network_creators[1].network_settings.name)])
2767 self.inst_creators.append(OpenStackVmInstance(
2768 self.os_creds, instance1_settings,
2769 self.image_creator.image_settings))
2770 self.inst_creators.append(OpenStackVmInstance(
2771 self.os_creds, instance2_settings,
2772 self.image_creator.image_settings))
2774 for inst_creator in self.inst_creators:
2775 inst_creator.create(block=True)
2777 # Check for DHCP lease
2778 self.assertTrue(check_dhcp_lease(self.inst_creators[0], self.ip1))
2779 self.assertTrue(check_dhcp_lease(self.inst_creators[1], self.ip2))
2781 # Effectively blocks until VM has been properly activated
2782 self.assertTrue(check_ping(self.inst_creators[0]))
2783 self.assertTrue(check_ping(self.inst_creators[1]))
2786 class CreateInstanceVolumeTests(OSIntegrationTestCase):
2788 Simple instance creation with an attached volume
2793 Instantiates the CreateImage object that is responsible for downloading
2794 and creating an OS image file
2797 super(self.__class__, self).__start__()
2799 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
2800 self.vm_inst_name = guid + '-inst'
2801 self.nova = nova_utils.nova_client(self.os_creds)
2802 self.neutron = neutron_utils.neutron_client(self.os_creds)
2803 os_image_settings = openstack_tests.cirros_image_settings(
2804 name=guid + '-image', image_metadata=self.image_metadata)
2806 net_config = openstack_tests.get_priv_net_config(
2807 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
2808 router_name=guid + '-pub-router', external_net=self.ext_net_name)
2810 self.volume_settings1 = VolumeConfig(
2811 name=self.__class__.__name__ + '-' + str(guid) + '-1')
2812 self.volume_settings2 = VolumeConfig(
2813 name=self.__class__.__name__ + '-' + str(guid) + '-2')
2815 # Initialize for tearDown()
2816 self.image_creator = None
2817 self.flavor_creator = None
2819 self.network_creator = None
2820 self.inst_creator = None
2821 self.volume_creator1 = None
2822 self.volume_creator2 = None
2826 self.image_creator = OpenStackImage(self.os_creds,
2828 self.image_creator.create()
2831 self.flavor_creator = OpenStackFlavor(
2832 self.admin_os_creds,
2833 FlavorConfig(name=guid + '-flavor-name', ram=256, disk=1,
2834 vcpus=2, metadata=self.flavor_metadata))
2835 self.flavor_creator.create()
2838 self.network_creator = OpenStackNetwork(
2839 self.os_creds, net_config.network_settings)
2840 self.network_creator.create()
2842 self.port_settings = PortConfig(
2843 name=guid + '-port',
2844 network_name=net_config.network_settings.name)
2846 self.volume_creator1 = OpenStackVolume(
2847 self.os_creds, self.volume_settings1)
2848 self.volume_creator1.create(block=True)
2850 self.volume_creator2 = OpenStackVolume(
2851 self.os_creds, self.volume_settings2)
2852 self.volume_creator2.create(block=True)
2854 except Exception as e:
2860 Cleans the created object
2862 if self.inst_creator:
2864 self.inst_creator.clean()
2865 except Exception as e:
2867 'Unexpected exception cleaning VM instance with message '
2870 if self.flavor_creator:
2872 self.flavor_creator.clean()
2873 except Exception as e:
2875 'Unexpected exception cleaning flavor with message - %s',
2878 if self.network_creator:
2880 self.network_creator.clean()
2881 except Exception as e:
2883 'Unexpected exception cleaning network with message - %s',
2886 if self.volume_creator2:
2888 self.volume_creator2.clean()
2889 except Exception as e:
2891 'Unexpected exception cleaning volume with message - %s',
2894 if self.volume_creator1:
2896 self.volume_creator1.clean()
2897 except Exception as e:
2899 'Unexpected exception cleaning volume with message - %s',
2902 if self.image_creator and not self.image_creator.image_settings.exists:
2904 self.image_creator.clean()
2905 except Exception as e:
2907 'Unexpected exception cleaning image with message - %s', e)
2909 super(self.__class__, self).__clean__()
2911 def test_create_instance_with_one_volume(self):
2913 Tests the creation of an OpenStack instance with a single volume.
2915 instance_settings = VmInstanceConfig(
2916 name=self.vm_inst_name,
2917 flavor=self.flavor_creator.flavor_settings.name,
2918 port_settings=[self.port_settings],
2919 volume_names=[self.volume_settings1.name])
2921 self.inst_creator = OpenStackVmInstance(
2922 self.os_creds, instance_settings,
2923 self.image_creator.image_settings)
2925 vm_inst = self.inst_creator.create(block=True)
2926 self.assertIsNotNone(nova_utils.get_server(
2927 self.nova, self.neutron, vm_inst_settings=instance_settings))
2929 self.assertIsNotNone(vm_inst)
2930 self.assertEqual(1, len(vm_inst.volume_ids))
2931 self.assertEqual(self.volume_creator1.get_volume().id,
2932 vm_inst.volume_ids[0]['id'])
2934 def test_create_instance_with_two_volumes(self):
2936 Tests the creation of an OpenStack instance with a single volume.
2938 instance_settings = VmInstanceConfig(
2939 name=self.vm_inst_name,
2940 flavor=self.flavor_creator.flavor_settings.name,
2941 port_settings=[self.port_settings],
2942 volume_names=[self.volume_settings1.name,
2943 self.volume_settings2.name])
2945 self.inst_creator = OpenStackVmInstance(
2946 self.os_creds, instance_settings,
2947 self.image_creator.image_settings)
2949 vm_inst = self.inst_creator.create(block=True)
2950 self.assertIsNotNone(nova_utils.get_server(
2951 self.nova, self.neutron, vm_inst_settings=instance_settings))
2953 self.assertIsNotNone(vm_inst)
2954 self.assertEqual(2, len(vm_inst.volume_ids))
2955 self.assertEqual(self.volume_creator1.get_volume().id,
2956 vm_inst.volume_ids[0]['id'])
2957 self.assertEqual(self.volume_creator2.get_volume().id,
2958 vm_inst.volume_ids[1]['id'])
2961 def check_dhcp_lease(inst_creator, ip, timeout=160):
2963 Returns true if the expected DHCP lease has been acquired
2964 :param inst_creator: the SNAPS OpenStackVmInstance object
2965 :param ip: the IP address to look for
2966 :param timeout: how long to query for IP address
2970 start_time = time.time()
2972 logger.info("Looking for IP %s in the console log" % ip)
2974 while timeout > time.time() - start_time:
2975 output = inst_creator.get_console_output()
2976 full_log = full_log + output
2977 if re.search(ip, output):
2978 logger.info('DHCP lease obtained logged in console')
2983 logger.error('Full console output -\n' + full_log)
2985 logger.debug('Full console output -\n' + full_log)
2990 def _get_ping_userdata(test_ip):
2992 Returns the post VM creation script to be added into the VM's userdata
2993 :param test_ip: the IP value to substitute into the script
2994 :return: the bash script contents
2997 return ("#!/bin/sh\n\n"
2999 " ping -c 1 %s 2>&1 >/dev/null\n"
3001 " if [ \"Z$RES\" = \"Z0\" ] ; then\n"
3002 " echo 'vPing OK'\n"
3005 " echo 'vPing KO'\n"
3012 def check_ping(vm_creator, timeout=160):
3014 Check for VM for ping result
3018 while tries < timeout:
3020 p_console = vm_creator.get_console_output()
3021 if "vPing OK" in p_console:
3023 elif "failed to read iid from metadata" in p_console or tries > 5: