Extend the 'shutdown' and 'reboot' methods so that they both
accept a new argument
--mode acpi|agent
* tools/virsh.c: New args for shutdown/reboot
* tools/virsh.pod: Document new args
---
tools/virsh.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
tools/virsh.pod | 24 ++++++++++++++++--------
2 files changed, 61 insertions(+), 10 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index c511e2a..f991604 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -3827,6 +3827,7 @@ static const vshCmdInfo info_shutdown[] = {
static const vshCmdOptDef opts_shutdown[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
+ {"mode", VSH_OT_STRING, VSH_OFLAG_NONE, N_("shutdown mode:
acpi|agent")},
{NULL, 0, 0, NULL}
};
@@ -3836,14 +3837,37 @@ cmdShutdown(vshControl *ctl, const vshCmd *cmd)
virDomainPtr dom;
bool ret = true;
const char *name;
+ const char *mode = NULL;
+ int flags = 0;
+ int rv;
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
+ if (vshCommandOptString(cmd, "mode", &mode) < 0) {
+ vshError(ctl, "%s", _("Invalid type"));
+ return false;
+ }
+
+ if (mode) {
+ if (STREQ(mode, "acpi")) {
+ flags |= VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN;
+ } else if (STREQ(mode, "agent")) {
+ flags |= VIR_DOMAIN_SHUTDOWN_GUEST_AGENT;
+ } else {
+ vshError(ctl, _("Unknown mode %s value, expecting 'acpi' or
'agent'"), mode);
+ return false;
+ }
+ }
+
if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
return false;
- if (virDomainShutdown(dom) == 0) {
+ if (flags)
+ rv = virDomainShutdownFlags(dom, flags);
+ else
+ rv = virDomainShutdown(dom);
+ if (rv == 0) {
vshPrint(ctl, _("Domain %s is being shutdown\n"), name);
} else {
vshError(ctl, _("Failed to shutdown domain %s"), name);
@@ -3865,6 +3889,7 @@ static const vshCmdInfo info_reboot[] = {
static const vshCmdOptDef opts_reboot[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
+ {"mode", VSH_OT_STRING, VSH_OFLAG_NONE, N_("shutdown mode:
acpi|agent")},
{NULL, 0, 0, NULL}
};
@@ -3874,14 +3899,32 @@ cmdReboot(vshControl *ctl, const vshCmd *cmd)
virDomainPtr dom;
bool ret = true;
const char *name;
+ const char *mode = NULL;
+ int flags = 0;
if (!vshConnectionUsability(ctl, ctl->conn))
return false;
+ if (vshCommandOptString(cmd, "mode", &mode) < 0) {
+ vshError(ctl, "%s", _("Invalid type"));
+ return false;
+ }
+
+ if (mode) {
+ if (STREQ(mode, "acpi")) {
+ flags |= VIR_DOMAIN_SHUTDOWN_ACPI_POWER_BTN;
+ } else if (STREQ(mode, "agent")) {
+ flags |= VIR_DOMAIN_SHUTDOWN_GUEST_AGENT;
+ } else {
+ vshError(ctl, _("Unknown mode %s value, expecting 'acpi' or
'agent'"), mode);
+ return false;
+ }
+ }
+
if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
return false;
- if (virDomainReboot(dom, 0) == 0) {
+ if (virDomainReboot(dom, flags) == 0) {
vshPrint(ctl, _("Domain %s is being rebooted\n"), name);
} else {
vshError(ctl, _("Failed to reboot domain %s"), name);
diff --git a/tools/virsh.pod b/tools/virsh.pod
index c88395b..856be43 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -805,7 +805,7 @@ If I<--live> is specified, set scheduler information of a
running guest.
If I<--config> is specified, affect the next boot of a persistent guest.
If I<--current> is specified, affect the current guest state.
-=item B<reboot> I<domain-id>
+=item B<reboot> I<domain-id> [I<--mode acpi|agent>]
Reboot a domain. This acts just as if the domain had the B<reboot>
command run from the console. The command returns as soon as it has
@@ -815,6 +815,10 @@ domain actually reboots.
The exact behavior of a domain when it reboots is set by the
I<on_reboot> parameter in the domain's XML definition.
+By default the hypervisor will try to pick a suitable shutdown
+method. To specify an alternative method, the I<--mode> parameter
+can specify C<acpi> or C<agent>.
+
=item B<reset> I<domain-id>
Reset a domain immediately without any guest shutdown. B<reset>
@@ -1188,7 +1192,7 @@ The I<--maximum> flag controls the maximum number of virtual
cpus that can
be hot-plugged the next time the domain is booted. As such, it must only be
used with the I<--config> flag, and not with the I<--live> flag.
-=item B<shutdown> I<domain-id>
+=item B<shutdown> I<domain-id> [I<--mode acpi|agent>]
Gracefully shuts down a domain. This coordinates with the domain OS
to perform graceful shutdown, so there is no guarantee that it will
@@ -1203,6 +1207,10 @@ be lost once the guest stops running, but the snapshot contents
still
exist, and a new domain with the same name and UUID can restore the
snapshot metadata with B<snapshot-create>.
+By default the hypervisor will try to pick a suitable shutdown
+method. To specify an alternative method, the I<--mode> parameter
+can specify C<acpi> or C<agent>.
+
=item B<start> I<domain-name> [I<--console>] [I<--paused>]
[I<--autodestroy>]
[I<--bypass-cache>] [I<--force-boot>]
@@ -1796,9 +1804,9 @@ Edit the XML configuration file for a storage pool.
This is equivalent to:
- virsh pool-dumpxml pool > pool.xml
- vi pool.xml (or make changes with your other text editor)
- virsh pool-define pool.xml
+virsh pool-dumpxml pool > pool.xml
+vi pool.xml (or make changes with your other text editor)
+virsh pool-define pool.xml
except that it does some error checking.
@@ -1853,9 +1861,9 @@ pre-existing volume.
B<Example>
- virsh vol-dumpxml --pool storagepool1 appvolume1 > newvolume.xml
- vi newvolume.xml (or make changes with your other text editor)
- virsh vol-create differentstoragepool newvolume.xml
+virsh vol-dumpxml --pool storagepool1 appvolume1 > newvolume.xml
+vi newvolume.xml (or make changes with your other text editor)
+virsh vol-create differentstoragepool newvolume.xml
=item B<vol-create-from> I<pool-or-uuid> I<FILE> [I<--inputpool>
I<pool-or-uuid>] I<vol-name-or-key-or-path>
--
1.7.3.4