]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add virsh command to initiate suspend on the host
authorSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
Mon, 28 Nov 2011 21:42:44 +0000 (03:12 +0530)
committerDaniel Veillard <veillard@redhat.com>
Tue, 29 Nov 2011 09:29:17 +0000 (17:29 +0800)
Add a new command 'nodesuspend' to perform a timed suspend on the host.

Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
tools/virsh.c
tools/virsh.pod

index 6ed249ba45fe95e2284cfc74ca904f43caaf1350..d8e5dae02b612d5ac5cbba8dc1c513998722a5ec 100644 (file)
@@ -5201,6 +5201,69 @@ cmdNodeMemStats(vshControl *ctl, const vshCmd *cmd)
     return ret;
 }
 
+/*
+ * "nodesuspend" command
+ */
+static const vshCmdInfo info_nodesuspend[] = {
+    {"help", N_("suspend the host node for a given time duration")},
+    {"desc", N_("Suspend the host node for a given time duration "
+                               "and attempt to resume thereafter.")},
+    {NULL, NULL}
+};
+
+static const vshCmdOptDef opts_node_suspend[] = {
+    {"target", VSH_OT_DATA, VSH_OFLAG_REQ, N_("mem(Suspend-to-RAM), "
+                                               "disk(Suspend-to-Disk), hybrid(Hybrid-Suspend)")},
+    {"duration", VSH_OT_INT, VSH_OFLAG_REQ, N_("Suspend duration in seconds")},
+    {"flags", VSH_OT_INT, VSH_OFLAG_NONE, N_("Suspend flags, 0 for default")},
+    {NULL, 0, 0, NULL}
+};
+
+static bool
+cmdNodeSuspend(vshControl *ctl, const vshCmd *cmd)
+{
+    const char *target = NULL;
+    unsigned int suspendTarget;
+    long long duration;
+    unsigned int flags = 0;
+
+    if (!vshConnectionUsability(ctl, ctl->conn))
+        return false;
+
+    if (vshCommandOptString(cmd, "target", &target) < 0)
+        return false;
+
+    if (vshCommandOptLongLong(cmd, "duration", &duration) < 0)
+        return false;
+
+    if (vshCommandOptUInt(cmd, "flags", &flags) < 0)
+        return false;
+
+    if (STREQ(target, "mem"))
+        suspendTarget = VIR_NODE_SUSPEND_TARGET_MEM;
+    else if (STREQ(target, "disk"))
+        suspendTarget = VIR_NODE_SUSPEND_TARGET_DISK;
+    else if (STREQ(target, "hybrid"))
+        suspendTarget = VIR_NODE_SUSPEND_TARGET_HYBRID;
+    else {
+        vshError(ctl, "%s", _("Invalid target"));
+        return false;
+    }
+
+    if (duration <= 0) {
+        vshError(ctl, "%s", _("Invalid duration"));
+        return false;
+    }
+
+    if (virNodeSuspendForDuration(ctl->conn, suspendTarget, duration,
+                                  flags) < 0) {
+        vshError(ctl, "%s", _("The host was not suspended"));
+        return false;
+    }
+    return true;
+}
+
+
 /*
  * "capabilities" command
  */
@@ -14973,6 +15036,7 @@ static const vshCmdDef hostAndHypervisorCmds[] = {
     {"nodecpustats", cmdNodeCpuStats, opts_node_cpustats, info_nodecpustats, 0},
     {"nodeinfo", cmdNodeinfo, NULL, info_nodeinfo, 0},
     {"nodememstats", cmdNodeMemStats, opts_node_memstats, info_nodememstats, 0},
+    {"nodesuspend", cmdNodeSuspend, opts_node_suspend, info_nodesuspend, 0},
     {"qemu-attach", cmdQemuAttach, opts_qemu_attach, info_qemu_attach},
     {"qemu-monitor-command", cmdQemuMonitorCommand, opts_qemu_monitor_command,
      info_qemu_monitor_command, 0},
index db872dde09d8873bb4fc8610b9024b0b3151c613..f5183b428a262c95dfcdfb965e79ee0e62cd4e23 100644 (file)
@@ -253,6 +253,13 @@ statistics during 1 second.
 Returns memory stats of the node.
 If I<cell> is specified, this will prints specified cell statistics only.
 
+=item B<nodesuspend> [I<target>] [I<duration>] [I<flags>]
+
+Puts the node (host machine) into a system-wide sleep state such as
+Suspend-to-RAM, Suspend-to-Disk or Hybrid-Suspend and sets up a
+Real-Time-Clock interrupt to fire (to wake up the node) after a time delay
+specified by the 'duration' parameter.
+
 =item B<capabilities>
 
 Print an XML document describing the capabilities of the hypervisor