2009-09-23 12:25:52 +00:00
|
|
|
#include <config.h>
|
|
|
|
|
2013-04-16 13:41:44 +00:00
|
|
|
#include "testutils.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 <unistd.h>
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-03-09 18:22:22 +00:00
|
|
|
# include "internal.h"
|
2012-12-12 18:06:53 +00:00
|
|
|
# include "viralloc.h"
|
2010-12-21 21:39:55 +00:00
|
|
|
# include "vmx/vmx.h"
|
2013-04-03 10:36:23 +00:00
|
|
|
# include "virstring.h"
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2013-05-03 12:52:21 +00:00
|
|
|
# define VIR_FROM_THIS VIR_FROM_VMWARE
|
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
static virCapsPtr caps;
|
2013-03-15 10:40:17 +00:00
|
|
|
static virDomainXMLOptionPtr xmlopt;
|
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
|
|
|
|
2010-06-17 17:57:12 +00:00
|
|
|
static void
|
|
|
|
testCapsInit(void)
|
|
|
|
{
|
|
|
|
virCapsGuestPtr guest = NULL;
|
|
|
|
|
2014-07-14 12:56:13 +00:00
|
|
|
caps = virCapabilitiesNew(VIR_ARCH_I686, true, true);
|
2010-06-17 17:57:12 +00:00
|
|
|
|
2014-11-13 14:20:43 +00:00
|
|
|
if (caps == NULL)
|
2010-06-17 17:57:12 +00:00
|
|
|
return;
|
|
|
|
|
2018-05-18 21:47:08 +00:00
|
|
|
virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr");
|
2010-06-17 17:57:12 +00:00
|
|
|
|
|
|
|
/* i686 guest */
|
|
|
|
guest =
|
2015-04-17 22:09:16 +00:00
|
|
|
virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM,
|
2012-12-18 19:32:23 +00:00
|
|
|
VIR_ARCH_I686,
|
|
|
|
NULL, NULL, 0, NULL);
|
2010-06-17 17:57:12 +00:00
|
|
|
|
2014-11-13 14:20:43 +00:00
|
|
|
if (guest == NULL)
|
2010-06-17 17:57:12 +00:00
|
|
|
goto failure;
|
|
|
|
|
2015-04-17 22:38:10 +00:00
|
|
|
if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE, NULL, NULL, 0,
|
2010-06-17 17:57:12 +00:00
|
|
|
NULL) == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* x86_64 guest */
|
|
|
|
guest =
|
2015-04-17 22:09:16 +00:00
|
|
|
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 17:57:12 +00:00
|
|
|
|
2014-11-13 14:20:43 +00:00
|
|
|
if (guest == NULL)
|
2010-06-17 17:57:12 +00:00
|
|
|
goto failure;
|
|
|
|
|
2015-04-17 22:38:10 +00:00
|
|
|
if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE, NULL, NULL, 0,
|
2010-06-17 17:57:12 +00:00
|
|
|
NULL) == NULL) {
|
|
|
|
goto failure;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
2014-03-25 06:53:44 +00:00
|
|
|
failure:
|
2013-02-01 12:26:18 +00:00
|
|
|
virObjectUnref(caps);
|
2010-06-17 17:57:12 +00:00
|
|
|
caps = NULL;
|
|
|
|
}
|
|
|
|
|
2009-09-23 12:25:52 +00:00
|
|
|
static int
|
2010-12-21 21:39:55 +00:00
|
|
|
testCompareFiles(const char *vmx, const char *xml)
|
2009-09-23 12:25:52 +00:00
|
|
|
{
|
2013-09-25 10:34:00 +00:00
|
|
|
int ret = -1;
|
2011-04-24 22:25:10 +00:00
|
|
|
char *vmxData = NULL;
|
2009-09-23 12:25:52 +00:00
|
|
|
char *formatted = NULL;
|
|
|
|
virDomainDefPtr def = NULL;
|
|
|
|
|
2016-05-26 15:01:52 +00:00
|
|
|
if (virTestLoadFile(vmx, &vmxData) < 0)
|
2013-09-25 10:34:00 +00:00
|
|
|
goto cleanup;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2015-11-28 04:12:33 +00:00
|
|
|
if (!(def = virVMXParseConfig(&ctx, xmlopt, caps, vmxData)))
|
2013-09-25 10:34:00 +00:00
|
|
|
goto cleanup;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2017-05-19 13:07:15 +00:00
|
|
|
if (!virDomainDefCheckABIStability(def, def, xmlopt)) {
|
2014-01-10 17:18:03 +00:00
|
|
|
fprintf(stderr, "ABI stability check failed on %s", vmx);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2019-11-27 11:57:34 +00:00
|
|
|
if (!(formatted = virDomainDefFormat(def, xmlopt,
|
2016-02-03 21:40:35 +00:00
|
|
|
VIR_DOMAIN_DEF_FORMAT_SECURE)))
|
2013-09-25 10:34:00 +00:00
|
|
|
goto cleanup;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2016-05-26 15:01:53 +00:00
|
|
|
if (virTestCompareToFile(formatted, xml) < 0)
|
2013-09-25 10:34:00 +00:00
|
|
|
goto cleanup;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2013-09-25 10:34:00 +00:00
|
|
|
ret = 0;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2014-03-25 06:53:44 +00:00
|
|
|
cleanup:
|
2011-04-24 22:25:10 +00:00
|
|
|
VIR_FREE(vmxData);
|
2009-09-23 12:25:52 +00:00
|
|
|
VIR_FREE(formatted);
|
|
|
|
virDomainDefFree(def);
|
|
|
|
|
2013-09-25 10:34:00 +00:00
|
|
|
return ret;
|
2009-09-23 12:25:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
struct testInfo {
|
|
|
|
const char *input;
|
|
|
|
const char *output;
|
|
|
|
};
|
|
|
|
|
|
|
|
static int
|
|
|
|
testCompareHelper(const void *data)
|
|
|
|
{
|
2013-09-25 10:34:00 +00:00
|
|
|
int ret = -1;
|
2009-09-23 12:25:52 +00:00
|
|
|
const struct testInfo *info = data;
|
2011-04-24 22:25:10 +00:00
|
|
|
char *vmx = NULL;
|
|
|
|
char *xml = NULL;
|
|
|
|
|
2019-10-22 13:26:14 +00:00
|
|
|
vmx = g_strdup_printf("%s/vmx2xmldata/vmx2xml-%s.vmx", abs_srcdir,
|
|
|
|
info->input);
|
|
|
|
xml = g_strdup_printf("%s/vmx2xmldata/vmx2xml-%s.xml", abs_srcdir,
|
|
|
|
info->output);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2013-09-25 10:34:00 +00:00
|
|
|
ret = testCompareFiles(vmx, xml);
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2011-04-24 22:25:10 +00:00
|
|
|
VIR_FREE(vmx);
|
|
|
|
VIR_FREE(xml);
|
|
|
|
|
2013-09-25 10:34:00 +00:00
|
|
|
return ret;
|
2009-09-23 12:25:52 +00:00
|
|
|
}
|
|
|
|
|
2010-08-05 15:43:19 +00:00
|
|
|
static char *
|
2019-10-14 12:45:03 +00:00
|
|
|
testParseVMXFileName(const char *fileName, void *opaque G_GNUC_UNUSED)
|
2010-08-05 15:43:19 +00:00
|
|
|
{
|
|
|
|
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 */
|
2019-10-20 11:49:46 +00:00
|
|
|
copyOfFileName = g_strdup(fileName);
|
2010-08-05 15:43:19 +00:00
|
|
|
|
|
|
|
/* 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;
|
|
|
|
}
|
|
|
|
|
2019-10-22 13:26:14 +00:00
|
|
|
src = g_strdup_printf("[%s] %s", datastoreName, directoryAndFileName);
|
2010-08-05 15:43:19 +00:00
|
|
|
} else if (STRPREFIX(fileName, "/")) {
|
|
|
|
/* Found absolute path referencing a file outside a datastore */
|
2019-10-18 11:27:03 +00:00
|
|
|
src = g_strdup(fileName);
|
2010-08-05 15:43:19 +00:00
|
|
|
} 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 */
|
2019-10-22 13:26:14 +00:00
|
|
|
src = g_strdup_printf("[datastore] directory/%s", fileName);
|
2010-08-05 15:43:19 +00:00
|
|
|
}
|
|
|
|
|
2014-03-25 06:53:44 +00:00
|
|
|
cleanup:
|
2010-08-05 15:43:19 +00:00
|
|
|
VIR_FREE(copyOfFileName);
|
|
|
|
|
|
|
|
return src;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
{
|
2013-09-25 10:34:00 +00:00
|
|
|
int ret = 0;
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2017-11-03 12:09:47 +00:00
|
|
|
# define DO_TEST(_in, _out) \
|
|
|
|
do { \
|
|
|
|
struct testInfo info = { _in, _out }; \
|
|
|
|
virResetLastError(); \
|
|
|
|
if (virTestRun("VMware VMX-2-XML "_in" -> "_out, \
|
|
|
|
testCompareHelper, &info) < 0) { \
|
|
|
|
ret = -1; \
|
|
|
|
} \
|
2009-09-23 12:25:52 +00:00
|
|
|
} while (0)
|
|
|
|
|
2010-06-17 17:57:12 +00:00
|
|
|
testCapsInit();
|
|
|
|
|
2014-11-13 14:20:43 +00:00
|
|
|
if (caps == NULL)
|
2010-06-17 17:57:12 +00:00
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
2019-12-03 10:49:49 +00:00
|
|
|
if (!(xmlopt = virVMXDomainXMLConfInit(caps)))
|
2013-03-15 10:40:17 +00:00
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
2010-08-05 15:43:19 +00:00
|
|
|
ctx.opaque = NULL;
|
|
|
|
ctx.parseFileName = testParseVMXFileName;
|
|
|
|
ctx.formatFileName = NULL;
|
|
|
|
ctx.autodetectSCSIControllerModel = NULL;
|
2015-09-11 10:00:47 +00:00
|
|
|
ctx.datacenterPath = NULL;
|
2010-08-05 15:43:19 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("case-insensitive-1", "case-insensitive-1");
|
|
|
|
DO_TEST("case-insensitive-2", "case-insensitive-2");
|
2010-03-24 00:52:33 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("minimal", "minimal");
|
|
|
|
DO_TEST("minimal-64bit", "minimal-64bit");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("graphics-vnc", "graphics-vnc");
|
2010-01-16 12:52:34 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("scsi-driver", "scsi-driver");
|
|
|
|
DO_TEST("scsi-writethrough", "scsi-writethrough");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("harddisk-scsi-file", "harddisk-scsi-file");
|
|
|
|
DO_TEST("harddisk-ide-file", "harddisk-ide-file");
|
2014-01-18 11:20:57 +00:00
|
|
|
DO_TEST("harddisk-transient", "harddisk-transient");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("cdrom-scsi-file", "cdrom-scsi-file");
|
2016-01-07 08:51:55 +00:00
|
|
|
DO_TEST("cdrom-scsi-empty", "cdrom-scsi-empty");
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("cdrom-scsi-device", "cdrom-scsi-device");
|
2013-08-13 01:55:57 +00:00
|
|
|
DO_TEST("cdrom-scsi-raw-device", "cdrom-scsi-raw-device");
|
2013-08-13 15:56:01 +00:00
|
|
|
DO_TEST("cdrom-scsi-raw-auto-detect", "cdrom-scsi-raw-auto-detect");
|
2015-09-01 14:52:04 +00:00
|
|
|
DO_TEST("cdrom-scsi-passthru", "cdrom-scsi-passthru");
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("cdrom-ide-file", "cdrom-ide-file");
|
2016-01-07 08:51:55 +00:00
|
|
|
DO_TEST("cdrom-ide-empty", "cdrom-ide-empty");
|
2020-03-18 09:46:55 +00:00
|
|
|
DO_TEST("cdrom-ide-empty-2", "cdrom-ide-empty-2");
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("cdrom-ide-device", "cdrom-ide-device");
|
2013-08-13 01:55:57 +00:00
|
|
|
DO_TEST("cdrom-ide-raw-device", "cdrom-ide-raw-device");
|
2013-08-13 15:56:01 +00:00
|
|
|
DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect");
|
2016-01-07 08:51:55 +00:00
|
|
|
DO_TEST("cdrom-ide-raw-auto-detect", "cdrom-ide-raw-auto-detect");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("floppy-file", "floppy-file");
|
|
|
|
DO_TEST("floppy-device", "floppy-device");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2012-07-11 10:16:35 +00:00
|
|
|
DO_TEST("sharedfolder", "sharedfolder");
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("ethernet-e1000", "ethernet-e1000");
|
|
|
|
DO_TEST("ethernet-vmxnet2", "ethernet-vmxnet2");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("ethernet-custom", "ethernet-custom");
|
|
|
|
DO_TEST("ethernet-bridged", "ethernet-bridged");
|
2012-02-23 09:34:45 +00:00
|
|
|
DO_TEST("ethernet-nat", "ethernet-nat");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("ethernet-generated", "ethernet-generated");
|
|
|
|
DO_TEST("ethernet-static", "ethernet-static");
|
|
|
|
DO_TEST("ethernet-vpx", "ethernet-vpx");
|
|
|
|
DO_TEST("ethernet-other", "ethernet-other");
|
2010-01-02 22:58:24 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
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");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("parallel-file", "parallel-file");
|
|
|
|
DO_TEST("parallel-device", "parallel-device");
|
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");
|
|
|
|
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");
|
2011-05-26 15:40:51 +00:00
|
|
|
DO_TEST("esx-in-the-wild-6", "esx-in-the-wild-6");
|
2015-09-01 14:52:04 +00:00
|
|
|
DO_TEST("esx-in-the-wild-7", "esx-in-the-wild-7");
|
2018-03-28 11:40:21 +00:00
|
|
|
DO_TEST("esx-in-the-wild-8", "esx-in-the-wild-8");
|
2018-04-19 13:03:37 +00:00
|
|
|
DO_TEST("esx-in-the-wild-9", "esx-in-the-wild-9");
|
2020-10-12 15:06:59 +00:00
|
|
|
DO_TEST("esx-in-the-wild-10", "esx-in-the-wild-10");
|
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");
|
|
|
|
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");
|
2009-09-23 12:25:52 +00:00
|
|
|
|
2012-02-23 09:34:45 +00: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");
|
|
|
|
|
2013-08-13 15:56:56 +00:00
|
|
|
DO_TEST("fusion-in-the-wild-1", "fusion-in-the-wild-1");
|
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("annotation", "annotation");
|
2010-08-27 15:23:49 +00:00
|
|
|
|
2010-12-21 21:39:55 +00:00
|
|
|
DO_TEST("smbios", "smbios");
|
2010-11-10 19:05:51 +00:00
|
|
|
|
2010-12-30 17:08:54 +00:00
|
|
|
DO_TEST("svga", "svga");
|
|
|
|
|
2019-04-09 14:04:31 +00:00
|
|
|
DO_TEST("firmware-efi", "firmware-efi");
|
|
|
|
|
2015-09-11 10:00:47 +00:00
|
|
|
ctx.datacenterPath = "folder1/folder2/datacenter1";
|
|
|
|
|
|
|
|
DO_TEST("datacenterpath", "datacenterpath");
|
|
|
|
|
2013-02-01 12:26:18 +00:00
|
|
|
virObjectUnref(caps);
|
2013-03-15 10:40:17 +00:00
|
|
|
virObjectUnref(xmlopt);
|
2010-06-17 17:57:12 +00:00
|
|
|
|
2013-09-25 10:34:00 +00:00
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
2009-09-23 12:25:52 +00:00
|
|
|
}
|
|
|
|
|
2017-03-29 14:45:42 +00:00
|
|
|
VIR_TEST_MAIN(mymain)
|
2009-09-23 12:25:52 +00:00
|
|
|
|
|
|
|
#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 */
|