Massaging ovf for virtualbox


VirtualBox and VMware’s ovftool have a different idea of how a storage controller should be described. This prevents exporting a VM from, e.g. VMware Fusion, and then importing it into VirtualBox. However, this can be worked around.

Ovftool produces output like

`<Item>`
  `<rasd:Address>`0`</rasd:Address>`
  `<rasd:Description>`SATA Controller`</rasd:Description>`
  `<rasd:ElementName>`sataController0`</rasd:ElementName>`
  `<rasd:InstanceID>`3`</rasd:InstanceID>`
  `<rasd:ResourceSubType>`vmware.sata.ahci`</rasd:ResourceSubType>`
  `<rasd:ResourceType>`20`</rasd:ResourceType>`
`</Item>`

but VirtualBox wants a tag named Caption, not ElementName. It also wants ResourceSubType to be just ‘AHCI’. See the code below

case ResourceType_OtherStorageDevice:        // 20       SATA controller
{
    /* `<Item>`
        `<rasd:Description>`SATA Controller`</rasd:Description>`
        `<rasd:Caption>`sataController0`</rasd:Caption>`
        `<rasd:InstanceID>`4`</rasd:InstanceID>`
        `<rasd:ResourceType>`20`</rasd:ResourceType>`
        `<rasd:ResourceSubType>`AHCI`</rasd:ResourceSubType>`
        `<rasd:Address>`0`</rasd:Address>`
        `<rasd:BusNumber>`0`</rasd:BusNumber>`
    `</Item>` */
    if (    i.strCaption.startsWith("sataController", RTCString::CaseInsensitive)
         && !i.strResourceSubType.compare("AHCI", RTCString::CaseInsensitive)
       )
    {
        HardDiskController hdc;
        hdc.system = HardDiskController::SATA;
        hdc.idController = i.ulInstanceID;
        hdc.strControllerType = i.strResourceSubType;

        vsys.mapControllers[i.ulInstanceID] = hdc;
    }
    else
        throw OVFLogicError(N_("Error reading \"%s\": Host resource of type \"Other Storage Device (%d)\" is supported with SATA AHCI controllers only, line %d"),
                            m_strPath.c_str(),
                            ResourceType_OtherStorageDevice,
                            i.ulLineNumber);
    break;
}

If you modify the ovf file to make these changes, the import should succeed. After modfying it, be sure to update the sha1sum of the ovf file in the mf file.