]> xenbits.xensource.com Git - libvirt.git/commitdiff
Implements domainXMLTo/FromNative in libxl driver
authorMarkus Groß <gross@univention.de>
Tue, 29 Mar 2011 12:39:18 +0000 (20:39 +0800)
committerDaniel Veillard <veillard@redhat.com>
Tue, 29 Mar 2011 12:57:02 +0000 (20:57 +0800)
* src/Makefile.am src/libvirt_private.syms configure.ac: share and
  reuse the sexpr routines from sexpr.h of the old xen driver
* src/libxl/libxl_driver.c: implements libxlDomainXMLFromNative and
  libxlDomainXMLToNative

configure.ac
src/Makefile.am
src/libvirt_private.syms
src/libxl/libxl_driver.c

index 60e0df29bdefdb5d5adeeba2102b6260c90acf46..2378d9a9f19cf7d49e49b8b0d0338885ecf6f75e 100644 (file)
@@ -600,6 +600,8 @@ AM_CONDITIONAL([WITH_XEN], [test "$with_xen" = "yes"])
 AC_SUBST([XEN_CFLAGS])
 AC_SUBST([XEN_LIBS])
 
+AM_CONDITIONAL([WITH_XENXS], [test "$with_libxl" = "yes" || test "$with_xen" = "yes"])
+
 dnl
 dnl check for kernel headers required by xen_inotify
 dnl
index 85e4f2301136ac6b2565f2901cb7f9008c69b24e..9b54679d7be100e7f8e1374ace0595ccec97b318 100644 (file)
@@ -473,7 +473,7 @@ libvirt_vmx_la_CFLAGS = \
 libvirt_vmx_la_SOURCES = $(VMX_SOURCES)
 endif
 
-if WITH_XEN
+if WITH_XENXS
 noinst_LTLIBRARIES += libvirt_xenxs.la
 libvirt_la_BUILT_LIBADD += libvirt_xenxs.la
 libvirt_xenxs_la_CFLAGS = \
@@ -703,10 +703,12 @@ noinst_LTLIBRARIES += libvirt_driver_libxl.la
 # Stateful, so linked to daemon instead
 #libvirt_la_BUILT_LIBADD += libvirt_driver_libxl.la
 endif
-libvirt_driver_libxl_la_CFLAGS = $(LIBXL_CFLAGS) \
-               -I@top_srcdir@/src/conf $(AM_CFLAGS)
+libvirt_driver_libxl_la_CFLAGS = $(LIBXL_CFLAGS)               \
+               -I@top_srcdir@/src/conf                         \
+               -I@top_srcdir@/src/xenxs                        \
+               $(AM_CFLAGS)
 libvirt_driver_libxl_la_LDFLAGS = $(AM_LDFLAGS)
-libvirt_driver_libxl_la_LIBADD = $(LIBXL_LIBS)
+libvirt_driver_libxl_la_LIBADD = $(LIBXL_LIBS) libvirt_xenxs.la
 if WITH_DRIVER_MODULES
 libvirt_driver_libxl_la_LIBADD += ../gnulib/lib/libgnu.la
 libvirt_driver_libxl_la_LDFLAGS += -module -avoid-version
index b1a357b6e45a22a97e2f52f727c21d713506826f..103d8bf8d0585d89fb82b0667086b8a41d0222c7 100644 (file)
@@ -757,6 +757,22 @@ virSecurityManagerSetSavedStateLabel;
 virSecurityManagerSetSocketLabel;
 virSecurityManagerVerify;
 
+# sexpr.h
+sexpr_append;
+sexpr_cons;
+sexpr_float;
+sexpr_fmt_node;
+sexpr_free;
+sexpr_has;
+sexpr_int;
+sexpr_lookup;
+sexpr_nil;
+sexpr_node;
+sexpr_node_copy;
+sexpr_string;
+sexpr_u64;
+sexpr2string;
+string2sexpr;
 
 # storage_conf.h
 virStoragePartedFsTypeTypeToString;
index 3251e6662e72bf3c46f39c9935ddd9d80f5459a1..7d839756997a8a4e42f5d65cab8e5c7fb605ed32 100644 (file)
@@ -33,6 +33,7 @@
 #include "internal.h"
 #include "logging.h"
 #include "virterror_internal.h"
+#include "conf.h"
 #include "datatypes.h"
 #include "files.h"
 #include "memory.h"
