mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-09 15:00:07 +00:00
23c4794488
When using vSPC (Virtual Serial Port Concentrator) in vSphere the actual address for it is saved in serialX.vspc in which case the serialX.fileName is most probably something we can't get any useful information from and we also fail during the parsing rendering any dumpxml and similar tries unsuccessful. Instead of parsing the vspc URL with something along the lines of `virURIParse(vspc ? vspc : fileName)`, which could lead to us reporting information that is very prune to misuse (the vSPC seemingly has a protocol on top of the telnet connection; redefining the domain would change the behaviour; the URL might have a fragment we are not saving; etc.) or adding more XML knobs to indicate vSPC usage (which we would not be able to configure; we'd have to properly error out everywhere; etc.) let's just report dummy serial port that leads to nowhere (i.e. type="null"). Resolves: https://issues.redhat.com/browse/RHEL-32182 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
306 lines
7.7 KiB
C
306 lines
7.7 KiB
C
#include <config.h>
|
|
|
|
#include "testutils.h"
|
|
|
|
#ifdef WITH_VMX
|
|
|
|
# include <unistd.h>
|
|
|
|
# include "internal.h"
|
|
# include "vmx/vmx.h"
|
|
|
|
# define VIR_FROM_THIS VIR_FROM_VMWARE
|
|
|
|
static virCaps *caps;
|
|
static virDomainXMLOption *xmlopt;
|
|
static virVMXContext ctx;
|
|
|
|
|
|
static void
|
|
testCapsInit(void)
|
|
{
|
|
virCapsGuest *guest = NULL;
|
|
|
|
caps = virCapabilitiesNew(VIR_ARCH_I686, true, true);
|
|
|
|
if (caps == NULL)
|
|
return;
|
|
|
|
virCapabilitiesAddHostMigrateTransport(caps, "vpxmigr");
|
|
|
|
/* i686 guest */
|
|
guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM,
|
|
VIR_ARCH_I686,
|
|
NULL, NULL, 0, NULL);
|
|
|
|
virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE,
|
|
NULL, NULL, 0, NULL);
|
|
|
|
/* x86_64 guest */
|
|
guest = virCapabilitiesAddGuest(caps, VIR_DOMAIN_OSTYPE_HVM,
|
|
VIR_ARCH_X86_64,
|
|
NULL, NULL, 0, NULL);
|
|
|
|
virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_VMWARE,
|
|
NULL, NULL, 0, NULL);
|
|
}
|
|
|
|
static int
|
|
testCompareFiles(const char *vmx, const char *xml, bool should_fail_parse)
|
|
{
|
|
g_autofree char *vmxData = NULL;
|
|
g_autofree char *formatted = NULL;
|
|
g_autoptr(virDomainDef) def = NULL;
|
|
|
|
if (virTestLoadFile(vmx, &vmxData) < 0)
|
|
return -1;
|
|
|
|
def = virVMXParseConfig(&ctx, xmlopt, caps, vmxData);
|
|
if (should_fail_parse) {
|
|
if (!def)
|
|
return 0;
|
|
|
|
VIR_TEST_DEBUG("passed instead of expected failure");
|
|
return -1;
|
|
}
|
|
if (!def)
|
|
return -1;
|
|
|
|
if (!virDomainDefCheckABIStability(def, def, xmlopt)) {
|
|
fprintf(stderr, "ABI stability check failed on %s", vmx);
|
|
return -1;
|
|
}
|
|
|
|
if (!(formatted = virDomainDefFormat(def, xmlopt,
|
|
VIR_DOMAIN_DEF_FORMAT_SECURE)))
|
|
return -1;
|
|
|
|
if (virTestCompareToFile(formatted, xml) < 0)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
struct testInfo {
|
|
const char *file;
|
|
bool should_fail;
|
|
};
|
|
|
|
static int
|
|
testCompareHelper(const void *data)
|
|
{
|
|
int ret = -1;
|
|
const struct testInfo *info = data;
|
|
g_autofree char *vmx = NULL;
|
|
g_autofree char *xml = NULL;
|
|
|
|
vmx = g_strdup_printf("%s/vmx2xmldata/%s.vmx", abs_srcdir,
|
|
info->file);
|
|
xml = g_strdup_printf("%s/vmx2xmldata/%s.xml", abs_srcdir,
|
|
info->file);
|
|
|
|
ret = testCompareFiles(vmx, xml, info->should_fail);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int
|
|
testParseVMXFileName(const char *fileName,
|
|
void *opaque G_GNUC_UNUSED,
|
|
char **src,
|
|
bool allow_missing)
|
|
{
|
|
g_autofree char *copyOfFileName = NULL;
|
|
char *tmp = NULL;
|
|
char *saveptr = NULL;
|
|
char *datastoreName = NULL;
|
|
char *directoryAndFileName = NULL;
|
|
|
|
*src = NULL;
|
|
|
|
if (STRPREFIX(fileName, "/vmfs/volumes/")) {
|
|
/* Found absolute path referencing a file inside a datastore */
|
|
copyOfFileName = g_strdup(fileName);
|
|
|
|
/* 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) {
|
|
return -1;
|
|
}
|
|
|
|
if (STREQ(datastoreName, "missing") ||
|
|
STRPREFIX(directoryAndFileName, "missing")) {
|
|
if (allow_missing)
|
|
return 0;
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
"Referenced missing file '%s'", fileName);
|
|
return -1;
|
|
}
|
|
|
|
*src = g_strdup_printf("[%s] %s", datastoreName, directoryAndFileName);
|
|
} else if (STRPREFIX(fileName, "/")) {
|
|
/* Found absolute path referencing a file outside a datastore */
|
|
*src = g_strdup(fileName);
|
|
} else if (strchr(fileName, '/') != NULL) {
|
|
/* Found relative path, this is not supported */
|
|
return -1;
|
|
} else {
|
|
/* Found single file name referencing a file inside a datastore */
|
|
*src = g_strdup_printf("[datastore] directory/%s", fileName);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
mymain(void)
|
|
{
|
|
int ret = 0;
|
|
|
|
# define DO_TEST_FULL(file, should_fail) \
|
|
do { \
|
|
struct testInfo info = { file, should_fail }; \
|
|
virResetLastError(); \
|
|
if (virTestRun("VMware VMX-2-XML " file, \
|
|
testCompareHelper, &info) < 0) { \
|
|
ret = -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
# define DO_TEST(file) DO_TEST_FULL(file, false)
|
|
# define DO_TEST_FAIL(file) DO_TEST_FULL(file, true)
|
|
|
|
testCapsInit();
|
|
|
|
if (caps == NULL)
|
|
return EXIT_FAILURE;
|
|
|
|
if (!(xmlopt = virVMXDomainXMLConfInit(caps)))
|
|
return EXIT_FAILURE;
|
|
|
|
ctx.opaque = NULL;
|
|
ctx.parseFileName = testParseVMXFileName;
|
|
ctx.formatFileName = NULL;
|
|
ctx.autodetectSCSIControllerModel = NULL;
|
|
ctx.datacenterPath = NULL;
|
|
|
|
DO_TEST("case-insensitive-1");
|
|
DO_TEST("case-insensitive-2");
|
|
|
|
DO_TEST("minimal");
|
|
DO_TEST("minimal-64bit");
|
|
|
|
DO_TEST("graphics-vnc");
|
|
|
|
DO_TEST("scsi-driver");
|
|
DO_TEST("scsi-writethrough");
|
|
|
|
DO_TEST("harddisk-scsi-file");
|
|
DO_TEST("harddisk-ide-file");
|
|
DO_TEST("harddisk-transient");
|
|
|
|
DO_TEST("cdrom-scsi-file");
|
|
DO_TEST("cdrom-scsi-empty");
|
|
DO_TEST("cdrom-scsi-device");
|
|
DO_TEST("cdrom-scsi-raw-device");
|
|
DO_TEST("cdrom-scsi-raw-auto-detect");
|
|
DO_TEST("cdrom-scsi-passthru");
|
|
DO_TEST("cdrom-ide-file");
|
|
DO_TEST("cdrom-ide-empty");
|
|
DO_TEST("cdrom-ide-empty-2");
|
|
DO_TEST("cdrom-ide-device");
|
|
DO_TEST("cdrom-ide-raw-device");
|
|
DO_TEST("cdrom-ide-raw-auto-detect");
|
|
|
|
DO_TEST("cdrom-ide-file-missing-datastore");
|
|
DO_TEST("cdrom-ide-file-missing-file");
|
|
|
|
DO_TEST_FAIL("harddisk-ide-file-missing-datastore");
|
|
DO_TEST_FAIL("harddisk-scsi-file-missing-file");
|
|
|
|
DO_TEST("floppy-file");
|
|
DO_TEST("floppy-device");
|
|
|
|
DO_TEST("sharedfolder");
|
|
|
|
DO_TEST("ethernet-e1000");
|
|
DO_TEST("ethernet-vmxnet2");
|
|
|
|
DO_TEST("ethernet-custom");
|
|
DO_TEST("ethernet-bridged");
|
|
DO_TEST("ethernet-nat");
|
|
|
|
DO_TEST("ethernet-generated");
|
|
DO_TEST("ethernet-static");
|
|
DO_TEST("ethernet-vpx");
|
|
DO_TEST("ethernet-other");
|
|
DO_TEST("ethernet-null");
|
|
DO_TEST("ethernet-vds");
|
|
|
|
DO_TEST("serial-file");
|
|
DO_TEST("serial-device");
|
|
DO_TEST("serial-pipe-client-app");
|
|
DO_TEST("serial-pipe-client-vm");
|
|
DO_TEST("serial-pipe-server-app");
|
|
DO_TEST("serial-pipe-server-vm");
|
|
DO_TEST("serial-network-server");
|
|
DO_TEST("serial-network-client");
|
|
|
|
DO_TEST("parallel-file");
|
|
DO_TEST("parallel-device");
|
|
|
|
DO_TEST("esx-in-the-wild-1");
|
|
DO_TEST("esx-in-the-wild-2");
|
|
DO_TEST("esx-in-the-wild-3");
|
|
DO_TEST("esx-in-the-wild-4");
|
|
DO_TEST("esx-in-the-wild-5");
|
|
DO_TEST("esx-in-the-wild-6");
|
|
DO_TEST("esx-in-the-wild-7");
|
|
DO_TEST("esx-in-the-wild-8");
|
|
DO_TEST("esx-in-the-wild-9");
|
|
DO_TEST("esx-in-the-wild-10");
|
|
DO_TEST("esx-in-the-wild-11");
|
|
DO_TEST("esx-in-the-wild-12");
|
|
DO_TEST("esx-in-the-wild-13");
|
|
|
|
DO_TEST("gsx-in-the-wild-1");
|
|
DO_TEST("gsx-in-the-wild-2");
|
|
DO_TEST("gsx-in-the-wild-3");
|
|
DO_TEST("gsx-in-the-wild-4");
|
|
|
|
DO_TEST("ws-in-the-wild-1");
|
|
DO_TEST("ws-in-the-wild-2");
|
|
|
|
DO_TEST("fusion-in-the-wild-1");
|
|
|
|
DO_TEST("annotation");
|
|
|
|
DO_TEST("smbios");
|
|
|
|
DO_TEST("svga");
|
|
|
|
DO_TEST("firmware-efi");
|
|
|
|
ctx.datacenterPath = "folder1/folder2/datacenter1";
|
|
|
|
DO_TEST("datacenterpath");
|
|
|
|
virObjectUnref(caps);
|
|
virObjectUnref(xmlopt);
|
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIR_TEST_MAIN(mymain)
|
|
|
|
#else
|
|
|
|
int main(void)
|
|
{
|
|
return EXIT_AM_SKIP;
|
|
}
|
|
|
|
#endif /* WITH_VMX */
|