mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Implement virConnectGetDomainCapabilities
So far only information on disks and host devices are exposed in the capabilities XML. Well, at least something. Even a new test is introduced. The qemu capabilities are stolen from already existing qemucapabilities test. There's one tricky point though. Functions that checks host's KVM and VFIO capabilities, are impossible to mock currently. So in the test, we are setting the capabilities by hand. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
@@ -835,6 +835,11 @@ domaincapstest_SOURCES = \
|
||||
domaincapstest.c testutils.h testutils.c
|
||||
domaincapstest_LDADD = $(LDADDS)
|
||||
|
||||
if WITH_QEMU
|
||||
domaincapstest_SOURCES += testutilsqemu.c testutilsqemu.h
|
||||
domaincapstest_LDADD += $(qemu_LDADDS)
|
||||
endif WITH_QEMU
|
||||
|
||||
if WITH_LIBVIRTD
|
||||
libvirtdconftest_SOURCES = \
|
||||
libvirtdconftest.c testutils.h testutils.c \
|
||||
|
||||
45
tests/domaincapsschemadata/domaincaps-qemu_1.6.50-1.xml
Normal file
45
tests/domaincapsschemadata/domaincaps-qemu_1.6.50-1.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<domainCapabilities>
|
||||
<path>/usr/bin/qemu-system-x86_64</path>
|
||||
<domain>kvm</domain>
|
||||
<machine>pc-1.2</machine>
|
||||
<arch>x86_64</arch>
|
||||
<devices>
|
||||
<disk supported='yes'>
|
||||
<enum name='diskDevice'>
|
||||
<value>disk</value>
|
||||
<value>cdrom</value>
|
||||
<value>floppy</value>
|
||||
<value>lun</value>
|
||||
</enum>
|
||||
<enum name='bus'>
|
||||
<value>ide</value>
|
||||
<value>fdc</value>
|
||||
<value>scsi</value>
|
||||
<value>virtio</value>
|
||||
<value>usb</value>
|
||||
</enum>
|
||||
</disk>
|
||||
<hostdev supported='yes'>
|
||||
<enum name='mode'>
|
||||
<value>subsystem</value>
|
||||
</enum>
|
||||
<enum name='startupPolicy'>
|
||||
<value>default</value>
|
||||
<value>mandatory</value>
|
||||
<value>requisite</value>
|
||||
<value>optional</value>
|
||||
</enum>
|
||||
<enum name='subsysType'>
|
||||
<value>usb</value>
|
||||
<value>pci</value>
|
||||
<value>scsi</value>
|
||||
</enum>
|
||||
<enum name='capsType'/>
|
||||
<enum name='pciBackend'>
|
||||
<value>default</value>
|
||||
<value>kvm</value>
|
||||
<value>vfio</value>
|
||||
</enum>
|
||||
</hostdev>
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
@@ -54,6 +54,30 @@ fillAll(virDomainCapsPtr domCaps,
|
||||
SET_ALL_BITS(hostdev->pciBackend);
|
||||
}
|
||||
|
||||
|
||||
#ifdef WITH_QEMU
|
||||
# include "testutilsqemu.h"
|
||||
static void
|
||||
fillQemuCaps(virDomainCapsPtr domCaps,
|
||||
void *opaque)
|
||||
{
|
||||
virQEMUCapsPtr qemuCaps = (virQEMUCapsPtr) opaque;
|
||||
|
||||
virQEMUCapsFillDomainCaps(domCaps, qemuCaps);
|
||||
|
||||
/* The function above tries to query host's KVM & VFIO capabilities by
|
||||
* calling qemuHostdevHostSupportsPassthroughLegacy() and
|
||||
* qemuHostdevHostSupportsPassthroughVFIO() which, however, can't be
|
||||
* successfully mocked as they are not exposed as internal APIs. Therefore,
|
||||
* instead of mocking set the expected values here by hand. */
|
||||
VIR_DOMAIN_CAPS_ENUM_SET(domCaps->hostdev.pciBackend,
|
||||
VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT,
|
||||
VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM,
|
||||
VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO);
|
||||
}
|
||||
#endif /* WITH_QEMU */
|
||||
|
||||
|
||||
static virDomainCapsPtr
|
||||
buildVirDomainCaps(const char *emulatorbin,
|
||||
const char *machine,
|
||||
@@ -143,6 +167,27 @@ mymain(void)
|
||||
DO_TEST("full", "/bin/emulatorbin", "my-machine-type",
|
||||
VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_KVM, .fillFunc = fillAll);
|
||||
|
||||
#ifdef WITH_QEMU
|
||||
|
||||
# define DO_TEST_QEMU(Filename, QemuCapsFile, Emulatorbin, Machine, Arch, Type, ...) \
|
||||
do { \
|
||||
const char *capsPath = abs_srcdir "/qemucapabilitiesdata/" QemuCapsFile ".caps"; \
|
||||
virQEMUCapsPtr qemuCaps = qemuTestParseCapabilities(capsPath); \
|
||||
struct test_virDomainCapsFormatData data = {.filename = Filename, \
|
||||
.emulatorbin = Emulatorbin, .machine = Machine, .arch = Arch, \
|
||||
.type = Type, .fillFunc = fillQemuCaps, .opaque = qemuCaps}; \
|
||||
if (!qemuCaps) { \
|
||||
fprintf(stderr, "Unable to build qemu caps from %s\n", capsPath); \
|
||||
ret = -1; \
|
||||
} else if (virtTestRun(Filename, test_virDomainCapsFormat, &data) < 0) \
|
||||
ret = -1; \
|
||||
} while (0)
|
||||
|
||||
DO_TEST_QEMU("qemu_1.6.50-1", "caps_1.6.50-1", "/usr/bin/qemu-system-x86_64",
|
||||
"pc-1.2", VIR_ARCH_X86_64, VIR_DOMAIN_VIRT_KVM);
|
||||
|
||||
#endif /* WITH_QEMU */
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user