From 2c78051a14acfb7aba078d569b1632dfe0ca0853 Mon Sep 17 00:00:00 2001 From: Kiarie Kahurani Date: Thu, 11 Sep 2014 07:10:33 +0300 Subject: [PATCH] src/xenconfig: Xen-xl parser Introduce a Xen xl parser This parser allows for users to convert the new xl disk format and spice graphics config to libvirt xml format and vice versa. Regarding the spice graphics config, the code is pretty much straight forward. For the disk {formating, parsing}, this parser takes care of the new xl format which include positional parameters and key/value parameters. In xl format disk config a consists of parameters separated by commas. If the parameters do not contain an '=' they are automatically assigned to certain options following the order below target, format, vdev, access The above are the only mandatory parameters in the but there are many more disk config options. These options can be specified as key=value pairs. This takes care of the rest of the options such as devtype, backend, backendtype, script, direct-io-safe, The positional paramters can also be specified in key/value form for example /dev/vg/guest-volume,,hda /dev/vg/guest-volume,raw,hda,rw format=raw, vdev=hda, access=rw, target=/dev/vg/guest-volume are interpleted to one config. In xm format, the above diskspec would be written as phy:/dev/vg/guest-volume,hda,w The disk parser is based on the same parser used successfully by the Xen project for several years now. Ian Jackson authored the scanner, which is used by this commit with mimimal changes. Only the PREFIX option is changed, to produce function and file names more consistent with libvirt's convention. Signed-off-by: Kiarie Kahurani Signed-off-by: Jim Fehlig --- .gitignore | 1 + cfg.mk | 3 +- configure.ac | 1 + po/POTFILES.in | 1 + src/Makefile.am | 25 +- src/libvirt_xenconfig.syms | 4 + src/xenconfig/xen_common.c | 3 +- src/xenconfig/xen_xl.c | 499 ++++++++++++++++++++++++++++++++++ src/xenconfig/xen_xl.h | 33 +++ src/xenconfig/xen_xl_disk.l | 256 +++++++++++++++++ src/xenconfig/xen_xl_disk_i.h | 39 +++ 11 files changed, 861 insertions(+), 4 deletions(-) create mode 100644 src/xenconfig/xen_xl.c create mode 100644 src/xenconfig/xen_xl.h create mode 100644 src/xenconfig/xen_xl_disk.l create mode 100644 src/xenconfig/xen_xl_disk_i.h diff --git a/.gitignore b/.gitignore index 9d09709c5f..eac2203265 100644 --- a/.gitignore +++ b/.gitignore @@ -140,6 +140,7 @@ /src/remote/*_protocol.[ch] /src/rpc/virkeepaliveprotocol.[ch] /src/rpc/virnetprotocol.[ch] +/src/xenconfig/xen_xl_disk.[ch] /src/test_libvirt*.aug /src/test_virtlockd.aug /src/util/virkeymaps.h diff --git a/cfg.mk b/cfg.mk index 21f83c3435..3df3dcbc31 100644 --- a/cfg.mk +++ b/cfg.mk @@ -89,8 +89,9 @@ distdir: sc_vulnerable_makefile_CVE-2012-3386.z endif # Files that should never cause syntax check failures. +# (^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$ VC_LIST_ALWAYS_EXCLUDE_REGEX = \ - (^(HACKING|docs/(news\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$ + (^(HACKING|docs/(news\.html\.in|.*\.patch)|src/xenconfig/xen_xl_disk.[chl])|\.(po|fig|gif|ico|png))$$ # Functions like free() that are no-ops on NULL arguments. useless_free_options = \ diff --git a/configure.ac b/configure.ac index 9d12079458..167b875c9b 100644 --- a/configure.ac +++ b/configure.ac @@ -146,6 +146,7 @@ m4_ifndef([LT_INIT], [ ]) AM_PROG_CC_C_O AM_PROG_LD +AM_PROG_LEX AC_MSG_CHECKING([for how to mark DSO non-deletable at runtime]) LIBVIRT_NODELETE= diff --git a/po/POTFILES.in b/po/POTFILES.in index e7cb2cc197..094c8e3704 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -247,6 +247,7 @@ src/xenapi/xenapi_driver.c src/xenapi/xenapi_utils.c src/xenconfig/xen_common.c src/xenconfig/xen_sxpr.c +src/xenconfig/xen_xl.c src/xenconfig/xen_xm.c tests/virpolkittest.c tools/libvirt-guests.sh.in diff --git a/src/Makefile.am b/src/Makefile.am index 550362cca3..8ccc27384b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1000,11 +1000,22 @@ CPU_SOURCES = \ VMX_SOURCES = \ vmx/vmx.c vmx/vmx.h +AM_LFLAGS = -Pxl_disk_ --header-file=../$*.h +LEX_OUTPUT_ROOT = lex.xl_disk_ +BUILT_SOURCES += xenconfig/xen_xl_disk.c xenconfig/xen_xl_disk.h +# Generated header file is not implicitly added to dist +EXTRA_DIST += xenconfig/xen_xl_disk.h +CLEANFILES += xenconfig/xen_xl_disk.h xenconfig/xen_xl_disk.c + +XENXLDISKPARSER_SOURCES = xenconfig/xen_xl_disk.l + XENCONFIG_SOURCES = \ xenconfig/xenxs_private.h \ - xenconfig/xen_common.c xenconfig/xen_common.h \ + xenconfig/xen_common.c xenconfig/xen_common.h \ xenconfig/xen_sxpr.c xenconfig/xen_sxpr.h \ - xenconfig/xen_xm.c xenconfig/xen_xm.h + xenconfig/xen_xm.c xenconfig/xen_xm.h \ + xenconfig/xen_xl.c xenconfig/xen_xl.h \ + xenconfig/xen_xl_disk_i.h pkgdata_DATA = cpu/cpu_map.xml @@ -1059,10 +1070,19 @@ libvirt_vmx_la_SOURCES = $(VMX_SOURCES) endif WITH_VMX if WITH_XENCONFIG +# Flex generated XL disk parser needs to be compiled without WARN_FLAGS +# Add the generated object to its own library to control CFLAGS +noinst_LTLIBRARIES += libvirt_xenxldiskparser.la +libvirt_xenxldiskparser_la_CFLAGS = \ + -I$(top_srcdir)/src/conf $(AM_CFLAGS) -Wno-unused-parameter +libvirt_xenxldiskparser_la_SOURCES = \ + $(XENXLDISKPARSER_SOURCES) + noinst_LTLIBRARIES += libvirt_xenconfig.la libvirt_la_BUILT_LIBADD += libvirt_xenconfig.la libvirt_xenconfig_la_CFLAGS = \ -I$(top_srcdir)/src/conf $(AM_CFLAGS) +libvirt_xenconfig_la_LIBADD = libvirt_xenxldiskparser.la libvirt_xenconfig_la_SOURCES = $(XENCONFIG_SOURCES) endif WITH_XENCONFIG @@ -1824,6 +1844,7 @@ EXTRA_DIST += \ $(VBOX_DRIVER_EXTRA_DIST) \ $(VMWARE_DRIVER_SOURCES) \ $(XENCONFIG_SOURCES) \ + $(XENXLDISKPARSER_SOURCES) \ $(ACCESS_DRIVER_POLKIT_POLICY) check-local: check-augeas diff --git a/src/libvirt_xenconfig.syms b/src/libvirt_xenconfig.syms index 6541685fe5..3e2e5d6cbd 100644 --- a/src/libvirt_xenconfig.syms +++ b/src/libvirt_xenconfig.syms @@ -16,6 +16,10 @@ xenParseSxprChar; xenParseSxprSound; xenParseSxprString; +#xenconfig/xen_xl.h +xenFormatXL; +xenParseXL; + # xenconfig/xen_xm.h xenFormatXM; xenParseXM; diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index cbacc2ad84..e612fdc30a 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -1801,7 +1801,8 @@ xenFormatVfb(virConfPtr conf, virDomainDefPtr def, int xendConfigVersion) { int hvm = STREQ(def->os.type, "hvm") ? 1 : 0; - if (def->ngraphics == 1) { + if (def->ngraphics == 1 && + def->graphics[0]->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE) { if (hvm || (xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF)) { if (def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) { if (xenConfigSetInt(conf, "sdl", 1) < 0) diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c new file mode 100644 index 0000000000..8d1d2a79ff --- /dev/null +++ b/src/xenconfig/xen_xl.c @@ -0,0 +1,499 @@ +/* + * xen_xl.c: Xen XL parsing functions + * + * 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 + * . + * + * Author: Kiarie Kahurani + */ + +#include + +#include "virconf.h" +#include "virerror.h" +#include "domain_conf.h" +#include "viralloc.h" +#include "virstring.h" +#include "xen_xl.h" +#include "xen_xl_disk.h" +#include "xen_xl_disk_i.h" + +#define VIR_FROM_THIS VIR_FROM_NONE + + +static int +xenParseXLSpice(virConfPtr conf, virDomainDefPtr def) +{ + virDomainGraphicsDefPtr graphics = NULL; + unsigned long port; + char *listenAddr = NULL; + int val; + + if (STREQ(def->os.type, "hvm")) { + if (xenConfigGetBool(conf, "spice", &val, 0) < 0) + return -1; + + if (val) { + if (VIR_ALLOC(graphics) < 0) + return -1; + + graphics->type = VIR_DOMAIN_GRAPHICS_TYPE_SPICE; + if (xenConfigCopyStringOpt(conf, "spicehost", &listenAddr) < 0) + goto cleanup; + if (listenAddr && + virDomainGraphicsListenSetAddress(graphics, 0, listenAddr, + -1, true) < 0) { + goto cleanup; + } + VIR_FREE(listenAddr); + + if (xenConfigGetULong(conf, "spicetls_port", &port, 0) < 0) + goto cleanup; + graphics->data.spice.tlsPort = (int)port; + + if (xenConfigGetULong(conf, "spiceport", &port, 0) < 0) + goto cleanup; + + graphics->data.spice.port = (int)port; + + if (!graphics->data.spice.tlsPort && + !graphics->data.spice.port) + graphics->data.spice.autoport = 1; + + if (xenConfigGetBool(conf, "spicedisable_ticketing", &val, 0) < 0) + goto cleanup; + if (val) { + if (xenConfigCopyStringOpt(conf, "spicepasswd", + &graphics->data.spice.auth.passwd) < 0) + goto cleanup; + } + + if (xenConfigGetBool(conf, "spiceagent_mouse", + &graphics->data.spice.mousemode, 0) < 0) + goto cleanup; + if (xenConfigGetBool(conf, "spicedvagent", &val, 0) < 0) + goto cleanup; + if (val) { + if (xenConfigGetBool(conf, "spice_clipboard_sharing", + &graphics->data.spice.copypaste, + 0) < 0) + goto cleanup; + } + + if (VIR_ALLOC_N(def->graphics, 1) < 0) + goto cleanup; + def->graphics[0] = graphics; + def->ngraphics = 1; + } + } + + return 0; + + cleanup: + virDomainGraphicsDefFree(graphics); + return -1; +} + + +void +xenXLDiskParserError(xenXLDiskParserContext *dpc, + const char *erroneous, + const char *message) +{ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("disk config %s not supported: %s"), + erroneous, message); + + if (!dpc->err) + dpc->err = EINVAL; +} + + +static int +xenXLDiskParserPrep(xenXLDiskParserContext *dpc, + const char *spec, + virDomainDiskDefPtr disk) +{ + int err; + + dpc->spec = spec; + dpc->disk = disk; + dpc->access_set = 0; + + err = xl_disk_lex_init_extra(dpc, &dpc->scanner); + if (err) + goto fail; + + dpc->buf = xl_disk__scan_bytes(spec, strlen(spec), dpc->scanner); + if (!dpc->buf) { + err = ENOMEM; + goto fail; + } + + return 0; + + fail: + virReportSystemError(errno, "%s", + _("failed to initialize disk configuration parser")); + return err; +} + + +static void +xenXLDiskParserCleanup(xenXLDiskParserContext *dpc) +{ + if (dpc->buf) { + xl_disk__delete_buffer(dpc->buf, dpc->scanner); + dpc->buf = NULL; + } + + if (dpc->scanner) { + xl_disk_lex_destroy(dpc->scanner); + dpc->scanner = NULL; + } +} + + +/* + * positional parameters + * (If the strings are not separated by "=" + * the string is split following ',' and assigned to + * the following options in the following order) + * target,format,vdev,access + * ================================================================ + * + * The parameters below cannot be specified as positional parameters: + * + * other parameters + * devtype = + * backendtype = + * parameters not taken care of + * backend = + * script =