Skip to content

Commit

Permalink
Some initial support and tests for a v2.0 OVF exported from VirtualBox
Browse files Browse the repository at this point in the history
  • Loading branch information
glennmatthews committed Jan 26, 2015
1 parent b76f65e commit 8d71693
Show file tree
Hide file tree
Showing 7 changed files with 501 additions and 79 deletions.
258 changes: 185 additions & 73 deletions COT/ovf.py

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions COT/tests/add_disk.py
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,18 @@ def test_new_hard_disk_v09(self):
</ovf:Section>""".format(input_size=self.FILE_SIZE['input.vmdk'],
blank_size=self.FILE_SIZE['blank.vmdk']))

def test_new_hard_disk_v20_vbox(self):
"""Test adding a new hard disk to a v2.0 OVF from VirtualBox"""
self.instance.set_value("PACKAGE", self.v20_vbox_ovf)
self.instance.set_value("DISK_IMAGE", self.new_vmdk)
self.instance.run()
self.instance.finished()
# TODO - vbox XML is not very clean so the diffs are large...
# self.check_diff('', file1=self.v20_vbox_ovf)

# ovftool does not consider vbox ovfs to be valid
self.validate_output_with_ovftool = False

def test_overwrite_hard_disk_fileid(self):
"""Overwrite an existing disk by specifying matching file-id."""
self.instance.set_value("PACKAGE", self.input_ovf)
Expand Down
30 changes: 30 additions & 0 deletions COT/tests/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -565,3 +565,33 @@ def test_vmware_ovf(self):
Network adapter 4 : lanethernet0
E1000 ethernet adapter on "lanethernet0"
""".format(self.vmware_ovf))

def test_v20_vbox_ovf(self):
"""Test info string for v2.0 OVF generated by VirtualBox"""
self.instance.set_value("PACKAGE_LIST", [self.v20_vbox_ovf])
self.instance.set_value("verbosity", "verbose")
self.check_cot_output("""
-------------------------------------------------------------------------------
{0}
-------------------------------------------------------------------------------
Files and Disks: File Size Capacity Device
---------- ---------- --------------------
ubuntu.2.0-disk1.vmdk 8.00 GB harddisk @ SATA 0:0
Hardware Variants:
System types: virtualbox-2.2
IDE device types: PIIX4
Ethernet device types: E1000
Configuration Profiles: CPUs Memory NICs Serials Disks/Capacity
---- --------- ------ ------- ---------------
None (default) 1 512 MB 1 0 1 / 8.00 GB
Networks:
NAT Logical network used by this appliance.
NICs and Associated Networks:
<instance 10> : NAT
Ethernet adapter on 'NAT'
""".format(self.v20_vbox_ovf))
19 changes: 14 additions & 5 deletions COT/tests/ovf.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,24 @@ def test_input_output(self):
self.check_diff('', file2=(self.temp_file + ".a.b.c"))

def test_input_output_v09(self):
"""Test reading/writing of a v0.9 OVF.
"""
"""Test reading/writing of a v0.9 OVF."""
with VMContextManager(self.v09_ovf, self.temp_file):
pass
self.check_diff('', file1=self.v09_ovf)

def test_input_output_custom(self):
"""Test reading/writing of an OVF with custom extensions.
"""
def test_input_output_v20_vbox(self):
"""Test reading/writing of a v2.0 OVF from VirtualBox."""
with VMContextManager(self.v20_vbox_ovf, self.temp_file):
pass

# TODO - vbox XML is not very clean so the diffs are large...
# self.check_diff('', file1=self.v20_vbox_ovf)

# ovftool does not consider vbox ovfs to be valid
self.validate_output_with_ovftool = False

