Merge "Check for kernel_url and ramdisk_url keys in dict"
[snaps.git] / snaps / openstack / tests / create_instance_tests.py
index 1daf701..2cb1cdc 100644 (file)
@@ -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.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'
 
 
 __author__ = 'spisarski'
 
@@ -243,7 +243,7 @@ class SimpleHealthCheck(OSIntegrationTestCase):
         self.floating_ip_name = guid + 'fip1'
 
         # Initialize for tearDown()
         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
         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)
 
         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')
 
         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:
         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)
 
             # 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,
             # 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()
             self.flavor_creator.create()
         except Exception as e:
             self.tearDown()
@@ -292,18 +315,14 @@ class SimpleHealthCheck(OSIntegrationTestCase):
         if self.flavor_creator:
             try:
                 self.flavor_creator.clean()
         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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
@@ -317,7 +336,8 @@ class SimpleHealthCheck(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[self.port_settings])
 
         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)
         vm = self.inst_creator.create()
 
         ip = self.inst_creator.get_port_ip(self.port_settings.name)
@@ -331,8 +351,10 @@ class SimpleHealthCheck(OSIntegrationTestCase):
         match_value = 'Lease of.*obtained'
 
         logger.info("Looking for expression %s in the console log" % match_value)
         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()
         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:
             if re.search(match_value, output):
                 logger.info('DHCP lease obtained logged in console')
                 if ip in output:
@@ -342,6 +364,11 @@ class SimpleHealthCheck(OSIntegrationTestCase):
                     logger.error('With incorrect IP address')
                 break
 
                     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)
 
 
         self.assertTrue(found)
 
 
@@ -366,7 +393,7 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase):
             router_name=guid + '-pub-router', external_net=self.ext_net_name)
 
         # Initialize for tearDown()
             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.flavor_creator = None
 
         self.net_creator = None
@@ -374,13 +401,36 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase):
 
         try:
             # Create Image
 
         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,
 
             # 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
             self.flavor_creator.create()
 
             # Create Network
@@ -416,9 +466,11 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
@@ -432,7 +484,7 @@ class CreateInstanceSimpleTests(OSIntegrationTestCase):
                                                port_settings=[self.port_settings])
 
         self.inst_creator = OpenStackVmInstance(
                                                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)))
 
         vm_inst = self.inst_creator.create()
         self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
@@ -469,7 +521,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
         self.floating_ip_name = guid + 'fip1'
 
         # Initialize for tearDown()
         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
         self.network_creator = None
         self.router_creator = None
         self.flavor_creator = None
@@ -483,8 +535,31 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
 
         try:
             # Create Image
 
         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)
 
             # Create Network
             self.network_creator = OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings)
@@ -497,7 +572,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
             # 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(
             self.flavor_creator.create()
 
             self.keypair_creator = OpenStackKeypair(
@@ -549,9 +624,11 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
@@ -574,7 +651,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
                 router_name=self.pub_net_config.router_settings.name)])
 
         inst_creator = OpenStackVmInstance(
                 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()
             keypair_settings=self.keypair_creator.keypair_settings)
         self.inst_creators.append(inst_creator)
         vm_inst = inst_creator.create()
@@ -597,7 +674,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
                 router_name=self.pub_net_config.router_settings.name)])
 
         inst_creator = OpenStackVmInstance(
                 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()
             keypair_settings=self.keypair_creator.keypair_settings)
         self.inst_creators.append(inst_creator)
         vm_inst = inst_creator.create()
@@ -606,7 +683,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
         self.assertTrue(inst_creator.vm_active(block=True))
         self.assertEquals(vm_inst, inst_creator.get_vm_inst())
 
         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):
         """
 
     def test_ssh_client_fip_after_active(self):
         """
@@ -622,7 +699,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
                 router_name=self.pub_net_config.router_settings.name)])
 
         inst_creator = OpenStackVmInstance(
                 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)
 
             keypair_settings=self.keypair_creator.keypair_settings)
         self.inst_creators.append(inst_creator)
 
