Files
libvirt/tests/vmx2xmltest.c
T

308 lines
8.7 KiB
C
Raw Normal View History

#include <config.h>
2013-04-16 21:41:44 +08:00
#include "testutils.h"
#ifdef WITH_VMX
# include <stdio.h>
# include <string.h>
# include <unistd.h>
# include "internal.h"
2012-12-12 18:06:53 +00:00
# include "viralloc.h"
# include "vmx/vmx.h"
# include "virstring.h"
# define VIR_FROM_THIS VIR_FROM_VMWARE
2011-04-25 00:25:10 +02:00
static virCapsPtr caps;
2013-03-15 11:40:17 +01:00
static virDomainXMLOptionPtr xmlopt;
static virVMXContext ctx;
2011-10-20 14:56:20 +01:00
2010-06-17 19:57:12 +02:00
static void
testCapsInit(void)
{
virCapsGuestPtr guest = NULL;
2014-07-14 06:56:13 -06:00
caps = virCapabilitiesNew(VIR_ARCH_I686, true, true);
2010-06-17 19:57:12 +02:00
2014-11-13 15:20:43 +01:00
if (caps == NULL)
2010-06-17 19:57:12 +02:00
return;
virCapabilitiesAddHostMigrateTransport(caps, "esx");
/* i686 guest */
guest =
virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM,
2012-12-18 19:32:23 +00:00
VIR_ARCH_I686,
NULL, NULL, 0, NULL);
2010-06-17 19:57:12 +02:00
2014-11-13 15:20:43 +01:00
if (guest == NULL)
2010-06-17 19:57:12 +02:00
goto failure;
if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE, NULL, NULL, 0,
2010-06-17 19:57:12 +02:00
NULL) == NULL) {
goto failure;
}
/* x86_64 guest */
guest =
virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM,
2012-12-18 19:32:23 +00:00
VIR_ARCH_X86_64,
NULL, NULL, 0, NULL);
2010-06-17 19:57:12 +02:00
2014-11-13 15:20:43 +01:00
if (guest == NULL)
2010-06-17 19:57:12 +02:00
goto failure;
if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE, NULL, NULL, 0,
2010-06-17 19:57:12 +02:00
NULL) == NULL) {
goto failure;
}
return;
failure:
2013-02-01 12:26:18 +00:00
virObjectUnref(caps);
2010-06-17 19:57:12 +02:00
caps = NULL;
}
static int
testCompareFiles(const char *vmx, const char *xml)
{
int ret = -1;
2011-04-25 00:25:10 +02:00
char *vmxData = NULL;
char *formatted = NULL;
virDomainDefPtr def = NULL;
if (virtTestLoadFile(vmx, &vmxData) < 0)
goto cleanup;
if (!(def = virVMXParseConfig(&ctx, xmlopt, caps, vmxData)))
goto cleanup;
if (!virDomainDefCheckABIStability(def, def)) {
fprintf(stderr, "ABI stability check failed on %s", vmx);
goto cleanup;
}
2016-02-03 21:40:35 +00:00
if (!(formatted = virDomainDefFormat(def, caps,
VIR_DOMAIN_DEF_FORMAT_SECURE)))
goto cleanup;
2015-04-23 11:14:26 -04:00
if (virtTestCompareToFile(formatted, xml) < 0)
goto cleanup;
ret = 0;
cleanup:
2011-04-25 00:25:10 +02:00
VIR_FREE(vmxData);
VIR_FREE(formatted);
virDomainDefFree(def);
return ret;
}
struct testInfo {
const char *input;
const char *output;
};
static int
testCompareHelper(const void *data)
{
int ret = -1;
const struct testInfo *info = data;
2011-04-25 00:25:10 +02:00
char *vmx = NULL;
char *xml = NULL;
if (virAsprintf(&vmx, "%s/vmx2xmldata/vmx2xml-%s.vmx", abs_srcdir,
info->input) < 0 ||
virAsprintf(&xml, "%s/vmx2xmldata/vmx2xml-%s.xml", abs_srcdir,
info->output) < 0) {
goto cleanup;
}
ret = testCompareFiles(vmx, xml);
cleanup:
2011-04-25 00:25:10 +02:00
VIR_FREE(vmx);
VIR_FREE(xml);
return ret;
}
static char *
testParseVMXFileName(const char *fileName, void *opaque ATTRIBUTE_UNUSED)
{
char *copyOfFileName = NULL;
char *tmp = NULL;
char *saveptr = NULL;
char *datastoreName = NULL;
char *directoryAndFileName = NULL;
char *src = NULL;
if (STRPREFIX(fileName, "/vmfs/volumes/")) {
/* Found absolute path referencing a file inside a datastore */
if (VIR_STRDUP(copyOfFileName, fileName) < 0)
goto cleanup;
/* Expected format: '/vmfs/volumes/<datastore>/<path>' */
if ((tmp = STRSKIP(copyOfFileName, "/vmfs/volumes/")) == NULL ||
(datastoreName = strtok_r(tmp, "/", &saveptr)) == NULL ||
(directoryAndFileName = strtok_r(NULL, "", &saveptr)) == NULL) {
goto cleanup;
}
if (virAsprintf(&src, "[%s] %s", datastoreName,
directoryAndFileName) < 0)
goto cleanup;
} else if (STRPREFIX(fileName, "/")) {
/* Found absolute path referencing a file outside a datastore */
ignore_value(VIR_STRDUP(src, fileName));
} else if (strchr(fileName, '/') != NULL) {
/* Found relative path, this is not supported */
src = NULL;
} else {
/* Found single file name referencing a file inside a datastore */
if (virAsprintf(&src, "[datastore] directory/%s", fileName) < 0)
goto cleanup;
}
cleanup:
VIR_FREE(copyOfFileName);
return src;
}
static int
2011-04-29 10:21:20 -06:00
mymain(void)
{
int ret = 0;
# define DO_TEST(_in, _out) \
do { \
struct testInfo info = { _in, _out }; \
virResetLastError(); \
2013-09-20 19:13:35 +01:00
if (virtTestRun("VMware VMX-2-XML "_in" -> "_out, \
testCompareHelper, &info) < 0) { \
ret = -1; \
} \
} while (0)
2010-06-17 19:57:12 +02:00
testCapsInit();
2014-11-13 15:20:43 +01:00
if (caps == NULL)
2010-06-17 19:57:12 +02:00
return EXIT_FAILURE;
2013-03-15 11:40:17 +01:00
if (!(xmlopt = virVMXDomainXMLConfInit()))
return EXIT_FAILURE;
ctx.opaque = NULL;
ctx.parseFileName = testParseVMXFileName;
ctx.formatFileName = NULL;
ctx.autodetectSCSIControllerModel = NULL;
2015-09-11 12:00:47 +02:00
ctx.datacenterPath = NULL;
DO_TEST("case-insensitive-1", "case-insensitive-1");
DO_TEST("case-insensitive-2", "case-insensitive-2");
DO_TEST("minimal", "minimal");
DO_TEST("minimal-64bit", "minimal-64bit");
DO_TEST("graphics-vnc", "graphics-vnc");
2010-01-16 13:52:34 +01:00
DO_TEST("scsi-driver", "scsi-driver");
DO_TEST("scsi-writethrough", "scsi-writethrough");
DO_TEST("harddisk-scsi-file", "harddisk-scsi-file");
DO_TEST("harddisk-ide-file", "harddisk-ide-file");
DO_TEST("harddisk-transient", "harddisk-transient");
DO_TEST("cdrom-scsi-file", "cdrom-scsi-file");
DO_TEST("cdrom-scsi-empty", "cdrom-scsi-empty");
DO_TEST("cdrom-scsi-device", "cdrom-scsi-device");
DO_TEST("cdrom-scsi-raw-device", "cdrom-scsi-raw-device");
DO_TEST("cdrom-scsi-raw-auto-detect", "cdrom-scsi-raw-auto-detect");
DO_TEST("cdrom-scsi-passthru", "cdrom-scsi-passthru");
DO_TEST("cdrom-ide-file", "cdrom-ide-file");
DO_TEST("cdrom-ide-empty", "cdrom-ide-empty");
DO_TEST("cdrom-ide-device", "cdrom-ide-device");
DO_TEST("cdrom-ide-raw-device", "cdrom-ide-raw-device");
DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect");
DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect");
DO_TEST("floppy-file", "floppy-file");
DO_TEST("floppy-device", "floppy-device");
2012-07-11 12:16:35 +02:00
DO_TEST("sharedfolder", "sharedfolder");
DO_TEST("ethernet-e1000", "ethernet-e1000");
DO_TEST("ethernet-vmxnet2", "ethernet-vmxnet2");
DO_TEST("ethernet-custom", "ethernet-custom");
DO_TEST("ethernet-bridged", "ethernet-bridged");
2012-02-23 10:34:45 +01:00
DO_TEST("ethernet-nat", "ethernet-nat");
DO_TEST("ethernet-generated", "ethernet-generated");
DO_TEST("ethernet-static", "ethernet-static");
DO_TEST("ethernet-vpx", "ethernet-vpx");
DO_TEST("ethernet-other", "ethernet-other");
DO_TEST("serial-file", "serial-file");
DO_TEST("serial-device", "serial-device");
DO_TEST("serial-pipe-client-app", "serial-pipe");
DO_TEST("serial-pipe-server-vm", "serial-pipe");
DO_TEST("serial-pipe-client-app", "serial-pipe");
DO_TEST("serial-pipe-server-vm", "serial-pipe");
DO_TEST("serial-network-server", "serial-network-server");
DO_TEST("serial-network-client", "serial-network-client");
DO_TEST("parallel-file", "parallel-file");
DO_TEST("parallel-device", "parallel-device");
DO_TEST("esx-in-the-wild-1", "esx-in-the-wild-1");
DO_TEST("esx-in-the-wild-2", "esx-in-the-wild-2");
DO_TEST("esx-in-the-wild-3", "esx-in-the-wild-3");
DO_TEST("esx-in-the-wild-4", "esx-in-the-wild-4");
DO_TEST("esx-in-the-wild-5", "esx-in-the-wild-5");
DO_TEST("esx-in-the-wild-6", "esx-in-the-wild-6");
DO_TEST("esx-in-the-wild-7", "esx-in-the-wild-7");
DO_TEST("gsx-in-the-wild-1", "gsx-in-the-wild-1");
DO_TEST("gsx-in-the-wild-2", "gsx-in-the-wild-2");
DO_TEST("gsx-in-the-wild-3", "gsx-in-the-wild-3");
DO_TEST("gsx-in-the-wild-4", "gsx-in-the-wild-4");
2012-02-23 10:34:45 +01:00
DO_TEST("ws-in-the-wild-1", "ws-in-the-wild-1");
DO_TEST("ws-in-the-wild-2", "ws-in-the-wild-2");
DO_TEST("fusion-in-the-wild-1", "fusion-in-the-wild-1");
DO_TEST("annotation", "annotation");
DO_TEST("smbios", "smbios");
2010-11-10 20:05:51 +01:00
2010-12-30 18:08:54 +01:00
DO_TEST("svga", "svga");
2015-09-11 12:00:47 +02:00
ctx.datacenterPath = "folder1/folder2/datacenter1";
DO_TEST("datacenterpath", "datacenterpath");
2013-02-01 12:26:18 +00:00
virObjectUnref(caps);
2013-03-15 11:40:17 +01:00
virObjectUnref(xmlopt);
2010-06-17 19:57:12 +02:00
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIRT_TEST_MAIN(mymain)
#else
int main(void)
{
return EXIT_AM_SKIP;
}
#endif /* WITH_VMX */