2009-09-23 16:25:52 +04:00
# include <config.h>
2013-04-16 17:41:44 +04:00
# include "testutils.h"
2010-12-22 00:39:55 +03:00
# ifdef WITH_VMX
2009-09-23 16:25:52 +04:00
2010-03-09 21:22:22 +03:00
# include <unistd.h>
2009-09-23 16:25:52 +04:00
2010-03-09 21:22:22 +03:00
# include "internal.h"
2010-12-22 00:39:55 +03:00
# include "vmx / vmx.h"
2009-09-23 16:25:52 +04:00
2013-05-03 16:52:21 +04:00
# define VIR_FROM_THIS VIR_FROM_VMWARE
2021-03-11 10:16:13 +03:00
static virCaps * caps ;
static virDomainXMLOption * xmlopt ;
2010-12-22 00:39:55 +03:00
static virVMXContext ctx ;
2009-09-23 16:25:52 +04:00
Fix default console type setting
The default console type may vary based on the OS type. ie a Xen
paravirt guests wants a 'xen' console, while a fullvirt guests
wants a 'serial' console.
A plain integer default console type in the capabilities does
not suffice. Instead introduce a callback that is passed the
OS type.
* src/conf/capabilities.h: Use a callback for default console
type
* src/conf/domain_conf.c, src/conf/domain_conf.h: Use callback
for default console type. Add missing LXC/OpenVZ console types.
* src/esx/esx_driver.c, src/libxl/libxl_conf.c,
src/lxc/lxc_conf.c, src/openvz/openvz_conf.c,
src/phyp/phyp_driver.c, src/qemu/qemu_capabilities.c,
src/uml/uml_conf.c, src/vbox/vbox_tmpl.c,
src/vmware/vmware_conf.c, src/xen/xen_hypervisor.c,
src/xenapi/xenapi_driver.c: Set default console type callback
2011-10-20 17:56:20 +04:00
2010-06-17 21:57:12 +04:00
static void
testCapsInit ( void )
{
2021-03-11 10:16:13 +03:00
virCapsGuest * guest = NULL ;
2010-06-17 21:57:12 +04:00
2014-07-14 16:56:13 +04:00
caps = virCapabilitiesNew ( VIR_ARCH_I686 , true , true ) ;
2010-06-17 21:57:12 +04:00
2014-11-13 17:20:43 +03:00
if ( caps = = NULL )
2010-06-17 21:57:12 +04:00
return ;
2018-05-19 00:47:08 +03:00
virCapabilitiesAddHostMigrateTransport ( caps , " vpxmigr " ) ;
2010-06-17 21:57:12 +04:00
/* i686 guest */
2021-10-07 11:47:27 +03:00
guest = virCapabilitiesAddGuest ( caps , VIR_DOMAIN_OSTYPE_HVM ,
VIR_ARCH_I686 ,
NULL , NULL , 0 , NULL ) ;
2010-06-17 21:57:12 +04:00
2021-10-07 11:47:28 +03:00
virCapabilitiesAddGuestDomain ( guest , VIR_DOMAIN_VIRT_VMWARE ,
NULL , NULL , 0 , NULL ) ;
2010-06-17 21:57:12 +04:00
/* x86_64 guest */
2021-10-07 11:47:27 +03:00
guest = virCapabilitiesAddGuest ( caps , VIR_DOMAIN_OSTYPE_HVM ,
VIR_ARCH_X86_64 ,
NULL , NULL , 0 , NULL ) ;
2010-06-17 21:57:12 +04:00
2021-10-07 11:47:28 +03:00
virCapabilitiesAddGuestDomain ( guest , VIR_DOMAIN_VIRT_VMWARE ,
NULL , NULL , 0 , NULL ) ;
2010-06-17 21:57:12 +04:00
}
2009-09-23 16:25:52 +04:00
static int
2021-01-05 16:19:21 +03:00
testCompareFiles ( const char * vmx , const char * xml , bool should_fail_parse )
2009-09-23 16:25:52 +04:00
{
2021-09-04 23:37:06 +03:00
g_autofree char * vmxData = NULL ;
g_autofree char * formatted = NULL ;
2021-09-04 22:50:02 +03:00
g_autoptr ( virDomainDef ) def = NULL ;
2009-09-23 16:25:52 +04:00
2016-05-26 18:01:52 +03:00
if ( virTestLoadFile ( vmx , & vmxData ) < 0 )
2021-01-05 16:19:21 +03:00
return - 1 ;
2009-09-23 16:25:52 +04:00
2021-01-05 16:19:21 +03:00
def = virVMXParseConfig ( & ctx , xmlopt , caps , vmxData ) ;
if ( should_fail_parse ) {
if ( ! def )
2021-09-04 23:39:27 +03:00
return 0 ;
VIR_TEST_DEBUG ( " passed instead of expected failure " ) ;
return - 1 ;
2021-01-05 16:19:21 +03:00
}
if ( ! def )
2021-09-04 23:39:27 +03:00
return - 1 ;
2009-09-23 16:25:52 +04:00
2017-05-19 16:07:15 +03:00
if ( ! virDomainDefCheckABIStability ( def , def , xmlopt ) ) {
2014-01-10 21:18:03 +04:00
fprintf ( stderr , " ABI stability check failed on %s " , vmx ) ;
2021-09-04 23:39:27 +03:00
return - 1 ;
2014-01-10 21:18:03 +04:00
}
2019-11-27 14:57:34 +03:00
if ( ! ( formatted = virDomainDefFormat ( def , xmlopt ,
2016-02-04 00:40:35 +03:00
VIR_DOMAIN_DEF_FORMAT_SECURE ) ) )
2021-09-04 23:39:27 +03:00
return - 1 ;
2009-09-23 16:25:52 +04:00
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( formatted , xml ) < 0 )
2021-09-04 23:39:27 +03:00
return - 1 ;
2009-09-23 16:25:52 +04:00
2021-09-04 23:39:27 +03:00
return 0 ;
2009-09-23 16:25:52 +04:00
}
struct testInfo {
2021-08-18 15:30:33 +03:00
const char * file ;
2021-01-05 16:19:21 +03:00
bool should_fail ;
2009-09-23 16:25:52 +04:00
} ;
static int
testCompareHelper ( const void * data )
{
2013-09-25 14:34:00 +04:00
int ret = - 1 ;
2009-09-23 16:25:52 +04:00
const struct testInfo * info = data ;
2021-09-04 23:37:06 +03:00
g_autofree char * vmx = NULL ;
g_autofree char * xml = NULL ;
2011-04-25 02:25:10 +04:00
2021-08-18 15:35:57 +03:00
vmx = g_strdup_printf ( " %s/vmx2xmldata/%s.vmx " , abs_srcdir ,
2021-08-18 15:30:33 +03:00
info - > file ) ;
2021-08-18 15:35:57 +03:00
xml = g_strdup_printf ( " %s/vmx2xmldata/%s.xml " , abs_srcdir ,
2021-08-18 15:30:33 +03:00
info - > file ) ;
2009-09-23 16:25:52 +04:00
2021-01-05 16:19:21 +03:00
ret = testCompareFiles ( vmx , xml , info - > should_fail ) ;
2009-09-23 16:25:52 +04:00
2013-09-25 14:34:00 +04:00
return ret ;
2009-09-23 16:25:52 +04:00
}
2020-12-21 16:48:49 +03:00
static int
testParseVMXFileName ( const char * fileName ,
void * opaque G_GNUC_UNUSED ,
2020-12-21 18:51:31 +03:00
char * * src ,
bool allow_missing )
2010-08-05 19:43:19 +04:00
{
2020-12-21 18:56:25 +03:00
g_autofree char * copyOfFileName = NULL ;
2010-08-05 19:43:19 +04:00
char * tmp = NULL ;
char * saveptr = NULL ;
char * datastoreName = NULL ;
char * directoryAndFileName = NULL ;
2020-12-21 16:48:49 +03:00
* src = NULL ;
2010-08-05 19:43:19 +04:00
if ( STRPREFIX ( fileName , " /vmfs/volumes/ " ) ) {
/* Found absolute path referencing a file inside a datastore */
2019-10-20 14:49:46 +03:00
copyOfFileName = g_strdup ( fileName ) ;
2010-08-05 19:43:19 +04:00
/* Expected format: '/vmfs/volumes/<datastore>/<path>' */
if ( ( tmp = STRSKIP ( copyOfFileName , " /vmfs/volumes/ " ) ) = = NULL | |
( datastoreName = strtok_r ( tmp , " / " , & saveptr ) ) = = NULL | |
( directoryAndFileName = strtok_r ( NULL , " " , & saveptr ) ) = = NULL ) {
2020-12-21 16:48:49 +03:00
return - 1 ;
2010-08-05 19:43:19 +04:00
}
2020-12-21 18:51:31 +03:00
if ( STREQ ( datastoreName , " missing " ) | |
STRPREFIX ( directoryAndFileName , " missing " ) ) {
if ( allow_missing )
return 0 ;
virReportError ( VIR_ERR_INTERNAL_ERROR ,
" Referenced missing file '%s' " , fileName ) ;
return - 1 ;
}
2020-12-21 16:48:49 +03:00
* src = g_strdup_printf ( " [%s] %s " , datastoreName , directoryAndFileName ) ;
2010-08-05 19:43:19 +04:00
} else if ( STRPREFIX ( fileName , " / " ) ) {
/* Found absolute path referencing a file outside a datastore */
2020-12-21 16:48:49 +03:00
* src = g_strdup ( fileName ) ;
2010-08-05 19:43:19 +04:00
} else if ( strchr ( fileName , ' / ' ) ! = NULL ) {
/* Found relative path, this is not supported */
2020-12-21 16:48:49 +03:00
return - 1 ;
2010-08-05 19:43:19 +04:00
} else {
/* Found single file name referencing a file inside a datastore */
2020-12-21 16:48:49 +03:00
* src = g_strdup_printf ( " [datastore] directory/%s " , fileName ) ;
2010-08-05 19:43:19 +04:00
}
2020-12-21 16:48:49 +03:00
return 0 ;
2010-08-05 19:43:19 +04:00
}
2009-09-23 16:25:52 +04:00
static int
2011-04-29 20:21:20 +04:00
mymain ( void )
2009-09-23 16:25:52 +04:00
{
2013-09-25 14:34:00 +04:00
int ret = 0 ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
# define DO_TEST_FULL(file, should_fail) \
2017-11-03 15:09:47 +03:00
do { \
2021-08-18 15:30:33 +03:00
struct testInfo info = { file , should_fail } ; \
2017-11-03 15:09:47 +03:00
virResetLastError ( ) ; \
2021-08-18 15:30:33 +03:00
if ( virTestRun ( " VMware VMX-2-XML " file , \
2017-11-03 15:09:47 +03:00
testCompareHelper , & info ) < 0 ) { \
ret = - 1 ; \
} \
2009-09-23 16:25:52 +04:00
} while ( 0 )
2021-08-18 15:30:33 +03:00
# define DO_TEST(file) DO_TEST_FULL(file, false)
# define DO_TEST_FAIL(file) DO_TEST_FULL(file, true)
2021-01-05 16:19:21 +03:00
2010-06-17 21:57:12 +04:00
testCapsInit ( ) ;
2014-11-13 17:20:43 +03:00
if ( caps = = NULL )
2010-06-17 21:57:12 +04:00
return EXIT_FAILURE ;
2019-12-03 13:49:49 +03:00
if ( ! ( xmlopt = virVMXDomainXMLConfInit ( caps ) ) )
2013-03-15 14:40:17 +04:00
return EXIT_FAILURE ;
2010-08-05 19:43:19 +04:00
ctx . opaque = NULL ;
ctx . parseFileName = testParseVMXFileName ;
ctx . formatFileName = NULL ;
ctx . autodetectSCSIControllerModel = NULL ;
2015-09-11 13:00:47 +03:00
ctx . datacenterPath = NULL ;
2010-08-05 19:43:19 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " case-insensitive-1 " ) ;
DO_TEST ( " case-insensitive-2 " ) ;
2010-03-24 03:52:33 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " minimal " ) ;
DO_TEST ( " minimal-64bit " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " graphics-vnc " ) ;
2010-01-16 15:52:34 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " scsi-driver " ) ;
DO_TEST ( " scsi-writethrough " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " harddisk-scsi-file " ) ;
DO_TEST ( " harddisk-ide-file " ) ;
DO_TEST ( " harddisk-transient " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " cdrom-scsi-file " ) ;
DO_TEST ( " cdrom-scsi-empty " ) ;
DO_TEST ( " cdrom-scsi-device " ) ;
DO_TEST ( " cdrom-scsi-raw-device " ) ;
DO_TEST ( " cdrom-scsi-raw-auto-detect " ) ;
DO_TEST ( " cdrom-scsi-passthru " ) ;
DO_TEST ( " cdrom-ide-file " ) ;
DO_TEST ( " cdrom-ide-empty " ) ;
DO_TEST ( " cdrom-ide-empty-2 " ) ;
DO_TEST ( " cdrom-ide-device " ) ;
DO_TEST ( " cdrom-ide-raw-device " ) ;
DO_TEST ( " cdrom-ide-raw-auto-detect " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " cdrom-ide-file-missing-datastore " ) ;
DO_TEST ( " cdrom-ide-file-missing-file " ) ;
2021-01-05 16:19:34 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST_FAIL ( " harddisk-ide-file-missing-datastore " ) ;
DO_TEST_FAIL ( " harddisk-scsi-file-missing-file " ) ;
2021-01-05 16:19:34 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " floppy-file " ) ;
DO_TEST ( " floppy-device " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " sharedfolder " ) ;
2012-07-11 14:16:35 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " ethernet-e1000 " ) ;
DO_TEST ( " ethernet-vmxnet2 " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " ethernet-custom " ) ;
DO_TEST ( " ethernet-bridged " ) ;
DO_TEST ( " ethernet-nat " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " ethernet-generated " ) ;
DO_TEST ( " ethernet-static " ) ;
DO_TEST ( " ethernet-vpx " ) ;
DO_TEST ( " ethernet-other " ) ;
2022-08-24 23:46:05 +03:00
DO_TEST ( " ethernet-null " ) ;
2022-08-17 15:44:55 +03:00
DO_TEST ( " ethernet-vds " ) ;
2010-01-03 01:58:24 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " serial-file " ) ;
DO_TEST ( " serial-device " ) ;
DO_TEST ( " serial-pipe-client-app " ) ;
2021-08-19 10:55:53 +03:00
DO_TEST ( " serial-pipe-client-vm " ) ;
DO_TEST ( " serial-pipe-server-app " ) ;
2021-08-18 15:30:33 +03:00
DO_TEST ( " serial-pipe-server-vm " ) ;
DO_TEST ( " serial-network-server " ) ;
DO_TEST ( " serial-network-client " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " parallel-file " ) ;
DO_TEST ( " parallel-device " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " esx-in-the-wild-1 " ) ;
DO_TEST ( " esx-in-the-wild-2 " ) ;
DO_TEST ( " esx-in-the-wild-3 " ) ;
DO_TEST ( " esx-in-the-wild-4 " ) ;
DO_TEST ( " esx-in-the-wild-5 " ) ;
DO_TEST ( " esx-in-the-wild-6 " ) ;
DO_TEST ( " esx-in-the-wild-7 " ) ;
DO_TEST ( " esx-in-the-wild-8 " ) ;
DO_TEST ( " esx-in-the-wild-9 " ) ;
DO_TEST ( " esx-in-the-wild-10 " ) ;
DO_TEST ( " esx-in-the-wild-11 " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " gsx-in-the-wild-1 " ) ;
DO_TEST ( " gsx-in-the-wild-2 " ) ;
DO_TEST ( " gsx-in-the-wild-3 " ) ;
DO_TEST ( " gsx-in-the-wild-4 " ) ;
2009-09-23 16:25:52 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " ws-in-the-wild-1 " ) ;
DO_TEST ( " ws-in-the-wild-2 " ) ;
2012-02-23 13:34:45 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " fusion-in-the-wild-1 " ) ;
2013-08-13 19:56:56 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " annotation " ) ;
2010-08-27 19:23:49 +04:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " smbios " ) ;
2010-11-10 22:05:51 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " svga " ) ;
2010-12-30 20:08:54 +03:00
2021-08-18 15:30:33 +03:00
DO_TEST ( " firmware-efi " ) ;
2019-04-09 17:04:31 +03:00
2015-09-11 13:00:47 +03:00
ctx . datacenterPath = " folder1/folder2/datacenter1 " ;
2021-08-18 15:30:33 +03:00
DO_TEST ( " datacenterpath " ) ;
2015-09-11 13:00:47 +03:00
2013-02-01 16:26:18 +04:00
virObjectUnref ( caps ) ;
2013-03-15 14:40:17 +04:00
virObjectUnref ( xmlopt ) ;
2010-06-17 21:57:12 +04:00
2013-09-25 14:34:00 +04:00
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
2009-09-23 16:25:52 +04:00
}
2017-03-29 17:45:42 +03:00
VIR_TEST_MAIN ( mymain )
2009-09-23 16:25:52 +04:00
# else
2011-07-09 03:24:44 +04:00
int main ( void )
2009-09-23 16:25:52 +04:00
{
2011-07-09 03:24:44 +04:00
return EXIT_AM_SKIP ;
2009-09-23 16:25:52 +04:00
}
2010-12-22 00:39:55 +03:00
# endif /* WITH_VMX */