Wait for pipe file to be created before starting the remote console for VMware and VirtualBox VMs. Fixes #331.

This commit is contained in:
grossmj 2015-10-11 15:50:50 -06:00
parent 9c23093510
commit ee6ef9f3d5
3 changed files with 22 additions and 1 deletions

View File

@ -30,6 +30,7 @@ import asyncio
from pkg_resources import parse_version
from gns3server.utils.telnet_server import TelnetServer
from gns3server.utils.asyncio import wait_for_file_creation
from .virtualbox_error import VirtualBoxError
from ..nios.nio_udp import NIOUDP
from ..nios.nio_nat import NIONAT
@ -214,6 +215,10 @@ class VirtualBoxVM(BaseVM):
yield from self.manager.execute("guestproperty", ["set", self._vmname, "ProjectDirInGNS3", self.working_dir])
if self._enable_remote_console and self._console is not None:
try:
yield from wait_for_file_creation(self._get_pipe_name()) # wait for VirtualBox to create the pipe file.
except asyncio.TimeoutError:
raise VirtualBoxError('Pipe file "{}" for remote console has not been created by VirtualBox'.format(self._get_pipe_name()))
self._start_remote_console()
if (yield from self.check_hw_virtualization()):

View File

@ -27,6 +27,7 @@ import tempfile
from gns3server.utils.telnet_server import TelnetServer
from gns3server.utils.interfaces import get_windows_interfaces
from gns3server.utils.asyncio import wait_for_file_creation
from collections import OrderedDict
from .vmware_error import VMwareError
from ..nios.nio_udp import NIOUDP
@ -427,7 +428,10 @@ class VMwareVM(BaseVM):
yield from self._add_ubridge_connection(nio, adapter_number)
if self._enable_remote_console and self._console is not None:
yield from asyncio.sleep(1) # give some time to VMware to create the pipe file.
try:
yield from wait_for_file_creation(self._get_pipe_name()) # wait for VMware to create the pipe file.
except asyncio.TimeoutError:
raise VMwareError('Pipe file "{}" for remote console has not been created by VMware'.format(self._get_pipe_name()))
self._start_remote_console()
if self._get_vmx_setting("vhv.enable", "TRUE"):

View File

@ -18,6 +18,7 @@
import asyncio
import sys
import os
@asyncio.coroutine
@ -96,3 +97,14 @@ def monitor_process(process, termination_callback):
"""Call termination_callback when a process dies"""
asyncio.async(_check_process(process, termination_callback))
@asyncio.coroutine
def wait_for_file_creation(path, timeout=10):
while timeout > 0:
if os.path.exists(path):
return
yield from asyncio.sleep(0.5)
timeout -= 0.5
raise asyncio.TimeoutError()