def test_input_output_vmware(self):
"""Test reading/writing of an OVF with custom extensions."""
with VMContextManager(self.vmware_ovf, self.temp_file):
pass
# VMware disagrees with COT on some fiddly details of XML formatting
Expand Down
Binary file added COT/tests/ubuntu.2.0-disk1.vmdk
Binary file not shown.
253 changes: 253 additions & 0 deletions COT/tests/ubuntu.2.0.ovf
Original file line number Diff line number Diff line change
@@ -0,0 +1,253 @@
<?xml version="1.0"?>
<Envelope ovf:version="2.0" xml:lang="en-US" xmlns="http://schemas.dmtf.org/ovf/envelope/2" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/2" 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:vbox="http://www.virtualbox.org/ovf/machine" xmlns:epasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_EthernetPortAllocationSettingData.xsd" xmlns:sasd="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_StorageAllocationSettingData.xsd">
<References>
<File ovf:href="ubuntu.2.0-disk1.vmdk" ovf:id="file1"/>
</References>
<DiskSection>
<Info>List of the virtual disks used in the package</Info>
<Disk ovf:capacity="8589934592" ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" vbox:uuid="ac4b44a7-3ace-401d-bc94-da1b5c3974f3"/>
</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">
<Info>A virtual machine</Info>
<OperatingSystemSection ovf:id="94">
<Info>The kind of installed guest operating system</Info>
<Description>Ubuntu_64</Description>
<vbox:OSType ovf:required="false">Ubuntu_64</vbox:OSType>
</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</vssd:VirtualSystemIdentifier>
<vssd:VirtualSystemType>virtualbox-2.2</vssd:VirtualSystemType>
</System>
<Item>
<rasd:Caption>1 virtual CPU</rasd:Caption>
<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:AllocationUnits>MegaBytes</rasd:AllocationUnits>
<rasd:Caption>512 MB of memory</rasd:Caption>
<rasd:Description>Memory Size</rasd:Description>
<rasd:InstanceID>2</rasd:InstanceID>
<rasd:ResourceType>4</rasd:ResourceType>
<rasd:VirtualQuantity>512</rasd:VirtualQuantity>
</Item>
<Item>
<rasd:Address>0</rasd:Address>
<rasd:Caption>ideController0</rasd:Caption>
<rasd:Description>IDE Controller</rasd:Description>
<rasd:InstanceID>3</rasd:InstanceID>
<rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
<rasd:ResourceType>5</rasd:ResourceType>
</Item>
<Item>
<rasd:Address>1</rasd:Address>
<rasd:Caption>ideController1</rasd:Caption>
<rasd:Description>IDE Controller</rasd:Description>
<rasd:InstanceID>4</rasd:InstanceID>
<rasd:ResourceSubType>PIIX4</rasd:ResourceSubType>
<rasd:ResourceType>5</rasd:ResourceType>
</Item>
<Item>
<rasd:Address>0</rasd:Address>
<rasd:Caption>sataController0</rasd:Caption>
<rasd:Description>SATA Controller</rasd:Description>
<rasd:InstanceID>5</rasd:InstanceID>
<rasd:ResourceSubType>AHCI</rasd:ResourceSubType>
<rasd:ResourceType>20</rasd:ResourceType>
</Item>
<Item>
<rasd:Address>0</rasd:Address>
<rasd:Caption>usb</rasd:Caption>
<rasd:Description>USB Controller</rasd:Description>
<rasd:InstanceID>6</rasd:InstanceID>
<rasd:ResourceType>23</rasd:ResourceType>
</Item>
<Item>
<rasd:AddressOnParent>3</rasd:AddressOnParent>
<rasd:AutomaticAllocation>false</rasd:AutomaticAllocation>
<rasd:Caption>sound</rasd:Caption>
<rasd:Description>Sound Card</rasd:Description>
<rasd:InstanceID>7</rasd:InstanceID>
<rasd:ResourceSubType>ensoniq1371</rasd:ResourceSubType>
<rasd:ResourceType>35</rasd:ResourceType>
</Item>
<StorageItem>
<sasd:AddressOnParent>0</sasd:AddressOnParent>
<sasd:Caption>disk1</sasd:Caption>
<sasd:Description>Disk Image</sasd:Description>
<sasd:HostResource>/disk/vmdisk1</sasd:HostResource>
<sasd:InstanceID>8</sasd:InstanceID>
<sasd:Parent>5</sasd:Parent>
<sasd:ResourceType>17</sasd:ResourceType>
</StorageItem>
<StorageItem>
<sasd:AddressOnParent>0</sasd:AddressOnParent>
<sasd:AutomaticAllocation>true</sasd:AutomaticAllocation>
<sasd:Caption>cdrom1</sasd:Caption>
<sasd:Description>CD-ROM Drive</sasd:Description>
<sasd:InstanceID>9</sasd:InstanceID>
<sasd:Parent>4</sasd:Parent>
<sasd:ResourceType>15</sasd:ResourceType>
</StorageItem>
<EthernetPortItem>
<epasd:AutomaticAllocation>true</epasd:AutomaticAllocation>
<epasd:Caption>Ethernet adapter on 'NAT'</epasd:Caption>
<epasd:Connection>NAT</epasd:Connection>
<epasd:InstanceID>10</epasd:InstanceID>
<epasd:ResourceSubType>E1000</epasd:ResourceSubType>
<epasd:ResourceType>10</epasd:ResourceType>
</EthernetPortItem>
</VirtualHardwareSection>
<vbox:Machine ovf:required="false" version="1.12-macosx" uuid="{39a69c87-0433-4945-8e25-b89431544a28}" name="ubuntu" OSType="Ubuntu_64" snapshotFolder="Snapshots" lastStateChange="2015-01-26T16:14:43Z">
<ovf:Info>Complete VirtualBox machine configuration in VirtualBox format</ovf:Info>
<ExtraData>
<ExtraDataItem name="GUI/FirstRun" value="yes"/>
</ExtraData>
<Hardware version="2">
<CPU count="1" hotplug="false">
<HardwareVirtEx enabled="true"/>
<HardwareVirtExNestedPaging enabled="true"/>
<HardwareVirtExVPID enabled="true"/>
<HardwareVirtExUX enabled="true"/>
<PAE enabled="false"/>
<HardwareVirtExLargePages enabled="true"/>
<HardwareVirtForce enabled="false"/>
</CPU>
<Memory RAMSize="512" PageFusion="false"/>
<HID Pointing="USBTablet" Keyboard="PS2Keyboard"/>
<HPET enabled="false"/>
<Chipset type="PIIX3"/>
<Boot>
<Order position="1" device="Floppy"/>
<Order position="2" device="DVD"/>
<Order position="3" device="HardDisk"/>
<Order position="4" device="None"/>
</Boot>
<Display VRAMSize="12" monitorCount="1" accelerate3D="false" accelerate2DVideo="false"/>
<VideoCapture/>
<RemoteDisplay enabled="false" authType="Null"/>
<BIOS>
<ACPI enabled="true"/>
<IOAPIC enabled="true"/>
<Logo fadeIn="true" fadeOut="true" displayTime="0"/>
<BootMenu mode="MessageAndMenu"/>
<TimeOffset value="0"/>
<PXEDebug enabled="false"/>
</BIOS>
<USBController enabled="true" enabledEhci="false"/>
<Network>
<Adapter slot="0" enabled="true" MACAddress="0800272AFB4E" cable="true" speed="0" type="82540EM">
<DisabledModes/>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</Adapter>
<Adapter slot="1" enabled="false" MACAddress="0800271C8694" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
<Adapter slot="2" enabled="false" MACAddress="080027CE3144" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
<Adapter slot="3" enabled="false" MACAddress="080027A0ED89" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
<Adapter slot="4" enabled="false" MACAddress="080027162EF8" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
<Adapter slot="5" enabled="false" MACAddress="080027C24AB0" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
<Adapter slot="6" enabled="false" MACAddress="0800274807FC" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
<Adapter slot="7" enabled="false" MACAddress="08002717D2F9" cable="true" speed="0" type="82540EM">
<DisabledModes>
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>
</DisabledModes>
</Adapter>
</Network>
<UART>
<Port slot="0" enabled="false" IOBase="0x3f8" IRQ="4" hostMode="Disconnected"/>
<Port slot="1" enabled="false" IOBase="0x2f8" IRQ="3" hostMode="Disconnected"/>
</UART>
<LPT>
<Port slot="0" enabled="false" IOBase="0x378" IRQ="7"/>
<Port slot="1" enabled="false" IOBase="0x378" IRQ="7"/>
</LPT>
<AudioAdapter controller="AC97" driver="CoreAudio" enabled="true"/>
<RTC localOrUTC="UTC"/>
<SharedFolders/>
<Clipboard mode="Disabled"/>
<DragAndDrop mode="Disabled"/>
<IO>
<IoCache enabled="true" size="5"/>
<BandwidthGroups/>
</IO>
<HostPci>
<Devices/>
</HostPci>
<EmulatedUSB>
<CardReader enabled="false"/>
</EmulatedUSB>
<Guest memoryBalloonSize="0"/>
<GuestProperties/>
</Hardware>
<StorageControllers>
<StorageController name="IDE" type="PIIX4" PortCount="2" useHostIOCache="true" Bootable="true">
<AttachedDevice passthrough="false" type="DVD" port="1" device="0"/>
</StorageController>
<StorageController name="SATA" type="AHCI" PortCount="1" useHostIOCache="false" Bootable="true" IDE0MasterEmulationPort="0" IDE0SlaveEmulationPort="1" IDE1MasterEmulationPort="2" IDE1SlaveEmulationPort="3">
<AttachedDevice type="HardDisk" port="0" device="0">
<Image uuid="{ac4b44a7-3ace-401d-bc94-da1b5c3974f3}"/>
</AttachedDevice>
</StorageController>
</StorageControllers>
</vbox:Machine>
</VirtualSystem>
</Envelope>
8 changes: 7 additions & 1 deletion COT/tests/ut.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,9 @@ def setUp(self):
self.iosv_ovf = os.path.join(os.path.dirname(__file__), "iosv.ovf")
# v0.9 OVF
self.v09_ovf = os.path.join(os.path.dirname(__file__), "v0.9.ovf")
# v2.0 OVF from VirtualBox
self.v20_vbox_ovf = os.path.join(os.path.dirname(__file__),
"ubuntu.2.0.ovf")
# OVF with lots of custom VMware extensions
self.vmware_ovf = os.path.join(os.path.dirname(__file__), "vmware.ovf")
# Set a temporary directory for us to write our OVF to
Expand All @@ -120,14 +123,17 @@ def setUp(self):
# Monitor the global temp directory to make sure COT cleans up
self.tmps = set(glob.glob(os.path.join(tempfile.gettempdir(), 'cot*')))

self.validate_output_with_ovftool = True

def tearDown(self):
"""Test case cleanup function called automatically after each test"""

if hasattr(self, 'instance'):
self.instance.destroy()
self.instance = None

if COT_UT.OVFTOOL_PRESENT and os.path.exists(self.temp_file):
if (COT_UT.OVFTOOL_PRESENT and self.validate_output_with_ovftool
and os.path.exists(self.temp_file)):
# Ask OVFtool to validate that the output file is sane
try:
validate_ovf_for_esxi(self.temp_file)
Expand Down

0 comments on commit 8d71693

Please sign in to comment.