2014-03-26 20:53:49 +04:00
# include <config.h>
# include "testutils.h"
# ifdef WITH_BHYVE
# include "datatypes.h"
2014-04-08 21:18:00 +04:00
# include "bhyve / bhyve_capabilities.h"
2017-01-05 15:31:35 +03:00
# include "bhyve / bhyve_domain.h"
2014-03-26 20:53:49 +04:00
# include "bhyve / bhyve_utils.h"
# include "bhyve / bhyve_command.h"
# define VIR_FROM_THIS VIR_FROM_BHYVE
static bhyveConn driver ;
2015-12-13 06:17:15 +03:00
typedef enum {
FLAG_EXPECT_FAILURE = 1 < < 0 ,
FLAG_EXPECT_PARSE_ERROR = 1 < < 1 ,
} virBhyveXMLToArgvTestFlags ;
2014-03-26 20:53:49 +04:00
static int testCompareXMLToArgvFiles ( const char * xml ,
2014-11-08 19:48:31 +03:00
const char * cmdline ,
const char * ldcmdline ,
2015-12-13 06:17:15 +03:00
const char * dmcmdline ,
unsigned int flags )
2014-03-26 20:53:49 +04:00
{
2020-07-28 03:56:33 +03:00
g_autofree char * actualargv = NULL ;
g_autofree char * actualld = NULL ;
g_autofree char * actualdm = NULL ;
2020-07-28 03:59:58 +03:00
g_autoptr ( virDomainDef ) vmdef = NULL ;
g_autoptr ( virCommand ) cmd = NULL ;
g_autoptr ( virCommand ) ldcmd = NULL ;
g_autoptr ( virConnect ) conn = NULL ;
2014-03-26 20:53:49 +04:00
int ret = - 1 ;
2014-08-14 20:15:57 +04:00
if ( ! ( conn = virGetConnect ( ) ) )
goto out ;
2014-03-26 20:53:49 +04:00
2019-11-27 15:29:21 +03:00
if ( ! ( vmdef = virDomainDefParseFile ( xml , driver . xmlopt ,
2016-09-22 18:14:17 +03:00
NULL , VIR_DOMAIN_DEF_PARSE_INACTIVE ) ) ) {
2017-01-05 17:38:20 +03:00
if ( flags & FLAG_EXPECT_PARSE_ERROR ) {
2015-12-13 06:17:15 +03:00
ret = 0 ;
2017-01-05 17:38:20 +03:00
} else if ( flags & FLAG_EXPECT_FAILURE ) {
ret = 0 ;
2019-05-03 11:31:02 +03:00
VIR_TEST_DEBUG ( " Got expected error: %s " ,
2017-01-05 17:38:20 +03:00
virGetLastErrorMessage ( ) ) ;
virResetLastError ( ) ;
}
2014-03-26 20:53:49 +04:00
goto out ;
2015-12-13 06:17:15 +03:00
}
2014-03-26 20:53:49 +04:00
2014-11-08 19:48:36 +03:00
conn - > privateData = & driver ;
2014-03-26 20:53:49 +04:00
2020-02-22 09:38:41 +03:00
cmd = virBhyveProcessBuildBhyveCmd ( & driver , vmdef , false ) ;
2016-06-30 06:00:04 +03:00
if ( vmdef - > os . loader )
ldcmd = virCommandNew ( " dummy " ) ;
else
2020-02-22 09:38:41 +03:00
ldcmd = virBhyveProcessBuildLoadCmd ( & driver , vmdef , " <device.map> " ,
2016-06-30 06:00:04 +03:00
& actualdm ) ;
2015-12-13 06:17:15 +03:00
if ( ( cmd = = NULL ) | | ( ldcmd = = NULL ) ) {
if ( flags & FLAG_EXPECT_FAILURE ) {
ret = 0 ;
2019-05-03 11:31:02 +03:00
VIR_TEST_DEBUG ( " Got expected error: %s " ,
2015-12-13 06:17:15 +03:00
virGetLastErrorMessage ( ) ) ;
virResetLastError ( ) ;
}
2014-03-26 20:53:49 +04:00
goto out ;
2015-12-13 06:17:15 +03:00
}
2014-03-26 20:53:49 +04:00
qemu: use line breaks in command line args written to log
The QEMU command line arguments are very long and currently all written
on a single line to /var/log/libvirt/qemu/$GUEST.log. This introduces
logic to add line breaks after every env variable and "-" optional
argument, and every positional argument. This will create a clearer log
file, which will in turn present better in bug reports when people cut +
paste from the log into a bug comment.
An example log file entry now looks like this:
2018-12-14 12:57:03.677+0000: starting up libvirt version: 5.0.0, qemu version: 3.0.0qemu-3.0.0-1.fc29, kernel: 4.19.5-300.fc29.x86_64, hostname: localhost.localdomain
LC_ALL=C \
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \
HOME=/home/berrange \
USER=berrange \
LOGNAME=berrange \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-ppc64 \
-name guest=guest,debug-threads=on \
-S \
-object secret,id=masterKey0,format=raw,file=/home/berrange/.config/libvirt/qemu/lib/domain-33-guest/master-key.aes \
-machine pseries-2.10,accel=tcg,usb=off,dump-guest-core=off \
-m 1024 \
-realtime mlock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c8a74977-ab18-41d0-ae3b-4041c7fffbcd \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=23,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device qemu-xhci,id=usb,bus=pci.0,addr=0x1 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
2018-12-14 12:57:03.730+0000: shutting down, reason=failed
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2018-12-14 15:07:08 +03:00
if ( ! ( actualargv = virCommandToString ( cmd , false ) ) )
2014-03-26 20:53:49 +04:00
goto out ;
2014-11-08 19:48:31 +03:00
if ( actualdm ! = NULL )
virTrimSpaces ( actualdm , NULL ) ;
qemu: use line breaks in command line args written to log
The QEMU command line arguments are very long and currently all written
on a single line to /var/log/libvirt/qemu/$GUEST.log. This introduces
logic to add line breaks after every env variable and "-" optional
argument, and every positional argument. This will create a clearer log
file, which will in turn present better in bug reports when people cut +
paste from the log into a bug comment.
An example log file entry now looks like this:
2018-12-14 12:57:03.677+0000: starting up libvirt version: 5.0.0, qemu version: 3.0.0qemu-3.0.0-1.fc29, kernel: 4.19.5-300.fc29.x86_64, hostname: localhost.localdomain
LC_ALL=C \
PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin \
HOME=/home/berrange \
USER=berrange \
LOGNAME=berrange \
QEMU_AUDIO_DRV=none \
/usr/bin/qemu-system-ppc64 \
-name guest=guest,debug-threads=on \
-S \
-object secret,id=masterKey0,format=raw,file=/home/berrange/.config/libvirt/qemu/lib/domain-33-guest/master-key.aes \
-machine pseries-2.10,accel=tcg,usb=off,dump-guest-core=off \
-m 1024 \
-realtime mlock=off \
-smp 1,sockets=1,cores=1,threads=1 \
-uuid c8a74977-ab18-41d0-ae3b-4041c7fffbcd \
-display none \
-no-user-config \
-nodefaults \
-chardev socket,id=charmonitor,fd=23,server,nowait \
-mon chardev=charmonitor,id=monitor,mode=control \
-rtc base=utc \
-no-shutdown \
-boot strict=on \
-device qemu-xhci,id=usb,bus=pci.0,addr=0x1 \
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x2 \
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
-msg timestamp=on
2018-12-14 12:57:03.730+0000: shutting down, reason=failed
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2018-12-14 15:07:08 +03:00
if ( ! ( actualld = virCommandToString ( ldcmd , false ) ) )
2014-11-08 19:48:31 +03:00
goto out ;
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( actualargv , cmdline ) < 0 )
2014-03-26 20:53:49 +04:00
goto out ;
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( actualld , ldcmdline ) < 0 )
2014-11-08 19:48:31 +03:00
goto out ;
2015-04-23 18:14:26 +03:00
if ( virFileExists ( dmcmdline ) | | actualdm ) {
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( actualdm , dmcmdline ) < 0 )
2015-04-23 18:14:26 +03:00
goto out ;
2014-11-08 19:48:31 +03:00
}
2014-03-26 20:53:49 +04:00
ret = 0 ;
out :
2018-02-06 12:09:06 +03:00
if ( vmdef & &
vmdef - > ngraphics = = 1 & &
2018-02-06 12:09:10 +03:00
vmdef - > graphics [ 0 ] - > type = = VIR_DOMAIN_GRAPHICS_TYPE_VNC )
virPortAllocatorRelease ( vmdef - > graphics [ 0 ] - > data . vnc . port ) ;
2018-02-06 12:09:06 +03:00
2014-03-26 20:53:49 +04:00
return ret ;
}
2015-12-13 06:17:15 +03:00
struct testInfo {
const char * name ;
unsigned int flags ;
} ;
2014-03-26 20:53:49 +04:00
static int
testCompareXMLToArgvHelper ( const void * data )
{
2015-12-13 06:17:15 +03:00
const struct testInfo * info = data ;
2020-07-28 03:56:33 +03:00
g_autofree char * xml = NULL ;
g_autofree char * args = NULL ;
g_autofree char * ldargs = NULL ;
g_autofree char * dmargs = NULL ;
2014-03-26 20:53:49 +04:00
2019-10-22 16:26:14 +03:00
xml = g_strdup_printf ( " %s/bhyvexml2argvdata/bhyvexml2argv-%s.xml " ,
abs_srcdir , info - > name ) ;
args = g_strdup_printf ( " %s/bhyvexml2argvdata/bhyvexml2argv-%s.args " ,
abs_srcdir , info - > name ) ;
ldargs = g_strdup_printf ( " %s/bhyvexml2argvdata/bhyvexml2argv-%s.ldargs " ,
abs_srcdir , info - > name ) ;
dmargs = g_strdup_printf ( " %s/bhyvexml2argvdata/bhyvexml2argv-%s.devmap " ,
abs_srcdir , info - > name ) ;
2014-03-26 20:53:49 +04:00
2020-07-28 03:58:58 +03:00
return testCompareXMLToArgvFiles ( xml , args , ldargs , dmargs , info - > flags ) ;
2014-03-26 20:53:49 +04:00
}
static int
mymain ( void )
{
int ret = 0 ;
2014-04-08 21:18:00 +04:00
if ( ( driver . caps = virBhyveCapsBuild ( ) ) = = NULL )
2014-03-26 20:53:49 +04:00
return EXIT_FAILURE ;
2017-01-05 15:31:35 +03:00
if ( ( driver . xmlopt = virBhyveDriverCreateXMLConf ( & driver ) ) = = NULL )
2014-03-26 20:53:49 +04:00
return EXIT_FAILURE ;
2018-02-06 12:09:09 +03:00
if ( ! ( driver . remotePorts = virPortAllocatorRangeNew ( " display " , 5900 , 65535 ) ) )
2017-05-08 13:36:43 +03:00
return EXIT_FAILURE ;
2017-11-03 15:09:47 +03:00
# define DO_TEST_FULL(name, flags) \
do { \
static struct testInfo info = { \
name , ( flags ) \
} ; \
if ( virTestRun ( " BHYVE XML-2-ARGV " name , \
2015-12-13 06:17:15 +03:00
testCompareXMLToArgvHelper , & info ) < 0 ) \
2017-11-03 15:09:47 +03:00
ret = - 1 ; \
2014-03-26 20:53:49 +04:00
} while ( 0 )
2017-11-03 15:09:47 +03:00
# define DO_TEST(name) \
2015-12-13 06:17:15 +03:00
DO_TEST_FULL ( name , 0 )
2017-11-03 15:09:47 +03:00
# define DO_TEST_FAILURE(name) \
2015-12-13 06:17:15 +03:00
DO_TEST_FULL ( name , FLAG_EXPECT_FAILURE )
2017-11-03 15:09:47 +03:00
# define DO_TEST_PARSE_ERROR(name) \
2015-12-13 06:17:15 +03:00
DO_TEST_FULL ( name , FLAG_EXPECT_PARSE_ERROR )
2014-11-08 19:48:36 +03:00
driver . grubcaps = BHYVE_GRUB_CAP_CONSDEV ;
2016-06-30 06:00:04 +03:00
driver . bhyvecaps = BHYVE_CAP_RTC_UTC | BHYVE_CAP_AHCI32SLOT | \
2017-02-12 17:06:23 +03:00
BHYVE_CAP_NET_E1000 | BHYVE_CAP_LPC_BOOTROM | \
2018-05-21 17:53:36 +03:00
BHYVE_CAP_FBUF | BHYVE_CAP_XHCI | \
2020-05-06 16:35:55 +03:00
BHYVE_CAP_CPUTOPOLOGY | BHYVE_CAP_SOUND_HDA | \
BHYVE_CAP_VNC_PASSWORD ;
2014-03-26 20:53:49 +04:00
DO_TEST ( " base " ) ;
2018-05-09 04:01:36 +03:00
DO_TEST ( " wired " ) ;
2014-03-26 20:53:49 +04:00
DO_TEST ( " acpiapic " ) ;
2014-07-19 19:15:26 +04:00
DO_TEST ( " disk-cdrom " ) ;
2014-03-26 20:53:49 +04:00
DO_TEST ( " disk-virtio " ) ;
DO_TEST ( " macaddr " ) ;
2014-03-30 15:54:52 +04:00
DO_TEST ( " serial " ) ;
DO_TEST ( " console " ) ;
2014-11-08 19:48:33 +03:00
DO_TEST ( " grub-defaults " ) ;
2014-11-13 01:31:53 +03:00
DO_TEST ( " grub-bootorder " ) ;
DO_TEST ( " grub-bootorder2 " ) ;
2015-12-13 06:17:15 +03:00
DO_TEST ( " bhyveload-bootorder " ) ;
DO_TEST ( " bhyveload-bootorder1 " ) ;
DO_TEST_FAILURE ( " bhyveload-bootorder2 " ) ;
DO_TEST ( " bhyveload-bootorder3 " ) ;
2014-11-08 19:48:33 +03:00
DO_TEST ( " bhyveload-explicitargs " ) ;
2015-12-13 06:17:15 +03:00
DO_TEST_FAILURE ( " bhyveload-bootorder4 " ) ;
DO_TEST_PARSE_ERROR ( " bhyveload-bootorder5 " ) ;
2014-11-08 19:48:33 +03:00
DO_TEST ( " custom-loader " ) ;
DO_TEST ( " disk-cdrom-grub " ) ;
2014-11-08 19:48:36 +03:00
DO_TEST ( " serial-grub " ) ;
2015-07-19 11:20:35 +03:00
DO_TEST ( " localtime " ) ;
2016-08-27 15:30:34 +03:00
DO_TEST ( " net-e1000 " ) ;
2016-06-30 06:00:04 +03:00
DO_TEST ( " uefi " ) ;
2017-02-12 17:06:23 +03:00
DO_TEST ( " vnc " ) ;
2017-05-09 13:48:30 +03:00
DO_TEST ( " vnc-vgaconf-on " ) ;
DO_TEST ( " vnc-vgaconf-off " ) ;
DO_TEST ( " vnc-vgaconf-io " ) ;
2017-05-08 13:36:43 +03:00
DO_TEST ( " vnc-autoport " ) ;
2020-05-06 16:35:53 +03:00
DO_TEST ( " vnc-resolution " ) ;
2020-05-06 16:35:55 +03:00
DO_TEST ( " vnc-password " ) ;
DO_TEST_FAILURE ( " vnc-password-comma " ) ;
2018-05-21 17:53:36 +03:00
DO_TEST ( " cputopology " ) ;
DO_TEST_FAILURE ( " cputopology-nvcpu-mismatch " ) ;
2019-01-17 18:07:20 +03:00
DO_TEST ( " commandline " ) ;
2019-01-25 18:27:58 +03:00
DO_TEST ( " msrs " ) ;
2020-07-14 17:44:13 +03:00
DO_TEST ( " sound " ) ;
2019-02-17 16:04:00 +03:00
DO_TEST ( " isa-controller " ) ;
DO_TEST_FAILURE ( " isa-multiple-controllers " ) ;
2014-11-08 19:48:36 +03:00
2017-01-05 17:38:20 +03:00
/* Address allocation tests */
DO_TEST ( " addr-single-sata-disk " ) ;
DO_TEST ( " addr-multiple-sata-disks " ) ;
DO_TEST ( " addr-more-than-32-sata-disks " ) ;
2017-02-01 19:19:31 +03:00
DO_TEST ( " addr-single-virtio-disk " ) ;
DO_TEST ( " addr-multiple-virtio-disks " ) ;
2019-02-17 16:04:00 +03:00
DO_TEST ( " addr-isa-controller-on-slot-1 " ) ;
DO_TEST ( " addr-isa-controller-on-slot-31 " ) ;
2020-09-20 17:53:57 +03:00
DO_TEST ( " addr-non-isa-controller-on-slot-1 " ) ;
2017-01-05 17:38:20 +03:00
/* The same without 32 devs per controller support */
driver . bhyvecaps ^ = BHYVE_CAP_AHCI32SLOT ;
DO_TEST ( " addr-no32devs-single-sata-disk " ) ;
DO_TEST ( " addr-no32devs-multiple-sata-disks " ) ;
DO_TEST_FAILURE ( " addr-no32devs-more-than-32-sata-disks " ) ;
2017-03-20 16:58:51 +03:00
/* USB xhci tablet */
DO_TEST ( " input-xhci-tablet " ) ;
DO_TEST_FAILURE ( " xhci-multiple-controllers " ) ;
DO_TEST_FAILURE ( " xhci-no-devs " ) ;
DO_TEST_FAILURE ( " xhci-multiple-devs " ) ;
driver . bhyvecaps ^ = BHYVE_CAP_XHCI ;
DO_TEST_FAILURE ( " input-xhci-tablet " ) ;
2014-11-08 19:48:36 +03:00
driver . grubcaps = 0 ;
DO_TEST ( " serial-grub-nocons " ) ;
2014-03-26 20:53:49 +04:00
2016-08-27 15:30:34 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_NET_E1000 ;
DO_TEST_FAILURE ( " net-e1000 " ) ;
2016-06-30 06:00:04 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_LPC_BOOTROM ;
DO_TEST_FAILURE ( " uefi " ) ;
2017-02-12 17:06:23 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_FBUF ;
DO_TEST_FAILURE ( " vnc " ) ;
2018-05-21 17:53:36 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_CPUTOPOLOGY ;
DO_TEST_FAILURE ( " cputopology " ) ;
2020-07-14 17:44:13 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_SOUND_HDA ;
DO_TEST_FAILURE ( " sound " ) ;
2020-05-06 16:35:55 +03:00
driver . bhyvecaps & = ~ BHYVE_CAP_VNC_PASSWORD ;
DO_TEST_FAILURE ( " vnc-password " ) ;
2014-03-26 20:53:49 +04:00
virObjectUnref ( driver . caps ) ;
virObjectUnref ( driver . xmlopt ) ;
2018-02-06 12:09:06 +03:00
virPortAllocatorRangeFree ( driver . remotePorts ) ;
2014-03-26 20:53:49 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
2019-08-21 19:13:16 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain , VIR_TEST_MOCK ( " bhyvexml2argv " ) )
2014-03-26 20:53:49 +04:00
# else
int main ( void )
{
return EXIT_AM_SKIP ;
}
# endif /* WITH_BHYVE */