Daniel P. Berrange wrote: > On Mon, Jun 02, 2014 at 01:41:58PM +0100, Ian Campbell wrote: > >>> I hacked around this, but it is a little dirty too. libvirt >>> already links to libyajl for the QEMU driver, but we don't >>> really need the raw YAJL objects. It'd be nice to have a >>> >>> char * libxl_domain_config_as_json(libxl_domain_config *p) >>> >>> as a higher level wrapper around libxl_domain_config_gen_json >>> avoiding the pain of dealing with YAJL's different APIs. >>> >>> Ian J mentioned to me that he thought there was already such a >>> method, but AFAICT, the only such code is in the 'xl' command >>> line tool itself (xl_cmdimpl.c - printf_info_one_json) >>> >> That was me not Ian J I think. >> > > Opps, my bad, was talking to too many people to remember things clearly :-) > > >> The function you need is libxl_domain_config_to_json (which is >> autogenerated, so in _libxl_types.[hc]). I think the general >> libxl_*_to_json support has been there since Xen 4.2, but IIRC >> libxl_domain_config only got moved into the autogenerated/IDL layer in >> 4.3. >> > > Ahhh, so I was looking in the wrong place - no wonder 'git grep' failed > to find it :-) > This patch becomes a bit smaller by using libxl_domain_config_to_json() - see below diff. It works with Xen 4.2-4.4, although the test fails on all but 4.4 due to changes in the json noted earlier (e.g. additional c_info fields added to the returned json). Thanks for looking at this btw! Great topic for the hackathon. I was groaning about the need for round-trip config testing last week while reviewing some other patches, just before you posted this series! Awesome! Regards, Jim diff --git a/tests/libxlxml2jsontest.c b/tests/libxlxml2jsontest.c index 02808b7..ed7c256 100644 --- a/tests/libxlxml2jsontest.c +++ b/tests/libxlxml2jsontest.c @@ -40,24 +40,11 @@ # include "virmock.h" # include "testutilsxen.h" -# ifdef WITH_YAJL2 -# define HAVE_YAJL_V2 -# endif - -# include <yajl/yajl_gen.h> -# include <libxl_json.h> - # define VIR_FROM_THIS VIR_FROM_XEN static const char *abs_top_srcdir; static virCapsPtr xencaps; -# ifdef WITH_YAJL2 -# define yajl_size_t size_t -# else -# define yajl_size_t unsigned int -# endif - static int testCompareXMLToJSONFiles(const char *xml, const char *cmdline) { @@ -69,31 +56,10 @@ static int testCompareXMLToJSONFiles(const char *xml, libxl_domain_config config; xentoollog_logger *log = NULL; virDomainXMLOptionPtr xmlopt = NULL; - yajl_gen gen; -# ifndef WITH_YAJL2 - yajl_gen_config conf = { 1, " " }; -# endif - const unsigned char *actualargv; - yajl_size_t actualargvlen; + char *actualargv = NULL; libxl_domain_config_init(&config); -# ifdef WITH_YAJL2 - gen = yajl_gen_alloc(NULL); - if (gen) { - yajl_gen_config(gen, yajl_gen_beautify, 1); - yajl_gen_config(gen, yajl_gen_indent_string, " "); - yajl_gen_config(gen, yajl_gen_validate_utf8, 1); - } -# else - gen = yajl_gen_alloc(&conf, NULL); -# endif - if (!gen) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - "Unable to create JSON formatter"); - goto cleanup; - } - if (!(log = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, XTL_DEBUG, 0))) goto cleanup; @@ -114,24 +80,18 @@ static int testCompareXMLToJSONFiles(const char *xml, if (libxlBuildDomainConfig(gports, vmdef, ctx, &config) < 0) goto cleanup; - libxl_domain_config_gen_json(gen, &config); - - if (yajl_gen_get_buf(gen, &actualargv, &actualargvlen) != yajl_gen_status_ok) { - virReportOOMError(); - goto cleanup; - } - + actualargv = libxl_domain_config_to_json(ctx, &config); virtTestLoadFile(cmdline, &expectargv); - if (STRNEQ(expectargv, (char *)actualargv)) { - virtTestDifference(stderr, expectargv, (char *)actualargv); + if (STRNEQ(expectargv, actualargv)) { + virtTestDifference(stderr, expectargv, actualargv); goto cleanup; } ret = 0; cleanup: - yajl_gen_free(gen); + VIR_FREE(actualargv); VIR_FREE(expectargv); virDomainDefFree(vmdef); virObjectUnref(gports); -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list