@@ -633,7 +710,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
         self.assertTrue(inst_creator.vm_active(block=True))
         self.assertEquals(vm_inst, inst_creator.get_vm_inst())
 
         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
 
     # 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 +728,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
     #             router_name=self.pub_net_config.router_settings.name)])
     #
     #     inst_creator_1 = OpenStackVmInstance(
     #             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)
     #
     #         keypair_settings=self.keypair_creator.keypair_settings)
     #     self.inst_creators.append(inst_creator_1)
     #
@@ -669,7 +746,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
     #             router_name=self.pub_net_config.router_settings.name)])
     #
     #     inst_creator_1 = OpenStackVmInstance(
     #             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)
     #         keypair_settings=self.keypair_creator.keypair_settings)
     #     self.inst_creators.append(inst_creator_1)
     #     inst_creator_1.create(block=True)
@@ -692,7 +769,7 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
     #         port_settings=[port_settings_2])
     #
     #     inst_creator_2 = OpenStackVmInstance(
     #         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)
     #
     #     self.inst_creators.append(inst_creator_2)
     #     inst_creator_2.create(block=True)
     #
@@ -710,13 +787,13 @@ class CreateInstanceSingleNetworkTests(OSIntegrationTestCase):
     #         port_settings=[port_settings_3])
     #
     #     inst_creator_3 = OpenStackVmInstance(
     #         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'
     #     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
 
 
     # TODO - Add validation
 
 
@@ -739,7 +816,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         self.floating_ip_name = guid + 'fip1'
 
         # Initialize for tearDown()
         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
         self.network_creator = None
         self.flavor_creator = None
         self.inst_creator = None
@@ -751,8 +828,31 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
 
         try:
             # Create Image
 
         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)
 
             # Create Network
             self.network_creator = OpenStackNetwork(self.os_creds, self.net_config.network_settings)
@@ -761,7 +861,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
             # 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()
             self.flavor_creator.create()
         except Exception as e:
             self.tearDown()
@@ -789,9 +889,11 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
@@ -809,7 +911,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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(
         self.inst_creator.create()
 
         self.assertEquals(ip, self.inst_creator.get_port_ip(
@@ -827,7 +930,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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()
 
         with self.assertRaises(Exception):
             self.inst_creator.create()
@@ -843,7 +947,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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))
         self.inst_creator.create()
 
         self.assertEquals(mac_addr, self.inst_creator.get_port_mac(self.port_1_name))
@@ -860,7 +965,7 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         self.inst_creator = OpenStackVmInstance(
             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()
 
         with self.assertRaises(Exception):
             self.inst_creator.create()
@@ -878,7 +983,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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(
         self.inst_creator.create()
 
         self.assertEquals(ip, self.inst_creator.get_port_ip(
@@ -898,7 +1004,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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)
         self.inst_creator.create()
 
         port = self.inst_creator.get_port_by_name(port_settings.name)
@@ -923,7 +1030,8 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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()
 
         with self.assertRaises(Exception):
             self.inst_creator.create()
 
@@ -943,12 +1051,13 @@ class CreateInstancePortManipulationTests(OSIntegrationTestCase):
         instance_settings = VmInstanceSettings(
             name=self.vm_inst_name, flavor=self.flavor_creator.flavor_settings.name, port_settings=[port_settings])
 
         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()
 
 
         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
     """
     """
     Test for the CreateInstance where one VM is deployed to each compute node
     """
@@ -958,12 +1067,14 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
         Instantiates the CreateImage object that is responsible for downloading and creating an OS image file
         within OpenStack
         """
         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()
         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()
         self.flavor_creator = None
         self.network_creator = None
         self.inst_creators = list()
@@ -975,18 +1086,41 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
 
         try:
             # Create Network
 
         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.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.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()
 
         except Exception as e:
             self.tearDown()
@@ -1014,18 +1148,22 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             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
     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
         zones = nova_utils.get_nova_availability_zones(nova)
 
         # Create Instance on each server/zone
@@ -1040,7 +1178,7 @@ class CreateInstanceOnComputeHost(OSComponentTestCase):
                 name=inst_name, flavor=self.flavor_creator.flavor_settings.name, availability_zone=zone,
                 port_settings=[port_settings])
             inst_creator = OpenStackVmInstance(
                 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()
 
             self.inst_creators.append(inst_creator)
             inst_creator.create()
 
@@ -1070,7 +1208,7 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
         super(self.__class__, self).__start__()
 
         # Initialize for tearDown()
         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
         self.network_creators = list()
         self.router_creators = list()
         self.flavor_creator = None
@@ -1096,8 +1234,31 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
 
         try:
             # Create Image
 
         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))
 
             # First network is public
             self.network_creators.append(OpenStackNetwork(self.os_creds, self.pub_net_config.network_settings))
@@ -1116,7 +1277,8 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
             # 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
             self.flavor_creator.create()
 
             # Create Keypair
@@ -1169,9 +1331,11 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
@@ -1203,7 +1367,7 @@ class CreateInstancePubPrivNetTests(OSIntegrationTestCase):
                 router_name=self.pub_net_config.router_settings.name)])
 
         self.inst_creator = OpenStackVmInstance(
                 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)
             keypair_settings=self.keypair_creator.keypair_settings)
 
         vm_inst = self.inst_creator.create(block=True)
