2009-09-23 12:25:52 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
#ifdef WITH_VMX
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# include <stdio.h>
|
|
|
|
# include <string.h>
|
|
|
|
# include <unistd.h>
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "internal.h"
|
|
|
|
# include "memory.h"
|
|
|
|
# include "testutils.h"
|
2010-12-21 21:39:55 +00:00
|
|
|
# include "vmx/vmx.h"
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
static virCapsPtr caps;
|
2010-12-21 21:39:55 +00:00
|
|
|
static virVMXContext ctx;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
Fix default console type setting
The default console type may vary based on the OS type. ie a Xen
paravirt guests wants a 'xen' console, while a fullvirt guests
wants a 'serial' console.
A plain integer default console type in the capabilities does
not suffice. Instead introduce a callback that is passed the
OS type.
* src/conf/capabilities.h: Use a callback for default console
type
* src/conf/domain_conf.c, src/conf/domain_conf.h: Use callback
for default console type. Add missing LXC/OpenVZ console types.
* src/esx/esx_driver.c, src/libxl/libxl_conf.c,
src/lxc/lxc_conf.c, src/openvz/openvz_conf.c,
src/phyp/phyp_driver.c, src/qemu/qemu_capabilities.c,
src/uml/uml_conf.c, src/vbox/vbox_tmpl.c,
src/vmware/vmware_conf.c, src/xen/xen_hypervisor.c,
src/xenapi/xenapi_driver.c: Set default console type callback
2011-10-20 13:56:20 +00:00
|
|
|
static int testDefaultConsoleType(const char *ostype ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
return VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
|
|
|
|
}
|
|
|
|
|
2009-09-23 12:25:52 +00:00
|
|
|
static void
|
2010-06-17 17:57:12 +00:00
|
|
|
testCapsInit(void)
|
2009-09-23 12:25:52 +00:00
|
|
|
{
|
|
|
|
virCapsGuestPtr guest = NULL;
|
|
|
|
|
|
|
|
caps = virCapabilitiesNew("i686", 1, 1);
|
|
|
|
|
|
|
|
if (caps == NULL) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Fix default console type setting
The default console type may vary based on the OS type. ie a Xen
paravirt guests wants a 'xen' console, while a fullvirt guests
wants a 'serial' console.
A plain integer default console type in the capabilities does
not suffice. Instead introduce a callback that is passed the
OS type.
* src/conf/capabilities.h: Use a callback for default console
type
* src/conf/domain_conf.c, src/conf/domain_conf.h: Use callback
for default console type. Add missing LXC/OpenVZ console types.
* src/esx/esx_driver.c, src/libxl/libxl_conf.c,
src/lxc/lxc_conf.c, src/openvz/openvz_conf.c,
src/phyp/phyp_driver.c, src/qemu/qemu_capabilities.c,
src/uml/uml_conf.c, src/vbox/vbox_tmpl.c,
src/vmware/vmware_conf.c, src/xen/xen_hypervisor.c,
src/xenapi/xenapi_driver.c: Set default console type callback
2011-10-20 13:56:20 +00:00
|
|
|
caps->defaultConsoleTargetType = testDefaultConsoleType;
|
|
|
|
|
2010-06-17 17:57:12 +00:00
|
|
|
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
|
2009-09-23 12:25:52 +00:00
|
|
|
virCapabilitiesAddHostMigrateTransport(caps, "esx");
|
|
|
|
|
2010-06-17 17:57:12 +00:00
|
|
|
caps->hasWideScsiBus = true;
|
|
|
|
|
2009-09-23 12:25:52 +00:00
|
|
|
/* i686 guest */
|
|
|
|
guest =
|
|
|
|
virCapabilitiesAddGuest(caps, "hvm", "i686", 32, NULL, NULL, 0, NULL);
|
|
|
|
|
|
|
|
if (guest == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virCapabilitiesAddGuestDomain(guest, "vmware", NULL, NULL, 0,
|
|
|
|
NULL) == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* x86_64 guest */
|
|
|
|
guest =
|
|
|
|
virCapabilitiesAddGuest(caps, "hvm", "x86_64", 64, NULL, NULL, 0, NULL);
|
|
|
|
|
|
|
|
if (guest == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virCapabilitiesAddGuestDomain(guest, "vmware", NULL, NULL, 0,
|
|
|
|
NULL) == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
failure:
|
|
|
|
virCapabilitiesFree(caps);
|
|
|
|
caps = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2010-12-21 21:39:55 +00:00
|
|
|
testCompareFiles(const char *xml, const char *vmx, int virtualHW_version)
|
2009-09-23 12:25:52 +00:00
|
|
|
{
|
|
|
|
int result = -1;
|
2011-04-24 22:25:10 +00:00
|
|
|
char *xmlData = NULL;
|
|
|
|
char *vmxData = NULL;
|
2009-09-23 12:25:52 +00:00
|
|
|
char *formatted = NULL;
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
if (virtTestLoadFile(xml, &xmlData) < 0) {
|
2009-09-23 12:25:52 +00:00
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
if (virtTestLoadFile(vmx, &vmxData) < 0) {
|
2009-09-23 12:25:52 +00:00
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
2011-07-11 17:29:09 +00:00
|
|
|
def = virDomainDefParseString(caps, xmlData, 1 << VIR_DOMAIN_VIRT_VMWARE,
|
|
|
|
VIR_DOMAIN_XML_INACTIVE);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
|
|
|
if (def == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
formatted = virVMXFormatConfig(&ctx, caps, def, virtualHW_version);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
|
|
|
if (formatted == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (STRNEQ(vmxData, formatted)) {
|
|
|
|
virtTestDifference(stderr, vmxData, formatted);
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = 0;
|
|
|
|
|
|
|
|
failure:
|
2011-04-24 22:25:10 +00:00
|
|
|
VIR_FREE(xmlData);
|
|
|
|
VIR_FREE(vmxData);
|
2009-09-23 12:25:52 +00:00
|
|
|
VIR_FREE(formatted);
|
|
|
|
virDomainDefFree(def);
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct testInfo {
|
|
|
|
const char *input;
|
|
|
|
const char *output;
|
2010-12-21 21:39:55 +00:00
|
|
|
int virtualHW_version;
|
2009-09-23 12:25:52 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
testCompareHelper(const void *data)
|
|
|
|
{
|
2011-04-24 22:25:10 +00:00
|
|
|
int result = -1;
|
2009-09-23 12:25:52 +00:00
|
|
|
const struct testInfo *info = data;
|
2011-04-24 22:25:10 +00:00
|
|
|
char *xml = NULL;
|
|
|
|
char *vmx = NULL;
|
|
|
|
|
|
|
|
if (virAsprintf(&xml, "%s/xml2vmxdata/xml2vmx-%s.xml", abs_srcdir,
|
|
|
|
info->input) < 0 ||
|
|
|
|
virAsprintf(&vmx, "%s/xml2vmxdata/xml2vmx-%s.vmx", abs_srcdir,
|
|
|
|
info->output) < 0) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
result = testCompareFiles(xml, vmx, info->virtualHW_version);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
cleanup:
|
|
|
|
VIR_FREE(xml);
|
|
|
|
VIR_FREE(vmx);
|
|
|
|
|
|
|
|
return result;
|
2009-09-23 12:25:52 +00:00
|
|
|
}
|
|
|
|
|
2010-08-05 15:43:19 +00:00
|
|
|
static int
|
|
|
|
testAutodetectSCSIControllerModel(virDomainDiskDefPtr def ATTRIBUTE_UNUSED,
|
|
|
|
int *model, void *opaque ATTRIBUTE_UNUSED)
|
|
|
|
{
|
2011-09-02 13:06:15 +00:00
|
|
|
*model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC;
|
2010-08-05 15:43:19 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
testFormatVMXFileName(const char *src, void *opaque ATTRIBUTE_UNUSED)
|
|
|
|
{
|
|
|
|
bool success = false;
|
2010-12-21 21:39:55 +00:00
|
|
|
char *copyOfDatastorePath = NULL;
|
|
|
|
char *tmp = NULL;
|
|
|
|
char *saveptr = NULL;
|
2010-08-05 15:43:19 +00:00
|
|
|
char *datastoreName = NULL;
|
2010-08-25 09:44:57 +00:00
|
|
|
char *directoryAndFileName = NULL;
|
2010-08-05 15:43:19 +00:00
|
|
|
char *absolutePath = NULL;
|
|
|
|
|
|
|
|
if (STRPREFIX(src, "[")) {
|
|
|
|
/* Found potential datastore path */
|
2010-12-21 21:39:55 +00:00
|
|
|
copyOfDatastorePath = strdup(src);
|
|
|
|
|
|
|
|
if (copyOfDatastorePath == NULL) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Expected format: '[<datastore>] <path>' where <path> is optional */
|
|
|
|
if ((tmp = STRSKIP(copyOfDatastorePath, "[")) == NULL || *tmp == ']' ||
|
|
|
|
(datastoreName = strtok_r(tmp, "]", &saveptr)) == NULL) {
|
2010-08-05 15:43:19 +00:00
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
directoryAndFileName = strtok_r(NULL, "", &saveptr);
|
|
|
|
|
|
|
|
if (directoryAndFileName == NULL) {
|
|
|
|
directoryAndFileName = (char *)"";
|
|
|
|
} else {
|
|
|
|
directoryAndFileName += strspn(directoryAndFileName, " ");
|
|
|
|
}
|
|
|
|
|
2010-08-25 09:44:57 +00:00
|
|
|
virAsprintf(&absolutePath, "/vmfs/volumes/%s/%s", datastoreName,
|
|
|
|
directoryAndFileName);
|
2010-08-05 15:43:19 +00:00
|
|
|
} else if (STRPREFIX(src, "/")) {
|
|
|
|
/* Found absolute path */
|
|
|
|
absolutePath = strdup(src);
|
|
|
|
} else {
|
|
|
|
/* Found relative path, this is not supported */
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
success = true;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
if (! success) {
|
|
|
|
VIR_FREE(absolutePath);
|
|
|
|
}
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
VIR_FREE(copyOfDatastorePath);
|
2010-08-05 15:43:19 +00:00
|
|
|
|
|
|
|
return absolutePath;
|
|
|
|
}
|
|
|
|
|
2009-09-23 12:25:52 +00:00
|
|
|
static int
|
2011-04-29 16:21:20 +00:00
|
|
|
mymain(void)
|
2009-09-23 12:25:52 +00:00
|
|
|
{
|
|
|
|
int result = 0;
|
|
|
|
|
2010-08-05 15:43:19 +00:00
|
|
|
# define DO_TEST(_in, _out, _version) \
|
2009-09-23 12:25:52 +00:00
|
|
|
do { \
|
|
|
|
struct testInfo info = { _in, _out, _version }; \
|
|
|
|
virResetLastError(); \
|
|
|
|
if (virtTestRun("VMware XML-2-VMX "_in" -> "_out, 1, \
|
|
|
|
testCompareHelper, &info) < 0) { \
|
|
|
|
result = -1; \
|
|
|
|
} \
|
|
|
|
} while (0)
|
|
|
|
|
2010-06-17 17:57:12 +00:00
|
|
|
testCapsInit();
|
2009-09-23 12:25:52 +00:00
|
|
|
|
|
|
|
if (caps == NULL) {
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
2010-08-05 15:43:19 +00:00
|
|
|
ctx.opaque = NULL;
|
|
|
|
ctx.parseFileName = NULL;
|
|
|
|
ctx.formatFileName = testFormatVMXFileName;
|
|
|
|
ctx.autodetectSCSIControllerModel = testAutodetectSCSIControllerModel;
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("minimal", "minimal", 4);
|
|
|
|
DO_TEST("minimal-64bit", "minimal-64bit", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("graphics-vnc", "graphics-vnc", 4);
|
2010-01-16 12:52:34 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("scsi-driver", "scsi-driver", 4);
|
|
|
|
DO_TEST("scsi-writethrough", "scsi-writethrough", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("harddisk-scsi-file", "harddisk-scsi-file", 4);
|
|
|
|
DO_TEST("harddisk-ide-file", "harddisk-ide-file", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("cdrom-scsi-file", "cdrom-scsi-file", 4);
|
|
|
|
DO_TEST("cdrom-scsi-device", "cdrom-scsi-device", 4);
|
|
|
|
DO_TEST("cdrom-ide-file", "cdrom-ide-file", 4);
|
|
|
|
DO_TEST("cdrom-ide-device", "cdrom-ide-device", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("floppy-file", "floppy-file", 4);
|
|
|
|
DO_TEST("floppy-device", "floppy-device", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("ethernet-e1000", "ethernet-e1000", 4);
|
|
|
|
DO_TEST("ethernet-vmxnet2", "ethernet-vmxnet2", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("ethernet-custom", "ethernet-custom", 4);
|
|
|
|
DO_TEST("ethernet-bridged", "ethernet-bridged", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("ethernet-generated", "ethernet-generated", 4);
|
|
|
|
DO_TEST("ethernet-static", "ethernet-static", 4);
|
|
|
|
DO_TEST("ethernet-vpx", "ethernet-vpx", 4);
|
|
|
|
DO_TEST("ethernet-other", "ethernet-other", 4);
|
2010-01-02 22:58:24 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("serial-file", "serial-file", 4);
|
|
|
|
DO_TEST("serial-device", "serial-device", 4);
|
|
|
|
DO_TEST("serial-pipe", "serial-pipe", 4);
|
|
|
|
DO_TEST("serial-network-server", "serial-network-server", 7);
|
|
|
|
DO_TEST("serial-network-client", "serial-network-client", 7);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("parallel-file", "parallel-file", 4);
|
|
|
|
DO_TEST("parallel-device", "parallel-device", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("esx-in-the-wild-1", "esx-in-the-wild-1", 4);
|
|
|
|
DO_TEST("esx-in-the-wild-2", "esx-in-the-wild-2", 4);
|
|
|
|
DO_TEST("esx-in-the-wild-3", "esx-in-the-wild-3", 4);
|
|
|
|
DO_TEST("esx-in-the-wild-4", "esx-in-the-wild-4", 4);
|
|
|
|
DO_TEST("esx-in-the-wild-5", "esx-in-the-wild-5", 4);
|
2011-05-26 15:40:51 +00:00
|
|
|
DO_TEST("esx-in-the-wild-6", "esx-in-the-wild-6", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1", 4);
|
|
|
|
DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2", 4);
|
|
|
|
DO_TEST("gsx-in-the-wild-3", "gsx-in-the-wild-3", 4);
|
|
|
|
DO_TEST("gsx-in-the-wild-4", "gsx-in-the-wild-4", 4);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("annotation", "annotation", 4);
|
2010-08-27 15:23:49 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("smbios", "smbios", 4);
|
2010-11-10 19:05:51 +00:00
|
|
|
|
2010-12-30 17:08:54 +00:00
|
|
|
DO_TEST("svga", "svga", 4);
|
|
|
|
|
2009-09-23 12:25:52 +00:00
|
|
|
virCapabilitiesFree(caps);
|
|
|
|
|
|
|
|
return result == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
VIRT_TEST_MAIN(mymain)
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
2011-07-08 23:24:44 +00:00
|
|
|
int main(void)
|
2009-09-23 12:25:52 +00:00
|
|
|
{
|
2011-07-08 23:24:44 +00:00
|
|
|
return EXIT_AM_SKIP;
|
2009-09-23 12:25:52 +00:00
|
|
|
}
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
#endif /* WITH_VMX */
|