On Thu, Jan 26, 2012 at 08:59:47PM +0100, Michal Privoznik wrote:
under new command "suspend-duration"
---
tools/virsh.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/virsh.pod | 8 ++++++
2 files changed, 75 insertions(+), 0 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index 74655c2..c00fe5d 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -2170,6 +2170,71 @@ cmdSuspend(vshControl *ctl, const vshCmd *cmd)
}
/*
+ * "suspend-duration" command
+ */
+static const vshCmdInfo info_suspend_duration[] = {
+ {"help", N_("suspend a domain for a given time duration")},
+ {"desc", N_("Suspend a running domain for a given time
duration.")},
+ {NULL, NULL}
+};
+
+static const vshCmdOptDef opts_suspend_duration[] = {
+ {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
+ /* {"duration", VSH_OT_INT, VSH_OFLAG_REQ, N_("duration in
seconds")}, */
+ {"target", VSH_OT_STRING, VSH_OFLAG_REQ, N_("mem(Suspend-to-RAM),
"
+ "disk(Suspend-to-Disk), "
+ "hybrid(Hybrid-Suspend)")},
+ {NULL, 0, 0, NULL}
+};
+
+static bool
+cmdSuspendDuration(vshControl *ctl, const vshCmd *cmd)
+{
+ virDomainPtr dom;
+ const char *name;
+ bool ret = false;
+ const char *target = NULL;
+ unsigned int suspendTarget;
+
+ if (!vshConnectionUsability(ctl, ctl->conn))
+ return false;
+
+ if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
+ return false;
+
+ if (vshCommandOptString(cmd, "target", &target) < 0) {
+ vshError(ctl, _("Invalig target argument"));
+ goto cleanup;
+ }
+
+ 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"));
+ goto cleanup;
+ }
+
+ if (virDomainSuspendForDuration(dom, suspendTarget, 0, 0) < 0) {
+ vshError(ctl, _("Domain %s could not be suspended"),
+ virDomainGetName(dom));
+ goto cleanup;
+ }
+
+ vshPrint(ctl, _("Domain %s successfully suspended"),
+ virDomainGetName(dom));
+
+ ret = true;
+
+cleanup:
+ virDomainFree(dom);
+ return ret;
+}
+
+/*
* "create" command
*/
static const vshCmdInfo info_create[] = {
@@ -16070,6 +16135,8 @@ static const vshCmdDef domManagementCmds[] = {
{"shutdown", cmdShutdown, opts_shutdown, info_shutdown, 0},
{"start", cmdStart, opts_start, info_start, 0},
{"suspend", cmdSuspend, opts_suspend, info_suspend, 0},
+ {"suspend-duration", cmdSuspendDuration,
+ opts_suspend_duration, info_suspend_duration, 0},
{"ttyconsole", cmdTTYConsole, opts_ttyconsole, info_ttyconsole, 0},
{"undefine", cmdUndefine, opts_undefine, info_undefine, 0},
{"update-device", cmdUpdateDevice, opts_update_device,
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 8599f66..dc6fd01 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1239,6 +1239,14 @@ Moves a domain out of the suspended state. This will allow a
previously
suspended domain to now be eligible for scheduling by the underlying
hypervisor.
+=item B<suspend-duration> I<domain-id> I<target>
+
+Suspend a running domain into one of these states (possible I<target>
+values):
+ mem equivallent of S3 ACPI state
+ disk equivallent of S4 ACPI state
+ hybrid RAM is saved to disk but not powered off
As with the API, I think we need a different name prefix, like
domnodesuspend
or
dompmsuspend
ACK if we rename it in one of these ways or another suggestion
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|