aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/QemuUtils.py
diff options
context:
space:
mode:
authorThomas F Herbert <therbert@redhat.com>2017-11-17 14:41:48 -0500
committerPeter Mikus <pmikus@cisco.com>2017-12-12 07:57:49 +0000
commit7174e36c3d36210712f18901190d888106bca64b (patch)
tree6ec4e2c044d82d35444b8ee3d04924b715a50697 /resources/libraries/python/QemuUtils.py
parentab504cb0bfd60863cd5d6e220cbcabf256634ffa (diff)
More reliable connection with nested qemu image.
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>
Diffstat (limited to 'resources/libraries/python/QemuUtils.py')
-rw-r--r--resources/libraries/python/QemuUtils.py18
1 files changed, 16 insertions, 2 deletions
diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py
index cbdfe856f0..6689e5cf96 100644
--- a/resources/libraries/python/QemuUtils.py
+++ b/resources/libraries/python/QemuUtils.py
@@ -300,7 +300,8 @@ class QemuUtils(object):
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
@@ -312,7 +313,20 @@ class QemuUtils(object):
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))