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 <stdio.h>
# include <string.h>
# include <unistd.h>
2009-09-23 16:25:52 +04:00
2010-03-09 21:22:22 +03:00
# include "internal.h"
2012-12-12 22:06:53 +04:00
# include "viralloc.h"
2010-12-22 00:39:55 +03:00
# include "vmx / vmx.h"
2013-04-03 14:36:23 +04:00
# include "virstring.h"
2009-09-23 16:25:52 +04:00
2013-05-03 16:52:21 +04:00
# define VIR_FROM_THIS VIR_FROM_VMWARE
2011-04-25 02:25:10 +04:00
static virCapsPtr caps ;
2010-12-22 00:39:55 +03:00
static virVMXContext ctx ;
2013-03-31 22:03:42 +04:00
static virDomainXMLOptionPtr xmlopt ;
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
2009-09-23 16:25:52 +04:00
static void
2010-06-17 21:57:12 +04:00
testCapsInit ( void )
2009-09-23 16:25:52 +04:00
{
virCapsGuestPtr guest = NULL ;
2014-07-14 16:56:13 +04:00
caps = virCapabilitiesNew ( VIR_ARCH_I686 , true , true ) ;
2009-09-23 16:25:52 +04:00
2014-11-13 17:20:43 +03:00
if ( caps = = NULL )
2009-09-23 16:25:52 +04:00
return ;
virCapabilitiesAddHostMigrateTransport ( caps , " esx " ) ;
2010-06-17 21:57:12 +04:00
2009-09-23 16:25:52 +04:00
/* i686 guest */
guest =
2015-04-18 01:09:16 +03:00
virCapabilitiesAddGuest ( caps , VIR_DOMAIN_OSTYPE_HVM ,
2012-12-18 23:32:23 +04:00
VIR_ARCH_I686 ,
NULL , NULL , 0 , NULL ) ;
2009-09-23 16:25:52 +04:00
2014-11-13 17:20:43 +03:00
if ( guest = = NULL )
2009-09-23 16:25:52 +04:00
goto failure ;
2015-04-18 01:38:10 +03:00
if ( virCapabilitiesAddGuestDomain ( guest , VIR_DOMAIN_VIRT_VMWARE , NULL , NULL , 0 ,
2009-09-23 16:25:52 +04:00
NULL ) = = NULL ) {
goto failure ;
}
/* x86_64 guest */
guest =
2015-04-18 01:09:16 +03:00
virCapabilitiesAddGuest ( caps , VIR_DOMAIN_OSTYPE_HVM ,
2012-12-18 23:32:23 +04:00
VIR_ARCH_X86_64 ,
NULL , NULL , 0 , NULL ) ;
2009-09-23 16:25:52 +04:00
2014-11-13 17:20:43 +03:00
if ( guest = = NULL )
2009-09-23 16:25:52 +04:00
goto failure ;
2015-04-18 01:38:10 +03:00
if ( virCapabilitiesAddGuestDomain ( guest , VIR_DOMAIN_VIRT_VMWARE , NULL , NULL , 0 ,
2009-09-23 16:25:52 +04:00
NULL ) = = NULL ) {
goto failure ;
}
return ;
2014-03-25 10:53:44 +04:00
failure :
2013-02-01 16:26:18 +04:00
virObjectUnref ( caps ) ;
2013-03-31 22:03:42 +04:00
virObjectUnref ( xmlopt ) ;
2009-09-23 16:25:52 +04:00
caps = NULL ;
}
static int
2010-12-22 00:39:55 +03:00
testCompareFiles ( const char * xml , const char * vmx , int virtualHW_version )
2009-09-23 16:25:52 +04:00
{
int result = - 1 ;
char * formatted = NULL ;
virDomainDefPtr def = NULL ;
2016-09-22 18:14:17 +03:00
def = virDomainDefParseFile ( xml , caps , xmlopt , NULL ,
2015-04-23 18:10:15 +03:00
VIR_DOMAIN_DEF_PARSE_INACTIVE ) ;
2009-09-23 16:25:52 +04:00
2014-11-13 17:20:43 +03:00
if ( def = = NULL )
2009-09-23 16:25:52 +04:00
goto failure ;
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 " , xml ) ;
goto failure ;
}
2013-03-15 14:40:17 +04:00
formatted = virVMXFormatConfig ( & ctx , xmlopt , def , virtualHW_version ) ;
2014-11-13 17:20:43 +03:00
if ( formatted = = NULL )
2009-09-23 16:25:52 +04:00
goto failure ;
2016-05-26 18:01:53 +03:00
if ( virTestCompareToFile ( formatted , vmx ) < 0 )
2009-09-23 16:25:52 +04:00
goto failure ;
result = 0 ;
2014-03-25 10:53:44 +04:00
failure :
2009-09-23 16:25:52 +04:00
VIR_FREE ( formatted ) ;
virDomainDefFree ( def ) ;
return result ;
}
struct testInfo {
const char * input ;
const char * output ;
2010-12-22 00:39:55 +03:00
int virtualHW_version ;
2009-09-23 16:25:52 +04:00
} ;
static int
testCompareHelper ( const void * data )
{
2011-04-25 02:25:10 +04:00
int result = - 1 ;
2009-09-23 16:25:52 +04:00
const struct testInfo * info = data ;
2011-04-25 02:25:10 +04:00
char * xml = NULL ;
char * vmx = NULL ;
if ( virAsprintf ( & xml , " %s/xml2vmxdata/xml2vmx-%s.xml " , abs_srcdir ,
info - > input ) < 0 | |
virAsprintf ( & vmx , " %s/xml2vmxdata/xml2vmx-%s.vmx " , abs_srcdir ,
info - > output ) < 0 ) {
goto cleanup ;
}
2009-09-23 16:25:52 +04:00
2011-04-25 02:25:10 +04:00
result = testCompareFiles ( xml , vmx , info - > virtualHW_version ) ;
2009-09-23 16:25:52 +04:00
2014-03-25 10:53:44 +04:00
cleanup :
2011-04-25 02:25:10 +04:00
VIR_FREE ( xml ) ;
VIR_FREE ( vmx ) ;
return result ;
2009-09-23 16:25:52 +04:00
}
2010-08-05 19:43:19 +04:00
static int
testAutodetectSCSIControllerModel ( virDomainDiskDefPtr def ATTRIBUTE_UNUSED ,
int * model , void * opaque ATTRIBUTE_UNUSED )
{
2011-09-02 17:06:15 +04:00
* model = VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC ;
2010-08-05 19:43:19 +04:00
return 0 ;
}
static char *
testFormatVMXFileName ( const char * src , void * opaque ATTRIBUTE_UNUSED )
{
bool success = false ;
2010-12-22 00:39:55 +03:00
char * copyOfDatastorePath = NULL ;
char * tmp = NULL ;
char * saveptr = NULL ;
2010-08-05 19:43:19 +04:00
char * datastoreName = NULL ;
2010-08-25 13:44:57 +04:00
char * directoryAndFileName = NULL ;
2010-08-05 19:43:19 +04:00
char * absolutePath = NULL ;
if ( STRPREFIX ( src , " [ " ) ) {
/* Found potential datastore path */
2013-05-03 16:52:21 +04:00
if ( VIR_STRDUP ( copyOfDatastorePath , src ) < 0 )
2010-12-22 00:39:55 +03:00
goto cleanup ;
/* Expected format: '[<datastore>] <path>' where <path> is optional */
if ( ( tmp = STRSKIP ( copyOfDatastorePath , " [ " ) ) = = NULL | | * tmp = = ' ] ' | |
( datastoreName = strtok_r ( tmp , " ] " , & saveptr ) ) = = NULL ) {
2010-08-05 19:43:19 +04:00
goto cleanup ;
}
2010-12-22 00:39:55 +03:00
directoryAndFileName = strtok_r ( NULL , " " , & saveptr ) ;
if ( directoryAndFileName = = NULL ) {
directoryAndFileName = ( char * ) " " ;
} else {
directoryAndFileName + = strspn ( directoryAndFileName , " " ) ;
}
2013-01-03 23:16:19 +04:00
if ( virAsprintf ( & absolutePath , " /vmfs/volumes/%s/%s " , datastoreName ,
directoryAndFileName ) < 0 )
goto cleanup ;
2010-08-05 19:43:19 +04:00
} else if ( STRPREFIX ( src , " / " ) ) {
/* Found absolute path */
2013-05-03 16:52:21 +04:00
ignore_value ( VIR_STRDUP ( absolutePath , src ) ) ;
2010-08-05 19:43:19 +04:00
} else {
/* Found relative path, this is not supported */
goto cleanup ;
}
success = true ;
2014-03-25 10:53:44 +04:00
cleanup :
2014-11-13 17:20:43 +03:00
if ( ! success )
2010-08-05 19:43:19 +04:00
VIR_FREE ( absolutePath ) ;
2010-12-22 00:39:55 +03:00
VIR_FREE ( copyOfDatastorePath ) ;
2010-08-05 19:43:19 +04:00
return absolutePath ;
}
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
{
int result = 0 ;
2017-11-03 15:09:47 +03:00
# define DO_TEST(_in, _out, _version) \
do { \
struct testInfo info = { _in , _out , _version } ; \
virResetLastError ( ) ; \
if ( virTestRun ( " VMware XML-2-VMX " _in " -> " _out , \
testCompareHelper , & info ) < 0 ) { \
result = - 1 ; \
} \
2009-09-23 16:25:52 +04:00
} while ( 0 )
2010-06-17 21:57:12 +04:00
testCapsInit ( ) ;
2009-09-23 16:25:52 +04:00
2014-11-13 17:20:43 +03:00
if ( caps = = NULL )
2009-09-23 16:25:52 +04:00
return EXIT_FAILURE ;
2013-03-15 14:40:17 +04:00
if ( ! ( xmlopt = virVMXDomainXMLConfInit ( ) ) )
2013-03-05 19:17:24 +04:00
return EXIT_FAILURE ;
2010-08-05 19:43:19 +04:00
ctx . opaque = NULL ;
ctx . parseFileName = NULL ;
ctx . formatFileName = testFormatVMXFileName ;
ctx . autodetectSCSIControllerModel = testAutodetectSCSIControllerModel ;
2015-09-11 13:00:47 +03:00
ctx . datacenterPath = NULL ;
2010-08-05 19:43:19 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " minimal " , " minimal " , 4 ) ;
DO_TEST ( " minimal-64bit " , " minimal-64bit " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " graphics-vnc " , " graphics-vnc " , 4 ) ;
2010-01-16 15:52:34 +03:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " scsi-driver " , " scsi-driver " , 4 ) ;
DO_TEST ( " scsi-writethrough " , " scsi-writethrough " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " harddisk-scsi-file " , " harddisk-scsi-file " , 4 ) ;
DO_TEST ( " harddisk-ide-file " , " harddisk-ide-file " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " cdrom-scsi-file " , " cdrom-scsi-file " , 4 ) ;
2016-01-07 11:51:55 +03:00
DO_TEST ( " cdrom-scsi-empty " , " cdrom-scsi-empty " , 4 ) ;
2010-12-22 00:39:55 +03:00
DO_TEST ( " cdrom-scsi-device " , " cdrom-scsi-device " , 4 ) ;
2013-08-13 05:55:57 +04:00
DO_TEST ( " cdrom-scsi-raw-device " , " cdrom-scsi-raw-device " , 4 ) ;
2013-08-13 19:56:01 +04:00
DO_TEST ( " cdrom-scsi-raw-auto-detect " , " cdrom-scsi-raw-auto-detect " , 4 ) ;
2015-09-01 17:52:04 +03:00
DO_TEST ( " cdrom-scsi-passthru " , " cdrom-scsi-passthru " , 4 ) ;
2010-12-22 00:39:55 +03:00
DO_TEST ( " cdrom-ide-file " , " cdrom-ide-file " , 4 ) ;
2016-01-07 11:51:55 +03:00
DO_TEST ( " cdrom-ide-empty " , " cdrom-ide-empty " , 4 ) ;
2010-12-22 00:39:55 +03:00
DO_TEST ( " cdrom-ide-device " , " cdrom-ide-device " , 4 ) ;
2013-08-13 05:55:57 +04:00
DO_TEST ( " cdrom-ide-raw-device " , " cdrom-ide-raw-device " , 4 ) ;
2013-08-13 19:56:01 +04:00
DO_TEST ( " cdrom-ide-raw-auto-detect " , " cdrom-ide-raw-auto-detect " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " floppy-file " , " floppy-file " , 4 ) ;
DO_TEST ( " floppy-device " , " floppy-device " , 4 ) ;
2009-09-23 16:25:52 +04:00
2012-07-11 14:16:34 +04:00
DO_TEST ( " sharedfolder " , " sharedfolder " , 4 ) ;
2010-12-22 00:39:55 +03:00
DO_TEST ( " ethernet-e1000 " , " ethernet-e1000 " , 4 ) ;
DO_TEST ( " ethernet-vmxnet2 " , " ethernet-vmxnet2 " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " ethernet-custom " , " ethernet-custom " , 4 ) ;
DO_TEST ( " ethernet-bridged " , " ethernet-bridged " , 4 ) ;
2012-02-23 13:34:45 +04:00
DO_TEST ( " ethernet-nat " , " ethernet-nat " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " ethernet-generated " , " ethernet-generated " , 4 ) ;
DO_TEST ( " ethernet-static " , " ethernet-static " , 4 ) ;
DO_TEST ( " ethernet-vpx " , " ethernet-vpx " , 4 ) ;
DO_TEST ( " ethernet-other " , " ethernet-other " , 4 ) ;
2010-01-03 01:58:24 +03:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " serial-file " , " serial-file " , 4 ) ;
DO_TEST ( " serial-device " , " serial-device " , 4 ) ;
DO_TEST ( " serial-pipe " , " serial-pipe " , 4 ) ;
DO_TEST ( " serial-network-server " , " serial-network-server " , 7 ) ;
DO_TEST ( " serial-network-client " , " serial-network-client " , 7 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " parallel-file " , " parallel-file " , 4 ) ;
DO_TEST ( " parallel-device " , " parallel-device " , 4 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " esx-in-the-wild-1 " , " esx-in-the-wild-1 " , 4 ) ;
DO_TEST ( " esx-in-the-wild-2 " , " esx-in-the-wild-2 " , 4 ) ;
DO_TEST ( " esx-in-the-wild-3 " , " esx-in-the-wild-3 " , 4 ) ;
DO_TEST ( " esx-in-the-wild-4 " , " esx-in-the-wild-4 " , 4 ) ;
DO_TEST ( " esx-in-the-wild-5 " , " esx-in-the-wild-5 " , 4 ) ;
2011-05-26 19:40:51 +04:00
DO_TEST ( " esx-in-the-wild-6 " , " esx-in-the-wild-6 " , 4 ) ;
2015-09-01 17:52:04 +03:00
DO_TEST ( " esx-in-the-wild-7 " , " esx-in-the-wild-7 " , 4 ) ;
2018-04-19 16:03:38 +03:00
DO_TEST ( " esx-in-the-wild-9 " , " esx-in-the-wild-9 " , 10 ) ;
2009-09-23 16:25:52 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " gsx-in-the-wild-1 " , " gsx-in-the-wild-1 " , 4 ) ;
DO_TEST ( " gsx-in-the-wild-2 " , " gsx-in-the-wild-2 " , 4 ) ;
DO_TEST ( " gsx-in-the-wild-3 " , " gsx-in-the-wild-3 " , 4 ) ;
DO_TEST ( " gsx-in-the-wild-4 " , " gsx-in-the-wild-4 " , 4 ) ;
2009-09-23 16:25:52 +04:00
2012-02-23 13:34:45 +04:00
DO_TEST ( " ws-in-the-wild-1 " , " ws-in-the-wild-1 " , 8 ) ;
DO_TEST ( " ws-in-the-wild-2 " , " ws-in-the-wild-2 " , 8 ) ;
2013-08-13 19:56:56 +04:00
DO_TEST ( " fusion-in-the-wild-1 " , " fusion-in-the-wild-1 " , 9 ) ;
2010-12-22 00:39:55 +03:00
DO_TEST ( " annotation " , " annotation " , 4 ) ;
2010-08-27 19:23:49 +04:00
2010-12-22 00:39:55 +03:00
DO_TEST ( " smbios " , " smbios " , 4 ) ;
2010-11-10 22:05:51 +03:00
2010-12-30 20:08:54 +03:00
DO_TEST ( " svga " , " svga " , 4 ) ;
2015-09-11 13:00:47 +03:00
DO_TEST ( " datacenterpath " , " datacenterpath " , 4 ) ;
2013-02-01 16:26:18 +04:00
virObjectUnref ( caps ) ;
2013-03-15 14:40:17 +04:00
virObjectUnref ( xmlopt ) ;
2009-09-23 16:25:52 +04:00
return result = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
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 */