From 1e6fab60af5e527a3c3e7154bf7a3e27efdbbd58 Mon Sep 17 00:00:00 2001
From: Agata Murawska <agatamurawska@google.com>
Date: Mon, 12 Sep 2011 10:47:44 +0200
Subject: [PATCH] Import: unittests

Signed-off-by: Agata Murawska <agatamurawska@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 Makefile.am                               |  19 +
 test/data/ovfdata/compr_disk.vmdk.gz      | Bin 0 -> 406 bytes
 test/data/ovfdata/corrupted_resources.ovf |  83 ++++
 test/data/ovfdata/empty.ovf               |  16 +
 test/data/ovfdata/ganeti.mf               |   2 +
 test/data/ovfdata/ganeti.ovf              |  93 ++++
 test/data/ovfdata/gzip_disk.ovf           |  93 ++++
 test/data/ovfdata/new_disk.vmdk           | Bin 0 -> 65536 bytes
 test/data/ovfdata/no_disk_in_ref.ovf      |  88 ++++
 test/data/ovfdata/no_ovf.ova              | Bin 0 -> 1409 bytes
 test/data/ovfdata/ova.ova                 | Bin 0 -> 4274 bytes
 test/data/ovfdata/second_disk.vmdk        | Bin 0 -> 65536 bytes
 test/data/ovfdata/virtualbox.ovf          |  89 ++++
 test/data/ovfdata/wrong_extension.ovd     | 105 +++++
 test/data/ovfdata/wrong_manifest.mf       |   2 +
 test/data/ovfdata/wrong_manifest.ovf      |  98 ++++
 test/data/ovfdata/wrong_ova.ova           | 105 +++++
 test/data/ovfdata/wrong_xml.ovf           |  75 +++
 test/ganeti.ovf_unittest.py               | 536 ++++++++++++++++++++++
 19 files changed, 1404 insertions(+)
 create mode 100644 test/data/ovfdata/compr_disk.vmdk.gz
 create mode 100644 test/data/ovfdata/corrupted_resources.ovf
 create mode 100644 test/data/ovfdata/empty.ovf
 create mode 100644 test/data/ovfdata/ganeti.mf
 create mode 100644 test/data/ovfdata/ganeti.ovf
 create mode 100644 test/data/ovfdata/gzip_disk.ovf
 create mode 100644 test/data/ovfdata/new_disk.vmdk
 create mode 100644 test/data/ovfdata/no_disk_in_ref.ovf
 create mode 100644 test/data/ovfdata/no_ovf.ova
 create mode 100644 test/data/ovfdata/ova.ova
 create mode 100644 test/data/ovfdata/second_disk.vmdk
 create mode 100644 test/data/ovfdata/virtualbox.ovf
 create mode 100644 test/data/ovfdata/wrong_extension.ovd
 create mode 100644 test/data/ovfdata/wrong_manifest.mf
 create mode 100644 test/data/ovfdata/wrong_manifest.ovf
 create mode 100644 test/data/ovfdata/wrong_ova.ova
 create mode 100644 test/data/ovfdata/wrong_xml.ovf
 create mode 100644 test/ganeti.ovf_unittest.py

