diff --git a/Makefile.am b/Makefile.am
index 9e6dcdc5553ae8f8b76b71bb90c6d58851cabe95..4c70c7846c0e5783bc946711e8f9900b12e35296 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -81,6 +81,7 @@ DIRS = \
 	qa \
 	test \
 	test/data \
+	test/data/ovfdata \
 	tools
 
 BUILDTIME_DIR_AUTOCREATE = \
@@ -640,6 +641,23 @@ TEST_FILES = \
 	test/data/proc_drbd83_sync.txt \
 	test/data/proc_drbd83_sync_krnl2.6.39.txt \
 	test/data/sys_drbd_usermode_helper.txt \
+	test/data/ovfdata/compr_disk.vmdk.gz \
+	test/data/ovfdata/corrupted_resources.ovf \
+	test/data/ovfdata/empty.ovf \
+	test/data/ovfdata/ganeti.mf \
+	test/data/ovfdata/ganeti.ovf \
+	test/data/ovfdata/gzip_disk.ovf \
+	test/data/ovfdata/new_disk.vmdk \
+	test/data/ovfdata/no_disk_in_ref.ovf \
+	test/data/ovfdata/no_ovf.ova \
+	test/data/ovfdata/ova.ova \
+	test/data/ovfdata/second_disk.vmdk \
+	test/data/ovfdata/virtualbox.ovf \
+	test/data/ovfdata/wrong_extension.ovd \
+	test/data/ovfdata/wrong_manifest.mf \
+	test/data/ovfdata/wrong_manifest.ovf \
+	test/data/ovfdata/wrong_ova.ova \
+	test/data/ovfdata/wrong_xml.ovf \
 	test/import-export_unittest-helper
 
 python_tests = \
@@ -674,6 +692,7 @@ python_tests = \
 	test/ganeti.netutils_unittest.py \
 	test/ganeti.objects_unittest.py \
 	test/ganeti.opcodes_unittest.py \
+	test/ganeti.ovf_unittest.py \
 	test/ganeti.qlang_unittest.py \
 	test/ganeti.query_unittest.py \
 	test/ganeti.rapi.baserlib_unittest.py \
