From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> 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 | 42 ++++++++++++++++++++++++++++++++++++++++-- tools/virsh.pod | 12 ++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 3a17971..e84f60a 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -3127,6 +3127,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_DATA, 0, N_("shutdown mode: acpi|agent")}, {NULL, 0, 0, NULL} }; @@ -3136,14 +3137,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); @@ -3165,6 +3189,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_DATA, 0, N_("shutdown mode: acpi|agent")}, {NULL, 0, 0, NULL} }; @@ -3174,14 +3199,27 @@ 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 (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 be81afc..7006025 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -780,7 +780,7 @@ migrated to another host. Get the maximum migration bandwidth (in Mbps) for a domain. -=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 @@ -790,6 +790,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> @@ -1074,7 +1078,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 @@ -1089,6 +1093,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>] -- 1.7.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list