mirror of
https://github.com/libvirt/libvirt.git
synced 2026-10-02 12:20:06 -05:00
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>
194 lines
6.1 KiB
C
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 */
|