Files
libvirt/tests/bhyvexml2xmltest.c
T
Roman Bogorodskiy 150b8fe6ee bhyve: add virtio-console support
Bhyve supports virtio-console devices using the following syntax:

 -s 2:0,virtio-console,org.qemu.guest_agent.0=/path/to/unix/socket,other.port=/other/socket,...

There are two details about that to consider.

The first one is that only up to 16 ports per console is supported. This
is different from the default (31), so update the code to manually add
the virtio-serial controllers with 16 ports. For the existing
controllers, make sure to set max ports to 16 or error out if ports
count greater than 16 was specified.

The second one is that bhyve does not clean up UNIX sockets for these
devices. So update virBhyveProcessStop() to remove leftover sockets.

Not adding capabilities probing as the virtio-console device is
available on all supported FreeBSD versions and on all supported arches.

Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2026-05-02 10:31:38 +02:00

194 lines
6.1 KiB
C

#include <config.h>
#include "testutils.h"
#ifdef WITH_BHYVE
# include "bhyve/bhyve_capabilities.h"
# include "bhyve/bhyve_conf.h"
# include "bhyve/bhyve_domain.h"
# include "bhyve/bhyve_utils.h"
# define VIR_FROM_THIS VIR_FROM_NONE
static bhyveConn driver;
struct testInfo {
const char *name;
unsigned int flags;
};
typedef enum {
FLAG_IS_DIFFERENT = 1 << 0,
FLAG_EXPECT_FAILURE = 1 << 1,
} virBhyveXMLToXMLTestFlags;
static int
testCompareXMLToXMLHelper(const void *data)
{
const struct testInfo *info = data;
g_autofree char *xml_in = NULL;
g_autofree char *xml_out = NULL;
bool is_different = info->flags & FLAG_IS_DIFFERENT;
int ret = -1;
const char *arch = virArchToString(virArchFromHost());
xml_in = g_strdup_printf("%s/bhyvexml2argvdata/%s/bhyvexml2argv-%s.xml",
abs_srcdir, arch, info->name);
xml_out = g_strdup_printf("%s/bhyvexml2xmloutdata/%s/bhyvexml2xmlout-%s.xml",
abs_srcdir, arch, info->name);
ret = testCompareDomXML2XMLFiles(driver.caps, driver.xmlopt, xml_in,
is_different ? xml_out : xml_in,
false, 0,
TEST_COMPARE_DOM_XML2XML_RESULT_SUCCESS);
if ((ret != 0) && (info->flags & FLAG_EXPECT_FAILURE)) {
ret = 0;
VIR_TEST_DEBUG("Got expected error: %s",
virGetLastErrorMessage());
virResetLastError();
}
return ret;
}
static int
mymain(void)
{
g_autofree char *fakeubootpath = g_strdup("fakeubootpath/u-boot.bin");
int ret = 0;
if ((driver.caps = virBhyveCapsBuild()) == NULL)
return EXIT_FAILURE;
if ((driver.xmlopt = virBhyveDriverCreateXMLConf(&driver)) == NULL)
return EXIT_FAILURE;
if (!(driver.config = virBhyveDriverConfigNew()))
return EXIT_FAILURE;
driver.config->ubootPath = fakeubootpath;
# define DO_TEST_FULL(name, flags) \
do { \
const struct testInfo info = {name, (flags)}; \
if (virTestRun("BHYVE XML-2-XML " name, \
testCompareXMLToXMLHelper, &info) < 0) \
ret = -1; \
} while (0)
# define DO_TEST_DIFFERENT(name) \
DO_TEST_FULL(name, FLAG_IS_DIFFERENT)
# define DO_TEST_FAILURE(name) \
DO_TEST_FULL(name, FLAG_EXPECT_FAILURE)
driver.bhyvecaps = BHYVE_CAP_AHCI32SLOT | BHYVE_CAP_RTC_UTC;
DO_TEST_DIFFERENT("acpiapic");
DO_TEST_DIFFERENT("base");
DO_TEST_DIFFERENT("wired");
DO_TEST_DIFFERENT("bhyveload-bootorder");
DO_TEST_DIFFERENT("bhyveload-bootorder1");
DO_TEST_DIFFERENT("bhyveload-bootorder2");
DO_TEST_DIFFERENT("bhyveload-bootorder3");
DO_TEST_DIFFERENT("bhyveload-bootorder4");
DO_TEST_DIFFERENT("bhyveload-explicitargs");
DO_TEST_DIFFERENT("console");
DO_TEST_DIFFERENT("console-master-slave-not-specified");
DO_TEST_DIFFERENT("custom-loader");
DO_TEST_DIFFERENT("disk-cdrom");
DO_TEST_DIFFERENT("disk-cdrom-grub");
DO_TEST_DIFFERENT("disk-virtio");
DO_TEST_DIFFERENT("grub-bootorder");
DO_TEST_DIFFERENT("grub-bootorder2");
DO_TEST_DIFFERENT("grub-defaults");
DO_TEST_DIFFERENT("localtime");
DO_TEST_DIFFERENT("macaddr");
DO_TEST_DIFFERENT("metadata");
DO_TEST_DIFFERENT("serial");
DO_TEST_DIFFERENT("serial-grub");
DO_TEST_DIFFERENT("serial-grub-nocons");
DO_TEST_DIFFERENT("vnc");
DO_TEST_DIFFERENT("vnc-vgaconf-on");
DO_TEST_DIFFERENT("vnc-vgaconf-off");
DO_TEST_DIFFERENT("vnc-vgaconf-io");
DO_TEST_DIFFERENT("vnc-autoport");
DO_TEST_DIFFERENT("vnc-resolution");
DO_TEST_DIFFERENT("vnc-password");
DO_TEST_DIFFERENT("vnc-wait");
DO_TEST_DIFFERENT("vnc-wait-no");
DO_TEST_DIFFERENT("commandline");
DO_TEST_DIFFERENT("msrs");
DO_TEST_DIFFERENT("sound");
DO_TEST_DIFFERENT("isa-controller");
DO_TEST_DIFFERENT("fs-9p");
DO_TEST_DIFFERENT("virtio-rnd");
DO_TEST_DIFFERENT("serial-tcp");
DO_TEST_DIFFERENT("4-consoles");
DO_TEST_DIFFERENT("nvme");
DO_TEST_DIFFERENT("2-nvme-2-controllers");
DO_TEST_DIFFERENT("passthru-multiple-devs");
DO_TEST_DIFFERENT("slirp");
DO_TEST_DIFFERENT("virtio-scsi");
DO_TEST_DIFFERENT("numa");
DO_TEST_DIFFERENT("blkiotune");
DO_TEST_FAILURE("blkiotune-invalid-device");
DO_TEST_FAILURE("blkiotune-weight");
DO_TEST_FAILURE("blkiotune-multiple-devices");
DO_TEST_DIFFERENT("virtio-console");
DO_TEST_DIFFERENT("virtio-console-addr");
DO_TEST_DIFFERENT("2-virtio-console-mixed-addr");
DO_TEST_DIFFERENT("virtio-console-multiple-controllers");
DO_TEST_DIFFERENT("virtio-console-controllers");
DO_TEST_FAILURE("virtio-console-too-many-ports");
DO_TEST_FAILURE("virtio-console-invalid-name");
DO_TEST_FAILURE("virtio-console-invalid-path");
/* Address allocation tests */
DO_TEST_DIFFERENT("addr-single-sata-disk");
DO_TEST_DIFFERENT("addr-multiple-sata-disks");
DO_TEST_DIFFERENT("addr-more-than-32-sata-disks");
DO_TEST_DIFFERENT("addr-single-virtio-disk");
DO_TEST_DIFFERENT("addr-multiple-virtio-disks");
DO_TEST_DIFFERENT("addr-isa-controller-on-slot-1");
DO_TEST_DIFFERENT("addr-isa-controller-on-slot-31");
/* The same without 32 devs per controller support */
driver.bhyvecaps ^= BHYVE_CAP_AHCI32SLOT;
DO_TEST_DIFFERENT("addr-no32devs-single-sata-disk");
DO_TEST_DIFFERENT("addr-no32devs-multiple-sata-disks");
DO_TEST_FAILURE("addr-no32devs-more-than-32-sata-disks");
/* USB xhci tablet */
DO_TEST_DIFFERENT("input-xhci-tablet");
virObjectUnref(driver.caps);
virTestSetHostArch(VIR_ARCH_AARCH64);
driver.caps = virBhyveCapsBuild();
/* bhyve does not support UTC clock on ARM */
driver.bhyvecaps ^= BHYVE_CAP_RTC_UTC;
DO_TEST_DIFFERENT("base");
DO_TEST_DIFFERENT("console");
DO_TEST_DIFFERENT("bootloader");
virObjectUnref(driver.caps);
virObjectUnref(driver.xmlopt);
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("bhyvexml2argv"))
#else
int
main(void)
{
return EXIT_AM_SKIP;
}
#endif /* WITH_BHYVE */