2014-12-16 07:30:05 +03:00
/*
2016-02-16 05:42:27 +03:00
* xlconfigtest . c : Test xl . cfg ( 5 ) < - > domXML config conversions
2014-12-16 07:30:05 +03:00
*
* Copyright ( C ) 2007 , 2010 - 2011 , 2014 Red Hat , Inc .
* Copyright ( c ) 2015 SUSE LINUX Products GmbH , Nuernberg , Germany .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library . If not , see
* < http : //www.gnu.org/licenses/>.
*
* Author : Daniel P . Berrange < berrange @ redhat . com >
* Author : Kiarie Kahurani < davidkiarie4 @ gmail . com >
*
*/
# include <config.h>
# include <stdio.h>
# include <string.h>
# include <unistd.h>
# include "internal.h"
# include "datatypes.h"
# include "xenconfig/xen_xl.h"
# include "viralloc.h"
# include "virstring.h"
# include "testutils.h"
# include "testutilsxen.h"
2015-01-21 02:45:09 +03:00
# include "libxl/libxl_conf.h"
2014-12-16 07:30:05 +03:00
# define VIR_FROM_THIS VIR_FROM_NONE
static virCapsPtr caps ;
static virDomainXMLOptionPtr xmlopt ;
2016-02-16 05:42:27 +03:00
2014-12-16 07:30:05 +03:00
/*
2016-02-16 05:42:27 +03:00
* Parses domXML to virDomainDef object , which is then converted to xl . cfg ( 5 )
* config and compared with expected config .
2014-12-16 07:30:05 +03:00
*/
static int
2016-02-16 05:42:27 +03:00
testCompareParseXML ( const char * xlcfg , const char * xml )
2014-12-16 07:30:05 +03:00
{
2016-02-16 05:42:27 +03:00
char * gotxlcfgData = NULL ;
2014-12-16 07:30:05 +03:00
virConfPtr conf = NULL ;
virConnectPtr conn = NULL ;
int wrote = 4096 ;
int ret = - 1 ;
virDomainDefPtr def = NULL ;
2016-02-16 05:42:27 +03:00
if ( VIR_ALLOC_N ( gotxlcfgData , wrote ) < 0 )
2014-12-16 07:30:05 +03:00
goto fail ;
conn = virGetConnect ( ) ;
if ( ! conn ) goto fail ;
2015-04-23 18:10:15 +03:00
if ( ! ( def = virDomainDefParseFile ( xml , caps , xmlopt ,
VIR_DOMAIN_XML_INACTIVE ) ) )
2014-12-16 07:30:05 +03:00
goto fail ;
if ( ! virDomainDefCheckABIStability ( def , def ) ) {
fprintf ( stderr , " ABI stability check failed on %s " , xml ) ;
goto fail ;
}
2015-12-05 05:11:39 +03:00
if ( ! ( conf = xenFormatXL ( def , conn ) ) )
2014-12-16 07:30:05 +03:00
goto fail ;
2016-02-16 05:42:27 +03:00
if ( virConfWriteMem ( gotxlcfgData , & wrote , conf ) < 0 )
2014-12-16 07:30:05 +03:00
goto fail ;
2016-02-16 05:42:27 +03:00
gotxlcfgData [ wrote ] = ' \0 ' ;
2014-12-16 07:30:05 +03:00
2016-02-16 05:42:27 +03:00
if ( virtTestCompareToFile ( gotxlcfgData , xlcfg ) < 0 )
2014-12-16 07:30:05 +03:00
goto fail ;
ret = 0 ;
fail :
2016-02-16 05:42:27 +03:00
VIR_FREE ( gotxlcfgData ) ;
2014-12-16 07:30:05 +03:00
if ( conf )
virConfFree ( conf ) ;
virDomainDefFree ( def ) ;
virObjectUnref ( conn ) ;
return ret ;
}
2016-02-16 05:42:27 +03:00
2014-12-16 07:30:05 +03:00
/*
2016-02-16 05:42:27 +03:00
* Parses xl . cfg ( 5 ) config to virDomainDef object , which is then converted to
* domXML and compared to expected XML .
2014-12-16 07:30:05 +03:00
*/
static int
2016-02-16 05:42:27 +03:00
testCompareFormatXML ( const char * xlcfg , const char * xml )
2014-12-16 07:30:05 +03:00
{
2016-02-16 05:42:27 +03:00
char * xlcfgData = NULL ;
2014-12-16 07:30:05 +03:00
char * gotxml = NULL ;
virConfPtr conf = NULL ;
int ret = - 1 ;
virConnectPtr conn ;
virDomainDefPtr def = NULL ;
conn = virGetConnect ( ) ;
if ( ! conn ) goto fail ;
2016-02-16 05:42:27 +03:00
if ( virtTestLoadFile ( xlcfg , & xlcfgData ) < 0 )
2014-12-16 07:30:05 +03:00
goto fail ;
2016-02-16 05:42:27 +03:00
if ( ! ( conf = virConfReadMem ( xlcfgData , strlen ( xlcfgData ) , 0 ) ) )
2014-12-16 07:30:05 +03:00
goto fail ;
2015-12-05 05:11:39 +03:00
if ( ! ( def = xenParseXL ( conf , caps , xmlopt ) ) )
2014-12-16 07:30:05 +03:00
goto fail ;
2016-02-04 00:40:35 +03:00
if ( ! ( gotxml = virDomainDefFormat ( def , caps , VIR_DOMAIN_XML_INACTIVE |
2014-12-16 07:30:05 +03:00
VIR_DOMAIN_XML_SECURE ) ) )
goto fail ;
2015-04-23 18:14:26 +03:00
if ( virtTestCompareToFile ( gotxml , xml ) < 0 )
2014-12-16 07:30:05 +03:00
goto fail ;
ret = 0 ;
fail :
if ( conf )
virConfFree ( conf ) ;
2016-02-16 05:42:27 +03:00
VIR_FREE ( xlcfgData ) ;
2014-12-16 07:30:05 +03:00
VIR_FREE ( gotxml ) ;
virDomainDefFree ( def ) ;
virObjectUnref ( conn ) ;
return ret ;
}
struct testInfo {
const char * name ;
int mode ;
} ;
static int
testCompareHelper ( const void * data )
{
int result = - 1 ;
const struct testInfo * info = data ;
char * xml = NULL ;
char * cfg = NULL ;
if ( virAsprintf ( & xml , " %s/xlconfigdata/test-%s.xml " ,
abs_srcdir , info - > name ) < 0 | |
virAsprintf ( & cfg , " %s/xlconfigdata/test-%s.cfg " ,
abs_srcdir , info - > name ) < 0 )
goto cleanup ;
if ( info - > mode = = 0 )
2015-12-05 04:09:28 +03:00
result = testCompareParseXML ( cfg , xml ) ;
2014-12-16 07:30:05 +03:00
else
2015-12-05 04:09:28 +03:00
result = testCompareFormatXML ( cfg , xml ) ;
2014-12-16 07:30:05 +03:00
cleanup :
VIR_FREE ( xml ) ;
VIR_FREE ( cfg ) ;
return result ;
}
static int
mymain ( void )
{
int ret = 0 ;
if ( ! ( caps = testXLInitCaps ( ) ) )
return EXIT_FAILURE ;
2015-01-21 02:45:09 +03:00
if ( ! ( xmlopt = libxlCreateXMLConf ( ) ) )
2014-12-16 07:30:05 +03:00
return EXIT_FAILURE ;
2016-01-21 15:29:29 +03:00
# define DO_TEST_PARSE(name) \
2014-12-16 07:30:05 +03:00
do { \
2015-12-05 04:09:28 +03:00
struct testInfo info0 = { name , 0 } ; \
2016-01-21 15:29:29 +03:00
if ( virtTestRun ( " Xen XL-2-XML Parse " name , \
2014-12-16 07:30:05 +03:00
testCompareHelper , & info0 ) < 0 ) \
ret = - 1 ; \
2016-01-21 15:29:29 +03:00
} while ( 0 )
# define DO_TEST_FORMAT(name) \
do { \
struct testInfo info1 = { name , 1 } ; \
if ( virtTestRun ( " Xen XL-2-XML Format " name , \
2014-12-16 07:30:05 +03:00
testCompareHelper , & info1 ) < 0 ) \
ret = - 1 ; \
} while ( 0 )
2016-01-21 15:29:29 +03:00
# define DO_TEST(name) \
do { \
DO_TEST_PARSE ( name ) ; \
DO_TEST_FORMAT ( name ) ; \
} while ( 0 )
2015-12-16 00:47:40 +03:00
DO_TEST ( " paravirt-maxvcpus " ) ;
2015-12-05 04:09:28 +03:00
DO_TEST ( " new-disk " ) ;
2016-02-10 02:19:01 +03:00
DO_TEST_FORMAT ( " disk-positional-parms-full " ) ;
DO_TEST_FORMAT ( " disk-positional-parms-partial " ) ;
2015-12-05 04:09:28 +03:00
DO_TEST ( " spice " ) ;
DO_TEST ( " spice-features " ) ;
2015-12-29 01:26:17 +03:00
DO_TEST ( " vif-rate " ) ;
2015-04-02 15:57:54 +03:00
2016-01-21 15:29:29 +03:00
DO_TEST ( " paravirt-cmdline " ) ;
DO_TEST_FORMAT ( " paravirt-cmdline-extra-root " ) ;
DO_TEST_FORMAT ( " paravirt-cmdline-bogus-extra-root " ) ;
2016-02-11 03:39:18 +03:00
DO_TEST ( " rbd-multihost-noauth " ) ;
2016-01-21 15:29:29 +03:00
2015-04-02 15:57:54 +03:00
# ifdef LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST
2015-12-05 04:09:28 +03:00
DO_TEST ( " fullvirt-multiusb " ) ;
2015-04-02 15:57:54 +03:00
# endif
2015-03-20 07:16:11 +03:00
# ifdef LIBXL_HAVE_BUILDINFO_KERNEL
2015-12-05 04:09:28 +03:00
DO_TEST ( " fullvirt-direct-kernel-boot " ) ;
2016-01-21 15:29:29 +03:00
DO_TEST_FORMAT ( " fullvirt-direct-kernel-boot-extra " ) ;
DO_TEST_FORMAT ( " fullvirt-direct-kernel-boot-bogus-extra " ) ;
2015-03-20 07:16:11 +03:00
# endif
2014-12-16 07:30:05 +03:00
virObjectUnref ( caps ) ;
virObjectUnref ( xmlopt ) ;
return ret = = 0 ? EXIT_SUCCESS : EXIT_FAILURE ;
}
VIRT_TEST_MAIN ( mymain )