def test_tar_untar(self): """Output OVF to OVA and vice versa.""" # Read OVF and write to OVA ovf = OVF(self.input_ovf, os.path.join(self.temp_dir, "temp.ova")) ovf.write() ovf.destroy() # Read OVA and write to OVF ovf2 = OVF(os.path.join(self.temp_dir, "temp.ova"), os.path.join(self.temp_dir, "input.ovf")) ovf2.write() ovf2.destroy() # Make sure everything propagated over successfully input_dir = os.path.dirname(self.input_ovf) for ext in ['.ovf', '.mf', '.iso', '.vmdk']: if (ext == '.mf' or ext == '.ovf') and sys.hexversion < 0x02070000: # OVF changes due to 2.6 XML handling, and MF changes due to # checksum difference for the OVF print("'{0}' file comparison skipped due to " "old Python version ({1})".format(ext, sys.version)) continue self.assertTrue( filecmp.cmp(os.path.join(input_dir, "input" + ext), os.path.join(self.temp_dir, "input" + ext)), "{0} file changed after OVF->OVA->OVF conversion" .format(ext))
def test_filename_validation(self): """Test class method(s) for filename validation.""" self.assertEqual('.ovf', OVF.detect_type_from_name("/foo/bar/foo.ovf")) self.assertEqual('.ova', OVF.detect_type_from_name("/foo/bar/foo.ova")) # Lazy filenames should be OK too self.assertEqual('.ovf', OVF.detect_type_from_name("/foo/bar/foo.ovf.5.2.2")) self.assertLogged(levelname='WARNING', msg="found '.ovf' in mid-filename; treating as such") self.assertEqual('.ova', OVF.detect_type_from_name("/foo/bar/foo.ova.15.4.T")) self.assertLogged(levelname='WARNING', msg="found '.ova' in mid-filename; treating as such") # Unsupported formats self.assertRaises(ValueUnsupportedError, OVF.detect_type_from_name, "/foo/bar.ovf/baz") self.assertRaises(ValueUnsupportedError, OVF.detect_type_from_name, "/foo/bar.zip")
def test_tar_links(self): """Check that OVA dereferences symlinks and hard links.""" self.staging_dir = tempfile.mkdtemp(prefix="cot_ut_ovfio_stage") shutil.copy(self.input_ovf, self.staging_dir) # Hardlink self.input_vmdk to the staging dir os.link(self.input_vmdk, os.path.join(self.staging_dir, 'input.vmdk')) # Symlink self.input_iso to the staging dir os.symlink(self.input_iso, os.path.join(self.staging_dir, 'input.iso')) ovf = OVF(os.path.join(self.staging_dir, 'input.ovf'), os.path.join(self.temp_dir, 'input.ova')) ovf.write() ovf.destroy() with closing(tarfile.open(os.path.join(self.temp_dir, 'input.ova'), 'r')) as tarf: vmdk = tarf.getmember('input.vmdk') self.assertTrue(vmdk.isfile(), "hardlink was not added as a regular file") self.assertFalse(vmdk.islnk()) iso = tarf.getmember('input.iso') self.assertTrue(iso.isfile(), "symlink was not added as a regular file") self.assertFalse(iso.issym())
def test_set_property(self): """Test cases for set_property() and related methods.""" ovf = OVF(self.input_ovf, self.temp_file) hw = ovf.hardware # InstanceID 1, 'CPU' - entries for 'default' plus two other profiles item = hw.item_dict['1'] self.assertTrue(item.has_profile(None)) self.assertTrue(item.has_profile("2CPU-2GB-1NIC")) self.assertTrue(item.has_profile("4CPU-4GB-3NIC")) # implied by default profile self.assertTrue(item.has_profile("1CPU-1GB-1NIC")) # nonexistent profile self.assertFalse(item.has_profile("nonexistent")) self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, ['1CPU-1GB-1NIC']), '1') self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, ['2CPU-2GB-1NIC']), '2') # value differs between profiles, so get_value returns None self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, ['1CPU-1GB-1NIC', '2CPU-2GB-1NIC']), None) # Set profile 1 to same as default (this is a no-op) item.set_property(ovf.VIRTUAL_QUANTITY, '1', ["1CPU-1GB-1NIC"]) ovf.write() self.check_diff("") # Change profile 1 to same as profile 2 item.set_property(ovf.VIRTUAL_QUANTITY, '2', ["1CPU-1GB-1NIC"]) self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, ['1CPU-1GB-1NIC', '2CPU-2GB-1NIC']), '2') ovf.write() self.check_diff(""" </ovf:Item> - <ovf:Item ovf:configuration="2CPU-2GB-1NIC"> + <ovf:Item ovf:configuration="1CPU-1GB-1NIC 2CPU-2GB-1NIC"> <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits> """) # Change profile 1 back under default item.set_property(ovf.VIRTUAL_QUANTITY, '1', ["1CPU-1GB-1NIC"]) ovf.write() self.check_diff("") # Change profile 2 to fall under default item.set_property(ovf.VIRTUAL_QUANTITY, '1', ["2CPU-2GB-1NIC"]) self.assertTrue(item.has_profile(None)) self.assertTrue(item.has_profile("4CPU-4GB-3NIC")) # implied by default profile self.assertTrue(item.has_profile("1CPU-1GB-1NIC")) self.assertTrue(item.has_profile("2CPU-2GB-1NIC")) # nonexistent profile self.assertFalse(item.has_profile("nonexistent")) self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, ['1CPU-1GB-1NIC', '2CPU-2GB-1NIC']), '1') self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, [None]), '1') self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, [None, '1CPU-1GB-1NIC', '2CPU-2GB-1NIC']), '1') # disjoint sets self.assertEqual(item.get_value(ovf.VIRTUAL_QUANTITY, [None, '1CPU-1GB-1NIC', '2CPU-2GB-1NIC', '4CPU-4GB-3NIC']), None) ovf.write() self.check_diff(""" </ovf:Item> - <ovf:Item ovf:configuration="2CPU-2GB-1NIC"> - <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits> - <rasd:Description>Number of Virtual CPUs</rasd:Description> - <rasd:ElementName>2 virtual CPU(s)</rasd:ElementName> - <rasd:InstanceID>1</rasd:InstanceID> - <rasd:ResourceType>3</rasd:ResourceType> - <rasd:VirtualQuantity>2</rasd:VirtualQuantity> - <vmw:CoresPerSocket ovf:required="false">1</vmw:CoresPerSocket> - </ovf:Item> <ovf:Item ovf:configuration="4CPU-4GB-3NIC"> """) ovf.destroy()