[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH v2 5/5] virsh: Expose new virDomainSuspendForDuration API



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
+
 =item B<ttyconsole> I<domain-id>
 
 Output the device used for the TTY console of the domain. If the information
-- 
1.7.3.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]