]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
add virsh --suspend arg to migrate command
authorPaolo Bonzini <pbonzini@redhat.com>
Fri, 11 Dec 2009 09:00:44 +0000 (10:00 +0100)
committerDaniel Veillard <veillard@redhat.com>
Fri, 11 Dec 2009 09:00:44 +0000 (10:00 +0100)
This adds a new flag, VIR_MIGRATE_PAUSED, that mandates pausing
the migrated VM before starting it.

* include/libvirt/libvirt.h.in (virDomainMigrateFlags): Add VIR_MIGRATE_PAUSED.
* src/qemu/qemu_driver.c (qemudDomainMigrateFinish2): Handle VIR_MIGRATE_PAUSED.
* tools/virsh.c (opts_migrate): Add --suspend. (cmdMigrate): Handle it.
* tools/virsh.pod (migrate): Document it.

include/libvirt/libvirt.h.in
src/libvirt.c
src/qemu/qemu_driver.c
tools/virsh.c
tools/virsh.pod

index 5bc76947c9783abb28af90b099722fe6c759b435..0488cbf90da6ef561c466780fceb9d4c2e613ff7 100644 (file)
@@ -341,6 +341,7 @@ typedef enum {
     VIR_MIGRATE_TUNNELLED         = (1 << 2), /* tunnel migration data over libvirtd connection */
     VIR_MIGRATE_PERSIST_DEST      = (1 << 3), /* persist the VM on the destination */
     VIR_MIGRATE_UNDEFINE_SOURCE   = (1 << 4), /* undefine the VM on the source */
+    VIR_MIGRATE_PAUSED            = (1 << 5), /* pause on remote side */
 } virDomainMigrateFlags;
 
 /* Domain migration. */
index 05e45f35f074d7f2d4120da676e2f34c775ad5a5..2ced6048283c57d352012c0aaa479d57969ddba3 100644 (file)
@@ -3179,6 +3179,7 @@ virDomainMigrateDirect (virDomainPtr domain,
  *                            on the destination host.
  *   VIR_MIGRATE_UNDEFINE_SOURCE If the migration is successful, undefine the
  *                               domain on the source host.
+ *   VIR_MIGRATE_PAUSED    Leave the domain suspended on the remote side.
  *
  * VIR_MIGRATE_TUNNELLED requires that VIR_MIGRATE_PEER2PEER be set.
  * Applications using the VIR_MIGRATE_PEER2PEER flag will probably
index 2e1eaa1c8fb288b8733375e9c734e2e878860ab8..16828425f5375a5f20273bc59a5f271b6df1ed50 100644 (file)
@@ -7540,24 +7540,33 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
         qemuDomainObjPrivatePtr priv = vm->privateData;
         dom = virGetDomain (dconn, vm->def->name, vm->def->uuid);
 
-        /* run 'cont' on the destination, which allows migration on qemu
-         * >= 0.10.6 to work properly.  This isn't strictly necessary on
-         * older qemu's, but it also doesn't hurt anything there
-         */
-        qemuDomainObjEnterMonitorWithDriver(driver, vm);
-        if (qemuMonitorStartCPUs(priv->mon, dconn) < 0) {
-            if (virGetLastError() == NULL)
-                qemudReportError(dconn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                                 "%s", _("resume operation failed"));
+        if (!(flags & VIR_MIGRATE_PAUSED)) {
+            /* run 'cont' on the destination, which allows migration on qemu
+             * >= 0.10.6 to work properly.  This isn't strictly necessary on
+             * older qemu's, but it also doesn't hurt anything there
+             */
+            qemuDomainObjEnterMonitorWithDriver(driver, vm);
+            if (qemuMonitorStartCPUs(priv->mon, dconn) < 0) {
+                if (virGetLastError() == NULL)
+                    qemudReportError(dconn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                                     "%s", _("resume operation failed"));
+                qemuDomainObjExitMonitorWithDriver(driver, vm);
+                goto endjob;
+            }
             qemuDomainObjExitMonitorWithDriver(driver, vm);
-            goto endjob;
+
+            vm->state = VIR_DOMAIN_RUNNING;
         }
-        qemuDomainObjExitMonitorWithDriver(driver, vm);
 
-        vm->state = VIR_DOMAIN_RUNNING;
         event = virDomainEventNewFromObj(vm,
                                          VIR_DOMAIN_EVENT_RESUMED,
                                          VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
+        if (vm->state == VIR_DOMAIN_PAUSED) {
+            qemuDomainEventQueue(driver, event);
+            event = virDomainEventNewFromObj(vm,
+                                             VIR_DOMAIN_EVENT_SUSPENDED,
+                                             VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
+        }
         virDomainSaveStatus(dconn, driver->caps, driver->stateDir, vm);
     } else {
         qemudShutdownVMDaemon (dconn, driver, vm);
index 94a99e960bf0aa547882fa69a66f5e793cdca6ec..b8ddaa6beb1c62482dd377ed88602a248f2c06d8 100644 (file)
@@ -2478,6 +2478,7 @@ static const vshCmdOptDef opts_migrate[] = {
     {"tunnelled", VSH_OT_BOOL, 0, gettext_noop("tunnelled migration")},
     {"persistent", VSH_OT_BOOL, 0, gettext_noop("persist VM on destination")},
     {"undefinesource", VSH_OT_BOOL, 0, gettext_noop("undefine VM on source")},
+    {"suspend", VSH_OT_BOOL, 0, gettext_noop("do not restart the domain on the destination host")},
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id or uuid")},
     {"desturi", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("connection URI of the destination host")},
     {"migrateuri", VSH_OT_DATA, 0, gettext_noop("migration URI, usually can be omitted")},
@@ -2519,10 +2520,12 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd)
 
     if (vshCommandOptBool (cmd, "persistent"))
         flags |= VIR_MIGRATE_PERSIST_DEST;
-
     if (vshCommandOptBool (cmd, "undefinesource"))
         flags |= VIR_MIGRATE_UNDEFINE_SOURCE;
 
+    if (vshCommandOptBool (cmd, "suspend"))
+        flags |= VIR_MIGRATE_PAUSED;
+
     if ((flags & VIR_MIGRATE_PEER2PEER) ||
         vshCommandOptBool (cmd, "direct")) {
         /* For peer2peer migration or direct migration we only expect one URI
index 6ff01513204d886a85565e75936b5f30ae3279e0..383046487cfa2f7f8de462830e458c76a404ec3d 100644 (file)
@@ -302,10 +302,11 @@ except that it does some error checking.
 The editor used can be supplied by the C<$EDITOR> environment
 variable, or if that is not defined defaults to C<vi>.
 
-=item B<migrate> optional I<--live> I<domain-id> I<desturi> I<migrateuri>
+=item B<migrate> optional I<--live> I<--suspend> I<domain-id> I<desturi> I<migrateuri>
 
-Migrate domain to another host.  Add --live for live migration. The I<desturi>
-is the connection URI of the destination host, and I<migrateuri> is the
+Migrate domain to another host.  Add --live for live migration; --suspend
+leaves the domain paused on the destination host. The I<desturi> is the
+connection URI of the destination host, and I<migrateuri> is the
 migration URI, which usually can be omitted.
 
 =item B<reboot> I<domain-id>