2014-04-06 11:44:37 +04:00
# include <config.h>
# include "testutils.h"
# ifdef WITH_BHYVE
# include "bhyve / bhyve_capabilities.h"
2017-01-05 15:31:35 +03:00
# include "bhyve / bhyve_domain.h"
2014-04-06 11:44:37 +04:00
# include "bhyve / bhyve_utils.h"
# define VIR_FROM_THIS VIR_FROM_NONE
static bhyveConn driver ;
struct testInfo {
const char * name ;
2017-01-05 17:38:20 +03:00
unsigned int flags ;
2014-04-06 11:44:37 +04:00
} ;
2017-01-05 17:38:20 +03:00
typedef enum {
FLAG_IS_DIFFERENT = 1 < < 0 ,
FLAG_EXPECT_FAILURE = 1 < < 1 ,
} virBhyveXMLToXMLTestFlags ;
2014-04-06 11:44:37 +04:00
static int
testCompareXMLToXMLHelper ( const void * data )
{
const struct testInfo * info = data ;
char * xml_in = NULL ;
char * xml_out = NULL ;
2017-01-05 17:38:20 +03:00
bool is_different = info - > flags & FLAG_IS_DIFFERENT ;
2014-04-06 11:44:37 +04:00
int ret = - 1 ;
if ( virAsprintf ( & xml_in , " %s/bhyvexml2argvdata/bhyvexml2argv-%s.xml " ,
abs_srcdir , info - > name ) < 0 | |
virAsprintf ( & xml_out , " %s/bhyvexml2xmloutdata/bhyvexml2xmlout-%s.xml " ,
abs_srcdir , info - > name ) < 0 )
goto cleanup ;
2016-01-08 23:55:44 +03:00
ret = testCompareDomXML2XMLFiles ( driver . caps , driver . xmlopt , xml_in ,
2017-01-05 17:38:20 +03:00
is_different ? xml_out : xml_in ,
2018-03-13 17:32:31 +03:00
false , 0 ,
2016-04-08 19:04:10 +03:00
TEST_COMPARE_DOM_XML2XML_RESULT_SUCCESS ) ;
2014-04-06 11:44:37 +04:00
2017-01-05 17:38:20 +03:00
if ( ( ret ! = 0 ) & & ( info - > flags & FLAG_EXPECT_FAILURE ) ) {
ret = 0 ;
VIR_TEST_DEBUG ( " Got expected error: %s \n " ,
virGetLastErrorMessage ( ) ) ;
virResetLastError ( ) ;
}
2014-04-06 11:44:37 +04:00
cleanup :
VIR_FREE ( xml_in ) ;
VIR_FREE ( xml_out ) ;
return ret ;
}
static int
mymain ( void )
{
int ret = 0 ;
if ( ( driver . caps = virBhyveCapsBuild ( ) ) = = NULL )
return EXIT_FAILURE ;
2017-01-05 15:31:35 +03:00
if ( ( driver . xmlopt = virBhyveDriverCreateXMLConf ( & driver ) ) = = NULL )
2014-04-06 11:44:37 +04:00
return EXIT_FAILURE ;
2017-11-03 15:09:47 +03:00
# 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 ; \
2014-04-06 11:44:37 +04:00
} while ( 0 )
# define DO_TEST_DIFFERENT(name) \
2017-01-05 17:38:20 +03:00
DO_TEST_FULL ( name , FLAG_IS_DIFFERENT )
# define DO_TEST_FAILURE(name) \
DO_TEST_FULL ( name , FLAG_EXPECT_FAILURE )
2014-04-06 11:44:37 +04:00
bhyve: fix SATA address allocation
As bhyve for a long time didn't have a notion of the explicit SATA
controller and created a controller for each drive, the bhyve driver
in libvirt acted in a similar way and didn't care about the SATA
controllers and assigned PCI addresses to drives directly, as
the generated command will look like this anyway:
2:0,ahci-hd,somedisk.img
This no longer makes sense because:
1. After commit c07d1c1c4f it's not possible to assign
PCI addresses to disks
2. Bhyve now supports multiple disk drives for a controller,
so it's going away from 1:1 controller:disk mapping, so
the controller object starts to make more sense now
So, this patch does the following:
- Assign PCI address to SATA controllers (previously we didn't do this)
- Assign disk addresses instead of PCI addresses for disks. Now, when
building a bhyve command, we take PCI address not from the disk
itself but from its controller
- Assign addresses at XML parsing time using the
assignAddressesCallback. This is done mainly for being able to
verify address allocation via xml2xml tests
- Adjust existing bhyvexml2{xml,argv} tests to chase the new
address allocation
This patch is largely based on work of Fabian Freyer.
2017-01-05 15:51:25 +03:00
driver . bhyvecaps = BHYVE_CAP_AHCI32SLOT ;
2016-12-26 14:23:27 +03:00
DO_TEST_DIFFERENT ( " acpiapic " ) ;
DO_TEST_DIFFERENT ( " base " ) ;
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 ( " 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 " ) ;
2014-04-06 11:44:37 +04:00
DO_TEST_DIFFERENT ( " metadata " ) ;
2016-12-26 14:23:27 +03:00
DO_TEST_DIFFERENT ( " serial " ) ;
DO_TEST_DIFFERENT ( " serial-grub " ) ;
DO_TEST_DIFFERENT ( " serial-grub-nocons " ) ;
2017-05-08 14:35:59 +03:00
DO_TEST_DIFFERENT ( " vnc " ) ;
2017-05-09 13:48:30 +03:00
DO_TEST_DIFFERENT ( " vnc-vgaconf-on " ) ;
DO_TEST_DIFFERENT ( " vnc-vgaconf-off " ) ;
DO_TEST_DIFFERENT ( " vnc-vgaconf-io " ) ;
2017-05-08 13:36:43 +03:00
DO_TEST_DIFFERENT ( " vnc-autoport " ) ;
2014-04-06 11:44:37 +04:00
2017-01-05 17:38:20 +03:00
/* 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 " ) ;
2017-02-01 19:19:31 +03:00
DO_TEST_DIFFERENT ( " addr-single-virtio-disk " ) ;
DO_TEST_DIFFERENT ( " addr-multiple-virtio-disks " ) ;
2017-01-05 17:38:20 +03:00
/* 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 " ) ;
2017-03-20 16:58:51 +03:00
/* USB xhci tablet */
DO_TEST_DIFFERENT ( " input-xhci-tablet " ) ;
2014-04-06 11:44:37 +04:00
virObjectUnref ( driver . caps ) ;
virObjectUnref ( driver . xmlopt ) ;
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
2017-05-08 14:35:59 +03:00
VIR_TEST_MAIN_PRELOAD ( mymain , abs_builddir " /.libs/bhyvexml2argvmock.so " )
2014-04-06 11:44:37 +04:00
# else
int
main ( void )
{
return EXIT_AM_SKIP ;
}
# endif /* WITH_BHYVE */