mirror of
https://github.com/libvirt/libvirt.git
synced 2026-10-02 12:20:06 -05:00
The constants for maximum units on a bus are slightly tricky because for the narrow bus it does not need to account for the extra unit used by the controller, but the wide and super-wide ones need to. With this patch a VMX with 64 disks on a pvscsi controller can be properly parsed. To properly handle the maximum numbers one of the conditions also needs to be changed to not allow for units 16 and 65. This does not change various conditionals in XML parsing and VMX formatting as they need a significant rewrite. And since that is already working only with the wide scsi controller (and not the super-wide one) we leave that refactor for another day as it was done previously. Tests show this is now possible and they fail before this change. Resolves: https://redhat.atlassian.net/browse/RHEL-181350 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
271 lines
6.5 KiB
C
271 lines
6.5 KiB
C
#include <config.h>
|
|
|
|
#include "testutils.h"
|
|
|
|
#ifdef WITH_VMX
|
|
|
|
# include <unistd.h>
|
|
|
|
# include "internal.h"
|
|
# include "vmx/vmx.h"
|
|
# define LIBVIRT_ESX_DRIVERPRIV_H_ALLOW
|
|
# include "esx_driverpriv.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
|
|
mymain(void)
|
|
{
|
|
int ret = 0;
|
|
esxVMX_Data data = { 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;
|
|
|
|
data.datastorePathWithoutFileName = (char*) "[datastore] directory";
|
|
|
|
ctx.opaque = &data;
|
|
ctx.parseFileName = esxParseVMXFileName;
|
|
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-driver-max");
|
|
DO_TEST("scsi-driver-superwide-max");
|
|
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("esx-in-the-wild-14");
|
|
DO_TEST("esx-in-the-wild-15");
|
|
DO_TEST("esx-in-the-wild-16");
|
|
DO_TEST("esx-in-the-wild-17");
|
|
|
|
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");
|
|
|
|
DO_TEST("vtpm");
|
|
|
|
ctx.datacenterPath = "folder1/folder2/datacenter1";
|
|
|
|
DO_TEST("datacenterpath");
|
|
|
|
virObjectUnref(caps);
|
|
virObjectUnref(xmlopt);
|
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIR_TEST_MAIN_PRELOAD(mymain,
|
|
VIR_TEST_MOCK("vmx2xml"))
|
|
|
|
#else
|
|
|
|
int main(void)
|
|
{
|
|
return EXIT_AM_SKIP;
|
|
}
|
|
|
|
#endif /* WITH_VMX */
|