diff --git a/test/data/ovfdata/compr_disk.vmdk.gz b/test/data/ovfdata/compr_disk.vmdk.gz
new file mode 100644
index 0000000000000000000000000000000000000000..3fcb2de28f8c875d3066e880085fdc393346d3c7
Binary files /dev/null and b/test/data/ovfdata/compr_disk.vmdk.gz differ
diff --git a/test/data/ovfdata/corrupted_resources.ovf b/test/data/ovfdata/corrupted_resources.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..480de2b28329e18a20f028f7bd1f3db7f3544ccc
--- /dev/null
+++ b/test/data/ovfdata/corrupted_resources.ovf
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Generated by VMware ovftool 2.0.1 (build-260188), User: , UTC time: 2011-08-17T15:12:11.715742Z-->
+<Envelope vmw:buildId="build-260188" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+    <File ovf:href="other_disk.vmdk" ovf:id="file1" ovf:size="761627136"/>
+  </References>
+  <DiskSection>
+    <Info>Virtual disk information</Info>
+    <Disk ovf:capacity="16514" ovf:capacityAllocationUnits="byte * 2^20" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="2042953728"/>
+  </DiskSection>
+  <NetworkSection>
+    <Info>The list of logical networks</Info>
+    <Network ovf:name="bridged">
+      <Description>The bridged network</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="vm">
+    <Info>A virtual machine</Info>
+    <Name>AyertiennaSUSE.x86_64-0.0.2</Name>
+    <OperatingSystemSection ovf:id="83" vmw:osType="suse64Guest">
+      <Info>The kind of installed guest operating system</Info>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>AyertiennaSUSE.x86_64-0.0.2</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>vmx-04</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
+        <rasd:Description>Number of Virtual CPUs</rasd:Description>
+        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:ElementName>512MB of memory</rasd:ElementName>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:VirtualQuantity>512</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>SCSI Controller</rasd:Description>
+        <rasd:ElementName>scsiController0</rasd:ElementName>
+        <rasd:InstanceID>4</rasd:InstanceID>
+        <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
+        <rasd:ResourceType>6</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
+        <rasd:InstanceID>8</rasd:InstanceID>
+        <rasd:Parent>4</rasd:Parent>
+        <rasd:ResourceType>17</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>2</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection>bridged</rasd:Connection>
+        <rasd:Description>E1000 ethernet adapter on &quot;bridged&quot;</rasd:Description>
+        <rasd:ElementName>ethernet0</rasd:ElementName>
+        <rasd:InstanceID>9</rasd:InstanceID>
+        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>
+        <rasd:ResourceType>10</rasd:ResourceType>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
+
diff --git a/test/data/ovfdata/empty.ovf b/test/data/ovfdata/empty.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..b1b05f36415ea8d0e35062747290264c8fd00b90
--- /dev/null
+++ b/test/data/ovfdata/empty.ovf
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+  </References>
+  <DiskSection>
+  </DiskSection>
+  <NetworkSection>
+  </NetworkSection>
+  <VirtualSystem>
+    <Info>A virtual machine</Info>
+    <OperatingSystemSection>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/ganeti.mf b/test/data/ovfdata/ganeti.mf
new file mode 100644
index 0000000000000000000000000000000000000000..107ec2b2599a69315f9ec303b1a6adef613bfaa3
--- /dev/null
+++ b/test/data/ovfdata/ganeti.mf
@@ -0,0 +1,2 @@
+SHA1(ganeti.ovf)= d298200d9044c54b0fde13efaa90e564badc5961
+SHA1(new_disk.vmdk)= 711c48f14c934228b8e117d036c913cdb9d63305
diff --git a/test/data/ovfdata/ganeti.ovf b/test/data/ovfdata/ganeti.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..e664da80dcd306173fe966f61179948e624d9c5e
--- /dev/null
+++ b/test/data/ovfdata/ganeti.ovf
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gnt="http://ganeti">
+  <References>
+    <File ovf:href="new_disk.vmdk" ovf:id="file1"/>
+  </References>
+  <DiskSection>
+    <Info>List of the virtual disks used in the package</Info>
+    <Disk ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+  </DiskSection>
+  <gnt:GanetiSection>
+    <gnt:Version>0</gnt:Version>
+    <gnt:AutoBalance>False</gnt:AutoBalance>
+    <gnt:Tags></gnt:Tags>
+    <gnt:DiskTemplate>plain</gnt:DiskTemplate>
+    <gnt:OperatingSystem>
+      <gnt:Name>lenny-image</gnt:Name>
+    </gnt:OperatingSystem>
+    <gnt:Network>
+      <gnt:Nic ovf:name="routed">
+        <gnt:Mode>bridged</gnt:Mode>
+        <gnt:MACAddress>aa:00:00:d8:2c:1e</gnt:MACAddress>
+        <gnt:IPAddress>none</gnt:IPAddress>
+        <gnt:Link>xen-br0</gnt:Link>
+      </gnt:Nic>
+    </gnt:Network>
+    <gnt:Hypervisor>
+      <gnt:Name>xen-pvm</gnt:Name>
+      <gnt:Parameters>
+        <gnt:root-path>/dev/sda</gnt:root-path>
+        <gnt:kernel_args>ro</gnt:kernel_args>
+      </gnt:Parameters>
+    </gnt:Hypervisor>
+  </gnt:GanetiSection>
+  <NetworkSection>
+    <Info>Logical networks used in the package</Info>
+    <Network ovf:name="routed">
+      <Description>Logical network used by this appliance.</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="New-shiny-instance">
+    <Info>A virtual machine</Info>
+    <Name>ganeti-test-xen</Name>
+    <OperatingSystemSection ovf:id="93">
+      <Info>The kind of installed guest operating system</Info>
+      <Description>Ubuntu</Description>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements for a virtual machine</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>Ubuntu-freshly-created</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:Caption>1 virtual CPU</rasd:Caption>
+        <rasd:ElementName>1 virtual CPU</rasd:ElementName>
+        <rasd:Description>Number of virtual CPUs</rasd:Description>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>2048 MB of memory</rasd:Caption>
+        <rasd:ElementName>2048 MB of memory</rasd:ElementName>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
+        <rasd:VirtualQuantity>2048</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>Ethernet adapter on 'NAT'</rasd:Caption>
+        <rasd:ElementName>Ethernet adapter on 'NAT'</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>10</rasd:ResourceType>
+        <rasd:ResourceSubType>PCNet32</rasd:ResourceSubType>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection></rasd:Connection>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/gzip_disk.ovf b/test/data/ovfdata/gzip_disk.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..44fc5def7eee5effed5987f4e1f8eb288c7bcf55
--- /dev/null
+++ b/test/data/ovfdata/gzip_disk.ovf
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gnt="http://ganeti">
+  <References>
+    <File ovf:href="compr_disk.vmdk.gz"  ovf:compression="gzip" ovf:id="file1"/>
+  </References>
+  <DiskSection>
+    <Info>List of the virtual disks used in the package</Info>
+    <Disk ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+  </DiskSection>
+  <gnt:GanetiSection>
+    <gnt:Version>0</gnt:Version>
+    <gnt:AutoBalance>False</gnt:AutoBalance>
+    <gnt:Tags></gnt:Tags>
+    <gnt:DiskTemplate>plain</gnt:DiskTemplate>
+    <gnt:OperatingSystem>
+      <gnt:Name>lenny-image</gnt:Name>
+    </gnt:OperatingSystem>
+    <gnt:Network>
+      <gnt:Nic ovf:name="routed">
+        <gnt:Mode>bridged</gnt:Mode>
+        <gnt:MACAddress>aa:00:00:d8:2c:1e</gnt:MACAddress>
+        <gnt:IPAddress>none</gnt:IPAddress>
+        <gnt:Link>xen-br0</gnt:Link>
+      </gnt:Nic>
+    </gnt:Network>
+    <gnt:Hypervisor>
+      <gnt:Name>xen-pvm</gnt:Name>
+      <gnt:Parameters>
+        <gnt:root-path>/dev/sda</gnt:root-path>
+        <gnt:kernel_args>ro</gnt:kernel_args>
+      </gnt:Parameters>
+    </gnt:Hypervisor>
+  </gnt:GanetiSection>
+  <NetworkSection>
+    <Info>Logical networks used in the package</Info>
+    <Network ovf:name="routed">
+      <Description>Logical network used by this appliance.</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="New-shiny-instance">
+    <Info>A virtual machine</Info>
+    <Name>ganeti-test-xen</Name>
+    <OperatingSystemSection ovf:id="93">
+      <Info>The kind of installed guest operating system</Info>
+      <Description>Ubuntu</Description>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements for a virtual machine</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>Ubuntu-freshly-created</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:Caption>1 virtual CPU</rasd:Caption>
+        <rasd:ElementName>1 virtual CPU</rasd:ElementName>
+        <rasd:Description>Number of virtual CPUs</rasd:Description>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>2048 MB of memory</rasd:Caption>
+        <rasd:ElementName>2048 MB of memory</rasd:ElementName>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
+        <rasd:VirtualQuantity>2048</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>Ethernet adapter on 'NAT'</rasd:Caption>
+        <rasd:ElementName>Ethernet adapter on 'NAT'</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>10</rasd:ResourceType>
+        <rasd:ResourceSubType>PCNet32</rasd:ResourceSubType>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection></rasd:Connection>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/new_disk.vmdk b/test/data/ovfdata/new_disk.vmdk
new file mode 100644
index 0000000000000000000000000000000000000000..5047100c210107b8c3394099becc933cb59dcb32
Binary files /dev/null and b/test/data/ovfdata/new_disk.vmdk differ
diff --git a/test/data/ovfdata/no_disk_in_ref.ovf b/test/data/ovfdata/no_disk_in_ref.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..1aa8afc9268636561b93fe599664ce54ce0d6489
--- /dev/null
+++ b/test/data/ovfdata/no_disk_in_ref.ovf
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+    <File ovf:href="second_disk.vmdk" ovf:id="file2"/>
+  </References>
+  <DiskSection>
+    <Info>List of the virtual disks used in the package</Info>
+    <Disk ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+    <Disk ovf:diskId="vmdisk2" ovf:fileRef="file2" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+  </DiskSection>
+  <NetworkSection>
+    <Info>Logical networks used in the package</Info>
+    <Network ovf:name="NAT">
+      <Description>Logical network used by this appliance.</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="Ubuntu-freshly-created">
+    <Info>A virtual machine</Info>
+    <OperatingSystemSection ovf:id="93">
+      <Info>The kind of installed guest operating system</Info>
+      <Description>Ubuntu</Description>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements for a virtual machine</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>Ubuntu-freshly-created</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:Caption>1 virtual CPU</rasd:Caption>
+        <rasd:ElementName>1 virtual CPU</rasd:ElementName>
+        <rasd:Description>Number of virtual CPUs</rasd:Description>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>2048 MB of memory</rasd:Caption>
+        <rasd:ElementName>2048 MB of memory</rasd:ElementName>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
+        <rasd:VirtualQuantity>2048</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>ideController0</rasd:Caption>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:InstanceID>3</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+        <rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
+        <rasd:Address>1</rasd:Address>
+      </Item>
+      <Item>
+        <rasd:Caption>Ethernet adapter on 'NAT'</rasd:Caption>
+        <rasd:ElementName>Ethernet adapter on 'NAT'</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>10</rasd:ResourceType>
+        <rasd:ResourceSubType>PCNet32</rasd:ResourceSubType>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection>NAT</rasd:Connection>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>9</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/no_ovf.ova b/test/data/ovfdata/no_ovf.ova
new file mode 100644
index 0000000000000000000000000000000000000000..207b571836f8d8ec6f9886dcf83fb71ac0b25b30
Binary files /dev/null and b/test/data/ovfdata/no_ovf.ova differ
diff --git a/test/data/ovfdata/ova.ova b/test/data/ovfdata/ova.ova
new file mode 100644
index 0000000000000000000000000000000000000000..856de9637663bb897ecc067499a9ae1ab5deda1b
Binary files /dev/null and b/test/data/ovfdata/ova.ova differ
diff --git a/test/data/ovfdata/second_disk.vmdk b/test/data/ovfdata/second_disk.vmdk
new file mode 100644
index 0000000000000000000000000000000000000000..4ba0fffd911afa1bf2fe692dc6cc8f01b4256223
Binary files /dev/null and b/test/data/ovfdata/second_disk.vmdk differ
diff --git a/test/data/ovfdata/virtualbox.ovf b/test/data/ovfdata/virtualbox.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..dba291996efe2bdbfa5b7d1fb7e36cdd9b493b88
--- /dev/null
+++ b/test/data/ovfdata/virtualbox.ovf
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+    <File ovf:href="new_disk.vmdk" ovf:id="file1"/>
+    <File ovf:href="second_disk.vmdk" ovf:id="file2"/>
+  </References>
+  <DiskSection>
+    <Info>List of the virtual disks used in the package</Info>
+    <Disk ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+    <Disk ovf:diskId="vmdisk2" ovf:fileRef="file2" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+  </DiskSection>
+  <NetworkSection>
+    <Info>Logical networks used in the package</Info>
+    <Network ovf:name="bridged">
+      <Description>Logical network used by this appliance.</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="Ubuntu-freshly-created">
+    <Info>A virtual machine</Info>
+    <OperatingSystemSection ovf:id="93">
+      <Info>The kind of installed guest operating system</Info>
+      <Description>Ubuntu</Description>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements for a virtual machine</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>Ubuntu-freshly-created</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:Caption>1 virtual CPU</rasd:Caption>
+        <rasd:ElementName>1 virtual CPU</rasd:ElementName>
+        <rasd:Description>Number of virtual CPUs</rasd:Description>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>2048 MB of memory</rasd:Caption>
+        <rasd:ElementName>2048 MB of memory</rasd:ElementName>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
+        <rasd:VirtualQuantity>2048</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>ideController0</rasd:Caption>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:InstanceID>3</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+        <rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
+        <rasd:Address>1</rasd:Address>
+      </Item>
+      <Item>
+        <rasd:Caption>Ethernet adapter on 'NAT'</rasd:Caption>
+        <rasd:ElementName>Ethernet adapter on 'NAT'</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>10</rasd:ResourceType>
+        <rasd:ResourceSubType>PCNet32</rasd:ResourceSubType>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection>bridged</rasd:Connection>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>9</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/wrong_extension.ovd b/test/data/ovfdata/wrong_extension.ovd
new file mode 100644
index 0000000000000000000000000000000000000000..e1e8709925d3a5ffbb542a578e6ed4d5095d5696
--- /dev/null
+++ b/test/data/ovfdata/wrong_extension.ovd
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Generated by VMware ovftool 2.0.1 (build-260188), User: , UTC time: 2011-08-17T15:12:11.715742Z-->
+<Envelope vmw:buildId="build-260188" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+    <File ovf:href="AyertiennaSUSE.x86_64-0.0.2-disk1.vmdk" ovf:id="file1" ovf:size="761627136"/>
+  </References>
+  <DiskSection>
+    <Info>Virtual disk information</Info>
+    <Disk ovf:capacity="16514" ovf:capacityAllocationUnits="byte * 2^20" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="2042953728"/>
+  </DiskSection>
+  <NetworkSection>
+    <Info>The list of logical networks</Info>
+    <Network ovf:name="bridged">
+      <Description>The bridged network</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="vm">
+    <Info>A virtual machine</Info>
+    <Name>AyertiennaSUSE.x86_64-0.0.2</Name>
+    <OperatingSystemSection ovf:id="83" vmw:osType="suse64Guest">
+      <Info>The kind of installed guest operating system</Info>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>AyertiennaSUSE.x86_64-0.0.2</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>vmx-04</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
+        <rasd:Description>Number of Virtual CPUs</rasd:Description>
+        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:ElementName>512MB of memory</rasd:ElementName>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:VirtualQuantity>512</rasd:VirtualQuantity>
+      </Item>
+      <Item ovf:required="false">
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>USB Controller</rasd:Description>
+        <rasd:ElementName>usb</rasd:ElementName>
+        <rasd:InstanceID>3</rasd:InstanceID>
+        <rasd:ResourceType>23</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>SCSI Controller</rasd:Description>
+        <rasd:ElementName>scsiController0</rasd:ElementName>
+        <rasd:InstanceID>4</rasd:InstanceID>
+        <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
+        <rasd:ResourceType>6</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+      </Item>
+      <Item ovf:required="false">
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:Description>Floppy Drive</rasd:Description>
+        <rasd:ElementName>floppy0</rasd:ElementName>
+        <rasd:InstanceID>6</rasd:InstanceID>
+        <rasd:ResourceType>14</rasd:ResourceType>
+      </Item>
+      <Item ovf:required="false">
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:ElementName>cdrom1</rasd:ElementName>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:Parent>5</rasd:Parent>
+        <rasd:ResourceType>15</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
+        <rasd:InstanceID>8</rasd:InstanceID>
+        <rasd:Parent>4</rasd:Parent>
+        <rasd:ResourceType>17</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>2</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection>bridged</rasd:Connection>
+        <rasd:Description>E1000 ethernet adapter on &quot;bridged&quot;</rasd:Description>
+        <rasd:ElementName>ethernet0</rasd:ElementName>
+        <rasd:InstanceID>9</rasd:InstanceID>
+        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>
+        <rasd:ResourceType>10</rasd:ResourceType>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/wrong_manifest.mf b/test/data/ovfdata/wrong_manifest.mf
new file mode 100644
index 0000000000000000000000000000000000000000..7bd40057436898aa2f7dd7570eaf1fbf77292d68
--- /dev/null
+++ b/test/data/ovfdata/wrong_manifest.mf
@@ -0,0 +1,2 @@
+SHA1(new_disk.vmdk)= 0500304662fb8a6a7925b5a43bc0e05d6a03720d
+SHA1(wrong_manifest.ovf)= 0500304662fb8a6a7965b5a43bc0e05d6a03720d
diff --git a/test/data/ovfdata/wrong_manifest.ovf b/test/data/ovfdata/wrong_manifest.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..6883d737eae9a952a68331c8711e7a2ce8c5f4c4
--- /dev/null
+++ b/test/data/ovfdata/wrong_manifest.ovf
@@ -0,0 +1,98 @@
+<?xml version="1.0"?>
+<Envelope ovf:version="1.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gnt="http://ganeti">
+  <References>
+    <File ovf:href="new_disk.vmdk" ovf:id="file1"/>
+  </References>
+  <DiskSection>
+    <Info>List of the virtual disks used in the package</Info>
+    <Disk ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/specifications/vmdk.html#sparse"/>
+  </DiskSection>
+  <gnt:GanetiSection>
+    <gnt:VersionId>0</gnt:VersionId>
+    <gnt:AutoBalance>False</gnt:AutoBalance>
+    <gnt:Tags></gnt:Tags>
+    <gnt:OS>
+      <gnt:Name>lenny-image</gnt:Name>
+    </gnt:OS>
+    <gnt:Network>
+      <gnt:Mode>bridged</gnt:Mode>
+      <gnt:MACAddress>aa:00:00:d8:2c:1e</gnt:MACAddress>
+      <gnt:IPAddress>None</gnt:IPAddress>
+      <gnt:Link>xen-br0</gnt:Link>
+    </gnt:Network>
+    <gnt:Hypervisor>
+      <gnt:Name>xen-pvm</gnt:Name>
+      <gnt:Parameters>
+        <gnt:root-path>/dev/sda</gnt:root-path>
+        <gnt:kernel_args>ro</gnt:kernel_args>
+      </gnt:Parameters>
+    </gnt:Hypervisor>
+  </gnt:GanetiSection>
+  <NetworkSection>
+    <Info>Logical networks used in the package</Info>
+    <Network ovf:name="bridged network">
+      <Description>Logical network used by this appliance.</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="New-shiny-instance">
+    <Info>A virtual machine</Info>
+    <OperatingSystemSection ovf:id="93">
+      <Info>The kind of installed guest operating system</Info>
+      <Description>Ubuntu</Description>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements for a virtual machine</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>Ubuntu-freshly-created</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:Caption>1 virtual CPU</rasd:Caption>
+        <rasd:ElementName>1 virtual CPU</rasd:ElementName>
+        <rasd:Description>Number of virtual CPUs</rasd:Description>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>2048 MB of memory</rasd:Caption>
+        <rasd:ElementName>2048 MB of memory</rasd:ElementName>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:AllocationUnits>MegaBytes</rasd:AllocationUnits>
+        <rasd:VirtualQuantity>2048</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Caption>ideController0</rasd:Caption>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:InstanceID>3</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+        <rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
+        <rasd:Address>1</rasd:Address>
+      </Item>
+      <Item>
+        <rasd:Caption>Ethernet adapter on 'NAT'</rasd:Caption>
+        <rasd:ElementName>Ethernet adapter on 'NAT'</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>10</rasd:ResourceType>
+        <rasd:ResourceSubType>PCNet32</rasd:ResourceSubType>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection>bridged network</rasd:Connection>
+      </Item>
+      <Item>
+        <rasd:Caption>disk1</rasd:Caption>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:Description>Disk Image</rasd:Description>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:ResourceType>17</rasd:ResourceType>
+        <rasd:HostResource>/disk/vmdisk1</rasd:HostResource>
+        <rasd:Parent>3</rasd:Parent>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/wrong_ova.ova b/test/data/ovfdata/wrong_ova.ova
new file mode 100644
index 0000000000000000000000000000000000000000..e1e8709925d3a5ffbb542a578e6ed4d5095d5696
--- /dev/null
+++ b/test/data/ovfdata/wrong_ova.ova
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Generated by VMware ovftool 2.0.1 (build-260188), User: , UTC time: 2011-08-17T15:12:11.715742Z-->
+<Envelope vmw:buildId="build-260188" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+    <File ovf:href="AyertiennaSUSE.x86_64-0.0.2-disk1.vmdk" ovf:id="file1" ovf:size="761627136"/>
+  </References>
+  <DiskSection>
+    <Info>Virtual disk information</Info>
+    <Disk ovf:capacity="16514" ovf:capacityAllocationUnits="byte * 2^20" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="2042953728"/>
+  </DiskSection>
+  <NetworkSection>
+    <Info>The list of logical networks</Info>
+    <Network ovf:name="bridged">
+      <Description>The bridged network</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="vm">
+    <Info>A virtual machine</Info>
+    <Name>AyertiennaSUSE.x86_64-0.0.2</Name>
+    <OperatingSystemSection ovf:id="83" vmw:osType="suse64Guest">
+      <Info>The kind of installed guest operating system</Info>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>AyertiennaSUSE.x86_64-0.0.2</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>vmx-04</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
+        <rasd:Description>Number of Virtual CPUs</rasd:Description>
+        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:ElementName>512MB of memory</rasd:ElementName>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:VirtualQuantity>512</rasd:VirtualQuantity>
+      </Item>
+      <Item ovf:required="false">
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>USB Controller</rasd:Description>
+        <rasd:ElementName>usb</rasd:ElementName>
+        <rasd:InstanceID>3</rasd:InstanceID>
+        <rasd:ResourceType>23</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>SCSI Controller</rasd:Description>
+        <rasd:ElementName>scsiController0</rasd:ElementName>
+        <rasd:InstanceID>4</rasd:InstanceID>
+        <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
+        <rasd:ResourceType>6</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+      </Item>
+      <Item ovf:required="false">
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:Description>Floppy Drive</rasd:Description>
+        <rasd:ElementName>floppy0</rasd:ElementName>
+        <rasd:InstanceID>6</rasd:InstanceID>
+        <rasd:ResourceType>14</rasd:ResourceType>
+      </Item>
+      <Item ovf:required="false">
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
+        <rasd:ElementName>cdrom1</rasd:ElementName>
+        <rasd:InstanceID>7</rasd:InstanceID>
+        <rasd:Parent>5</rasd:Parent>
+        <rasd:ResourceType>15</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
+        <rasd:InstanceID>8</rasd:InstanceID>
+        <rasd:Parent>4</rasd:Parent>
+        <rasd:ResourceType>17</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>2</rasd:AddressOnParent>
+        <rasd:AutomaticAllocation>true</rasd:AutomaticAllocation>
+        <rasd:Connection>bridged</rasd:Connection>
+        <rasd:Description>E1000 ethernet adapter on &quot;bridged&quot;</rasd:Description>
+        <rasd:ElementName>ethernet0</rasd:ElementName>
+        <rasd:InstanceID>9</rasd:InstanceID>
+        <rasd:ResourceSubType>E1000</rasd:ResourceSubType>
+        <rasd:ResourceType>10</rasd:ResourceType>
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
diff --git a/test/data/ovfdata/wrong_xml.ovf b/test/data/ovfdata/wrong_xml.ovf
new file mode 100644
index 0000000000000000000000000000000000000000..f98b9c84933863238cb1c05c2bfca7f51cf51caa
--- /dev/null
+++ b/test/data/ovfdata/wrong_xml.ovf
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Generated by VMware ovftool 2.0.1 (build-260188), User: , UTC time: 2011-08-17T15:12:11.715742Z-->
+<Envelope vmw:buildId="build-260188" xmlns="http://schemas.dmtf.org/ovf/envelope/1" xmlns:cim="http://schemas.dmtf.org/wbem/wscim/1/common" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1" xmlns:rasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" xmlns:vmw="http://www.vmware.com/schema/ovf" xmlns:vssd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <References>
+    <File ovf:href="AyertiennaSUSE.x86_64-0.0.2-disk1.vmdk" ovf:id="file1" ovf:size="761627136"/>
+  </References>
+  <DiskSection>
+    <Info>Virtual disk information</Info>
+    <Disk ovf:capacity="16514" ovf:capacityAllocationUnits="byte * 2^20" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" ovf:populatedSize="2042953728"/>
+  </DiskSection>
+  <NetworkSection>
+    <Info>The list of logical networks</Info>
+    <Network ovf:name="bridged">
+      <Description>The bridged network</Description>
+    </Network>
+  </NetworkSection>
+  <VirtualSystem ovf:id="vm">
+    <Info>A virtual machine</Info>
+    <Name>AyertiennaSUSE.x86_64-0.0.2</Name>
+    <OperatingSystemSection ovf:id="83" vmw:osType="suse64Guest">
+      <Info>The kind of installed guest operating system</Info>
+    </OperatingSystemSection>
+    <VirtualHardwareSection>
+      <Info>Virtual hardware requirements</Info>
+      <System>
+        <vssd:ElementName>Virtual Hardware Family</vssd:ElementName>
+        <vssd:InstanceID>0</vssd:InstanceID>
+        <vssd:VirtualSystemIdentifier>AyertiennaSUSE.x86_64-0.0.2</vssd:VirtualSystemIdentifier>
+        <vssd:VirtualSystemType>vmx-04</vssd:VirtualSystemType>
+      </System>
+      <Item>
+        <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
+        <rasd:Description>Number of Virtual CPUs</rasd:Description>
+        <rasd:ElementName>1 virtual CPU(s)</rasd:ElementName>
+        <rasd:InstanceID>1</rasd:InstanceID>
+        <rasd:ResourceType>3</rasd:ResourceType>
+        <rasd:VirtualQuantity>1</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
+        <rasd:Description>Memory Size</rasd:Description>
+        <rasd:ElementName>512MB of memory</rasd:ElementName>
+        <rasd:InstanceID>2</rasd:InstanceID>
+        <rasd:ResourceType>4</rasd:ResourceType>
+        <rasd:VirtualQuantity>512</rasd:VirtualQuantity>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>SCSI Controller</rasd:Description>
+        <rasd:ElementName>scsiController0</rasd:ElementName>
+        <rasd:InstanceID>4</rasd:InstanceID>
+        <rasd:ResourceSubType>lsilogic</rasd:ResourceSubType>
+        <rasd:ResourceType>6</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:Address>0</rasd:Address>
+        <rasd:Description>IDE Controller</rasd:Description>
+        <rasd:ElementName>ideController0</rasd:ElementName>
+        <rasd:InstanceID>5</rasd:InstanceID>
+        <rasd:ResourceType>5</rasd:ResourceType>
+      </Item>
+      <Item>
+        <rasd:AddressOnParent>0</rasd:AddressOnParent>
+        <rasd:ElementName>disk1</rasd:ElementName>
+        <rasd:HostResource>ovf:/disk/vmdisk1</rasd:HostResource>
+        <rasd:InstanceID>8</rasd:InstanceID>
+        <rasd:Parent>4</rasd:Parent>
+        <rasd:ResourceType>17</rasd:ResourceType>
+      </Item>
+      <Item
+      </Item>
+    </VirtualHardwareSection>
+  </VirtualSystem>
+</Envelope>
+
diff --git a/test/ganeti.ovf_unittest.py b/test/ganeti.ovf_unittest.py
new file mode 100644
index 0000000000000000000000000000000000000000..e30ac39560fe31b9e1bc2fc14b38fac1bdff2440
--- /dev/null
+++ b/test/ganeti.ovf_unittest.py
@@ -0,0 +1,536 @@
+#!/usr/bin/python
+#
+
+# Copyright (C) 2011 Google Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+
+"""Script for testing ganeti.ovf.
+
+"""
+
+import optparse
+import os
+import os.path
+import re
+import shutil
+import sys
+import tempfile
+import unittest
+
+from ganeti import constants
+from ganeti import errors
+from ganeti import ovf
+from ganeti import utils
+
+import testutils
+
+OUTPUT_DIR = "newdir"
+
+GANETI_DISKS = {
+  "disk_count": "1",
+  "disk0_dump": "new_disk.raw",
+  "disk0_size": "0",
+  "disk0_ivname": "disk/0",
+}
+GANETI_NETWORKS = {
+  "nic_count": "1",
+  "nic0_mode": "bridged",
+  "nic0_ip": "none",
+  "nic0_mac": "aa:00:00:d8:2c:1e",
+  "nic0_link": "xen-br0",
+}
+GANETI_HYPERVISOR = {
+  "hypervisor_name": "xen-pvm",
+  "root-path": "/dev/sda",
+  "kernel_args": "ro",
+}
+GANETI_OS = {"os_name": "lenny-image"}
+GANETI_BACKEND = {
+  "vcpus": "1",
+  "memory" : "2048",
+  "auto_balance": "False",
+}
+GANETI_NAME = "ganeti-test-xen"
+GANETI_TEMPLATE = "plain"
+GANETI_TAGS = None
+GANETI_VERSION = "0"
+
+VIRTUALBOX_DISKS = {
+  "disk_count": "2",
+  "disk0_ivname": "disk/0",
+  "disk0_dump": "new_disk.raw",
+  "disk0_size": "0",
+  "disk1_ivname": "disk/1",
+  "disk1_dump": "second_disk.raw",
+  "disk1_size": "0",
+}
+VIRTUALBOX_NETWORKS = {
+  "nic_count": "1",
+  "nic0_mode": "bridged",
+  "nic0_ip": "none",
+  "nic0_link": "auto",
+  "nic0_mac": "auto",
+}
+VIRTUALBOX_HYPERVISOR = {"hypervisor_name": "auto"}
+VIRTUALBOX_OS = {"os_name": None}
+VIRTUALBOX_BACKEND = {
+ "vcpus": "1",
+  "memory" : "2048",
+  "auto_balance": "auto",
+}
+VIRTUALBOX_NAME = None
+VIRTUALBOX_TEMPLATE = None
+VIRTUALBOX_TAGS = None
+VIRTUALBOX_VERSION = None
+
+EMPTY_DISKS = {}
+EMPTY_NETWORKS = {}
+EMPTY_HYPERVISOR = {"hypervisor_name": "auto"}
+EMPTY_OS = {}
+EMPTY_BACKEND = {
+  "vcpus": "auto",
+  "memory" : "auto",
+  "auto_balance": "auto",
+}
+EMPTY_NAME = None
+EMPTY_TEMPLATE = None
+EMPTY_TAGS = None
+EMPTY_VERSION = None
+
+CMDARGS_DISKS = {
+  "disk_count": "1",
+  "disk0_ivname": "disk/0",
+  "disk0_dump": "disk0.raw",
+  "disk0_size": "8",
+}
+CMDARGS_NETWORKS = {
+  "nic0_link": "auto",
+  "nic0_mode": "bridged",
+  "nic0_ip": "none",
+  "nic0_mac": "auto",
+  "nic_count": "1",
+}
+CMDARGS_HYPERVISOR = {
+  "hypervisor_name": "xen-pvm"
+}
+CMDARGS_OS = {"os_name": "lenny-image"}
+CMDARGS_BACKEND = {
+  "auto_balance": False,
+  "vcpus": "1",
+  "memory": "256",
+}
+CMDARGS_NAME = "test-instance"
+CMDARGS_TEMPLATE = "plain"
+CMDARGS_TAGS = "test-tag-1,test-tag-2"
+
+ARGS_EMPTY = {
+  "output_dir": None,
+  "nics": [],
+  "disks": [],
+  "name": "test-instance",
+}
+ARGS_EXPORT_DIR = dict(ARGS_EMPTY, **{
+  "output_dir": OUTPUT_DIR,
+  "name": None,
+  "hypervisor": None,
+  "os": None,
+  "beparams": {},
+  "no_nics": False,
+  "disk_template": None,
+  "tags": None,
+})
+ARGS_VBOX = dict(ARGS_EXPORT_DIR, **{
+  "output_dir": OUTPUT_DIR,
+  "name": "test-instance",
+  "os": "lenny-image",
+  "hypervisor": ("xen-pvm", {}),
+  "osparams":{},
+  "disks": [],
+})
+ARGS_COMPLETE = dict(ARGS_VBOX, **{
+  "beparams": {"vcpus":"1", "memory":"256", "auto_balance": False},
+  "disks": [(0,{"size":"5mb"})],
+  "nics": [("0",{"mode":"bridged"})],
+  "disk_template": "plain",
+  "tags": "test-tag-1,test-tag-2",
+})
+ARGS_BROKEN = dict(ARGS_EXPORT_DIR , **{
+  "no_nics": True,
+  "disk_template": "diskless",
+  "name": "test-instance",
+  "os": "lenny-image",
+  "osparams": {},
+})
+
+
+def _GetArgs(args, with_name=False):
+  options = optparse.Values()
+  needed = args
+  if with_name:
+    needed["name"] = "test-instance"
+  options._update_loose(needed)
+  return options
+
+
+OPTS_EMPTY = _GetArgs(ARGS_EMPTY)
+OPTS_EXPORT_NO_NAME = _GetArgs(ARGS_EXPORT_DIR)
+OPTS_EXPORT = _GetArgs(ARGS_EXPORT_DIR, with_name=True)
+OPTS_VBOX = _GetArgs(ARGS_VBOX)
+OPTS_COMPLETE = _GetArgs(ARGS_COMPLETE)
+OPTS_NONIC_NODISK = _GetArgs(ARGS_BROKEN)
+
+
+def _GetFullFilename(file_name):
+  file_path = "%s/test/data/ovfdata/%s" % (testutils.GetSourceDir(),
+    file_name)
+  file_path = os.path.abspath(file_path)
+  return file_path
+
+
+class BetterUnitTest(unittest.TestCase):
+  def assertRaisesRegexp(self, exception, regexp_val, function, *args):
+    try:
+      function(*args)
+      self.fail("Expected raising %s" % exception)
+    except exception, err:
+      regexp = re.compile(regexp_val)
+      if re.search(regexp, str(err)) == None:
+        self.fail("Expected matching '%s', got '%s'" %
+          (regexp_val, str(err)))
+
+
+class TestOVFImporter(BetterUnitTest):
+  def setUp(self):
+    self.non_existing_file = _GetFullFilename("not_the_file.ovf")
+    self.ganeti_ovf = _GetFullFilename("ganeti.ovf")
+    self.virtualbox_ovf = _GetFullFilename("virtualbox.ovf")
+    self.ova_package = _GetFullFilename("ova.ova")
+    self.empty_ovf = _GetFullFilename("empty.ovf")
+    self.wrong_extension = _GetFullFilename("wrong_extension.ovd")
+    self.wrong_ova_archive = _GetFullFilename("wrong_ova.ova")
+    self.no_ovf_in_ova = _GetFullFilename("no_ovf.ova")
+    self.importer = None
+
+  def tearDown(self):
+    if self.importer:
+      self.importer.Cleanup()
+    del_dir = os.path.abspath(OUTPUT_DIR)
+    try:
+      shutil.rmtree(del_dir)
+    except OSError:
+      pass
+
+  def testFileDoesNotExistError(self):
+    self.assertRaisesRegexp(errors.OpPrereqError, "does not exist",
+      ovf.OVFImporter, self.non_existing_file, None)
+
+  def testWrongInputFileExtensionError(self):
+    self.assertRaisesRegexp(errors.OpPrereqError,
+      "Unknown file extension", ovf.OVFImporter,
+      self.wrong_extension, None)
+
+  def testOVAUnpackingDirectories(self):
+    self.importer = ovf.OVFImporter(self.ova_package, OPTS_EMPTY)
+    self.assertTrue(self.importer.input_dir != None)
+    self.assertEquals(self.importer.output_dir , constants.EXPORT_DIR)
+    self.assertTrue(self.importer.temp_dir != None)
+
+  def testOVFUnpackingDirectories(self):
+    self.importer = ovf.OVFImporter(self.virtualbox_ovf,
+      OPTS_EMPTY)
+    self.assertEquals(self.importer.input_dir , _GetFullFilename(""))
+    self.assertEquals(self.importer.output_dir , constants.EXPORT_DIR)
+    self.assertEquals(self.importer.temp_dir , None)
+
+  def testOVFSetOutputDirDirectories(self):
+    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
+    self.assertEquals(self.importer.input_dir , _GetFullFilename(""))
+    self.assertTrue(OUTPUT_DIR in self.importer.output_dir)
+    self.assertEquals(self.importer.temp_dir , None)
+
+  def testWrongOVAArchiveError(self):
+    self.assertRaisesRegexp(errors.OpPrereqError, "not a proper tar",
+      ovf.OVFImporter, self.wrong_ova_archive, None)
+
+  def testNoOVFFileInOVAPackageError(self):
+    self.assertRaisesRegexp(errors.OpPrereqError, "No .ovf file",
+      ovf.OVFImporter, self.no_ovf_in_ova, None)
+
+  def testParseGanetiOvf(self):
+    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT_NO_NAME)
+    self.importer.Parse()
+    self.assertTrue("%s/ganeti-test-xen" % OUTPUT_DIR in
+      self.importer.output_dir)
+    self.assertEqual(self.importer.results_disk, GANETI_DISKS)
+    self.assertEqual(self.importer.results_network, GANETI_NETWORKS)
+    self.assertEqual(self.importer.results_hypervisor, GANETI_HYPERVISOR)
+    self.assertEqual(self.importer.results_os, GANETI_OS)
+    self.assertEqual(self.importer.results_backend, GANETI_BACKEND)
+    self.assertEqual(self.importer.results_name, GANETI_NAME)
+    self.assertEqual(self.importer.results_template, GANETI_TEMPLATE)
+    self.assertEqual(self.importer.results_tags, GANETI_TAGS)
+    self.assertEqual(self.importer.results_version, GANETI_VERSION)
+
+  def testParseVirtualboxOvf(self):
+    self.importer = ovf.OVFImporter(self.virtualbox_ovf, OPTS_VBOX)
+    self.importer.Parse()
+    self.assertTrue("%s/test-instance" % OUTPUT_DIR in self.importer.output_dir)
+    self.assertEquals(self.importer.results_disk, VIRTUALBOX_DISKS)
+    self.assertEquals(self.importer.results_network, VIRTUALBOX_NETWORKS)
+    self.assertEquals(self.importer.results_hypervisor, CMDARGS_HYPERVISOR)
+    self.assertEquals(self.importer.results_os, CMDARGS_OS)
+    self.assertEquals(self.importer.results_backend, VIRTUALBOX_BACKEND)
+    self.assertEquals(self.importer.results_name, CMDARGS_NAME)
+    self.assertEquals(self.importer.results_template, VIRTUALBOX_TEMPLATE)
+    self.assertEqual(self.importer.results_tags, VIRTUALBOX_TAGS)
+    self.assertEqual(self.importer.results_version, constants.EXPORT_VERSION)
+
+  def testParseEmptyOvf(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    self.importer.Parse()
+    self.assertTrue("%s/test-instance" % OUTPUT_DIR in self.importer.output_dir)
+    self.assertEquals(self.importer.results_disk, CMDARGS_DISKS)
+    self.assertEquals(self.importer.results_network, CMDARGS_NETWORKS)
+    self.assertEquals(self.importer.results_hypervisor, CMDARGS_HYPERVISOR)
+    self.assertEquals(self.importer.results_os, CMDARGS_OS)
+    self.assertEquals(self.importer.results_backend, CMDARGS_BACKEND)
+    self.assertEquals(self.importer.results_name, CMDARGS_NAME)
+    self.assertEquals(self.importer.results_template, CMDARGS_TEMPLATE)
+    self.assertEqual(self.importer.results_tags, CMDARGS_TAGS)
+    self.assertEqual(self.importer.results_version, constants.EXPORT_VERSION)
+
+  def testParseNameOptions(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseNameOptions()
+    self.assertEquals(results, CMDARGS_NAME)
+
+  def testParseHypervisorOptions(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseHypervisorOptions()
+    self.assertEquals(results, CMDARGS_HYPERVISOR)
+
+  def testParseOSOptions(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseOSOptions()
+    self.assertEquals(results, CMDARGS_OS)
+
+  def testParseBackendOptions(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseBackendOptions()
+    self.assertEquals(results, CMDARGS_BACKEND)
+
+  def testParseTags(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseTags()
+    self.assertEquals(results, CMDARGS_TAGS)
+
+  def testParseNicOptions(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseNicOptions()
+    self.assertEquals(results, CMDARGS_NETWORKS)
+
+  def testParseDiskOptionsFromGanetiOVF(self):
+    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
+    os.mkdir(OUTPUT_DIR)
+    results = self.importer._GetDiskInfo()
+    self.assertEquals(results, GANETI_DISKS)
+
+  def testParseTemplateOptions(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    results = self.importer._ParseTemplateOptions()
+    self.assertEquals(results, GANETI_TEMPLATE)
+
+  def testParseDiskOptionsFromCmdLine(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_COMPLETE)
+    os.mkdir(OUTPUT_DIR)
+    results = self.importer._ParseDiskOptions()
+    self.assertEquals(results, CMDARGS_DISKS)
+
+  def testGetDiskFormat(self):
+    self.importer = ovf.OVFImporter(self.ganeti_ovf, OPTS_EXPORT)
+    disks_list = self.importer.ovf_reader.GetDisksNames()
+    results = [self.importer._GetDiskQemuInfo("%s/%s" %
+      (self.importer.input_dir, path), "file format: (\S+)")
+      for (path, _) in disks_list]
+    self.assertEqual(results, ["vmdk"])
+
+  def testNoInstanceNameOVF(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_EXPORT_NO_NAME)
+    self.assertRaisesRegexp(errors.OpPrereqError, "Name of instance",
+      self.importer.Parse)
+
+  def testErrorNoOSNameOVF(self):
+    self.importer = ovf.OVFImporter(self.virtualbox_ovf, OPTS_EXPORT)
+    self.assertRaisesRegexp(errors.OpPrereqError, "OS name",
+      self.importer.Parse)
+
+  def testErrorNoDiskAndNoNetwork(self):
+    self.importer = ovf.OVFImporter(self.empty_ovf, OPTS_NONIC_NODISK)
+    self.assertRaisesRegexp(errors.OpPrereqError,
+      "Either disk specification or network"
+      " description", self.importer.Parse)
+
+
+class TestOVFReader(BetterUnitTest):
+  def setUp(self):
+    self.wrong_xml_file = _GetFullFilename("wrong_xml.ovf")
+    self.ganeti_ovf = _GetFullFilename("ganeti.ovf")
+    self.virtualbox_ovf = _GetFullFilename("virtualbox.ovf")
+    self.corrupted_ovf = _GetFullFilename("corrupted_resources.ovf")
+    self.wrong_manifest_ovf = _GetFullFilename("wrong_manifest.ovf")
+    self.no_disk_in_ref_ovf = _GetFullFilename("no_disk_in_ref.ovf")
+    self.empty_ovf = _GetFullFilename("empty.ovf")
+    self.compressed_disk = _GetFullFilename("gzip_disk.ovf")
+
+  def tearDown(self):
+    pass
+
+  def testXMLParsingError(self):
+    self.assertRaisesRegexp(errors.OpPrereqError,
+      "Error while reading .ovf", ovf.OVFReader, self.wrong_xml_file)
+
+  def testFileInResourcesDoesNotExistError(self):
+    self.assertRaisesRegexp(errors.OpPrereqError, "does not exist",
+      ovf.OVFReader, self.corrupted_ovf)
+
+  def testWrongManifestChecksumError(self):
+    reader = ovf.OVFReader(self.wrong_manifest_ovf)
+    self.assertRaisesRegexp(errors.OpPrereqError,
+      "does not match the value in manifest file", reader.VerifyManifest)
+
+  def testGoodManifestChecksum(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    self.assertEqual(reader.VerifyManifest(), None)
+
+  def testGetDisksNamesOVFCorruptedError(self):
+    reader = ovf.OVFReader(self.no_disk_in_ref_ovf)
+    self.assertRaisesRegexp(errors.OpPrereqError,
+      "not found in references", reader.GetDisksNames)
+
+  def testGetDisksNamesVirtualbox(self):
+    reader = ovf.OVFReader(self.virtualbox_ovf)
+    disk_names = reader.GetDisksNames()
+    expected_names = [
+      ("new_disk.vmdk", None) ,
+      ("second_disk.vmdk", None),
+    ]
+    self.assertEqual(sorted(disk_names), sorted(expected_names))
+
+  def testGetDisksNamesEmpty(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    disk_names = reader.GetDisksNames()
+    self.assertEqual(disk_names, [])
+
+  def testGetDisksNamesCompressed(self):
+    reader = ovf.OVFReader(self.compressed_disk)
+    disk_names = reader.GetDisksNames()
+    self.assertEqual(disk_names, [("compr_disk.vmdk.gz", "gzip")])
+
+  def testGetNetworkDataGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    networks = reader.GetNetworkData()
+    self.assertEqual(networks, GANETI_NETWORKS)
+
+  def testGetNetworkDataVirtualbox(self):
+    reader = ovf.OVFReader(self.virtualbox_ovf)
+    networks = reader.GetNetworkData()
+    self.assertEqual(networks, VIRTUALBOX_NETWORKS)
+
+  def testGetNetworkDataEmpty(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    networks = reader.GetNetworkData()
+    self.assertEqual(networks, EMPTY_NETWORKS)
+
+  def testGetHypervisorDataGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    hypervisor = reader.GetHypervisorData()
+    self.assertEqual(hypervisor, GANETI_HYPERVISOR)
+
+  def testGetHypervisorDataEmptyOvf(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    hypervisor = reader.GetHypervisorData()
+    self.assertEqual(hypervisor, EMPTY_HYPERVISOR)
+
+  def testGetOSDataGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    osys = reader.GetOSData()
+    self.assertEqual(osys, GANETI_OS)
+
+  def testGetOSDataEmptyOvf(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    osys = reader.GetOSData()
+    self.assertEqual(osys, EMPTY_OS)
+
+  def testGetBackendDataGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    backend = reader.GetBackendData()
+    self.assertEqual(backend, GANETI_BACKEND)
+
+  def testGetBackendDataVirtualbox(self):
+    reader = ovf.OVFReader(self.virtualbox_ovf)
+    backend = reader.GetBackendData()
+    self.assertEqual(backend, VIRTUALBOX_BACKEND)
+
+  def testGetBackendDataEmptyOvf(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    backend = reader.GetBackendData()
+    self.assertEqual(backend, EMPTY_BACKEND)
+
+  def testGetInstanceNameGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    name = reader.GetInstanceName()
+    self.assertEqual(name, GANETI_NAME)
+
+  def testGetInstanceNameDataEmptyOvf(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    name = reader.GetInstanceName()
+    self.assertEqual(name, EMPTY_NAME)
+
+  def testGetDiskTemplateGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    name = reader.GetDiskTemplate()
+    self.assertEqual(name, GANETI_TEMPLATE)
+
+  def testGetDiskTemplateEmpty(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    name = reader.GetDiskTemplate()
+    self.assertEqual(name, EMPTY_TEMPLATE)
+
+  def testGetTagsGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    tags = reader.GetTagsData()
+    self.assertEqual(tags, GANETI_TAGS)
+
+  def testGetTagsEmpty(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    tags = reader.GetTagsData()
+    self.assertEqual(tags, EMPTY_TAGS)
+
+  def testGetVersionGaneti(self):
+    reader = ovf.OVFReader(self.ganeti_ovf)
+    version = reader.GetVersionData()
+    self.assertEqual(version, GANETI_VERSION)
+
+  def testGetVersionEmpty(self):
+    reader = ovf.OVFReader(self.empty_ovf)
+    version = reader.GetVersionData()
+    self.assertEqual(version, EMPTY_VERSION)
+
+
+if __name__ == "__main__":
+  testutils.GanetiTestProgram()