@@ -41,6 +42,7 @@
 #include "command.h"
 #include "libxl_driver.h"
 #include "libxl_conf.h"
+#include "xen_xm.h"
 
 
 #define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -51,6 +53,8 @@
 #define LIBXL_DOM_REQ_CRASH    3
 #define LIBXL_DOM_REQ_HALT     4
 
+#define LIBXL_CONFIG_FORMAT_XM "xen-xm"
+
 static libxlDriverPrivatePtr libxl_driver = NULL;
 
 
@@ -1636,6 +1640,92 @@ libxlDomainDumpXML(virDomainPtr dom, int flags)
     return ret;
 }
 
+static char *
+libxlDomainXMLFromNative(virConnectPtr conn, const char * nativeFormat,
+                         const char * nativeConfig,
+                         unsigned int flags ATTRIBUTE_UNUSED)
+{
+    libxlDriverPrivatePtr driver = conn->privateData;
+    const libxl_version_info *ver_info;
+    virDomainDefPtr def = NULL;
+    virConfPtr conf = NULL;
+    char *xml = NULL;
+
+    if (STRNEQ(nativeFormat, LIBXL_CONFIG_FORMAT_XM)) {
+        libxlError(VIR_ERR_INVALID_ARG,
+                   _("unsupported config type %s"), nativeFormat);
+        goto cleanup;
+    }
+
+    if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
+        VIR_ERROR0(_("cannot get version information from libxenlight"));
+        goto cleanup;
+    }
+
+    if (!(conf = virConfReadMem(nativeConfig, strlen(nativeConfig), 0)))
+        goto cleanup;
+
+    if (!(def = xenParseXM(conf, ver_info->xen_version_major, driver->caps))) {
+        libxlError(VIR_ERR_INTERNAL_ERROR, "%s", _("parsing xm config failed"));
+        goto cleanup;
+    }
+
+    xml = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
+
+cleanup:
+    virDomainDefFree(def);
+    if (conf)
+        virConfFree(conf);
+    return xml;
+}
+
+#define MAX_CONFIG_SIZE (1024 * 65)
+static char *
+libxlDomainXMLToNative(virConnectPtr conn, const char * nativeFormat,
+                       const char * domainXml,
+                       unsigned int flags ATTRIBUTE_UNUSED)
+{
+    libxlDriverPrivatePtr driver = conn->privateData;
+    const libxl_version_info *ver_info;
+    virDomainDefPtr def = NULL;
+    virConfPtr conf = NULL;
+    int len = MAX_CONFIG_SIZE;
+    char *ret = NULL;
+
+    if (STRNEQ(nativeFormat, LIBXL_CONFIG_FORMAT_XM)) {
+        libxlError(VIR_ERR_INVALID_ARG,
+                   _("unsupported config type %s"), nativeFormat);
+        goto cleanup;
+    }
+
+    if ((ver_info = libxl_get_version_info(&driver->ctx)) == NULL) {
+        VIR_ERROR0(_("cannot get version information from libxenlight"));
+        goto cleanup;
+    }
+
+    if (!(def = virDomainDefParseString(driver->caps, domainXml, 0)))
+        goto cleanup;
+
+    if (!(conf = xenFormatXM(conn, def, ver_info->xen_version_major)))
+        goto cleanup;
+
+    if (VIR_ALLOC_N(ret, len) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if (virConfWriteMem(ret, &len, conf) < 0) {
+        VIR_FREE(ret);
+        goto cleanup;
+    }
+
+cleanup:
+    virDomainDefFree(def);
+    if (conf)
+        virConfFree(conf);
+    return ret;
+}
+
 static int
 libxlListDefinedDomains(virConnectPtr conn,
                         char **const names, int nnames)
@@ -1994,8 +2084,8 @@ static virDriver libxlDriver = {
     NULL,                       /* domainGetSecurityLabel */
     NULL,                       /* nodeGetSecurityModel */
     libxlDomainDumpXML,         /* domainDumpXML */
-    NULL,                       /* domainXmlFromNative */
-    NULL,                       /* domainXmlToNative */
+    libxlDomainXMLFromNative,   /* domainXmlFromNative */
+    libxlDomainXMLToNative,     /* domainXmlToNative */
     libxlListDefinedDomains,    /* listDefinedDomains */
     libxlNumDefinedDomains,     /* numOfDefinedDomains */
     libxlDomainCreate,          /* domainCreate */