diff options
author | Thomas F Herbert <therbert@redhat.com> | 2017-11-17 14:41:48 -0500 |
---|---|---|
committer | Peter Mikus <pmikus@cisco.com> | 2017-12-12 07:57:49 +0000 |
commit | 7174e36c3d36210712f18901190d888106bca64b (patch) | |
tree | 6ec4e2c044d82d35444b8ee3d04924b715a50697 /resources/libraries/python | |
parent | ab504cb0bfd60863cd5d6e220cbcabf256634ffa (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')
-rw-r--r-- | resources/libraries/python/QemuUtils.py | 18 |
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)) |