X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Fopenstack%2Ftests%2Fcreate_instance_tests.py;h=765def774cfe3d19dbd35277156fccdb98845fc2;hb=4762240029f3ab7393a353f094a746ebbb70f288;hp=64053ffe809c16887bfa54bb7dac948925424515;hpb=2274f89f78eb4b80f0848e2e3c5e46f1700e4a0e;p=snaps.git diff --git a/snaps/openstack/tests/create_instance_tests.py b/snaps/openstack/tests/create_instance_tests.py index 64053ff..765def7 100644 --- a/snaps/openstack/tests/create_instance_tests.py +++ b/snaps/openstack/tests/create_instance_tests.py @@ -28,7 +28,7 @@ from snaps.openstack.create_image import OpenStackImage from snaps.openstack.create_security_group import SecurityGroupSettings, OpenStackSecurityGroup from snaps.openstack.tests import openstack_tests, validation_utils from snaps.openstack.utils import nova_utils -from snaps.openstack.tests.os_source_file_test import OSComponentTestCase, OSIntegrationTestCase +from snaps.openstack.tests.os_source_file_test import OSIntegrationTestCase __author__ = 'spisarski' @@ -243,7 +243,7 @@ class SimpleHealthCheck(OSIntegrationTestCase): self.floating_ip_name = guid + 'fip1' # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.network_creator = None self.flavor_creator = None self.inst_creator = None @@ -253,12 +253,35 @@ class SimpleHealthCheck(OSIntegrationTestCase): self.port_settings = PortSettings( name=self.port_1_name, network_name=self.priv_net_config.network_settings.name) + # Create Image + # Set the default image settings, then set any custom parameters sent from the app self.os_image_settings = openstack_tests.cirros_url_image(name=guid + '-image') + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + try: - # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() # Create Network self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings) @@ -267,7 +290,7 @@ class SimpleHealthCheck(OSIntegrationTestCase): # Create Flavor self.flavor_creator = OpenStackFlavor( self.admin_os_creds, - FlavorSettings(name=guid + '-flavor-name', ram=1024, disk=10, vcpus=1)) + FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=1, metadata=self.flavor_metadata)) self.flavor_creator.create() except Exception as e: self.tearDown() @@ -289,21 +312,23 @@ class SimpleHealthCheck(OSIntegrationTestCase): if os.path.isfile(self.keypair_priv_filepath): os.remove(self.keypair_priv_filepath) - if self.flavor_creator: - try: - self.flavor_creator.clean() - except Exception as e: - logger.error('Unexpected exception cleaning flavor with message - ' + e.message) - if self.network_creator: try: self.network_creator.clean() except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.flavor_creator: try: - self.image_creator.clean() + self.flavor_creator.clean() + except Exception as e: + logger.error('Unexpected exception cleaning flavor with message - ' + e.message) + + if self.image_creators: + try: + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) @@ -317,7 +342,8 @@ class SimpleHealthCheck(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) vm = self.inst_creator.create() ip = self.inst_creator.get_port_ip(self.port_settings.name) @@ -331,8 +357,10 @@ class SimpleHealthCheck(OSIntegrationTestCase): match_value = 'Lease of.*obtained' logger.info("Looking for expression %s in the console log" % match_value) + full_log = '' while timeout > time.time() - start_time: output = vm.get_console_output() + full_log = full_log + output if re.search(match_value, output): logger.info('DHCP lease obtained logged in console') if ip in output: @@ -342,6 +370,11 @@ class SimpleHealthCheck(OSIntegrationTestCase): logger.error('With incorrect IP address') break + if not found: + logger.error('Full console output -\n' + full_log) + else: + logger.debug('Full console output -\n' + full_log) + self.assertTrue(found) @@ -366,21 +399,44 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase): router_name=guid + '-pub-router', external_net=self.ext_net_name) # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.flavor_creator = None - self.net_creator = None + self.network_creator = None self.inst_creator = None try: # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # Set any custom parameters sent from the app + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() # Create Flavor self.flavor_creator = OpenStackFlavor( self.admin_os_creds, - FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2)) + FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata)) self.flavor_creator.create() # Create Network @@ -410,15 +466,17 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase): except Exception as e: logger.error('Unexpected exception cleaning flavor with message - ' + e.message) - if self.net_creator: + if self.network_creator: try: - self.net_creator.clean() + self.network_creator.clean() except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.image_creators: try: - self.image_creator.clean() + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) @@ -432,7 +490,7 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase): port_settings=[self.port_settings]) self.inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings) + self.os_creds, instance_settings, self.image_creators[-1].image_settings) vm_inst = self.inst_creator.create() self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name))) @@ -469,7 +527,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): self.floating_ip_name = guid + 'fip1' # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.network_creator = None self.router_creator = None self.flavor_creator = None @@ -483,8 +541,31 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): try: # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # Set any custom parameters sent from the app + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() # Create Network self.network_creator = OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings) @@ -497,7 +578,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): # Create Flavor self.flavor_creator = OpenStackFlavor( self.admin_os_creds, - FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2)) + FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata)) self.flavor_creator.create() self.keypair_creator = OpenStackKeypair( @@ -549,9 +630,11 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.image_creators: try: - self.image_creator.clean() + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) @@ -574,7 +657,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): router_name=self.pub_net_config.router_settings.name)]) inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings, + self.os_creds, instance_settings, self.image_creators[-1].image_settings, keypair_settings=self.keypair_creator.keypair_settings) self.inst_creators.append(inst_creator) vm_inst = inst_creator.create() @@ -597,7 +680,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): router_name=self.pub_net_config.router_settings.name)]) inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings, + self.os_creds, instance_settings, self.image_creators[-1].image_settings, keypair_settings=self.keypair_creator.keypair_settings) self.inst_creators.append(inst_creator) vm_inst = inst_creator.create() @@ -606,7 +689,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): self.assertTrue(inst_creator.vm_active(block=True)) self.assertEquals(vm_inst, inst_creator.get_vm_inst()) - validate_ssh_client(inst_creator) + self.assertTrue(validate_ssh_client(inst_creator)) def test_ssh_client_fip_after_active(self): """ @@ -622,7 +705,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): router_name=self.pub_net_config.router_settings.name)]) inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings, + self.os_creds, instance_settings, self.image_creators[-1].image_settings, keypair_settings=self.keypair_creator.keypair_settings) self.inst_creators.append(inst_creator) @@ -633,7 +716,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): self.assertTrue(inst_creator.vm_active(block=True)) self.assertEquals(vm_inst, inst_creator.get_vm_inst()) - validate_ssh_client(inst_creator) + self.assertTrue(validate_ssh_client(inst_creator)) # TODO - Determine how allowed_address_pairs is supposed to operate before continuing this test # see http://docs.openstack.org/developer/dragonflow/specs/allowed_address_pairs.html for a functional description @@ -651,7 +734,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): # router_name=self.pub_net_config.router_settings.name)]) # # inst_creator_1 = OpenStackVmInstance( - # self.os_creds, instance_settings_1, self.image_creator.image_settings, + # self.os_creds, instance_settings_1, self.image_creators[-1].image_settings, # keypair_settings=self.keypair_creator.keypair_settings) # self.inst_creators.append(inst_creator_1) # @@ -669,7 +752,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): # router_name=self.pub_net_config.router_settings.name)]) # # inst_creator_1 = OpenStackVmInstance( - # self.os_creds, instance_settings_1, self.image_creator.image_settings, + # self.os_creds, instance_settings_1, self.image_creators[-1].image_settings, # keypair_settings=self.keypair_creator.keypair_settings) # self.inst_creators.append(inst_creator_1) # inst_creator_1.create(block=True) @@ -692,7 +775,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): # port_settings=[port_settings_2]) # # inst_creator_2 = OpenStackVmInstance( - # self.os_creds, instance_settings_2, self.image_creator.image_settings) + # self.os_creds, instance_settings_2, self.image_creators[-1].image_settings) # self.inst_creators.append(inst_creator_2) # inst_creator_2.create(block=True) # @@ -710,13 +793,13 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase): # port_settings=[port_settings_3]) # # inst_creator_3 = OpenStackVmInstance( - # self.os_creds, instance_settings_3, self.image_creator.image_settings) + # self.os_creds, instance_settings_3, self.image_creators[-1].image_settings) # self.inst_creators.append(inst_creator_3) # inst_creator_3.create(block=True) # # print 'foo' - # I expected that this feature would block/allow traffic from specific endpoints (VMs). In this case, I would expect - # inst_1 to be able to access inst_2 but not inst_3; however, they all can access each other. + # I expected that this feature would block/allow traffic from specific endpoints (VMs). In this case, I would + # expect inst_1 to be able to access inst_2 but not inst_3; however, they all can access each other. # TODO - Add validation @@ -739,7 +822,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): self.floating_ip_name = guid + 'fip1' # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.network_creator = None self.flavor_creator = None self.inst_creator = None @@ -751,8 +834,31 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): try: # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # Set any custom parameters sent from the app + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() # Create Network self.network_creator = OpenStackNetwork(self.os_creds, self.net_config.network_settings) @@ -761,7 +867,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): # Create Flavor self.flavor_creator = OpenStackFlavor( self.admin_os_creds, - FlavorSettings(name=guid + '-flavor-name', ram=2048, disk=10, vcpus=2)) + FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata)) self.flavor_creator.create() except Exception as e: self.tearDown() @@ -789,9 +895,11 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.image_creators: try: - self.image_creator.clean() + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) @@ -809,7 +917,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) self.inst_creator.create() self.assertEquals(ip, self.inst_creator.get_port_ip( @@ -827,7 +936,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) with self.assertRaises(Exception): self.inst_creator.create() @@ -843,7 +953,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) self.inst_creator.create() self.assertEquals(mac_addr, self.inst_creator.get_port_mac(self.port_1_name)) @@ -860,7 +971,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) self.inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings) + self.os_creds, instance_settings, self.image_creators[-1].image_settings) with self.assertRaises(Exception): self.inst_creator.create() @@ -878,7 +989,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) self.inst_creator.create() self.assertEquals(ip, self.inst_creator.get_port_ip( @@ -898,7 +1010,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) self.inst_creator.create() port = self.inst_creator.get_port_by_name(port_settings.name) @@ -923,7 +1036,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) with self.assertRaises(Exception): self.inst_creator.create() @@ -943,12 +1057,13 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) with self.assertRaises(Exception): self.inst_creator.create() -class CreateInstanceOnComputeHost(OSComponentTestCase): +class CreateInstanceOnComputeHost(OSIntegrationTestCase): """ Test for the CreateInstance where one VM is deployed to each compute node """ @@ -958,12 +1073,14 @@ class CreateInstanceOnComputeHost(OSComponentTestCase): Instantiates the CreateImage object that is responsible for downloading and creating an OS image file within OpenStack """ + super(self.__class__, self).__start__() + guid = self.__class__.__name__ + '-' + str(uuid.uuid4()) self.vm_inst_name = guid + '-inst' self.port_base_name = guid + 'port' # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.flavor_creator = None self.network_creator = None self.inst_creators = list() @@ -975,18 +1092,41 @@ class CreateInstanceOnComputeHost(OSComponentTestCase): try: # Create Network - self.network_creator = OpenStackNetwork(self.os_creds, self.priv_net_config.network_settings) + self.network_creator = OpenStackNetwork(self.admin_os_creds, self.priv_net_config.network_settings) self.network_creator.create() # Create Flavor self.flavor_creator = OpenStackFlavor( - self.os_creds, - FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1)) + self.admin_os_creds, + FlavorSettings(name=guid + '-flavor-name', ram=512, disk=1, vcpus=1, metadata=self.flavor_metadata)) self.flavor_creator.create() # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # Set any custom parameters sent from the app + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() except Exception as e: self.tearDown() @@ -1014,18 +1154,22 @@ class CreateInstanceOnComputeHost(OSComponentTestCase): except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.image_creators: try: - self.image_creator.clean() + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) + super(self.__class__, self).__clean__() + def test_deploy_vm_to_each_compute_node(self): """ Tests the creation of OpenStack VM instances to each compute node. """ from snaps.openstack.utils import nova_utils - nova = nova_utils.nova_client(self.os_creds) + nova = nova_utils.nova_client(self.admin_os_creds) zones = nova_utils.get_nova_availability_zones(nova) # Create Instance on each server/zone @@ -1040,7 +1184,7 @@ class CreateInstanceOnComputeHost(OSComponentTestCase): name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone, port_settings=[port_settings]) inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings) + self.admin_os_creds, instance_settings, self.image_creators[-1].image_settings) self.inst_creators.append(inst_creator) inst_creator.create() @@ -1070,7 +1214,7 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase): super(self.__class__, self).__start__() # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.network_creators = list() self.router_creators = list() self.flavor_creator = None @@ -1096,8 +1240,31 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase): try: # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # Set any custom parameters sent from the app + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() # First network is public self.network_creators.append(OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings)) @@ -1116,7 +1283,8 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase): # Create Flavor self.flavor_creator = OpenStackFlavor( self.admin_os_creds, - FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2)) + FlavorSettings(name=self.guid + '-flavor-name', ram=512, disk=10, vcpus=2, + metadata=self.flavor_metadata)) self.flavor_creator.create() # Create Keypair @@ -1169,9 +1337,11 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase): except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.image_creators: try: - self.image_creator.clean() + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) @@ -1203,7 +1373,7 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase): router_name=self.pub_net_config.router_settings.name)]) self.inst_creator = OpenStackVmInstance( - self.os_creds, instance_settings, self.image_creator.image_settings, + self.os_creds, instance_settings, self.image_creators[-1].image_settings, keypair_settings=self.keypair_creator.keypair_settings) vm_inst = self.inst_creator.create(block=True) @@ -1250,7 +1420,7 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): router_name=self.guid + '-pub-router', external_net=self.ext_net_name) # Initialize for tearDown() - self.image_creator = None + self.image_creators = list() self.flavor_creator = None self.network_creator = None self.router_creator = None @@ -1259,8 +1429,31 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): try: # Create Image - self.image_creator = OpenStackImage(self.os_creds, self.os_image_settings) - self.image_creator.create() + # Set any custom parameters sent from the app + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + self.os_image_settings.url = self.image_metadata['disk_url'] + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + self.os_image_settings.extra_properties = self.image_metadata['extra_properties'] + + # If this is a 3-part image create the kernel and ramdisk images first + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_kernel', url=self.image_metadata['kernel_url']) + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['kernel_id'] = kernel_image.id + + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.os_image_settings.name+'_ramdisk', url=self.image_metadata['ramdisk_url']) + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.os_image_settings.extra_properties['ramdisk_id'] = ramdisk_image.id + + self.image_creators.append(OpenStackImage(self.os_creds, self.os_image_settings)) + self.image_creators[-1].create() # Create Network self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings) @@ -1269,7 +1462,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): # Create Flavor self.flavor_creator = OpenStackFlavor( self.admin_os_creds, - FlavorSettings(name=self.guid + '-flavor-name', ram=2048, disk=10, vcpus=2)) + FlavorSettings(name=self.guid + '-flavor-name', ram=128, disk=10, vcpus=2, + metadata=self.flavor_metadata)) self.flavor_creator.create() self.port_settings = PortSettings(name=self.guid + '-port', @@ -1306,9 +1500,11 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): except Exception as e: logger.error('Unexpected exception cleaning network with message - ' + e.message) - if self.image_creator: + if self.image_creators: try: - self.image_creator.clean() + while self.image_creators: + self.image_creators[-1].clean() + self.image_creators.pop() except Exception as e: logger.error('Unexpected exception cleaning image with message - ' + e.message) @@ -1321,7 +1517,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): # Create instance instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) vm_inst = self.inst_creator.create(block=True) self.assertIsNotNone(vm_inst) @@ -1347,7 +1544,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): # Create instance instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) vm_inst = self.inst_creator.create(block=True) self.assertIsNotNone(vm_inst) @@ -1381,7 +1579,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) vm_inst = self.inst_creator.create(block=True) self.assertIsNotNone(vm_inst) @@ -1407,7 +1606,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): # Create instance instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) vm_inst = self.inst_creator.create(block=True) self.assertIsNotNone(vm_inst) @@ -1434,7 +1634,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase): instance_settings = VmInstanceSettings( name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, security_group_names=[sec_grp_settings.name], port_settings=[self.port_settings]) - self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, self.image_creator.image_settings) + self.inst_creator = OpenStackVmInstance(self.os_creds, instance_settings, + self.image_creators[-1].image_settings) vm_inst = self.inst_creator.create(block=True) self.assertIsNotNone(vm_inst) @@ -1487,3 +1688,152 @@ def validate_ssh_client(instance_creator): return True return False + + +class CreateInstanceFromThreePartImage(OSIntegrationTestCase): + """ + Test for the CreateInstance class for creating an image from a 3-part image + """ + + def setUp(self): + """ + Instantiates the CreateImage object that is responsible for downloading and creating an OS image file + within OpenStack + """ + super(self.__class__, self).__start__() + + guid = self.__class__.__name__ + '-' + str(uuid.uuid4()) + self.image_name = guid + self.vm_inst_name = guid + '-inst' + self.nova = nova_utils.nova_client(self.os_creds) + + net_config = openstack_tests.get_priv_net_config( + net_name=guid + '-pub-net', subnet_name=guid + '-pub-subnet', + router_name=guid + '-pub-router', external_net=self.ext_net_name) + + # Initialize for tearDown() + self.image_creators = list() + self.network_creator = None + self.flavor_creator = None + self.inst_creator = None + + try: + # Create Images + # Set properties + properties = {} + if self.image_metadata: + if 'extra_properties' in self.image_metadata and self.image_metadata['extra_properties']: + properties = self.image_metadata['extra_properties'] + + # Create the kernel image + kernel_image_settings = openstack_tests.cirros_url_image( + name=self.image_name+'_kernel', + url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-kernel') + + if self.image_metadata: + if 'kernel_url' in self.image_metadata and self.image_metadata['kernel_url']: + kernel_image_settings.url = self.image_metadata['kernel_url'] + + self.image_creators.append(OpenStackImage(self.os_creds, kernel_image_settings)) + kernel_image = self.image_creators[-1].create() + + # Create the ramdisk image + ramdisk_image_settings = openstack_tests.cirros_url_image( + name=self.image_name+'_ramdisk', + url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-initramfs') + + if self.image_metadata: + if 'ramdisk_url' in self.image_metadata and self.image_metadata['ramdisk_url']: + ramdisk_image_settings.url = self.image_metadata['ramdisk_url'] + + self.image_creators.append(OpenStackImage(self.os_creds, ramdisk_image_settings)) + ramdisk_image = self.image_creators[-1].create() + self.assertIsNotNone(ramdisk_image) + + # Create the main image + os_image_settings = openstack_tests.cirros_url_image( + name=self.image_name, + url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img') + if self.image_metadata: + if 'disk_url' in self.image_metadata and self.image_metadata['disk_url']: + os_image_settings.url = self.image_metadata['disk_url'] + + properties['kernel_id'] = kernel_image.id + properties['ramdisk_id'] = ramdisk_image.id + os_image_settings.extra_properties = properties + self.image_creators.append(OpenStackImage(self.os_creds, os_image_settings)) + created_image = self.image_creators[-1].create() + self.assertIsNotNone(created_image) + + # Create Flavor + self.flavor_creator = OpenStackFlavor( + self.admin_os_creds, + FlavorSettings(name=guid + '-flavor-name', ram=128, disk=10, vcpus=2, metadata=self.flavor_metadata)) + self.flavor_creator.create() + + # Create Network + self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings) + self.network_creator.create() + + self.port_settings = PortSettings(name=guid + '-port', + network_name=net_config.network_settings.name) + except Exception as e: + self.tearDown() + raise e + + def tearDown(self): + """ + Cleans the created object + """ + if self.inst_creator: + try: + self.inst_creator.clean() + except Exception as e: + logger.error('Unexpected exception cleaning VM instance with message - ' + e.message) + + if self.flavor_creator: + try: + self.flavor_creator.clean() + except Exception as e: + logger.error('Unexpected exception cleaning flavor with message - ' + e.message) + + if self.network_creator: + try: + self.network_creator.clean() + except Exception as e: + logger.error('Unexpected exception cleaning network with message - ' + e.message) + + if self.image_creators: + try: + while self.image_creators: + self.image_creators[0].clean() + self.image_creators.pop(0) + except Exception as e: + logger.error('Unexpected exception cleaning image with message - ' + e.message) + + super(self.__class__, self).__clean__() + + def test_create_delete_instance_from_three_part_image(self): + """ + Tests the creation of an OpenStack instance from a 3-part image. + """ + instance_settings = VmInstanceSettings(name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, + port_settings=[self.port_settings]) + + # The last created image is the main image from which we create the instance + self.inst_creator = OpenStackVmInstance( + self.os_creds, instance_settings, self.image_creators[-1].image_settings) + + vm_inst = self.inst_creator.create() + self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name))) + + self.assertTrue(self.inst_creator.vm_active(block=True)) + + # Delete instance + nova_utils.delete_vm_instance(self.nova, vm_inst) + + self.assertTrue(self.inst_creator.vm_deleted(block=True)) + self.assertEquals(0, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name))) + + # Exception should not be thrown + self.inst_creator.clean()