More reliable connection with nested qemu image. 56/9756/2
authorThomas F Herbert <therbert@redhat.com>
Fri, 17 Nov 2017 19:41:48 +0000 (14:41 -0500)
committerPeter Mikus <pmikus@cisco.com>
Tue, 12 Dec 2017 07:57:49 +0000 (07:57 +0000)
Under some circumstances on a busy server, the qga channel
between the host and hte virtual guest has some garbage
characters that cause the communications to fail.
This has been seen on Centos 7.4 on a slow or busy server.

This change sends a flush to qemu guest via the qga socket at 5
second intervals until there is a non empty response from guest
before sending a guest ping.

Change-Id: I6f21c205b289169aee9d6a4072ad4e6bafafa76f
Signed-off-by: Thomas F Herbert <therbert@redhat.com>
resources/libraries/python/QemuUtils.py

index cbdfe85..6689e5c 100644 (file)
@@ -300,7 +300,8 @@ class QemuUtils(object):
     def _wait_until_vm_boot(self, timeout=60):
         """Wait until QEMU VM is booted.
 
     def _wait_until_vm_boot(self, timeout=60):
         """Wait until QEMU VM is booted.
 
-        Ping QEMU guest agent each 5s until VM booted or timeout.
+        First try to flush qga until there is output.
+        Then ping QEMU guest agent each 5s until VM booted or timeout.
 
         :param timeout: Waiting timeout in seconds (optional, default 60s).
         :type timeout: int
 
         :param timeout: Waiting timeout in seconds (optional, default 60s).
         :type timeout: int
@@ -312,7 +313,20 @@ class QemuUtils(object):
                     self._qemu_opt['disk_image'], self._node['host']))
             out = None
             try:
                     self._qemu_opt['disk_image'], self._node['host']))
             out = None
             try:
-                self._qemu_qga_flush()
+                out = self._qemu_qga_flush()
+            except ValueError:
+                logger.trace('QGA qga flush unexpected output {}'.format(out))
+            # Empty output - VM not booted yet
+            if not out:
+                sleep(5)
+            else:
+                break
+        while True:
+            if time() - start > timeout:
+                raise RuntimeError('timeout, VM {0} not booted on {1}'.format(
+                    self._qemu_opt['disk_image'], self._node['host']))
+            out = None
+            try:
                 out = self._qemu_qga_exec('guest-ping')
             except ValueError:
                 logger.trace('QGA guest-ping unexpected output {}'.format(out))
                 out = self._qemu_qga_exec('guest-ping')
             except ValueError:
                 logger.trace('QGA guest-ping unexpected output {}'.format(out))