]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Allow custom XML to be passed in during migration
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 27 May 2011 10:30:26 +0000 (11:30 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 31 May 2011 11:14:57 +0000 (12:14 +0100)
Update the qemuDomainMigrateBegin method so that it accepts
an optional incoming XML document. This will be validated
for ABI compatibility against the current domain config,
and if this check passes, will be passed back out for use
by the qemuDomainMigratePrepare method on the target

* src/qemu/qemu_domain.c, src/qemu/qemu_domain.h,
  src/qemu/qemu_migration.c: Allow custom XML to be passed

src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_migration.c

index 8f4915cc669905774b51ed0b2282dee52dc77278..bb6a887cb78d26127dbcf95bf783160c8b898614 100644 (file)
@@ -700,19 +700,14 @@ void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver,
 }
 
 
-char *qemuDomainFormatXML(struct qemud_driver *driver,
-                          virDomainObjPtr vm,
-                          int flags)
+char *qemuDomainDefFormatXML(struct qemud_driver *driver,
+                             virDomainDefPtr def,
+                             int flags)
 {
     char *ret = NULL;
     virCPUDefPtr cpu = NULL;
-    virDomainDefPtr def;
     virCPUDefPtr def_cpu;
 
-    if ((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef)
-        def = vm->newDef;
-    else
-        def = vm->def;
     def_cpu = def->cpu;
 
     /* Update guest CPU requirements according to host CPU */
@@ -737,6 +732,21 @@ cleanup:
     return ret;
 }
 
+char *qemuDomainFormatXML(struct qemud_driver *driver,
+                          virDomainObjPtr vm,
+                          int flags)
+{
+    virDomainDefPtr def;
+
+    if ((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef)
+        def = vm->newDef;
+    else
+        def = vm->def;
+
+    return qemuDomainDefFormatXML(driver, def, flags);
+}
+
+
 void qemuDomainObjTaint(struct qemud_driver *driver,
                         virDomainObjPtr obj,
                         enum virDomainTaintFlags taint,
index effaebc13312d2b44d3708bae072124dc2e29107..9e7a7e9f0aabba51dd7fd0416872117b3d769590 100644 (file)
@@ -120,6 +120,10 @@ void qemuDomainObjEnterRemoteWithDriver(struct qemud_driver *driver,
 void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver,
                                        virDomainObjPtr obj);
 
+char *qemuDomainDefFormatXML(struct qemud_driver *driver,
+                             virDomainDefPtr vm,
+                             int flags);
+
 char *qemuDomainFormatXML(struct qemud_driver *driver,
                           virDomainObjPtr vm,
                           int flags);
index 66c34f54b9a4ec9879e19348a211bf249d65c65d..be2b80847a5074426876c5dc34814dbb7c4fd3f8 100644 (file)
@@ -914,15 +914,10 @@ char *qemuMigrationBegin(struct qemud_driver *driver,
 {
     char *rv = NULL;
     qemuMigrationCookiePtr mig = NULL;
+    virDomainDefPtr def = NULL;
     VIR_DEBUG("driver=%p, vm=%p, xmlin=%s, cookieout=%p, cookieoutlen=%p",
               driver, vm, NULLSTR(xmlin), cookieout, cookieoutlen);
 
-    if (xmlin) {
-        qemuReportError(VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("Passing XML for the target VM is not yet supported"));
-        goto cleanup;
-    }
-
     if (!virDomainObjIsActive(vm)) {
         qemuReportError(VIR_ERR_OPERATION_INVALID,
                         "%s", _("domain is not running"));
@@ -940,13 +935,27 @@ char *qemuMigrationBegin(struct qemud_driver *driver,
                                 0) < 0)
         goto cleanup;
 
-    rv = qemuDomainFormatXML(driver, vm,
-                             VIR_DOMAIN_XML_SECURE |
-                             VIR_DOMAIN_XML_UPDATE_CPU);
+    if (xmlin) {
+        if (!(def = virDomainDefParseString(driver->caps, xmlin,
+                                            VIR_DOMAIN_XML_INACTIVE)))
+            goto cleanup;
+
+        if (!virDomainDefCheckABIStability(def, vm->def))
+            goto cleanup;
+
+        rv = qemuDomainDefFormatXML(driver, def,
+                                    VIR_DOMAIN_XML_SECURE |
+                                    VIR_DOMAIN_XML_UPDATE_CPU);
+    } else {
+        rv = qemuDomainFormatXML(driver, vm,
+                                 VIR_DOMAIN_XML_SECURE |
+                                 VIR_DOMAIN_XML_UPDATE_CPU);
+    }
 
 cleanup:
     virDomainObjUnlock(vm);
     qemuMigrationCookieFree(mig);
+    virDomainDefFree(def);
     return rv;
 }