Fix issue when calling reset_console with running VPCS and Qemu nodes. Ref #1619

This commit is contained in:
grossmj 2022-12-30 20:54:37 +08:00
parent 85679aaa94
commit 1148dbc48e
5 changed files with 34 additions and 10 deletions

View File

@ -386,7 +386,11 @@ class BaseNode:
await AsyncioTelnetServer.write_client_intro(writer, echo=True) await AsyncioTelnetServer.write_client_intro(writer, echo=True)
server = AsyncioTelnetServer(reader=reader, writer=writer, binary=True, echo=True) server = AsyncioTelnetServer(reader=reader, writer=writer, binary=True, echo=True)
# warning: this will raise OSError exception if there is a problem... # warning: this will raise OSError exception if there is a problem...
self._wrapper_telnet_server = await asyncio.start_server(server.run, self._manager.port_manager.console_host, self.console) self._wrapper_telnet_server = await asyncio.start_server(
server.run,
self._manager.port_manager.console_host,
self.console
)
async def stop_wrap_console(self): async def stop_wrap_console(self):
""" """
@ -397,14 +401,6 @@ class BaseNode:
self._wrapper_telnet_server.close() self._wrapper_telnet_server.close()
await self._wrapper_telnet_server.wait_closed() await self._wrapper_telnet_server.wait_closed()
async def reset_console(self):
"""
Reset console
"""
await self.stop_wrap_console()
await self.start_wrap_console()
async def start_websocket_console(self, request): async def start_websocket_console(self, request):
""" """
Connect to console using Websocket. Connect to console using Websocket.

View File

@ -977,7 +977,6 @@ class Router(BaseNode):
raise DynamipsError('"{name}" must be stopped to change the console type to {console_type}'.format(name=self._name, raise DynamipsError('"{name}" must be stopped to change the console type to {console_type}'.format(name=self._name,
console_type=console_type)) console_type=console_type))
self.console_type = console_type self.console_type = console_type
if self._console and console_type == "telnet": if self._console and console_type == "telnet":
@ -993,6 +992,13 @@ class Router(BaseNode):
self.aux = aux self.aux = aux
await self._hypervisor.send('vm set_aux_tcp_port "{name}" {aux}'.format(name=self._name, aux=aux)) await self._hypervisor.send('vm set_aux_tcp_port "{name}" {aux}'.format(name=self._name, aux=aux))
async def reset_console(self):
"""
Reset console
"""
pass # reset console is not supported with Dynamips
async def get_cpu_usage(self, cpu_id=0): async def get_cpu_usage(self, cpu_id=0):
""" """
Shows cpu usage in seconds, "cpu_id" is ignored. Shows cpu usage in seconds, "cpu_id" is ignored.

View File

@ -1567,6 +1567,15 @@ class QemuVM(BaseNode):
self._process = None self._process = None
return False return False
async def reset_console(self):
"""
Reset console
"""
await self.stop_wrap_console()
if self.is_running():
await self.start_wrap_console()
def command(self): def command(self):
""" """
Returns the QEMU command line. Returns the QEMU command line.

View File

@ -344,6 +344,15 @@ class VPCSVM(BaseNode):
return True return True
return False return False
async def reset_console(self):
"""
Reset console
"""
await self.stop_wrap_console()
if self.is_running():
await self.start_wrap_console()
@BaseNode.console_type.setter @BaseNode.console_type.setter
def console_type(self, new_console_type): def console_type(self, new_console_type):
""" """

View File

@ -189,6 +189,7 @@ class AsyncioTelnetServer:
sock = network_writer.get_extra_info("socket") sock = network_writer.get_extra_info("socket")
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#log.debug("New connection from {}".format(sock.getpeername())) #log.debug("New connection from {}".format(sock.getpeername()))
# Keep track of connected clients # Keep track of connected clients
@ -202,6 +203,7 @@ class AsyncioTelnetServer:
except ConnectionError: except ConnectionError:
async with self._lock: async with self._lock:
network_writer.close() network_writer.close()
await network_writer.wait_closed()
if self._reader_process == network_reader: if self._reader_process == network_reader:
self._reader_process = None self._reader_process = None
# Cancel current read from this reader # Cancel current read from this reader
@ -216,6 +218,8 @@ class AsyncioTelnetServer:
try: try:
writer.write_eof() writer.write_eof()
await writer.drain() await writer.drain()
writer.close()
await writer.wait_closed()
except (AttributeError, ConnectionError): except (AttributeError, ConnectionError):
continue continue