qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v1 10/18] tests/vm: Add workaround to consume console


From: Alex Bennée
Subject: [PATCH v1 10/18] tests/vm: Add workaround to consume console
Date: Mon, 22 Jun 2020 15:31:56 +0100

From: Robert Foley <robert.foley@linaro.org>

This adds support to basevm.py so that we always
drain the console chars.  This makes use of
support added in an earlier commit that allows
QEMUMachine to use the ConsoleSocket.

This is a workaround we found was needed since
there is a known issue where QEMU will hang waiting
for console characters to be consumed.

We also added the option of logging the console to a file.
LOG_CONSOLE=1 will now log the output to a file.

Signed-off-by: Robert Foley <robert.foley@linaro.org>
Reviewed-by: Peter Puhov <peter.puhov@linaro.org>
Acked-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200601211421.1277-10-robert.foley@linaro.org>
---
 tests/vm/Makefile.include |  4 ++++
 tests/vm/basevm.py        | 21 +++++++++++++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/tests/vm/Makefile.include b/tests/vm/Makefile.include
index 39f918a430a..f21948c46a5 100644
--- a/tests/vm/Makefile.include
+++ b/tests/vm/Makefile.include
@@ -49,6 +49,7 @@ endif
        @echo '    EXTRA_CONFIGURE_OPTS="..."'
        @echo "    J=[0..9]*                     - Override the -jN parameter 
for make commands"
        @echo "    DEBUG=1                       - Enable verbose output on 
host and interactive debugging"
+       @echo "    LOG_CONSOLE=1                 - Log console to file in: 
~/.cache/qemu-vm "
        @echo "    V=1                           - Enable verbose ouput on host 
and guest commands"
        @echo "    QEMU_LOCAL=1                 - Use QEMU binary local to this 
build."
        @echo "    QEMU=/path/to/qemu            - Change path to QEMU binary"
@@ -75,6 +76,7 @@ $(IMAGES_DIR)/%.img:  $(SRC_PATH)/tests/vm/% \
                $(if $(GENISOIMAGE),--genisoimage $(GENISOIMAGE)) \
                $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
                $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
+               $(if $(LOG_CONSOLE),--log-console) \
                --image "$@" \
                --force \
                --build-image $@, \
@@ -91,6 +93,7 @@ vm-build-%: $(IMAGES_DIR)/%.img
                $(if $(V),--verbose) \
                $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
                $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
+               $(if $(LOG_CONSOLE),--log-console) \
                --image "$<" \
                $(if $(BUILD_TARGET),--build-target $(BUILD_TARGET)) \
                --snapshot \
@@ -114,6 +117,7 @@ vm-boot-ssh-%: $(IMAGES_DIR)/%.img
                $(if $(V)$(DEBUG), --debug) \
                $(if $(QEMU_LOCAL),--build-path $(BUILD_DIR)) \
                $(if $(EFI_AARCH64),--efi-aarch64 $(EFI_AARCH64)) \
+               $(if $(LOG_CONSOLE),--log-console) \
                --image "$<" \
                --interactive \
                false, \
diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index f716798b405..04d083409a5 100644
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -117,6 +117,11 @@ class BaseVM(object):
              "w").write(self._config['ssh_pub_key'])
 
         self.debug = args.debug
+        self._console_log_path = None
+        if args.log_console:
+                self._console_log_path = \
+                         os.path.join(os.path.expanduser("~/.cache/qemu-vm"),
+                                      "{}.install.log".format(self.name))
         self._stderr = sys.stderr
         self._devnull = open(os.devnull, "w")
         if self.debug:
@@ -271,7 +276,13 @@ class BaseVM(object):
         args += self._data_args + extra_args + self._config['extra_args']
         logging.debug("QEMU args: %s", " ".join(args))
         qemu_path = get_qemu_path(self.arch, self._build_path)
-        guest = QEMUMachine(binary=qemu_path, args=args)
+
+        # Since console_log_path is only set when the user provides the
+        # log_console option, we will set drain_console=True so the
+        # console is always drained.
+        guest = QEMUMachine(binary=qemu_path, args=args,
+                            console_log=self._console_log_path,
+                            drain_console=True)
         guest.set_machine(self._config['machine'])
         guest.set_console()
         try:
@@ -285,6 +296,8 @@ class BaseVM(object):
             raise
         atexit.register(self.shutdown)
         self._guest = guest
+        # Init console so we can start consuming the chars.
+        self.console_init()
         usernet_info = guest.qmp("human-monitor-command",
                                  command_line="info usernet")
         self.ssh_port = None
@@ -296,7 +309,9 @@ class BaseVM(object):
             raise Exception("Cannot find ssh port from 'info usernet':\n%s" % \
                             usernet_info)
 
-    def console_init(self, timeout = 120):
+    def console_init(self, timeout = None):
+        if timeout == None:
+            timeout = self.socket_timeout
         vm = self._guest
         vm.console_socket.settimeout(timeout)
         self.console_raw_path = os.path.join(vm._temp_dir,
@@ -578,6 +593,8 @@ def parse_args(vmcls):
     parser.add_option("--efi-aarch64",
                       default="/usr/share/qemu-efi-aarch64/QEMU_EFI.fd",
                       help="Path to efi image for aarch64 VMs.")
+    parser.add_option("--log-console", action="store_true",
+                      help="Log console to file.")
     parser.disable_interspersed_args()
     return parser.parse_args()
 
-- 
2.20.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]