diff --git a/Makefile.am b/Makefile.am
index 9e6dcdc55..4c70c7846 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
GIT binary patch
literal 406
zcmb2|=HOV;m*U63oSdIqP!yk%S)8p`mYb5z@b;p8{$&RV_5^V=@0<e+r!{Y`c4^6z
z)X-y6RJjuJw!^1JHSDwhHqMmCiyy1Z`^4B0FyGy3@3p`0YTn<Rzgd5Ky5}UDT=$7G
ze_p<d44+?aS~*EYf7kJF_w30gHr~Sj%>Pc9`qlYFlI_}4rJGmTP5C?{FDZ2T>ZcVm
z_WhsI>;CcWi#ijDrLXsNolY|^z3;g^^vvvv&9TP|^EXDVdzNafy?k<6s%&-UE&lNR
zv&;N7b}`@DzU+E=qJ>1u$?N6UC$GK`eJuWd*S5~jXBSo6c)xSz(RFM0oIIQwcYMOP
z&2Nl+yC41jxopj>`9J?WzWa9JX#>8!f%)=(J65~qta|&i#9Dv4>+JW34hC9uS8n8Q
z6L<HNUH(@6M!I-DUu4{q*J@$ArQa<(y=d>XmGx2#FwlSRbg(%C!vXuRzpn7Y1c|3V
QtoXwk7g3_Yz`)1=0M(hXvj6}9

literal 0
HcmV?d00001

diff --git a/test/data/ovfdata/corrupted_resources.ovf b/test/data/ovfdata/corrupted_resources.ovf
new file mode 100644
index 000000000..480de2b28
--- /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 000000000..b1b05f364
--- /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 000000000..107ec2b25
--- /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 000000000..e664da80d
--- /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 000000000..44fc5def7
--- /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
GIT binary patch
literal 65536
zcmeIvKX21O90p(mn<X}2faR3zRU$&S3=|iE5E5#tc0?w=607+q+XS-pqt{N-rRvJi
z>N)9rr+a<p-#z}8eZP2?B*}}m7j5s_&F+~b-Fnwv?S~|Jo+Pgi^S6ib<}ORa%k*w;
zd^7_6kd^gy$YMRM%5}4<K9}>DZemrJtL1o@e)^h?NAbhxYBU(7>%5A~rdzr?v~*g<
zyou-AbsYB=tL185HnVa%Y2U14FHQU5^k38N3B}<9?WyV6Wf%?yVe;eS+2l0zmhtb;
zqAlWRvnZ~2d(LO^P*&dL;UuqPNc&lKlBPxR>u6I}&7XY!<?>=*Wf+IvsJDxL$JHV>
z)%Iw*otMj^&AV`LFPz1^*agGmdr2LqEx|53e!tK1B40PL>TcMbRTk~F9?joXC;<Wl
z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72s~ARH&69q?nQtA0RjXF
z5FqfNz`F-mEfOF=fB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ
zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U
iAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBoLKLWQ<*Jn}y

literal 0
HcmV?d00001

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 000000000..1aa8afc92
--- /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
GIT binary patch
literal 1409
zcmV-{1%CP;iwFR&6irS51MQe?Z`(Eyfb+S(g42MZ9cD|EZQ1o44{csr154Z0Nipn0
z3t6ILA`<D6lpXii??_RO<v4C+v>gWMfT9(7Z+z}}vbq$UU4P<>unB*TzK?hyLEAg>
z+J4Y!b>SJee9t%Q@NeG>yd#VQzl8%Fv|t^#gLdZ#dEY6Yl4Mea0->YuI#gkriEt@z
zc7b4=MVw84L`pwW27lb930e>#DQCwHZh8(PaMGBv>tpBY^1RV={un+P{M2Z?B8-So
zkr+)@=)=V_6a?|bRB@glzv(qGdOFEy5;y$7!@b_K-_VsLqL1M3%M+w%O8Ut6Fm8Cg
z2JT+sP9OVyjGJBD>9+lU8Vv|@#ug;ubAlG>vTwYN;$vsit%D$8CXbz&QuDs+%4kN?
zP&VUKO`BX?yO5GgtQ!|w^?pRthfS6flDbO?Ixco2o~E1?cHpgQC=tr|v9V~{$TeKw
zJsDkmdQT+JL_}UB36DYrH5n77pcbdlokaj(v-ZDSE}QTSwP-@(Hk?jutt=1E<^vTf
z3zP9mDw6I<<W|yBBFmO>>cgdW|GxNhY<x8+gDb`&;tZc4G<Z*@L_miTsUKnCoF=A^
z`ZGa*^@|k|iW0`c@zwaOdD{y<1?`3h{pB}eDsM0xH@<O<1%;DM!5rt0l71n_P8WuV
z-^H!KaZNzC9C2_8PR1nCY;6W3HswQmR-|Jf3M(Qt{0FYt&Na2I2^EF&FrsP&Hzw%d
zwo_WXE8Z2O3R-otQUv{q{ExnuYw94nvEeBCNco~Z$$O1p<4AcL4^^8oMZ`3OleuzE
zB08mcSm|m;&6!G*pQREcOyADo{sEpicRT0vEYVkaY>@ddnV-XC_Im}hEl7hmL@l}4
z#qDxNP(r0be2Nl&4H+be<=V2u&bl!1S(rlDiJ<W{q?9XYyhKKV&P@pI*D4hLAgv9B
z+^cKd=4szgb5QExb=NFXXY&v*(888K4Wk)lq?|cqJKWQk5LavD%5Ud-NWw)aZjDK0
z9k|zW%xvTGay17AGLs}|zsiVIcO2GWZzzj3SaXGv1W;USO~i{JNSY|6blu%4*j>xx
zbtq!pN2Sf}yD+m#NRZDN6(l80m5K@md5q!_7WBaBpCv}wa4EbMA<=o5(quJo?`dv1
z8QH-xIvsjedt+%!xm4#-3@+h15V5~*doA|`(8U`r(%XjD-sQz?7lhn0qQR)lOTRAq
zTO(sQgQUN}$iUvmVBqdl+48V?HQr?Dgb3X@1^bhCSJL{qcZcqLY}Nv=uLRgWmCvm8
z?sA!}joM(Vy|Y|qr+CpBQZ1`qTHG?QC;2N2p+0K04zazyrar35d}B&iM}9$4E>=j-
z(`uYM*uQwGOO+ZAl`#9&Ft-oD4Cz${ZHAp48Tt(!CXzV!=*O`jQV!Rw?eiYSSL2uH
zgfk^Lj6zWjb0#O1(6*|f_4l>#V|uYVjq%BNbTAGXNqT4NRYKE#G@5ZXF&q*}%};|Z
zM#c6%u)z=KIyyZ&7%Pp*p;SB78m?1~OO-46mc4_wG*jEq*6Z75nd17la&$K?hbBN_
zzGHt6|8w}7ny=8Qpo@y5bZRWCVGpWd$NOgJ|Bw47qbL?U#g*W7zY5Q0UUcj3gOmwZ
z?Cfs@bMwIFo9yc#UUR96B!{}rt~PY-H=VUFDLqWG_gIqc3M9MVmZX1pTPl%N=t>x&
z%zl>GFF<R%v9V`>oMF%N5K-_O8a^CR7>9GEe+@JA%jb-%->uL5q1uEgoK~AL&nv$$
z%@GcGTjFh_he|$hAN~$p?-k!I1Go5Zx#5%l`u{6ysil@$YN@4`T574KmRf45rIuQ1
PsV4sdUMSE(04M+eJdCw=

literal 0
HcmV?d00001

diff --git a/test/data/ovfdata/ova.ova b/test/data/ovfdata/ova.ova
new file mode 100644
index 0000000000000000000000000000000000000000..856de9637663bb897ecc067499a9ae1ab5deda1b
GIT binary patch
literal 4274
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
Lm3-vFACCMTXo(Lx

literal 0
HcmV?d00001

diff --git a/test/data/ovfdata/second_disk.vmdk b/test/data/ovfdata/second_disk.vmdk
new file mode 100644
index 0000000000000000000000000000000000000000..4ba0fffd911afa1bf2fe692dc6cc8f01b4256223
GIT binary patch
literal 65536
zcmeIvKX21O90p(m+evJ|0E?CEQ6fUO3=|iE5E5#tc0?w=607+q+eBpRN5@XmrBX+R
zR?kW2JKgI$|L*a(?EB@jBuQShy=Z&aZuie5>DIgU>M$h9^CWqFoWDJew|7}cUxvH6
z@zDtM)2ys-(k#}qs@yc|>T|h>VH>NuT(2gh@abzd8OIOf>+xt9HhC3SO}BJ?Y++W#
zyondPO`P<W>(zQuHuG{eZQrb8FNA)2_P1&Gq{Z<A?Wy7XDjf}n>Ga3P^XXaItK)3F
zDt;Di9fR$%xY=*Jn8#yfd6TE7c^%Wx&$81HisIK`TUO1VeDUS#@=$0xNqghoKKdQk
z%h*)A!ECoES4Eq5;qYEKk9n~VMkn`@wwhL9pPjrvWO<Qqnpkz0?9M8S_GXXf2P>2S
z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjY`q`;dec`KJ9K!5-N
z0t5&Ucu3&gLxFVy1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly
zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF
z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk
z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs
k0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0{=naAH8*GfdBvi

literal 0
HcmV?d00001

diff --git a/test/data/ovfdata/virtualbox.ovf b/test/data/ovfdata/virtualbox.ovf
new file mode 100644
index 000000000..dba291996
--- /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 000000000..e1e870992
--- /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 000000000..7bd400574
--- /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 000000000..6883d737e
--- /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 000000000..e1e870992
--- /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 000000000..f98b9c849
--- /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 000000000..e30ac3956
--- /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()
-- 
GitLab