]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: add `console --resume` support
authorMarc Hartmayer <mhartmay@linux.ibm.com>
Thu, 28 Sep 2023 15:37:08 +0000 (17:37 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 24 Oct 2023 11:51:32 +0000 (13:51 +0200)
This patch adds the command line flag `--resume` to the `virsh console`
command. This resumes a paused guest after connecting to the console.
This might be handy since it's a "common" pattern to start a guest
paused, connect to the console, and then resume it so as not to miss any
console messages.

Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
docs/manpages/virsh.rst
tools/virsh-console.c
tools/virsh-console.h
tools/virsh-domain.c

index c42597491222b5690f87e7c3fbc4661239be2775..3e7a4c6c22cebf4acdcc9d69a6d8cb37b9921847 100644 (file)
@@ -1442,7 +1442,7 @@ console
 
 ::
 
-   console domain [devname] [--safe] [--force]
+   console domain [devname] [--safe] [--force] [--resume]
 
 Connect the virtual serial console for the guest. The optional
 *devname* parameter refers to the device alias of an alternate
@@ -1455,6 +1455,9 @@ the server has to ensure exclusive access to console devices. Optionally
 the *--force* flag may be specified, requesting to disconnect any existing
 sessions, such as in a case of a broken connection.
 
+If the flag *--resume* is specified then the guest is resumed after connecting
+to the console.
+
 
 cpu-stats
 ---------
index 6bfb44a190ece9c79c5250838021b43fdbb46a2c..7c561a11f3304c8efba0ede1d8d206ef785a1850 100644 (file)
@@ -401,6 +401,7 @@ int
 virshRunConsole(vshControl *ctl,
                 virDomainPtr dom,
                 const char *dev_name,
+                const bool resume_domain,
                 unsigned int flags)
 {
     virConsole *con = NULL;
@@ -476,6 +477,14 @@ virshRunConsole(vshControl *ctl,
         goto cleanup;
     }
 
+    if (resume_domain) {
+        if (virDomainResume(dom) != 0) {
+            vshError(ctl, _("Failed to resume domain '%1$s'"),
+                     virDomainGetName(dom));
+            goto cleanup;
+        }
+    }
+
     while (!con->quit) {
         if (virCondWait(&con->cond, &con->parent.lock) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
index e89484d24bf4cbd9f54a56cb53ab2eaad7695213..2d00ed90cf4aff2a20244d8126a647851aa4a60c 100644 (file)
@@ -27,6 +27,7 @@
 int virshRunConsole(vshControl *ctl,
                     virDomainPtr dom,
                     const char *dev_name,
+                    const bool resume_domain,
                     unsigned int flags);
 
 #endif /* !WIN32 */
index 7abafe2ba30c2ad7373839e1719a7428a241f0ed..5c3c6d18aebfb13773af2106083f4795bdf62acd 100644 (file)
@@ -3012,6 +3012,10 @@ static const vshCmdOptDef opts_console[] = {
      .type = VSH_OT_BOOL,
      .help =  N_("force console connection (disconnect already connected sessions)")
     },
+    {.name = "resume",
+     .type = VSH_OT_BOOL,
+     .help =  N_("resume a paused guest after connecting to console")
+    },
     {.name = "safe",
      .type = VSH_OT_BOOL,
      .help =  N_("only connect if safe console handling is supported")
@@ -3022,6 +3026,7 @@ static const vshCmdOptDef opts_console[] = {
 static bool
 cmdRunConsole(vshControl *ctl, virDomainPtr dom,
               const char *name,
+              const bool resume_domain,
               unsigned int flags)
 {
     int state;
@@ -3048,7 +3053,7 @@ cmdRunConsole(vshControl *ctl, virDomainPtr dom,
         vshPrintExtra(ctl, " (Ctrl + %c)", priv->escapeChar[1]);
     vshPrintExtra(ctl, "\n");
     fflush(stdout);
-    if (virshRunConsole(ctl, dom, name, flags) == 0)
+    if (virshRunConsole(ctl, dom, name, resume_domain, flags) == 0)
         return true;
 
     return false;
@@ -3059,6 +3064,7 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd)
 {
     g_autoptr(virshDomain) dom = NULL;
     bool force = vshCommandOptBool(cmd, "force");
+    bool resume = vshCommandOptBool(cmd, "resume");
     bool safe = vshCommandOptBool(cmd, "safe");
     unsigned int flags = 0;
     const char *name = NULL;
@@ -3074,7 +3080,7 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd)
     if (safe)
         flags |= VIR_DOMAIN_CONSOLE_SAFE;
 
-    return cmdRunConsole(ctl, dom, name, flags);
+    return cmdRunConsole(ctl, dom, name, resume, flags);
 }
 #endif /* WIN32 */
 
@@ -4136,7 +4142,7 @@ cmdStart(vshControl *ctl, const vshCmd *cmd)
     vshPrintExtra(ctl, _("Domain '%1$s' started\n"),
                   virDomainGetName(dom));
 #ifndef WIN32
-    if (console && !cmdRunConsole(ctl, dom, NULL, 0))
+    if (console && !cmdRunConsole(ctl, dom, NULL, false, 0))
         return false;
 #endif
 
@@ -8232,7 +8238,7 @@ cmdCreate(vshControl *ctl, const vshCmd *cmd)
                   virDomainGetName(dom), from);
 #ifndef WIN32
     if (console)
-        cmdRunConsole(ctl, dom, NULL, 0);
+        cmdRunConsole(ctl, dom, NULL, false, 0);
 #endif
     return true;
 }