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 "bridged"</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 "bridged"</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 "bridged"</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