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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list