+ def setUp(self):
+ """
+ Instantiates the CreateImage object that is responsible for downloading
+ and creating an OS image file within OpenStack
+ """
+ self.guid = self.__class__.__name__ + '-' + str(uuid.uuid4())
+
+ self.tmpDir = 'tmp/' + str(self.guid)
+ if not os.path.exists(self.tmpDir):
+ os.makedirs(self.tmpDir)
+
+ self.image_name = self.guid + '-image'
+ self.vm_inst_name = self.guid + '-inst'
+ self.port_1_name = self.guid + 'port-1'
+
+ # Initialize for tearDown()
+ self.image_creator = None
+ self.network_creator = None
+ self.flavor_creator = None
+ self.inst_creator = None
+
+ self.priv_net_config = openstack_tests.get_priv_net_config(
+ net_name=self.guid + '-priv-net',
+ subnet_name=self.guid + '-priv-subnet')
+ self.port_settings = PortSettings(
+ name=self.port_1_name,
+ network_name=self.priv_net_config.network_settings.name)
+
+ try:
+ # Download image file
+ self.image_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_IMAGE_URL, self.tmpDir)
+
+ # Create Network
+ self.network_creator = OpenStackNetwork(
+ self.os_creds, self.priv_net_config.network_settings)
+ self.network_creator.create()
+
+ # Create Flavor
+ self.flavor_creator = OpenStackFlavor(
+ self.os_creds,
+ FlavorSettings(
+ name=self.guid + '-flavor-name', ram=128, disk=10,
+ vcpus=1))
+ self.flavor_creator.create()
+ 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 - '
+ '%s', e)
+
+ if self.network_creator:
+ try:
+ self.network_creator.clean()
+ except Exception as e:
+ logger.error(
+ 'Unexpected exception cleaning network with message - %s',
+ e)
+
+ if self.flavor_creator:
+ try:
+ self.flavor_creator.clean()
+ except Exception as e:
+ logger.error(
+ 'Unexpected exception cleaning flavor with message - %s',
+ e)
+
+ if self.image_creator:
+ try:
+ self.image_creator.clean()
+ except Exception as e:
+ logger.error(
+ 'Unexpected exception cleaning image with message - %s', e)
+
+ if os.path.exists(self.tmpDir) and os.path.isdir(self.tmpDir):
+ shutil.rmtree(self.tmpDir)
+
+ def test_inst_from_file_image_simple_flat(self):
+ """
+ Creates a VM instance from a locally sourced file image using simply
+ the 'disk_file' attribute vs. using the 'config' option which
+ completely overrides all image settings
+ :return:
+ """
+ metadata = {'disk_file': self.image_file.name}
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name, image_metadata=metadata)
+ self.assertEqual(self.image_file.name, os_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.image_user)
+ self.assertIsNone(os_image_settings.url)
+ self.assertFalse(os_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.format)
+
+ self.assertIsNone(os_image_settings.kernel_image_settings)
+ self.assertIsNone(os_image_settings.ramdisk_image_settings)
+
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ 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.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_file_image_simple_nested(self):
+ """
+ Creates a VM instance from a locally sourced file image using simply
+ the 'disk_file' attribute under 'cirros' vs. using the 'config' option
+ which completely overrides all image settings
+ :return:
+ """
+ metadata = {'cirros': {'disk_file': self.image_file.name}}
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name, image_metadata=metadata)
+ self.assertEqual(self.image_file.name, os_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.image_user)
+ self.assertIsNone(os_image_settings.url)
+ self.assertFalse(os_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.format)
+
+ self.assertIsNone(os_image_settings.kernel_image_settings)
+ self.assertIsNone(os_image_settings.ramdisk_image_settings)
+
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ 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.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_existing(self):
+ """
+ Creates a VM instance from a image creator that has been configured to
+ use an existing image
+ :return:
+ """
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name)
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ image_settings = self.image_creator.image_settings
+ test_image_creator = OpenStackImage(
+ self.os_creds,
+ ImageSettings(name=image_settings.name,
+ image_user=image_settings.image_user,
+ exists=True))
+ test_image_creator.create()
+ self.assertEqual(self.image_creator.get_image().id,
+ test_image_creator.get_image().id)
+
+ 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,
+ test_image_creator.image_settings)
+ self.inst_creator.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_file_image_complex(self):
+ """
+ Creates a VM instance from a locally sourced file image by overriding
+ the default settings by using a dict() that can be read in by
+ ImageSettings
+ :return:
+ """
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name)
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ metadata = {
+ 'cirros':
+ {'config':
+ {'name': os_image_settings.name,
+ 'image_user': os_image_settings.image_user,
+ 'exists': True}}}
+ test_image_settings = openstack_tests.cirros_image_settings(
+ image_metadata=metadata)
+ test_image = OpenStackImage(self.os_creds, test_image_settings)
+ test_image.create()
+
+ 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,
+ test_image_settings)
+ self.inst_creator.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_file_3part_image_complex(self):
+ """
+ Creates a VM instance from a locally sourced file image by overriding
+ the default settings by using a dict() that can be read in by
+ ImageSettings
+ :return:
+ """
+
+ kernel_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
+ ramdisk_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
+
+ metadata = {
+ 'cirros':
+ {'config':
+ {'name': self.image_name,
+ 'image_user': openstack_tests.CIRROS_USER,
+ 'image_file': self.image_file.name,
+ 'format': openstack_tests.DEFAULT_IMAGE_FORMAT,
+ 'kernel_image_settings':
+ {'name': self.image_name + '-kernel',
+ 'image_user': openstack_tests.CIRROS_USER,
+ 'image_file': kernel_file.name,
+ 'format': openstack_tests.DEFAULT_IMAGE_FORMAT},
+ 'ramdisk_image_settings':
+ {'name': self.image_name + '-ramdisk',
+ 'image_user': openstack_tests.CIRROS_USER,
+ 'image_file': ramdisk_file.name,
+ 'format': openstack_tests.DEFAULT_IMAGE_FORMAT}}}}
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name, image_metadata=metadata)
+ self.assertEqual(self.image_name, os_image_settings.name)
+ self.assertEqual(self.image_file.name, os_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.image_user)
+ self.assertIsNone(os_image_settings.url)
+ self.assertFalse(os_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.format)
+
+ self.assertIsNotNone(os_image_settings.kernel_image_settings)
+ self.assertEqual(self.image_name + '-kernel',
+ os_image_settings.kernel_image_settings.name)
+ self.assertEqual(kernel_file.name,
+ os_image_settings.kernel_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.kernel_image_settings.image_user)
+ self.assertIsNone(os_image_settings.kernel_image_settings.url)
+ self.assertFalse(os_image_settings.kernel_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.kernel_image_settings.format)
+
+ self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
+ self.assertEqual(self.image_name + '-ramdisk',
+ os_image_settings.ramdisk_image_settings.name)
+ self.assertEqual(ramdisk_file.name,
+ os_image_settings.ramdisk_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.ramdisk_image_settings.image_user)
+ self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
+ self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.ramdisk_image_settings.format)
+
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ 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.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_file_3part_image_simple_flat(self):
+ """
+ Creates a VM instance from a 3-part image locally sourced from file
+ images using simply the 'disk_file', 'kernel_file', and 'ramdisk_file'
+ attributes vs. using the 'config' option which completely overrides all
+ image settings
+ :return:
+ """
+ kernel_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
+ ramdisk_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
+
+ metadata = {'disk_file': self.image_file.name,
+ 'kernel_file': kernel_file.name,
+ 'ramdisk_file': ramdisk_file.name}
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name, image_metadata=metadata)
+
+ self.assertEqual(self.image_name, os_image_settings.name)
+ self.assertEqual(self.image_file.name, os_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.image_user)
+ self.assertIsNone(os_image_settings.url)
+ self.assertFalse(os_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.format)
+
+ self.assertIsNotNone(os_image_settings.kernel_image_settings)
+ self.assertEqual(self.image_name + '-kernel',
+ os_image_settings.kernel_image_settings.name)
+ self.assertEqual(kernel_file.name,
+ os_image_settings.kernel_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.kernel_image_settings.image_user)
+ self.assertIsNone(os_image_settings.kernel_image_settings.url)
+ self.assertFalse(os_image_settings.kernel_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.kernel_image_settings.format)
+
+ self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
+ self.assertEqual(self.image_name + '-ramdisk',
+ os_image_settings.ramdisk_image_settings.name)
+ self.assertEqual(ramdisk_file.name,
+ os_image_settings.ramdisk_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.ramdisk_image_settings.image_user)
+ self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
+ self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.ramdisk_image_settings.format)
+
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ self.assertIsNotNone(self.image_creator.get_kernel_image())
+ self.assertIsNotNone(self.image_creator.get_ramdisk_image())
+
+ 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.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_file_3part_image_simple_nested(self):
+ """
+ Creates a VM instance from a 3-part image locally sourced from file
+ images using simply the 'disk_file', 'kernel_file', and 'ramdisk_file'
+ attributes under 'cirros' vs. using the 'config' option which
+ completely overrides all image settings
+ :return:
+ """
+ kernel_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
+ ramdisk_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
+
+ metadata = {'cirros': {'disk_file': self.image_file.name,
+ 'kernel_file': kernel_file.name,
+ 'ramdisk_file': ramdisk_file.name}}
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name, image_metadata=metadata)
+
+ self.assertEqual(self.image_name, os_image_settings.name)
+ self.assertEqual(self.image_file.name, os_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.image_user)
+ self.assertIsNone(os_image_settings.url)
+ self.assertFalse(os_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.format)
+
+ self.assertIsNotNone(os_image_settings.kernel_image_settings)
+ self.assertEqual(self.image_name + '-kernel',
+ os_image_settings.kernel_image_settings.name)
+ self.assertEqual(kernel_file.name,
+ os_image_settings.kernel_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.kernel_image_settings.image_user)
+ self.assertIsNone(os_image_settings.kernel_image_settings.url)
+ self.assertFalse(os_image_settings.kernel_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.kernel_image_settings.format)
+
+ self.assertIsNotNone(os_image_settings.ramdisk_image_settings)
+ self.assertEqual(self.image_name + '-ramdisk',
+ os_image_settings.ramdisk_image_settings.name)
+ self.assertEqual(ramdisk_file.name,
+ os_image_settings.ramdisk_image_settings.image_file)
+ self.assertEqual(openstack_tests.CIRROS_USER,
+ os_image_settings.ramdisk_image_settings.image_user)
+ self.assertIsNone(os_image_settings.ramdisk_image_settings.url)
+ self.assertFalse(os_image_settings.ramdisk_image_settings.exists)
+ self.assertEqual(openstack_tests.DEFAULT_IMAGE_FORMAT,
+ os_image_settings.ramdisk_image_settings.format)
+
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ self.assertIsNotNone(self.image_creator.get_kernel_image())
+ self.assertIsNotNone(self.image_creator.get_ramdisk_image())
+
+ 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.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+ def test_inst_from_file_3part_image_existing(self):
+ """
+ Creates a VM instance from a 3-part image that is existing
+ :return:
+ """
+ kernel_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_KERNEL_IMAGE_URL, self.tmpDir)
+ ramdisk_file = file_utils.download(
+ openstack_tests.CIRROS_DEFAULT_RAMDISK_IMAGE_URL, self.tmpDir)
+
+ metadata = {'cirros': {'disk_file': self.image_file.name,
+ 'kernel_file': kernel_file.name,
+ 'ramdisk_file': ramdisk_file.name}}
+
+ os_image_settings = openstack_tests.cirros_image_settings(
+ name=self.image_name, image_metadata=metadata)
+ self.image_creator = OpenStackImage(self.os_creds, os_image_settings)
+ self.image_creator.create()
+
+ image_settings = self.image_creator.image_settings
+ test_image_creator = OpenStackImage(
+ self.os_creds,
+ ImageSettings(name=image_settings.name,
+ image_user=image_settings.image_user,
+ exists=True))
+ test_image_creator.create()
+ self.assertEqual(self.image_creator.get_image().id,
+ test_image_creator.get_image().id)
+
+ 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,
+ test_image_creator.image_settings)
+ self.inst_creator.create()
+
+ self.assertTrue(self.inst_creator.vm_active(block=True))
+
+
+def check_dhcp_lease(nova_client, vm_domain, ip, timeout=160):
+ """
+ Returns true if the expected DHCP lease has been acquired
+ :param nova_client: the nova client
+ :param vm_domain: the SNAPS VM instance domain object
+ :param ip: the IP address to look for
+ :param timeout: how long to query for IP address
+ :return:
+ """
+ found = False
+ start_time = time.time()
+
+ logger.info("Looking for IP %s in the console log" % ip)
+ full_log = ''
+ while timeout > time.time() - start_time:
+ vm = nova_utils.get_latest_server_os_object(nova_client, vm_domain)
+ output = vm.get_console_output()
+ full_log = full_log + output
+ if re.search(ip, output):
+ logger.info('DHCP lease obtained logged in console')
+ found = True
+ break
+
+ if not found:
+ logger.error('Full console output -\n' + full_log)
+ else:
+ logger.debug('Full console output -\n' + full_log)
+
+ return found