X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FQemuUtils.py;h=428599be8319cd61ccd1f66aea4995c118f6e9a5;hp=cbdfe856f051abbffd9ad1b143fb4d91700a1e7b;hb=d7cf0a829cc9cc63799330b673c8c42393de2655;hpb=adae22c83eb77a49a49f9ee50ef11c1a67239d4e diff --git a/resources/libraries/python/QemuUtils.py b/resources/libraries/python/QemuUtils.py index cbdfe856f0..428599be83 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)) @@ -535,19 +549,18 @@ class QemuUtils(object): self._qemu_bin, self._qemu_opt.get('smp'), mem, ssh_fwd, self._qemu_opt.get('options'), drive, qmp, serial, qga, graphic, pid) - (ret_code, _, stderr) = self._ssh.exec_command_sudo(cmd, timeout=300) - if int(ret_code) != 0: - logger.debug('QEMU start failed {0}'.format(stderr)) - raise RuntimeError('QEMU start failed on {0}'.format( - self._node['host'])) - logger.trace('QEMU running') - # Wait until VM boot try: + (ret_code, _, _) = self._ssh.exec_command_sudo(cmd, timeout=300) + if int(ret_code) != 0: + raise RuntimeError('QEMU start failed on {0}'.format( + self._node['host'])) + # Wait until VM boot self._wait_until_vm_boot() except (RuntimeError, SSHTimeout): self.qemu_kill_all() self.qemu_clear_socks() raise + logger.trace('QEMU started successfully.') # Update interface names in VM node dict self._update_vm_interfaces() # Return VM node dict