[libvirt] [PATCH 4/4] Allow choice of shutdown method via virsh

Daniel P. Berrange berrange at redhat.com
Wed Oct 5 17:31:57 UTC 2011


From: "Daniel P. Berrange" <berrange at redhat.com>

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




More information about the libvir-list mailing list