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 snaps import file_utils
24 from snaps.openstack.create_instance import VmInstanceSettings, OpenStackVmInstance, FloatingIpSettings
25 from snaps.openstack.create_flavor import OpenStackFlavor, FlavorSettings
26 from snaps.openstack.create_keypairs import OpenStackKeypair, KeypairSettings
27 from snaps.openstack.create_network import OpenStackNetwork, PortSettings
28 from snaps.openstack.create_router import OpenStackRouter
29 from snaps.openstack.create_image import OpenStackImage, ImageSettings
30 from snaps.openstack.create_security_group import SecurityGroupSettings, OpenStackSecurityGroup
31 from snaps.openstack.tests import openstack_tests, validation_utils
32 from snaps.openstack.utils import nova_utils
33 from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase, OSComponentTestCase
35 __author__ = 'spisarski'
39 logger = logging.getLogger('create_instance_tests')
42 class VmInstanceSettingsUnitTests(unittest.TestCase):
44 Tests the construction of the VmInstanceSettings class
47 def test_no_params(self):
48 with self.assertRaises(Exception):
51 def test_empty_config(self):
52 with self.assertRaises(Exception):
53 VmInstanceSettings(config=dict())
55 def test_name_only(self):
56 with self.assertRaises(Exception):
57 VmInstanceSettings(name='foo')
59 def test_config_with_name_only(self):
60 with self.assertRaises(Exception):
61 VmInstanceSettings(config={'name': 'foo'})
63 def test_name_flavor_only(self):
64 with self.assertRaises(Exception):
65 VmInstanceSettings(name='foo', flavor='bar')
67 def test_config_with_name_flavor_only(self):
68 with self.assertRaises(Exception):
69 VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar'})
71 def test_name_flavor_port_only(self):
72 port_settings = PortSettings(name='foo-port', network_name='bar-net')
73 settings = VmInstanceSettings(name='foo', flavor='bar', port_settings=[port_settings])
74 self.assertEqual('foo', settings.name)
75 self.assertEqual('bar', settings.flavor)
76 self.assertEqual(1, len(settings.port_settings))
77 self.assertEqual('foo-port', settings.port_settings[0].name)
78 self.assertEqual('bar-net', settings.port_settings[0].network_name)
79 self.assertEqual(0, len(settings.security_group_names))
80 self.assertEqual(0, len(settings.floating_ip_settings))
81 self.assertIsNone(settings.sudo_user)
82 self.assertEqual(900, settings.vm_boot_timeout)
83 self.assertEqual(300, settings.vm_delete_timeout)
84 self.assertEqual(180, settings.ssh_connect_timeout)
85 self.assertIsNone(settings.availability_zone)
87 def test_config_with_name_flavor_port_only(self):
88 port_settings = PortSettings(name='foo-port', network_name='bar-net')
89 settings = VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar', 'ports': [port_settings]})
90 self.assertEqual('foo', settings.name)
91 self.assertEqual('bar', settings.flavor)
92 self.assertEqual(1, len(settings.port_settings))
93 self.assertEqual('foo-port', settings.port_settings[0].name)
94 self.assertEqual('bar-net', settings.port_settings[0].network_name)
95 self.assertEqual(0, len(settings.security_group_names))
96 self.assertEqual(0, len(settings.floating_ip_settings))
97 self.assertIsNone(settings.sudo_user)
98 self.assertEqual(900, settings.vm_boot_timeout)
99 self.assertEqual(300, settings.vm_delete_timeout)
100 self.assertEqual(180, settings.ssh_connect_timeout)
101 self.assertIsNone(settings.availability_zone)
104 port_settings = PortSettings(name='foo-port', network_name='bar-net')
105 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port', router_name='foo-bar-router')
107 settings = VmInstanceSettings(name='foo', flavor='bar', port_settings=[port_settings],
108 security_group_names=['sec_grp_1'], floating_ip_settings=[fip_settings],
109 sudo_user='joe', vm_boot_timeout=999, vm_delete_timeout=333,
110 ssh_connect_timeout=111, availability_zone='server name')
111 self.assertEqual('foo', settings.name)
112 self.assertEqual('bar', settings.flavor)
113 self.assertEqual(1, len(settings.port_settings))
114 self.assertEqual('foo-port', settings.port_settings[0].name)
115 self.assertEqual('bar-net', settings.port_settings[0].network_name)
116 self.assertEqual(1, len(settings.security_group_names))
117 self.assertEqual('sec_grp_1', settings.security_group_names[0])
118 self.assertEqual(1, len(settings.floating_ip_settings))
119 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
120 self.assertEqual('bar-port', settings.floating_ip_settings[0].port_name)
121 self.assertEqual('foo-bar-router', settings.floating_ip_settings[0].router_name)
122 self.assertEqual('joe', settings.sudo_user)
123 self.assertEqual(999, settings.vm_boot_timeout)
124 self.assertEqual(333, settings.vm_delete_timeout)
125 self.assertEqual(111, settings.ssh_connect_timeout)
126 self.assertEqual('server name', settings.availability_zone)
128 def test_config_all(self):
129 port_settings = PortSettings(name='foo-port', network_name='bar-net')
130 fip_settings = FloatingIpSettings(name='foo-fip', port_name='bar-port', router_name='foo-bar-router')
132 settings = VmInstanceSettings(config={'name': 'foo', 'flavor': 'bar', 'ports': [port_settings],
133 'security_group_names': ['sec_grp_1'],
134 'floating_ips': [fip_settings], 'sudo_user': 'joe',
135 'vm_boot_timeout': 999, 'vm_delete_timeout': 333,
136 'ssh_connect_timeout': 111, 'availability_zone': 'server name'})
137 self.assertEqual('foo', settings.name)
138 self.assertEqual('bar', settings.flavor)
139 self.assertEqual(1, len(settings.port_settings))
140 self.assertEqual('foo-port', settings.port_settings[0].name)
141 self.assertEqual('bar-net', settings.port_settings[0].network_name)
142 self.assertEqual(1, len(settings.security_group_names))
143 self.assertEqual(1, len(settings.floating_ip_settings))
144 self.assertEqual('foo-fip', settings.floating_ip_settings[0].name)
145 self.assertEqual('bar-port', settings.floating_ip_settings[0].port_name)
146 self.assertEqual('foo-bar-router', settings.floating_ip_settings[0].router_name)
147 self.assertEqual('joe', settings.sudo_user)
148 self.assertEqual(999, settings.vm_boot_timeout)
149 self.assertEqual(333, settings.vm_delete_timeout)
150 self.assertEqual(111, settings.ssh_connect_timeout)
151 self.assertEqual('server name', settings.availability_zone)
154 class FloatingIpSettingsUnitTests(unittest.TestCase):
156 Tests the construction of the FloatingIpSettings class
159 def test_no_params(self):
160 with self.assertRaises(Exception):
163 def test_empty_config(self):
164 with self.assertRaises(Exception):
165 FloatingIpSettings(config=dict())
167 def test_name_only(self):
168 with self.assertRaises(Exception):
169 FloatingIpSettings(name='foo')
171 def test_config_with_name_only(self):
172 with self.assertRaises(Exception):
173 FloatingIpSettings(config={'name': 'foo'})
175 def test_name_port_only(self):
176 with self.assertRaises(Exception):
177 FloatingIpSettings(name='foo', port_name='bar')
179 def test_config_with_name_port_only(self):
180 with self.assertRaises(Exception):
181 FloatingIpSettings(config={'name': 'foo', 'port_name': 'bar'})
183 def test_name_router_only(self):
184 with self.assertRaises(Exception):
185 FloatingIpSettings(name='foo', router_name='bar')
187 def test_config_with_name_router_only(self):
188 with self.assertRaises(Exception):
189 FloatingIpSettings(config={'name': 'foo', 'router_name': 'bar'})
191 def test_name_port_router_only(self):
192 settings = FloatingIpSettings(name='foo', port_name='foo-port', router_name='bar-router')
193 self.assertEqual('foo', settings.name)
194 self.assertEqual('foo-port', settings.port_name)
195 self.assertEqual('bar-router', settings.router_name)
196 self.assertIsNone(settings.subnet_name)
197 self.assertTrue(settings.provisioning)
199 def test_config_with_name_port_router_only(self):
200 settings = FloatingIpSettings(config={'name': 'foo', 'port_name': 'foo-port', 'router_name': 'bar-router'})
201 self.assertEqual('foo', settings.name)
202 self.assertEqual('foo-port', settings.port_name)
203 self.assertEqual('bar-router', settings.router_name)
204 self.assertIsNone(settings.subnet_name)
205 self.assertTrue(settings.provisioning)
208 settings = FloatingIpSettings(name='foo', port_name='foo-port', router_name='bar-router',
209 subnet_name='bar-subnet', provisioning=False)
210 self.assertEqual('foo', settings.name)
211 self.assertEqual('foo-port', settings.port_name)
212 self.assertEqual('bar-router', settings.router_name)
213 self.assertEqual('bar-subnet', settings.subnet_name)
214 self.assertFalse(settings.provisioning)
216 def test_config_all(self):
217 settings = FloatingIpSettings(config={'name': 'foo', 'port_name': 'foo-port', 'router_name': 'bar-router',
218 'subnet_name': 'bar-subnet', 'provisioning': False})
219 self.assertEqual('foo', settings.name)
220 self.assertEqual('foo-port', settings.port_name)
221 self.assertEqual('bar-router', settings.router_name)
222 self.assertEqual('bar-subnet', settings.subnet_name)
223 self.assertFalse(settings.provisioning)
226 class SimpleHealthCheck(OSIntegrationTestCase):
228 Test for the CreateInstance class with a single NIC/Port with Floating IPs
233 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
236 super(self.__class__, self).__start__()
238 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
239 self.vm_inst_name = guid + '-inst'
240 self.port_1_name = guid + 'port-1'
242 # Initialize for tearDown()
243 self.image_creator = None
244 self.network_creator = None
245 self.flavor_creator = None
246 self.inst_creator = None
248 self.priv_net_config = openstack_tests.get_priv_net_config(
249 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
250 self.port_settings = PortSettings(
251 name=self.port_1_name, network_name=self.priv_net_config.network_settings.name)
254 # Set the default image settings, then set any custom parameters sent from the app
255 os_image_settings = openstack_tests.cirros_image_settings(
256 name=guid + '-image', image_metadata=self.image_metadata)
259 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
260 self.image_creator.create()
263 self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
264 self.network_creator.create()
267 self.flavor_creator = OpenStackFlavor(
269 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=1, metadata=self.flavor_metadata))
270 self.flavor_creator.create()
271 except Exception as e:
277 Cleans the created object
279 if self.inst_creator:
281 self.inst_creator.clean()
282 except Exception as e:
283 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
285 if self.network_creator:
287 self.network_creator.clean()
288 except Exception as e:
289 logger.error('Unexpected exception cleaning network with message - ' + str(e))
291 if self.flavor_creator:
293 self.flavor_creator.clean()
294 except Exception as e:
295 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
297 if self.image_creator and not self.image_creator.image_settings.exists:
299 self.image_creator.clean()
300 except Exception as e:
301 logger.error('Unexpected exception cleaning image with message - ' + str(e))
303 super(self.__class__, self).__clean__()
305 def test_check_vm_ip_dhcp(self):
307 Tests the creation of an OpenStack instance with a single port and ensures that it's assigned IP address is
310 instance_settings = VmInstanceSettings(
311 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
313 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
314 self.image_creator.image_settings)
315 vm = self.inst_creator.create()
317 ip = self.inst_creator.get_port_ip(self.port_settings.name)
318 self.assertIsNotNone(ip)
320 self.assertTrue(self.inst_creator.vm_active(block=True))
324 start_time = time.time()
326 logger.info("Looking for IP %s in the console log" % ip)
328 while timeout > time.time() - start_time:
329 output = vm.get_console_output()
330 full_log = full_log + output
331 if re.search(ip, output):
332 logger.info('DHCP lease obtained logged in console')
337 logger.error('Full console output -\n' + full_log)
339 logger.debug('Full console output -\n' + full_log)
341 self.assertTrue(found)
344 class CreateInstanceSimpleTests(OSIntegrationTestCase):
346 Simple instance creation tests without any other objects
350 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
353 super(self.__class__, self).__start__()
355 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
356 self.vm_inst_name = guid + '-inst'
357 self.nova = nova_utils.nova_client(self.os_creds)
358 os_image_settings = openstack_tests.cirros_image_settings(
359 name=guid + '-image', image_metadata=self.image_metadata)
361 net_config = openstack_tests.get_priv_net_config(
362 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
363 router_name=guid + '-pub-router', external_net=self.ext_net_name)
365 # Initialize for tearDown()
366 self.image_creator = None
367 self.flavor_creator = None
369 self.network_creator = None
370 self.inst_creator = None
374 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
375 self.image_creator.create()
378 self.flavor_creator = OpenStackFlavor(
380 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
381 self.flavor_creator.create()
384 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
385 self.network_creator.create()
387 self.port_settings = PortSettings(name=guid + '-port',
388 network_name=net_config.network_settings.name)
390 except Exception as e:
396 Cleans the created object
398 if self.inst_creator:
400 self.inst_creator.clean()
401 except Exception as e:
402 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
404 if self.flavor_creator:
406 self.flavor_creator.clean()
407 except Exception as e:
408 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
410 if self.network_creator:
412 self.network_creator.clean()
413 except Exception as e:
414 logger.error('Unexpected exception cleaning network with message - ' + str(e))
416 if self.image_creator and not self.image_creator.image_settings.exists:
418 self.image_creator.clean()
419 except Exception as e:
420 logger.error('Unexpected exception cleaning image with message - ' + str(e))
422 super(self.__class__, self).__clean__()
424 def test_create_delete_instance(self):
426 Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
428 instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
429 port_settings=[self.port_settings])
431 self.inst_creator = OpenStackVmInstance(
432 self.os_creds, instance_settings, self.image_creator.image_settings)
434 vm_inst = self.inst_creator.create()
435 self.assertEqual(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
438 nova_utils.delete_vm_instance(self.nova, vm_inst)
440 self.assertTrue(self.inst_creator.vm_deleted(block=True))
441 self.assertEqual(0, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
443 # Exception should not be thrown
444 self.inst_creator.clean()
447 class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
449 Test for the CreateInstance class with a single NIC/Port with Floating IPs
454 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
457 super(self.__class__, self).__start__()
459 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
460 self.keypair_priv_filepath = 'tmp/' + guid
461 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
462 self.keypair_name = guid + '-kp'
463 self.vm_inst_name = guid + '-inst'
464 self.port_1_name = guid + 'port-1'
465 self.port_2_name = guid + 'port-2'
466 self.floating_ip_name = guid + 'fip1'
468 # Initialize for tearDown()
469 self.image_creator = None
470 self.network_creator = None
471 self.router_creator = None
472 self.flavor_creator = None
473 self.keypair_creator = None
474 self.inst_creators = list()
476 self.pub_net_config = openstack_tests.get_pub_net_config(
477 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
478 router_name=guid + '-pub-router', external_net=self.ext_net_name)
479 os_image_settings = openstack_tests.cirros_image_settings(
480 name=guid + '-image', image_metadata=self.image_metadata)
483 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
484 self.image_creator.create()
487 self.network_creator = OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings)
488 self.network_creator.create()
491 self.router_creator = OpenStackRouter(self.os_creds, self.pub_net_config.router_settings)
492 self.router_creator.create()
495 self.flavor_creator = OpenStackFlavor(
497 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
498 self.flavor_creator.create()
500 self.keypair_creator = OpenStackKeypair(
501 self.os_creds, KeypairSettings(
502 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
503 private_filepath=self.keypair_priv_filepath))
504 self.keypair_creator.create()
505 except Exception as e:
511 Cleans the created object
513 for inst_creator in self.inst_creators:
516 except Exception as e:
517 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
519 if self.keypair_creator:
521 self.keypair_creator.clean()
522 except Exception as e:
523 logger.error('Unexpected exception cleaning keypair with message - ' + str(e))
525 if os.path.isfile(self.keypair_pub_filepath):
526 os.remove(self.keypair_pub_filepath)
528 if os.path.isfile(self.keypair_priv_filepath):
529 os.remove(self.keypair_priv_filepath)
531 if self.flavor_creator:
533 self.flavor_creator.clean()
534 except Exception as e:
535 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
537 if self.router_creator:
539 self.router_creator.clean()
540 except Exception as e:
541 logger.error('Unexpected exception cleaning router with message - ' + str(e))
543 if self.network_creator:
545 self.network_creator.clean()
546 except Exception as e:
547 logger.error('Unexpected exception cleaning network with message - ' + str(e))
549 if self.image_creator and not self.image_creator.image_settings.exists:
551 self.image_creator.clean()
552 except Exception as e:
553 logger.error('Unexpected exception cleaning image with message - ' + str(e))
555 super(self.__class__, self).__clean__()
557 def test_single_port_static(self):
559 Tests the creation of an OpenStack instance with a single port with a static IP without a Floating IP.
563 port_settings = PortSettings(
564 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name,
565 ip_addrs=[{'subnet_name': self.pub_net_config.network_settings.subnet_settings[0].name, 'ip': ip_1}])
567 instance_settings = VmInstanceSettings(
568 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
569 floating_ip_settings=[FloatingIpSettings(
570 name=self.floating_ip_name, port_name=self.port_1_name,
571 router_name=self.pub_net_config.router_settings.name)])
573 inst_creator = OpenStackVmInstance(
574 self.os_creds, instance_settings, self.image_creator.image_settings,
575 keypair_settings=self.keypair_creator.keypair_settings)
576 self.inst_creators.append(inst_creator)
577 vm_inst = inst_creator.create()
579 self.assertEqual(ip_1, inst_creator.get_port_ip(self.port_1_name))
580 self.assertTrue(inst_creator.vm_active(block=True))
581 self.assertEqual(vm_inst, inst_creator.get_vm_inst())
583 def test_ssh_client_fip_before_active(self):
585 Tests the ability to access a VM via SSH and a floating IP when it has been assigned prior to being active.
587 port_settings = PortSettings(
588 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name)
590 instance_settings = VmInstanceSettings(
591 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
592 floating_ip_settings=[FloatingIpSettings(
593 name=self.floating_ip_name, port_name=self.port_1_name,
594 router_name=self.pub_net_config.router_settings.name)])
596 inst_creator = OpenStackVmInstance(
597 self.os_creds, instance_settings, self.image_creator.image_settings,
598 keypair_settings=self.keypair_creator.keypair_settings)
599 self.inst_creators.append(inst_creator)
600 vm_inst = inst_creator.create()
601 self.assertIsNotNone(vm_inst)
603 self.assertTrue(inst_creator.vm_active(block=True))
604 self.assertEqual(vm_inst, inst_creator.get_vm_inst())
606 self.assertTrue(validate_ssh_client(inst_creator))
608 def test_ssh_client_fip_after_active(self):
610 Tests the ability to access a VM via SSH and a floating IP when it has been assigned prior to being active.
612 port_settings = PortSettings(
613 name=self.port_1_name, network_name=self.pub_net_config.network_settings.name)
615 instance_settings = VmInstanceSettings(
616 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings],
617 floating_ip_settings=[FloatingIpSettings(
618 name=self.floating_ip_name, port_name=self.port_1_name,
619 router_name=self.pub_net_config.router_settings.name)])
621 inst_creator = OpenStackVmInstance(
622 self.os_creds, instance_settings, self.image_creator.image_settings,
623 keypair_settings=self.keypair_creator.keypair_settings)
624 self.inst_creators.append(inst_creator)
626 # block=True will force the create() method to block until the
627 vm_inst = inst_creator.create(block=True)
628 self.assertIsNotNone(vm_inst)
630 self.assertTrue(inst_creator.vm_active(block=True))
631 self.assertEqual(vm_inst, inst_creator.get_vm_inst())
633 self.assertTrue(validate_ssh_client(inst_creator))
636 class CreateInstancePortManipulationTests(OSIntegrationTestCase):
638 Test for the CreateInstance class with a single NIC/Port where mac and IP values are manually set
643 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
646 super(self.__class__, self).__start__()
648 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
649 self.vm_inst_name = guid + '-inst'
650 self.port_1_name = guid + 'port-1'
651 self.port_2_name = guid + 'port-2'
652 self.floating_ip_name = guid + 'fip1'
654 # Initialize for tearDown()
655 self.image_creator = None
656 self.network_creator = None
657 self.flavor_creator = None
658 self.inst_creator = None
660 self.net_config = openstack_tests.get_priv_net_config(
661 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
662 router_name=guid + '-pub-router', external_net=self.ext_net_name)
663 os_image_settings = openstack_tests.cirros_image_settings(
664 name=guid + '-image', image_metadata=self.image_metadata)
668 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
669 self.image_creator.create()
672 self.network_creator = OpenStackNetwork(self.os_creds, self.net_config.network_settings)
673 self.network_creator.create()
676 self.flavor_creator = OpenStackFlavor(
678 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
679 self.flavor_creator.create()
680 except Exception as e:
686 Cleans the created object
688 if self.inst_creator:
690 self.inst_creator.clean()
691 except Exception as e:
692 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
694 if self.flavor_creator:
696 self.flavor_creator.clean()
697 except Exception as e:
698 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
700 if self.network_creator:
702 self.network_creator.clean()
703 except Exception as e:
704 logger.error('Unexpected exception cleaning network with message - ' + str(e))
706 if self.image_creator and not self.image_creator.image_settings.exists:
708 self.image_creator.clean()
709 except Exception as e:
710 logger.error('Unexpected exception cleaning image with message - ' + str(e))
712 super(self.__class__, self).__clean__()
714 def test_set_custom_valid_ip_one_subnet(self):
716 Tests the creation of an OpenStack instance with a single port with a static IP on a network with one subnet.
719 port_settings = PortSettings(
720 name=self.port_1_name, network_name=self.net_config.network_settings.name,
721 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
723 instance_settings = VmInstanceSettings(
724 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
726 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
727 self.image_creator.image_settings)
728 self.inst_creator.create(block=True)
730 self.assertEqual(ip, self.inst_creator.get_port_ip(
731 self.port_1_name, subnet_name=self.net_config.network_settings.subnet_settings[0].name))
733 def test_set_custom_invalid_ip_one_subnet(self):
735 Tests the creation of an OpenStack instance with a single port with a static IP on a network with one subnet.
738 port_settings = PortSettings(
739 name=self.port_1_name, network_name=self.net_config.network_settings.name,
740 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
742 instance_settings = VmInstanceSettings(
743 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
745 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
746 self.image_creator.image_settings)
748 with self.assertRaises(Exception):
749 self.inst_creator.create()
751 def test_set_custom_valid_mac(self):
753 Tests the creation of an OpenStack instance with a single port where the MAC address is assigned.
755 mac_addr = '0a:1b:2c:3d:4e:5f'
756 port_settings = PortSettings(
757 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address=mac_addr)
759 instance_settings = VmInstanceSettings(
760 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
762 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
763 self.image_creator.image_settings)
764 self.inst_creator.create(block=True)
766 self.assertEqual(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
768 def test_set_custom_invalid_mac(self):
770 Tests the creation of an OpenStack instance with a single port where an invalid MAC address value is being
771 assigned. This should raise an Exception
773 port_settings = PortSettings(
774 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address='foo')
776 instance_settings = VmInstanceSettings(
777 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
779 self.inst_creator = OpenStackVmInstance(
780 self.os_creds, instance_settings, self.image_creator.image_settings)
782 with self.assertRaises(Exception):
783 self.inst_creator.create()
785 def test_set_custom_mac_and_ip(self):
787 Tests the creation of an OpenStack instance with a single port where the IP and MAC address is assigned.
790 mac_addr = '0a:1b:2c:3d:4e:5f'
791 port_settings = PortSettings(
792 name=self.port_1_name, network_name=self.net_config.network_settings.name, mac_address=mac_addr,
793 ip_addrs=[{'subnet_name': self.net_config.network_settings.subnet_settings[0].name, 'ip': ip}])
795 instance_settings = VmInstanceSettings(
796 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
798 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
799 self.image_creator.image_settings)
800 self.inst_creator.create(block=True)
802 self.assertEqual(ip, self.inst_creator.get_port_ip(
803 self.port_1_name, subnet_name=self.net_config.network_settings.subnet_settings[0].name))
804 self.assertEqual(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
806 def test_set_allowed_address_pairs(self):
808 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set.
811 mac_addr = '0a:1b:2c:3d:4e:5f'
812 pair = {'ip_address': ip, 'mac_address': mac_addr}
813 port_settings = PortSettings(
814 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
816 instance_settings = VmInstanceSettings(
817 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
819 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
820 self.image_creator.image_settings)
821 self.inst_creator.create(block=True)
823 port = self.inst_creator.get_port_by_name(port_settings.name)
824 self.assertIsNotNone(port)
825 self.assertIsNotNone(port['port'].get('allowed_address_pairs'))
826 self.assertEqual(1, len(port['port']['allowed_address_pairs']))
827 validation_utils.objects_equivalent(pair, port['port']['allowed_address_pairs'][0])
829 def test_set_allowed_address_pairs_bad_mac(self):
831 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set with an
836 pair = {'ip_address': ip, 'mac_address': mac_addr}
838 pairs.add((ip, mac_addr))
839 port_settings = PortSettings(
840 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
842 instance_settings = VmInstanceSettings(
843 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
845 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
846 self.image_creator.image_settings)
847 with self.assertRaises(Exception):
848 self.inst_creator.create()
850 def test_set_allowed_address_pairs_bad_ip(self):
852 Tests the creation of an OpenStack instance with a single port where max_allowed_address_pair is set with an
856 mac_addr = '0a:1b:2c:3d:4e:5f'
857 pair = {'ip_address': ip, 'mac_address': mac_addr}
859 pairs.add((ip, mac_addr))
860 port_settings = PortSettings(
861 name=self.port_1_name, network_name=self.net_config.network_settings.name, allowed_address_pairs=[pair])
863 instance_settings = VmInstanceSettings(
864 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
866 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
867 self.image_creator.image_settings)
868 with self.assertRaises(Exception):
869 self.inst_creator.create()
872 class CreateInstanceOnComputeHost(OSIntegrationTestCase):
874 Test for the CreateInstance where one VM is deployed to each compute node
879 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
882 super(self.__class__, self).__start__()
884 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
885 self.vm_inst_name = guid + '-inst'
886 self.port_base_name = guid + 'port'
888 # Initialize for tearDown()
889 self.image_creator = None
890 self.flavor_creator = None
891 self.network_creator = None
892 self.inst_creators = list()
894 self.priv_net_config = openstack_tests.get_priv_net_config(
895 net_name=guid + '-priv-net', subnet_name=guid + '-priv-subnet')
897 os_image_settings = openstack_tests.cirros_image_settings(
898 name=guid + '-image', image_metadata=self.image_metadata)
902 self.network_creator = OpenStackNetwork(self.admin_os_creds, self.priv_net_config.network_settings)
903 self.network_creator.create()
906 self.flavor_creator = OpenStackFlavor(
908 FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1, metadata=self.flavor_metadata))
909 self.flavor_creator.create()
912 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
913 self.image_creator.create()
915 except Exception as e:
921 Cleans the created object
923 for inst_creator in self.inst_creators:
926 except Exception as e:
927 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
929 if self.flavor_creator:
931 self.flavor_creator.clean()
932 except Exception as e:
933 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
935 if self.network_creator:
937 self.network_creator.clean()
938 except Exception as e:
939 logger.error('Unexpected exception cleaning network with message - ' + str(e))
941 if self.image_creator and not self.image_creator.image_settings.exists:
943 self.image_creator.clean()
944 except Exception as e:
945 logger.error('Unexpected exception cleaning image with message - ' + str(e))
947 super(self.__class__, self).__clean__()
949 def test_deploy_vm_to_each_compute_node(self):
951 Tests the creation of OpenStack VM instances to each compute node.
953 from snaps.openstack.utils import nova_utils
954 nova = nova_utils.nova_client(self.admin_os_creds)
955 zones = nova_utils.get_nova_availability_zones(nova)
957 # Create Instance on each server/zone
960 inst_name = self.vm_inst_name + '-' + zone
962 port_settings = PortSettings(name=self.port_base_name + '-' + str(ctr),
963 network_name=self.priv_net_config.network_settings.name)
965 instance_settings = VmInstanceSettings(
966 name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
967 port_settings=[port_settings])
968 inst_creator = OpenStackVmInstance(
969 self.admin_os_creds, instance_settings, self.image_creator.image_settings)
970 self.inst_creators.append(inst_creator)
971 inst_creator.create()
973 # Validate instances to ensure they've been deployed to the correct server
976 creator = self.inst_creators[index]
977 self.assertTrue(creator.vm_active(block=True))
978 vm = creator.get_vm_inst()
979 deployed_zone = vm._info['OS-EXT-AZ:availability_zone']
980 deployed_host = vm._info['OS-EXT-SRV-ATTR:host']
981 self.assertEqual(zone, deployed_zone + ':' + deployed_host)
985 class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
987 Test for the CreateInstance class with two NIC/Ports, eth0 with floating IP and eth1 w/o
988 These tests require a Centos image
993 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
996 super(self.__class__, self).__start__()
998 # Initialize for tearDown()
999 self.image_creator = None
1000 self.network_creators = list()
1001 self.router_creators = list()
1002 self.flavor_creator = None
1003 self.keypair_creator = None
1004 self.inst_creator = None
1006 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1007 self.keypair_priv_filepath = 'tmp/' + self.guid
1008 self.keypair_pub_filepath = self.keypair_priv_filepath + '.pub'
1009 self.keypair_name = self.guid + '-kp'
1010 self.vm_inst_name = self.guid + '-inst'
1011 self.port_1_name = self.guid + '-port-1'
1012 self.port_2_name = self.guid + '-port-2'
1013 self.floating_ip_name = self.guid + 'fip1'
1014 self.priv_net_config = openstack_tests.get_priv_net_config(
1015 net_name=self.guid + '-priv-net', subnet_name=self.guid + '-priv-subnet',
1016 router_name=self.guid + '-priv-router', external_net=self.ext_net_name)
1017 self.pub_net_config = openstack_tests.get_pub_net_config(
1018 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1019 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1021 image_name = self.__class__.__name__ + '-' + str(uuid.uuid4())
1022 os_image_settings = openstack_tests.centos_image_settings(name=image_name, image_metadata=self.image_metadata)
1026 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1027 self.image_creator.create()
1029 # First network is public
1030 self.network_creators.append(OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings))
1031 # Second network is private
1032 self.network_creators.append(OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings))
1033 for network_creator in self.network_creators:
1034 network_creator.create()
1036 self.router_creators.append(OpenStackRouter(self.os_creds, self.pub_net_config.router_settings))
1037 self.router_creators.append(OpenStackRouter(self.os_creds, self.priv_net_config.router_settings))
1040 for router_creator in self.router_creators:
1041 router_creator.create()
1044 self.flavor_creator = OpenStackFlavor(
1045 self.admin_os_creds,
1046 FlavorSettings(name=self.guid + '-flavor-name', ram=512, disk=10, vcpus=2,
1047 metadata=self.flavor_metadata))
1048 self.flavor_creator.create()
1051 self.keypair_creator = OpenStackKeypair(
1052 self.os_creds, KeypairSettings(
1053 name=self.keypair_name, public_filepath=self.keypair_pub_filepath,
1054 private_filepath=self.keypair_priv_filepath))
1055 self.keypair_creator.create()
1056 except Exception as e:
1058 raise Exception(str(e))
1062 Cleans the created objects
1064 if self.inst_creator:
1066 self.inst_creator.clean()
1067 except Exception as e:
1068 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1070 if self.keypair_creator:
1072 self.keypair_creator.clean()
1073 except Exception as e:
1074 logger.error('Unexpected exception cleaning keypair with message - ' + str(e))
1076 if os.path.isfile(self.keypair_pub_filepath):
1077 os.remove(self.keypair_pub_filepath)
1079 if os.path.isfile(self.keypair_priv_filepath):
1080 os.remove(self.keypair_priv_filepath)
1082 if self.flavor_creator:
1084 self.flavor_creator.clean()
1085 except Exception as e:
1086 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1088 for router_creator in self.router_creators:
1090 router_creator.clean()
1091 except Exception as e:
1092 logger.error('Unexpected exception cleaning router with message - ' + str(e))
1094 for network_creator in self.network_creators:
1096 network_creator.clean()
1097 except Exception as e:
1098 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1100 if self.image_creator and not self.image_creator.image_settings.exists:
1102 self.image_creator.clean()
1103 except Exception as e:
1104 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1106 super(self.__class__, self).__clean__()
1108 def test_dual_ports_dhcp(self):
1110 Tests the creation of an OpenStack instance with a dual ports/NICs with a DHCP assigned IP.
1111 NOTE: This test and any others that call ansible will most likely fail unless you do one of
1113 1. Have a ~/.ansible.cfg (or alternate means) to set host_key_checking = False
1114 2. Set the following environment variable in your executing shell: ANSIBLE_HOST_KEY_CHECKING=False
1115 Should this not be performed, the creation of the host ssh key will cause your ansible calls to fail.
1117 # Create ports/NICs for instance
1120 for network_creator in self.network_creators:
1121 ports_settings.append(PortSettings(
1122 name=self.guid + '-port-' + str(ctr),
1123 network_name=network_creator.network_settings.name))
1127 instance_settings = VmInstanceSettings(
1128 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=ports_settings,
1129 floating_ip_settings=[FloatingIpSettings(
1130 name=self.floating_ip_name, port_name=self.port_1_name,
1131 router_name=self.pub_net_config.router_settings.name)])
1133 self.inst_creator = OpenStackVmInstance(
1134 self.os_creds, instance_settings, self.image_creator.image_settings,
1135 keypair_settings=self.keypair_creator.keypair_settings)
1137 vm_inst = self.inst_creator.create(block=True)
1139 self.assertEqual(vm_inst, self.inst_creator.get_vm_inst())
1141 # Effectively blocks until VM has been properly activated
1142 self.assertTrue(self.inst_creator.vm_active(block=True))
1144 # Effectively blocks until VM's ssh port has been opened
1145 self.assertTrue(self.inst_creator.vm_ssh_active(block=True))
1147 # TODO - Refactor config_nics() to return a status that can be validated here.
1148 self.inst_creator.config_nics()
1150 # TODO - *** ADD VALIDATION HERE ***
1151 # TODO - Add validation that both floating IPs work
1152 # TODO - Add tests where only one NIC has a floating IP
1153 # TODO - Add tests where one attempts to place a floating IP on a network/router without an external gateway
1156 class InstanceSecurityGroupTests(OSIntegrationTestCase):
1158 Tests that include, add, and remove security groups from VM instances
1162 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1165 super(self.__class__, self).__start__()
1167 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1168 self.vm_inst_name = self.guid + '-inst'
1169 self.nova = nova_utils.nova_client(self.os_creds)
1170 os_image_settings = openstack_tests.cirros_image_settings(
1171 name=self.guid + '-image', image_metadata=self.image_metadata)
1173 self.vm_inst_name = self.guid + '-inst'
1174 self.port_1_name = self.guid + 'port-1'
1175 self.port_2_name = self.guid + 'port-2'
1176 self.floating_ip_name = self.guid + 'fip1'
1178 net_config = openstack_tests.get_priv_net_config(
1179 net_name=self.guid + '-pub-net', subnet_name=self.guid + '-pub-subnet',
1180 router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
1182 # Initialize for tearDown()
1183 self.image_creator = None
1184 self.flavor_creator = None
1185 self.network_creator = None
1186 self.router_creator = None
1187 self.inst_creator = None
1188 self.sec_grp_creators = list()
1192 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1193 self.image_creator.create()
1196 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1197 self.network_creator.create()
1200 self.flavor_creator = OpenStackFlavor(
1201 self.admin_os_creds,
1202 FlavorSettings(name=self.guid + '-flavor-name', ram=128, disk=10, vcpus=2,
1203 metadata=self.flavor_metadata))
1204 self.flavor_creator.create()
1206 self.port_settings = PortSettings(name=self.guid + '-port',
1207 network_name=net_config.network_settings.name)
1208 except Exception as e:
1214 Cleans the created object
1216 if self.inst_creator:
1218 self.inst_creator.clean()
1219 except Exception as e:
1220 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1222 for sec_grp_creator in self.sec_grp_creators:
1224 sec_grp_creator.clean()
1225 except Exception as e:
1226 logger.error('Unexpected exception cleaning security group with message - ' + str(e))
1228 if self.flavor_creator:
1230 self.flavor_creator.clean()
1231 except Exception as e:
1232 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1234 if self.network_creator:
1236 self.network_creator.clean()
1237 except Exception as e:
1238 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1240 if self.image_creator and not self.image_creator.image_settings.exists:
1242 self.image_creator.clean()
1243 except Exception as e:
1244 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1246 super(self.__class__, self).__clean__()
1248 def test_add_security_group(self):
1250 Tests the addition of a security group created after the instance.
1253 instance_settings = VmInstanceSettings(
1254 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1255 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1256 self.image_creator.image_settings)
1257 vm_inst = self.inst_creator.create(block=True)
1258 self.assertIsNotNone(vm_inst)
1260 # Create security group object to add to instance
1261 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1262 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1263 sec_grp = sec_grp_creator.create()
1264 self.sec_grp_creators.append(sec_grp_creator)
1266 # Check that group has not been added
1267 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1269 # Add security group to instance after activated
1270 self.inst_creator.add_security_group(sec_grp)
1272 # Validate that security group has been added
1273 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1275 def test_add_invalid_security_group(self):
1277 Tests the addition of a security group that no longer exists.
1280 instance_settings = VmInstanceSettings(
1281 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1282 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1283 self.image_creator.image_settings)
1284 vm_inst = self.inst_creator.create(block=True)
1285 self.assertIsNotNone(vm_inst)
1287 # Create security group object to add to instance
1288 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1289 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1290 sec_grp = sec_grp_creator.create()
1291 sec_grp_creator.clean()
1292 self.sec_grp_creators.append(sec_grp_creator)
1294 # Check that group has not been added
1295 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1297 # Add security group to instance after activated
1298 self.assertFalse(self.inst_creator.add_security_group(sec_grp))
1300 # Validate that security group has been added
1301 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1303 def test_remove_security_group(self):
1305 Tests the removal of a security group created before and added to the instance.
1307 # Create security group object to add to instance
1308 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1309 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1310 sec_grp = sec_grp_creator.create()
1311 self.sec_grp_creators.append(sec_grp_creator)
1314 instance_settings = VmInstanceSettings(
1315 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1316 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1317 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1318 self.image_creator.image_settings)
1319 vm_inst = self.inst_creator.create(block=True)
1320 self.assertIsNotNone(vm_inst)
1322 # Check that group has been added
1323 self.assertTrue(inst_has_sec_grp(vm_inst, sec_grp_settings.name))
1325 # Add security group to instance after activated
1326 self.assertTrue(self.inst_creator.remove_security_group(sec_grp))
1328 # Validate that security group has been added
1329 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1331 def test_remove_security_group_never_added(self):
1333 Tests the removal of a security group that was never added in the first place.
1335 # Create security group object to add to instance
1336 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1337 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1338 sec_grp = sec_grp_creator.create()
1339 self.sec_grp_creators.append(sec_grp_creator)
1342 instance_settings = VmInstanceSettings(
1343 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1344 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1345 self.image_creator.image_settings)
1346 vm_inst = self.inst_creator.create(block=True)
1347 self.assertIsNotNone(vm_inst)
1349 # Check that group has been added
1350 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1352 # Add security group to instance after activated
1353 self.assertFalse(self.inst_creator.remove_security_group(sec_grp))
1355 # Validate that security group has been added
1356 self.assertFalse(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1358 def test_add_same_security_group(self):
1360 Tests the addition of a security group created before add added to the instance.
1362 # Create security group object to add to instance
1363 sec_grp_settings = SecurityGroupSettings(name=self.guid + '-name', description='hello group')
1364 sec_grp_creator = OpenStackSecurityGroup(self.os_creds, sec_grp_settings)
1365 sec_grp = sec_grp_creator.create()
1366 self.sec_grp_creators.append(sec_grp_creator)
1369 instance_settings = VmInstanceSettings(
1370 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1371 security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings])
1372 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1373 self.image_creator.image_settings)
1374 vm_inst = self.inst_creator.create(block=True)
1375 self.assertIsNotNone(vm_inst)
1377 # Check that group has been added
1378 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1380 # Add security group to instance after activated
1381 self.assertTrue(self.inst_creator.add_security_group(sec_grp))
1383 # Validate that security group has been added
1384 self.assertTrue(inst_has_sec_grp(self.inst_creator.get_vm_inst(), sec_grp_settings.name))
1387 def inst_has_sec_grp(vm_inst, sec_grp_name):
1389 Returns true if instance has a security group of a given name
1392 if not hasattr(vm_inst, 'security_groups'):
1396 for sec_grp_dict in vm_inst.security_groups:
1397 if sec_grp_name in sec_grp_dict['name']:
1403 def validate_ssh_client(instance_creator):
1405 Returns True if instance_creator returns an SSH client that is valid
1406 :param instance_creator: the object responsible for creating the VM instance
1409 ssh_active = instance_creator.vm_ssh_active(block=True)
1412 ssh_client = instance_creator.ssh_client()
1414 out = ssh_client.exec_command('pwd')[1]
1418 channel = out.channel
1419 in_buffer = channel.in_buffer
1420 pwd_out = in_buffer.read(1024)
1421 if not pwd_out or len(pwd_out) < 10:
1428 class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
1430 Test for the CreateInstance class for creating an image from a 3-part image
1435 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1438 super(self.__class__, self).__start__()
1440 guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1441 self.image_name = guid
1442 self.vm_inst_name = guid + '-inst'
1443 self.nova = nova_utils.nova_client(self.os_creds)
1445 net_config = openstack_tests.get_priv_net_config(
1446 net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet',
1447 router_name=guid + '-pub-router', external_net=self.ext_net_name)
1449 # Initialize for tearDown()
1450 self.image_creator = None
1451 self.network_creator = None
1452 self.flavor_creator = None
1453 self.inst_creator = None
1456 if self.image_metadata and 'disk_file' in self.image_metadata:
1457 metadata = self.image_metadata
1458 elif self.image_metadata and 'cirros' in self.image_metadata \
1459 and 'disk_file' in self.image_metadata['cirros']:
1460 metadata = self.image_metadata['cirros']
1462 metadata = {'disk_url': openstack_tests.CIRROS_DEFAULT_IMAGE_URL,
1463 'kernel_url': openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL,
1464 'ramdisk_url': openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL}
1466 image_settings = openstack_tests.cirros_image_settings(
1467 name=self.image_name,
1468 image_metadata=metadata)
1470 if not image_settings.ramdisk_image_settings or not image_settings.kernel_image_settings:
1471 logger.warn('3 Part image will not be tested. Image metadata has overridden this functionality')
1473 self.image_creator = OpenStackImage(self.os_creds, image_settings)
1474 self.image_creator.create()
1477 self.flavor_creator = OpenStackFlavor(
1478 self.admin_os_creds,
1479 FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata))
1480 self.flavor_creator.create()
1483 self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
1484 self.network_creator.create()
1486 self.port_settings = PortSettings(name=guid + '-port',
1487 network_name=net_config.network_settings.name)
1488 except Exception as e:
1494 Cleans the created object
1496 if self.inst_creator:
1498 self.inst_creator.clean()
1499 except Exception as e:
1500 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1502 if self.flavor_creator:
1504 self.flavor_creator.clean()
1505 except Exception as e:
1506 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1508 if self.network_creator:
1510 self.network_creator.clean()
1511 except Exception as e:
1512 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1514 if self.image_creator and not self.image_creator.image_settings.exists:
1516 self.image_creator.clean()
1517 except Exception as e:
1518 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1520 super(self.__class__, self).__clean__()
1522 def test_create_instance_from_three_part_image(self):
1524 Tests the creation of an OpenStack instance from a 3-part image.
1526 instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name,
1527 port_settings=[self.port_settings])
1529 # The last created image is the main image from which we create the instance
1530 self.inst_creator = OpenStackVmInstance(
1531 self.os_creds, instance_settings, self.image_creator.image_settings)
1533 vm_inst = self.inst_creator.create()
1534 self.assertIsNotNone(vm_inst)
1535 self.assertTrue(self.inst_creator.vm_active(block=True))
1538 class CreateInstanceMockOfflineTests(OSComponentTestCase):
1540 Tests the custom image_metadata that can be set by clients for handling images differently than the
1541 default behavior of the existing tests primarily for offline testing
1546 Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
1549 self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
1551 self.tmpDir = 'tmp/' + str(self.guid)
1552 if not os.path.exists(self.tmpDir):
1553 os.makedirs(self.tmpDir)
1555 self.image_name = self.guid + '-image'
1556 self.vm_inst_name = self.guid + '-inst'
1557 self.port_1_name = self.guid + 'port-1'
1559 # Initialize for tearDown()
1560 self.image_creator = None
1561 self.network_creator = None
1562 self.flavor_creator = None
1563 self.inst_creator = None
1565 self.priv_net_config = openstack_tests.get_priv_net_config(
1566 net_name=self.guid + '-priv-net', subnet_name=self.guid + '-priv-subnet')
1567 self.port_settings = PortSettings(
1568 name=self.port_1_name, network_name=self.priv_net_config.network_settings.name)
1571 # Download image file
1572 self.image_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_IMAGE_URL, self.tmpDir)
1575 self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings)
1576 self.network_creator.create()
1579 self.flavor_creator = OpenStackFlavor(
1582 name=self.guid + '-flavor-name', ram=128, disk=10, vcpus=1))
1583 self.flavor_creator.create()
1584 except Exception as e:
1590 Cleans the created object
1592 if self.inst_creator:
1594 self.inst_creator.clean()
1595 except Exception as e:
1596 logger.error('Unexpected exception cleaning VM instance with message - ' + str(e))
1598 if self.network_creator:
1600 self.network_creator.clean()
1601 except Exception as e:
1602 logger.error('Unexpected exception cleaning network with message - ' + str(e))
1604 if self.flavor_creator:
1606 self.flavor_creator.clean()
1607 except Exception as e:
1608 logger.error('Unexpected exception cleaning flavor with message - ' + str(e))
1610 if self.image_creator:
1612 self.image_creator.clean()
1613 except Exception as e:
1614 logger.error('Unexpected exception cleaning image with message - ' + str(e))
1616 if os.path.exists(self.tmpDir) and os.path.isdir(self.tmpDir):
1617 shutil.rmtree(self.tmpDir)
1619 def test_inst_from_file_image_simple_flat(self):
1621 Creates a VM instance from a locally sourced file image using simply the 'disk_file' attribute vs.
1622 using the 'config' option which completely overrides all image settings
1625 metadata = {'disk_file': self.image_file.name}
1627 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name, image_metadata=metadata)
1628 self.assertEqual(self.image_file.name, os_image_settings.image_file)
1629 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.image_user)
1630 self.assertIsNone(os_image_settings.url)
1631 self.assertFalse(os_image_settings.exists)
1632 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.format)
1634 self.assertIsNone(os_image_settings.kernel_image_settings)
1635 self.assertIsNone(os_image_settings.ramdisk_image_settings)
1637 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1638 self.image_creator.create()
1640 instance_settings = VmInstanceSettings(
1641 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1642 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1643 self.image_creator.image_settings)
1644 self.inst_creator.create()
1646 self.assertTrue(self.inst_creator.vm_active(block=True))
1648 def test_inst_from_file_image_simple_nested(self):
1650 Creates a VM instance from a locally sourced file image using simply the 'disk_file' attribute under 'cirros'
1651 vs. using the 'config' option which completely overrides all image settings
1654 metadata = {'cirros': {'disk_file': self.image_file.name}}
1656 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name, image_metadata=metadata)
1657 self.assertEqual(self.image_file.name, os_image_settings.image_file)
1658 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.image_user)
1659 self.assertIsNone(os_image_settings.url)
1660 self.assertFalse(os_image_settings.exists)
1661 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.format)
1663 self.assertIsNone(os_image_settings.kernel_image_settings)
1664 self.assertIsNone(os_image_settings.ramdisk_image_settings)
1666 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1667 self.image_creator.create()
1669 instance_settings = VmInstanceSettings(
1670 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1671 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1672 self.image_creator.image_settings)
1673 self.inst_creator.create()
1675 self.assertTrue(self.inst_creator.vm_active(block=True))
1677 def test_inst_from_existing(self):
1679 Creates a VM instance from a image creator that has been configured to use an existing image
1682 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name)
1683 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1684 self.image_creator.create()
1686 test_image_creator = OpenStackImage(
1687 self.os_creds, ImageSettings(name=self.image_creator.image_settings.name,
1688 image_user=self.image_creator.image_settings.image_user, exists=True))
1689 test_image_creator.create()
1690 self.assertEqual(self.image_creator.get_image().id, test_image_creator.get_image().id)
1692 instance_settings = VmInstanceSettings(
1693 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1694 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1695 test_image_creator.image_settings)
1696 self.inst_creator.create()
1698 self.assertTrue(self.inst_creator.vm_active(block=True))
1700 def test_inst_from_file_image_complex(self):
1702 Creates a VM instance from a locally sourced file image by overriding the default settings by using a dict()
1703 that can be read in by ImageSettings
1707 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name)
1708 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1709 self.image_creator.create()
1711 metadata = {'cirros': {'config':
1712 {'name': os_image_settings.name, 'image_user': os_image_settings.image_user,
1714 test_image_settings = openstack_tests.cirros_image_settings(image_metadata=metadata)
1715 test_image = OpenStackImage(self.os_creds, test_image_settings)
1718 instance_settings = VmInstanceSettings(
1719 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1720 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1721 test_image_settings)
1722 self.inst_creator.create()
1724 self.assertTrue(self.inst_creator.vm_active(block=True))
1726 def test_inst_from_file_3part_image_complex(self):
1728 Creates a VM instance from a locally sourced file image by overriding the default settings by using a dict()
1729 that can be read in by ImageSettings
1733 kernel_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
1734 ramdisk_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
1736 metadata = {'cirros':
1738 {'name': self.image_name,
1739 'image_user': openstack_tests.CIRROS_USER,
1740 'image_file': self.image_file.name,
1741 'format': openstack_tests.DEFAULT_IMAGE_FORMAT,
1742 'kernel_image_settings':
1743 {'name': self.image_name + '-kernel',
1744 'image_user': openstack_tests.CIRROS_USER,
1745 'image_file': kernel_file.name,
1746 'format': openstack_tests.DEFAULT_IMAGE_FORMAT},
1747 'ramdisk_image_settings':
1748 {'name': self.image_name + '-ramdisk',
1749 'image_user': openstack_tests.CIRROS_USER,
1750 'image_file': ramdisk_file.name,
1751 'format': openstack_tests.DEFAULT_IMAGE_FORMAT}}}}
1753 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name, image_metadata=metadata)
1754 self.assertEqual(self.image_name, os_image_settings.name)
1755 self.assertEqual(self.image_file.name, os_image_settings.image_file)
1756 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.image_user)
1757 self.assertIsNone(os_image_settings.url)
1758 self.assertFalse(os_image_settings.exists)
1759 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.format)
1761 self.assertIsNotNone(os_image_settings.kernel_image_settings)
1762 self.assertEqual(self.image_name + '-kernel', os_image_settings.kernel_image_settings.name)
1763 self.assertEqual(kernel_file.name, os_image_settings.kernel_image_settings.image_file)
1764 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.kernel_image_settings.image_user)
1765 self.assertIsNone(os_image_settings.kernel_image_settings.url)
1766 self.assertFalse(os_image_settings.kernel_image_settings.exists)
1767 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.kernel_image_settings.format)
1769 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
1770 self.assertEqual(self.image_name + '-ramdisk', os_image_settings.ramdisk_image_settings.name)
1771 self.assertEqual(ramdisk_file.name, os_image_settings.ramdisk_image_settings.image_file)
1772 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.ramdisk_image_settings.image_user)
1773 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
1774 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
1775 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.ramdisk_image_settings.format)
1777 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1778 self.image_creator.create()
1780 instance_settings = VmInstanceSettings(
1781 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1782 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings)
1783 self.inst_creator.create()
1785 self.assertTrue(self.inst_creator.vm_active(block=True))
1787 def test_inst_from_file_3part_image_simple_flat(self):
1789 Creates a VM instance from a 3-part image locally sourced from file images using simply the 'disk_file',
1790 'kernel_file', and 'ramdisk_file' attributes vs. using the 'config' option which completely overrides all
1794 kernel_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
1795 ramdisk_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
1797 metadata = {'disk_file': self.image_file.name, 'kernel_file': kernel_file.name,
1798 'ramdisk_file': ramdisk_file.name}
1800 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name, image_metadata=metadata)
1802 self.assertEqual(self.image_name, os_image_settings.name)
1803 self.assertEqual(self.image_file.name, os_image_settings.image_file)
1804 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.image_user)
1805 self.assertIsNone(os_image_settings.url)
1806 self.assertFalse(os_image_settings.exists)
1807 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.format)
1809 self.assertIsNotNone(os_image_settings.kernel_image_settings)
1810 self.assertEqual(self.image_name + '-kernel', os_image_settings.kernel_image_settings.name)
1811 self.assertEqual(kernel_file.name, os_image_settings.kernel_image_settings.image_file)
1812 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.kernel_image_settings.image_user)
1813 self.assertIsNone(os_image_settings.kernel_image_settings.url)
1814 self.assertFalse(os_image_settings.kernel_image_settings.exists)
1815 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.kernel_image_settings.format)
1817 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
1818 self.assertEqual(self.image_name + '-ramdisk', os_image_settings.ramdisk_image_settings.name)
1819 self.assertEqual(ramdisk_file.name, os_image_settings.ramdisk_image_settings.image_file)
1820 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.ramdisk_image_settings.image_user)
1821 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
1822 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
1823 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.ramdisk_image_settings.format)
1825 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1826 self.image_creator.create()
1828 self.assertIsNotNone(self.image_creator.get_kernel_image())
1829 self.assertIsNotNone(self.image_creator.get_ramdisk_image())
1831 instance_settings = VmInstanceSettings(
1832 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1833 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1834 self.image_creator.image_settings)
1835 self.inst_creator.create()
1837 self.assertTrue(self.inst_creator.vm_active(block=True))
1839 def test_inst_from_file_3part_image_simple_nested(self):
1841 Creates a VM instance from a 3-part image locally sourced from file images using simply the 'disk_file',
1842 'kernel_file', and 'ramdisk_file' attributes under 'cirros' vs. using the 'config' option which completely
1843 overrides all image settings
1846 kernel_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
1847 ramdisk_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
1849 metadata = {'cirros': {'disk_file': self.image_file.name, 'kernel_file': kernel_file.name,
1850 'ramdisk_file': ramdisk_file.name}}
1852 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name, image_metadata=metadata)
1854 self.assertEqual(self.image_name, os_image_settings.name)
1855 self.assertEqual(self.image_file.name, os_image_settings.image_file)
1856 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.image_user)
1857 self.assertIsNone(os_image_settings.url)
1858 self.assertFalse(os_image_settings.exists)
1859 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.format)
1861 self.assertIsNotNone(os_image_settings.kernel_image_settings)
1862 self.assertEqual(self.image_name + '-kernel', os_image_settings.kernel_image_settings.name)
1863 self.assertEqual(kernel_file.name, os_image_settings.kernel_image_settings.image_file)
1864 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.kernel_image_settings.image_user)
1865 self.assertIsNone(os_image_settings.kernel_image_settings.url)
1866 self.assertFalse(os_image_settings.kernel_image_settings.exists)
1867 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.kernel_image_settings.format)
1869 self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
1870 self.assertEqual(self.image_name + '-ramdisk', os_image_settings.ramdisk_image_settings.name)
1871 self.assertEqual(ramdisk_file.name, os_image_settings.ramdisk_image_settings.image_file)
1872 self.assertEqual(openstack_tests.CIRROS_USER, os_image_settings.ramdisk_image_settings.image_user)
1873 self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
1874 self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
1875 self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT, os_image_settings.ramdisk_image_settings.format)
1877 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1878 self.image_creator.create()
1880 self.assertIsNotNone(self.image_creator.get_kernel_image())
1881 self.assertIsNotNone(self.image_creator.get_ramdisk_image())
1883 instance_settings = VmInstanceSettings(
1884 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1885 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1886 self.image_creator.image_settings)
1887 self.inst_creator.create()
1889 self.assertTrue(self.inst_creator.vm_active(block=True))
1891 def test_inst_from_file_3part_image_existing(self):
1893 Creates a VM instance from a 3-part image that is existing
1896 kernel_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
1897 ramdisk_file = file_utils.download(openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
1899 metadata = {'cirros': {'disk_file': self.image_file.name, 'kernel_file': kernel_file.name,
1900 'ramdisk_file': ramdisk_file.name}}
1902 os_image_settings = openstack_tests.cirros_image_settings(name=self.image_name, image_metadata=metadata)
1903 self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
1904 self.image_creator.create()
1906 test_image_creator = OpenStackImage(
1907 self.os_creds, ImageSettings(name=self.image_creator.image_settings.name,
1908 image_user=self.image_creator.image_settings.image_user, exists=True))
1909 test_image_creator.create()
1910 self.assertEqual(self.image_creator.get_image().id, test_image_creator.get_image().id)
1912 instance_settings = VmInstanceSettings(
1913 name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
1914 self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings,
1915 test_image_creator.image_settings)
1916 self.inst_creator.create()
1918 self.assertTrue(self.inst_creator.vm_active(block=True))