Prevent error when quick close of gns3 server after docker usage

Fix #382
pull/448/head
Julien Duponchelle 9 years ago
parent 8cf55166cb
commit 061b459abe

@ -44,6 +44,9 @@ class Docker(BaseManager):
# Allow locking during ubridge operations # Allow locking during ubridge operations
self.ubridge_lock = asyncio.Lock() self.ubridge_lock = asyncio.Lock()
def __del__(self):
self._connector.close()
@asyncio.coroutine @asyncio.coroutine
def query(self, method, path, data={}, params={}): def query(self, method, path, data={}, params={}):
""" """

@ -248,20 +248,25 @@ class DockerVM(BaseVM):
def stop(self): def stop(self):
"""Stops this Docker container.""" """Stops this Docker container."""
if self._ubridge_hypervisor and self._ubridge_hypervisor.is_running(): try:
yield from self._ubridge_hypervisor.stop() if self._ubridge_hypervisor and self._ubridge_hypervisor.is_running():
yield from self._ubridge_hypervisor.stop()
state = yield from self._get_container_state()
if state == "paused": state = yield from self._get_container_state()
yield from self.unpause() if state == "paused":
yield from self.unpause()
if self._telnet_server:
self._telnet_server.close() if self._telnet_server:
self._telnet_server = None self._telnet_server.close()
# t=5 number of seconds to wait before killing the container self._telnet_server = None
yield from self.manager.query("POST", "containers/{}/stop".format(self._cid), params={"t": 5}) # t=5 number of seconds to wait before killing the container
log.info("Docker container '{name}' [{image}] stopped".format( yield from self.manager.query("POST", "containers/{}/stop".format(self._cid), params={"t": 5})
name=self._name, image=self._image)) log.info("Docker container '{name}' [{image}] stopped".format(
name=self._name, image=self._image))
# Ignore runtime error because when closing the server
except RuntimeError as e:
log.debug("Docker runtime error when closing: {}".format(str(e)))
return
@asyncio.coroutine @asyncio.coroutine
def pause(self): def pause(self):
@ -282,24 +287,30 @@ class DockerVM(BaseVM):
@asyncio.coroutine @asyncio.coroutine
def remove(self): def remove(self):
"""Removes this Docker container.""" """Removes this Docker container."""
state = yield from self._get_container_state()
if state == "paused":
yield from self.unpause()
if state == "running":
yield from self.stop()
yield from self.manager.query("DELETE", "containers/{}".format(self._cid), params={"force": 1})
log.info("Docker container '{name}' [{image}] removed".format(
name=self._name, image=self._image))
if self._console: try:
self._manager.port_manager.release_tcp_port(self._console, self._project) state = yield from self._get_container_state()
self._console = None if state == "paused":
yield from self.unpause()
for adapter in self._ethernet_adapters: if state == "running":
if adapter is not None: yield from self.stop()
for nio in adapter.ports.values(): yield from self.manager.query("DELETE", "containers/{}".format(self._cid), params={"force": 1})
if nio and isinstance(nio, NIOUDP): log.info("Docker container '{name}' [{image}] removed".format(
self.manager.port_manager.release_udp_port(nio.lport, self._project) name=self._name, image=self._image))
if self._console:
self._manager.port_manager.release_tcp_port(self._console, self._project)
self._console = None
for adapter in self._ethernet_adapters:
if adapter is not None:
for nio in adapter.ports.values():
if nio and isinstance(nio, NIOUDP):
self.manager.port_manager.release_udp_port(nio.lport, self._project)
# Ignore runtime error because when closing the server
except RuntimeError as e:
log.debug("Docker runtime error when closing: {}".format(str(e)))
return
@asyncio.coroutine @asyncio.coroutine
def close(self): def close(self):

Loading…
Cancel
Save