]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
libxl: support sexpr in native to XML conversion
authorJim Fehlig <jfehlig@suse.com>
Fri, 7 Mar 2014 17:31:45 +0000 (10:31 -0700)
committerJim Fehlig <jfehlig@suse.com>
Tue, 11 Mar 2014 20:31:08 +0000 (14:31 -0600)
Supporting sexpr in connectDomainXMLFromNative in the libxl driver
adds flexibility for users importing legacy Xen configuration into
libvirt.  E.g. this patch allows importing previous xend-managed
domains from /var/lib/xend/domains/<dom-uuid>/config.sxp into the
libvirt libxl driver.

src/libxl/libxl_driver.c

index a79efcb807d9ee3be013cdfb67e162c088ff975b..65d80a291e7605960ad92d3f98e3b6b871df7ab5 100644 (file)
@@ -46,6 +46,7 @@
 #include "libxl_driver.h"
 #include "libxl_conf.h"
 #include "xen_xm.h"
+#include "xen_sxpr.h"
 #include "virtypedparam.h"
 #include "viruri.h"
 #include "virstring.h"
@@ -62,6 +63,7 @@
 #define LIBXL_DOM_REQ_HALT     4
 
 #define LIBXL_CONFIG_FORMAT_XM "xen-xm"
+#define LIBXL_CONFIG_FORMAT_SEXPR "xen-sxpr"
 
 /* Number of Xen scheduler parameters */
 #define XEN_SCHED_CREDIT_NPARAM   2
@@ -2867,8 +2869,9 @@ libxlDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
 }
 
 static char *
-libxlConnectDomainXMLFromNative(virConnectPtr conn, const char * nativeFormat,
-                                const char * nativeConfig,
+libxlConnectDomainXMLFromNative(virConnectPtr conn,
+                                const char *nativeFormat,
+                                const char *nativeConfig,
                                 unsigned int flags)
 {
     libxlDriverPrivatePtr driver = conn->privateData;
@@ -2882,22 +2885,33 @@ libxlConnectDomainXMLFromNative(virConnectPtr conn, const char * nativeFormat,
     if (virConnectDomainXMLFromNativeEnsureACL(conn) < 0)
         goto cleanup;
 
-    if (STRNEQ(nativeFormat, LIBXL_CONFIG_FORMAT_XM)) {
+    if (STREQ(nativeFormat, LIBXL_CONFIG_FORMAT_XM)) {
+        if (!(conf = virConfReadMem(nativeConfig, strlen(nativeConfig), 0)))
+            goto cleanup;
+
+        if (!(def = xenParseXM(conf,
+                               cfg->verInfo->xen_version_major,
+                               cfg->caps))) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("parsing xm config failed"));
+            goto cleanup;
+        }
+    } else if (STREQ(nativeFormat, LIBXL_CONFIG_FORMAT_SEXPR)) {
+        /* only support latest xend config format */
+        if (!(def = xenParseSxprString(nativeConfig,
+                                       XEND_CONFIG_VERSION_3_1_0,
+                                       NULL,
+                                       -1))) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("parsing sxpr config failed"));
+            goto cleanup;
+        }
+    } else {
         virReportError(VIR_ERR_INVALID_ARG,
                        _("unsupported config type %s"), nativeFormat);
         goto cleanup;
     }
 
-    if (!(conf = virConfReadMem(nativeConfig, strlen(nativeConfig), 0)))
-        goto cleanup;
-
-    if (!(def = xenParseXM(conf,
-                           cfg->verInfo->xen_version_major,
-                           cfg->caps))) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("parsing xm config failed"));
-        goto cleanup;
-    }
-
     xml = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE);
 
 cleanup: