From 34401a8b42704216b73279d449eb998891e55ba0 Mon Sep 17 00:00:00 2001 From: "Srivatsa S. Bhat" Date: Tue, 29 Nov 2011 03:12:44 +0530 Subject: [PATCH] Add virsh command to initiate suspend on the host Add a new command 'nodesuspend' to perform a timed suspend on the host. Signed-off-by: Srivatsa S. Bhat --- tools/virsh.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ tools/virsh.pod | 7 ++++++ 2 files changed, 71 insertions(+) diff --git a/tools/virsh.c b/tools/virsh.c index 6ed249ba45..d8e5dae02b 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -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}, diff --git a/tools/virsh.pod b/tools/virsh.pod index db872dde09..f5183b428a 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -253,6 +253,13 @@ statistics during 1 second. Returns memory stats of the node. If I is specified, this will prints specified cell statistics only. +=item B [I] [I] [I] + +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 Print an XML document describing the capabilities of the hypervisor