tstOVF.cpp revision 508452243fd3328f7b9e0405d39fb9dc004e31b8
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/* $Id$ */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/** @file
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * tstOVF - testcases for OVF import and export
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/*
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copyright (C) 2010 Oracle Corporation
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * available from http://www.virtualbox.org. This file is free software;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * General Public License (GPL) as published by the Free Software
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/VirtualBox.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/com.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/array.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/string.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/ErrorInfo.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/errorprint.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <VBox/com/EventQueue.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/initterm.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/stream.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/file.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/path.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <iprt/param.h>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync#include <list>
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncusing namespace com;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync// main
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync///////////////////////////////////////////////////////////////////////////////
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/**
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Quick hack exception structure.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncstruct MyError
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync MyError(HRESULT rc,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const char *pcsz,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync IProgress *pProgress = NULL)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync : m_rc(rc)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync m_str = "ERROR: ";
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync m_str += pcsz;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (pProgress)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync com::ProgressErrorInfo info(pProgress);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync com::GluePrintErrorInfo(info);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync }
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync else if (rc)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync {
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync com::ErrorInfo info;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (!info.isFullAvailable() && !info.isBasicAvailable())
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync com::GluePrintRCMessage(rc);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync else
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync com::GluePrintErrorInfo(info);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync }
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync }
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync Utf8Str m_str;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync HRESULT m_rc;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync};
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync/**
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * Imports the given OVF file, with all bells and whistles.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * Throws MyError on errors.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @param pcszPrefix Descriptive short prefix string for console output.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @param pVirtualBox VirtualBox instance.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @param pcszOVF0 File to import.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync * @param llMachinesCreated out: UUIDs of machines that were created so that caller can clean up.
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync */
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsyncvoid importOVF(const char *pcszPrefix,
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync ComPtr<IVirtualBox> &pVirtualBox,
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync const char *pcszOVF0,
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync std::list<Guid> &llMachinesCreated)
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync{
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync char szAbsOVF[RTPATH_MAX];
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync RTPathAbs(pcszOVF0, szAbsOVF, sizeof(szAbsOVF));
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync RTPrintf("%s: reading appliance \"%s\"...\n", pcszPrefix, szAbsOVF);
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync ComPtr<IAppliance> pAppl;
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync HRESULT rc = pVirtualBox->CreateAppliance(pAppl.asOutParam());
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync if (FAILED(rc)) throw MyError(rc, "failed to create appliance\n");
4a9af9a8062589b741444d717d2dd1ed22b0f583vboxsync
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync ComPtr<IProgress> pProgress;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pAppl->Read(Bstr(szAbsOVF).raw(), pProgress.asOutParam());
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "Appliance::Read() failed\n");
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync rc = pProgress->WaitForCompletion(-1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "Progress::WaitForCompletion() failed\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync LONG rc2;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pProgress->COMGETTER(ResultCode)(&rc2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc2)) throw MyError(rc2, "Appliance::Read() failed\n", pProgress);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("%s: interpreting appliance \"%s\"...\n", pcszPrefix, szAbsOVF);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pAppl->Interpret();
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync if (FAILED(rc)) throw MyError(rc, "Appliance::Interpret() failed\n");
3a343ca21a267ec3c54e2317e2ed18fe99b8ebbbvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeIfaceArray<IVirtualSystemDescription> aDescriptions;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pAppl->COMGETTER(VirtualSystemDescriptions)(ComSafeArrayAsOutParam(aDescriptions));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t u = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync u < aDescriptions.size();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++u)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComPtr<IVirtualSystemDescription> pVSys = aDescriptions[u];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeArray<VirtualSystemDescriptionType_T> aTypes;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeArray<BSTR> aRefs;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeArray<BSTR> aOvfValues;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeArray<BSTR> aVboxValues;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeArray<BSTR> aExtraConfigValues;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pVSys->GetDescription(ComSafeArrayAsOutParam(aTypes),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComSafeArrayAsOutParam(aRefs),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComSafeArrayAsOutParam(aOvfValues),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComSafeArrayAsOutParam(aVboxValues),
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComSafeArrayAsOutParam(aExtraConfigValues));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "VirtualSystemDescription::GetDescription() failed\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (uint32_t u2 = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync u2 < aTypes.size();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++u2)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const char *pcszType;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync VirtualSystemDescriptionType_T t = aTypes[u2];
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync switch (t)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_OS:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "ostype";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Name:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "name";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Product:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "product";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_ProductUrl:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "producturl";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Vendor:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "vendor";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_VendorUrl:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "vendorurl";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Version:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "version";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Description:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "description";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_License:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "license";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_CPU:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "cpu";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Memory:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "memory";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_HardDiskControllerIDE:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "ide";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_HardDiskControllerSATA:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "sata";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_HardDiskControllerSAS:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "sas";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_HardDiskControllerSCSI:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "scsi";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_HardDiskImage:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "hd";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_CDROM:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "cdrom";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_Floppy:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "floppy";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_NetworkAdapter:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "net";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_USBController:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "usb";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync case VirtualSystemDescriptionType_SoundCard:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pcszType = "sound";
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync default:
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync throw MyError(E_UNEXPECTED, "Invalid VirtualSystemDescriptionType\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync break;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf(" vsys %2u item %2u: type %2d (%s), ovf: \"%ls\", vbox: \"%ls\", extra: \"%ls\"\n",
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync u, u2, t, pcszType,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync aOvfValues[u2],
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync aVboxValues[u2],
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync aExtraConfigValues[u2]);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("%s: importing %d machine(s)...\n", pcszPrefix, aDescriptions.size());
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pAppl->ImportMachines(pProgress.asOutParam());
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "Appliance::ImportMachines() failed\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pProgress->WaitForCompletion(-1);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "Progress::WaitForCompletion() failed\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync pProgress->COMGETTER(ResultCode)(&rc2);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc2)) throw MyError(rc2, "Appliance::ImportMachines() failed\n", pProgress);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync com::SafeArray<BSTR> aMachineUUIDs;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pAppl->COMGETTER(Machines)(ComSafeArrayAsOutParam(aMachineUUIDs));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "Appliance::GetMachines() failed\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync for (size_t u = 0;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync u < aMachineUUIDs.size();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ++u)
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("%s: created machine %u: %ls\n", pcszPrefix, u, aMachineUUIDs[u]);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync llMachinesCreated.push_back(Guid(Bstr(aMachineUUIDs[u])));
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync }
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("%s: success!\n", pcszPrefix);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync/**
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * Copies ovf-testcases/ovf-dummy.vmdk to the given target and appends that
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * target as a string to the given list so that the caller can delete it
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * again later.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @param llFiles2Delete List of strings to append the target file path to.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @param pcszDest Target for dummy VMDK.
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncvoid copyDummyDiskImage(const char *pcszPrefix,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync std::list<Utf8Str> &llFiles2Delete,
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync const char *pcszDest)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("%s: copying ovf-dummy.vmdk to \"%s\"...\n", pcszPrefix, pcszDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync int vrc = RTFileCopy("ovf-testcases/ovf-dummy.vmdk", pcszDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (RT_FAILURE(vrc)) throw MyError(0, Utf8StrFmt("Cannot copy ovf-dummy.vmdk to %s: %Rra\n", pcszDest, vrc).c_str());
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync llFiles2Delete.push_back(pcszDest);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync}
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync/**
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync *
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @param argc
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @param argv[]
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync * @return
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync */
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsyncint main(int argc, char *argv[])
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync{
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTR3Init();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync HRESULT rc = S_OK;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync std::list<Utf8Str> llFiles2Delete;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync std::list<Guid> llMachinesCreated;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComPtr<IVirtualBox> pVirtualBox;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync try
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync {
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("Initializing COM...\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = com::Initialize();
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "failed to initialize COM!\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync ComPtr<ISession> pSession;
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync RTPrintf("Creating VirtualBox object...\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pVirtualBox.createLocalObject(CLSID_VirtualBox);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "failed to create the VirtualBox object!\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync rc = pSession.createInprocObject(CLSID_Session);
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync if (FAILED(rc)) throw MyError(rc, "failed to create a session object!\n");
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync
9055f61bb57d2a625c6434d55beac7565c3b3c0dvboxsync // create the event queue
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // (here it is necessary only to process remaining XPCOM/IPC events after the session is closed)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync EventQueue eventQ;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // for each testcase, we will copy the dummy VMDK image to the subdirectory with the OVF testcase
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // so that the import will find the disks it expects; this is just for testing the import since
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // the imported machines will obviously not be usable.
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // llFiles2Delete receives the paths of all the files that we need to clean up later.
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // testcase 1: import ovf-joomla-0.9/joomla-1.1.4-ovf.ovf
09f4b412099acda62997fd82c8608075c453b3ebvboxsync copyDummyDiskImage("joomla-0.9", llFiles2Delete, "ovf-testcases/ovf-joomla-0.9/joomla-1.1.4-ovf-0.vmdk");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync copyDummyDiskImage("joomla-0.9", llFiles2Delete, "ovf-testcases/ovf-joomla-0.9/joomla-1.1.4-ovf-1.vmdk");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync importOVF("joomla-0.9", pVirtualBox, "ovf-testcases/ovf-joomla-0.9/joomla-1.1.4-ovf.ovf", llMachinesCreated);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // testcase 2: import ovf-winxp-vbox-sharedfolders/winxp.ovf
09f4b412099acda62997fd82c8608075c453b3ebvboxsync copyDummyDiskImage("winxp-vbox-sharedfolders", llFiles2Delete, "ovf-testcases/ovf-winxp-vbox-sharedfolders/Windows 5.1 XP 1 merged.vmdk");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync copyDummyDiskImage("winxp-vbox-sharedfolders", llFiles2Delete, "ovf-testcases/ovf-winxp-vbox-sharedfolders/smallvdi.vmdk");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync importOVF("winxp-vbox-sharedfolders", pVirtualBox, "ovf-testcases/ovf-winxp-vbox-sharedfolders/winxp.ovf", llMachinesCreated);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // testcase 3: import ovf-winxp-vbox-sharedfolders/winxp.ovf
09f4b412099acda62997fd82c8608075c453b3ebvboxsync importOVF("winhost-audio-nodisks", pVirtualBox, "ovf-testcases/ovf-winhost-audio-nodisks/WinXP.ovf", llMachinesCreated);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf("Machine imports done, no errors. Cleaning up...\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync catch (MyError &e)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync rc = e.m_rc;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf("%s", e.m_str.c_str());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync try
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // clean up the machines created
09f4b412099acda62997fd82c8608075c453b3ebvboxsync for (std::list<Guid>::const_iterator it = llMachinesCreated.begin();
09f4b412099acda62997fd82c8608075c453b3ebvboxsync it != llMachinesCreated.end();
09f4b412099acda62997fd82c8608075c453b3ebvboxsync ++it)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync const Guid &uuid = *it;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync Bstr bstrUUID(uuid.toUtf16());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync ComPtr<IMachine> pMachine;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync rc = pVirtualBox->FindMachine(bstrUUID.raw(), pMachine.asOutParam());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (FAILED(rc)) throw MyError(rc, "VirtualBox::FindMachine() failed\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf(" Deleting machine %ls...\n", bstrUUID.raw());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync SafeIfaceArray<IMedium> sfaMedia;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync rc = pMachine->Unregister(CleanupMode_DetachAllReturnHardDisksOnly,
09f4b412099acda62997fd82c8608075c453b3ebvboxsync ComSafeArrayAsOutParam(sfaMedia));
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (FAILED(rc)) throw MyError(rc, "Machine::Unregister() failed\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync ComPtr<IProgress> pProgress;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync rc = pMachine->Delete(ComSafeArrayAsInParam(sfaMedia), pProgress.asOutParam());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (FAILED(rc)) throw MyError(rc, "Machine::DeleteSettings() failed\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync rc = pProgress->WaitForCompletion(-1);
09f4b412099acda62997fd82c8608075c453b3ebvboxsync if (FAILED(rc)) throw MyError(rc, "Progress::WaitForCompletion() failed\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync catch (MyError &e)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync rc = e.m_rc;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf("%s", e.m_str.c_str());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync // clean up the VMDK copies that we made in copyDummyDiskImage()
09f4b412099acda62997fd82c8608075c453b3ebvboxsync for (std::list<Utf8Str>::const_iterator it = llFiles2Delete.begin();
09f4b412099acda62997fd82c8608075c453b3ebvboxsync it != llFiles2Delete.end();
09f4b412099acda62997fd82c8608075c453b3ebvboxsync ++it)
09f4b412099acda62997fd82c8608075c453b3ebvboxsync {
09f4b412099acda62997fd82c8608075c453b3ebvboxsync const Utf8Str &strFile = *it;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf("Deleting file %s...\n", strFile.c_str());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTFileDelete(strFile.c_str());
09f4b412099acda62997fd82c8608075c453b3ebvboxsync }
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync pVirtualBox.setNull();
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf("Shutting down COM...\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync com::Shutdown();
09f4b412099acda62997fd82c8608075c453b3ebvboxsync RTPrintf ("tstOVF all done!\n");
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync return rc;
09f4b412099acda62997fd82c8608075c453b3ebvboxsync}
09f4b412099acda62997fd82c8608075c453b3ebvboxsync
09f4b412099acda62997fd82c8608075c453b3ebvboxsync