mirror of
https://github.com/qemu/qemu.git
synced 2024-11-28 06:13:46 +08:00
tests/avocado: start PhoneServer upfront
Race conditions can happen with the current code, because the port that was available might not be anymore by the time the server is started. By setting the port to 0, PhoneServer it will use the OS default behavior to get a free port, then we save this information so we can later configure the guest. Suggested-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Beraldo Leal <bleal@redhat.com> Message-Id: <20220311171127.2189534-1-bleal@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
parent
c587bddb53
commit
5e2d19b3cd
@ -18,7 +18,7 @@ import time
|
|||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import avocado
|
import avocado
|
||||||
from avocado.utils import cloudinit, datadrainer, network, process, ssh, vmimage
|
from avocado.utils import cloudinit, datadrainer, process, ssh, vmimage
|
||||||
from avocado.utils.path import find_command
|
from avocado.utils.path import find_command
|
||||||
|
|
||||||
#: The QEMU build root directory. It may also be the source directory
|
#: The QEMU build root directory. It may also be the source directory
|
||||||
@ -602,9 +602,6 @@ class LinuxTest(LinuxSSHMixIn, QemuSystemTest):
|
|||||||
self.log.info('Preparing cloudinit image')
|
self.log.info('Preparing cloudinit image')
|
||||||
try:
|
try:
|
||||||
cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso')
|
cloudinit_iso = os.path.join(self.workdir, 'cloudinit.iso')
|
||||||
self.phone_home_port = network.find_free_port()
|
|
||||||
if not self.phone_home_port:
|
|
||||||
self.cancel('Failed to get a free port')
|
|
||||||
pubkey_content = None
|
pubkey_content = None
|
||||||
if ssh_pubkey:
|
if ssh_pubkey:
|
||||||
with open(ssh_pubkey) as pubkey:
|
with open(ssh_pubkey) as pubkey:
|
||||||
@ -614,7 +611,7 @@ class LinuxTest(LinuxSSHMixIn, QemuSystemTest):
|
|||||||
password=self.password,
|
password=self.password,
|
||||||
# QEMU's hard coded usermode router address
|
# QEMU's hard coded usermode router address
|
||||||
phone_home_host='10.0.2.2',
|
phone_home_host='10.0.2.2',
|
||||||
phone_home_port=self.phone_home_port,
|
phone_home_port=self.phone_server.server_port,
|
||||||
authorized_key=pubkey_content)
|
authorized_key=pubkey_content)
|
||||||
except Exception:
|
except Exception:
|
||||||
self.cancel('Failed to prepare the cloudinit image')
|
self.cancel('Failed to prepare the cloudinit image')
|
||||||
@ -625,6 +622,8 @@ class LinuxTest(LinuxSSHMixIn, QemuSystemTest):
|
|||||||
self.vm.add_args('-drive', 'file=%s' % path)
|
self.vm.add_args('-drive', 'file=%s' % path)
|
||||||
|
|
||||||
def set_up_cloudinit(self, ssh_pubkey=None):
|
def set_up_cloudinit(self, ssh_pubkey=None):
|
||||||
|
self.phone_server = cloudinit.PhoneHomeServer(('0.0.0.0', 0),
|
||||||
|
self.name)
|
||||||
cloudinit_iso = self.prepare_cloudinit(ssh_pubkey)
|
cloudinit_iso = self.prepare_cloudinit(ssh_pubkey)
|
||||||
self.vm.add_args('-drive', 'file=%s,format=raw' % cloudinit_iso)
|
self.vm.add_args('-drive', 'file=%s,format=raw' % cloudinit_iso)
|
||||||
|
|
||||||
@ -635,7 +634,9 @@ class LinuxTest(LinuxSSHMixIn, QemuSystemTest):
|
|||||||
logger=self.log.getChild('console'))
|
logger=self.log.getChild('console'))
|
||||||
console_drainer.start()
|
console_drainer.start()
|
||||||
self.log.info('VM launched, waiting for boot confirmation from guest')
|
self.log.info('VM launched, waiting for boot confirmation from guest')
|
||||||
cloudinit.wait_for_phone_home(('0.0.0.0', self.phone_home_port), self.name)
|
while not self.phone_server.instance_phoned_back:
|
||||||
|
self.phone_server.handle_request()
|
||||||
|
|
||||||
if set_up_ssh_connection:
|
if set_up_ssh_connection:
|
||||||
self.log.info('Setting up the SSH connection')
|
self.log.info('Setting up the SSH connection')
|
||||||
self.ssh_connect(self.username, self.ssh_key)
|
self.ssh_connect(self.username, self.ssh_key)
|
||||||
|
Loading…
Reference in New Issue
Block a user