Files
libvirt/tests/vmx2xmltest.c
T
Srihari Parimi via Devel 29432312be vmx: configure TPM device in the XML
Parses vtpm.present from VMX files and converts to libvirt TPM
device with CRB model and emulator backend. VMware vTPM uses
TPM 2.0 as specified in the document below

https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/vsphere/8-0/vsphere-security/securing-virtual-machines-with-virtual-trusted-platform-module/vtpm-overview.html

implement support for formatting TPM devices in virVMXFormatConfig

Signed-off-by: Srihari Parimi <sparimi@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2026-05-04 11:56:55 +02:00

269 lines
6.4 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-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 */