@@ -1250,7 +1414,7 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase):
             router_name=self.guid + '-pub-router', external_net=self.ext_net_name)
 
         # Initialize for tearDown()
             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
         self.flavor_creator = None
         self.network_creator = None
         self.router_creator = None
@@ -1259,8 +1423,31 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase):
 
         try:
             # Create Image
 
         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)
 
             # Create Network
             self.network_creator = OpenStackNetwork(self.os_creds, net_config.network_settings)
@@ -1269,7 +1456,8 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase):
             # Create Flavor
             self.flavor_creator = OpenStackFlavor(
                 self.admin_os_creds,
             # 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',
             self.flavor_creator.create()
 
             self.port_settings = PortSettings(name=self.guid + '-port',
@@ -1306,9 +1494,11 @@ class InstanceSecurityGroupTests(OSIntegrationTestCase):
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning network with message - ' + e.message)
 
-        if self.image_creator:
+        if self.image_creators:
             try:
             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)
 
             except Exception as e:
                 logger.error('Unexpected exception cleaning image with message - ' + e.message)
 
@@ -1321,7 +1511,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])
         # 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)
 
         vm_inst = self.inst_creator.create(block=True)
         self.assertIsNotNone(vm_inst)
 
@@ -1347,7 +1538,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])
         # 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)
 
         vm_inst = self.inst_creator.create(block=True)
         self.assertIsNotNone(vm_inst)
 
@@ -1381,7 +1573,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])
         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)
 
         vm_inst = self.inst_creator.create(block=True)
         self.assertIsNotNone(vm_inst)
 
@@ -1407,7 +1600,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])
         # 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)
 
         vm_inst = self.inst_creator.create(block=True)
         self.assertIsNotNone(vm_inst)
 
@@ -1434,7 +1628,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])
         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)
 
         vm_inst = self.inst_creator.create(block=True)
         self.assertIsNotNone(vm_inst)
 
@@ -1518,33 +1713,56 @@ class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
 
         try:
             # Create Images
 
         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
             # Create the kernel image
-            kernel_image_settings = openstack_tests.cirros_url_image(name=self.image_name+'_kernel',
+            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')
                 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
             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',
+            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')
                 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
             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,
+            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')
                 url='http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img')
-            properties = {}
+            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()
             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,
 
             # 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
             self.flavor_creator.create()
 
             # Create Network
@@ -1603,6 +1821,8 @@ class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
         vm_inst = self.inst_creator.create()
         self.assertEquals(1, len(nova_utils.get_servers_by_name(self.nova, instance_settings.name)))
 
         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)
 
         # Delete instance
         nova_utils.delete_vm_instance(self.nova, vm_inst)
 
@@ -1611,4 +1831,3 @@ class CreateInstanceFromThreePartImage(OSIntegrationTestCase):
 
         # Exception should not be thrown
         self.inst_creator.clean()
 
         # Exception should not be thrown
         self.inst_creator.clean()
-