From e183e7da27765a74af80b5b98fe716b23c1a31af Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 13 Jun 2016 16:28:26 +0200 Subject: [PATCH 1/4] Catch connection reset in ioucon --- gns3server/modules/iou/ioucon.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gns3server/modules/iou/ioucon.py b/gns3server/modules/iou/ioucon.py index 7aeb0287..a0785d7c 100644 --- a/gns3server/modules/iou/ioucon.py +++ b/gns3server/modules/iou/ioucon.py @@ -550,6 +550,8 @@ def send_recv_loop(epoll, console, router, esc_char, stop_event): esc_state = True else: router.write(buf) + except ConnectionError as e: + pass finally: router.unregister(epoll) console.unregister(epoll) From 4f03c3011eb69dc5ec72c0e3158211bae8094694 Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 13 Jun 2016 17:39:04 +0200 Subject: [PATCH 2/4] Delete volume when dropping the container Fix #567 --- gns3server/modules/docker/docker_vm.py | 4 +++- tests/modules/docker/test_docker_vm.py | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/gns3server/modules/docker/docker_vm.py b/gns3server/modules/docker/docker_vm.py index 4c360d15..12f0efab 100644 --- a/gns3server/modules/docker/docker_vm.py +++ b/gns3server/modules/docker/docker_vm.py @@ -583,7 +583,9 @@ class DockerVM(BaseVM): state = yield from self._get_container_state() if state == "paused" or state == "running": yield from self.stop() - yield from self.manager.query("DELETE", "containers/{}".format(self._cid), params={"force": 1}) + # v – 1/True/true or 0/False/false, Remove the volumes associated to the container. Default false. + # force - 1/True/true or 0/False/false, Kill then remove the container. Default false. + yield from self.manager.query("DELETE", "containers/{}".format(self._cid), params={"force": 1, "v": 1}) log.info("Docker container '{name}' [{image}] removed".format( name=self._name, image=self._image)) diff --git a/tests/modules/docker/test_docker_vm.py b/tests/modules/docker/test_docker_vm.py index 5e6151f7..b3bffd88 100644 --- a/tests/modules/docker/test_docker_vm.py +++ b/tests/modules/docker/test_docker_vm.py @@ -520,7 +520,7 @@ def test_update(loop, vm): with asyncio_patch("gns3server.modules.docker.Docker.query", return_value=response) as mock_query: loop.run_until_complete(asyncio.async(vm.update())) - mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1}) + mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1}) mock_query.assert_any_call("POST", "containers/create", data={ "Tty": True, "OpenStdin": True, @@ -588,7 +588,7 @@ def test_update_running(loop, vm): with asyncio_patch("gns3server.modules.docker.Docker.query", return_value=response) as mock_query: loop.run_until_complete(asyncio.async(vm.update())) - mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1}) + mock_query.assert_any_call("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1}) mock_query.assert_any_call("POST", "containers/create", data={ "Tty": True, "OpenStdin": True, @@ -624,7 +624,7 @@ def test_delete(loop, vm): with asyncio_patch("gns3server.modules.docker.DockerVM._get_container_state", return_value="stopped"): with asyncio_patch("gns3server.modules.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.delete())) - mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1}) + mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1}) def test_close(loop, vm, port_manager): @@ -638,7 +638,7 @@ def test_close(loop, vm, port_manager): with asyncio_patch("gns3server.modules.docker.DockerVM._get_container_state", return_value="stopped"): with asyncio_patch("gns3server.modules.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.close())) - mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1}) + mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1}) assert vm._closed is True assert "4242" not in port_manager.udp_ports @@ -653,7 +653,7 @@ def test_close_vnc(loop, vm, port_manager): with asyncio_patch("gns3server.modules.docker.DockerVM._get_container_state", return_value="stopped"): with asyncio_patch("gns3server.modules.docker.Docker.query") as mock_query: loop.run_until_complete(asyncio.async(vm.close())) - mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1}) + mock_query.assert_called_with("DELETE", "containers/e90e34656842", params={"force": 1, "v": 1}) assert vm._closed is True assert vm._xvfb_process.terminate.called From 016c3e515ba265f6948cd8305319c3ef312ce83d Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 13 Jun 2016 20:12:42 +0200 Subject: [PATCH 3/4] Workaround a crash in x11vnc Fix? #569 --- gns3server/modules/docker/docker_vm.py | 3 ++- tests/modules/docker/test_docker_vm.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gns3server/modules/docker/docker_vm.py b/gns3server/modules/docker/docker_vm.py index 12f0efab..56ba1c04 100644 --- a/gns3server/modules/docker/docker_vm.py +++ b/gns3server/modules/docker/docker_vm.py @@ -415,7 +415,8 @@ class DockerVM(BaseVM): if shutil.which("Xvfb") is None or shutil.which("x11vnc") is None: raise DockerError("Please install Xvfb and x11vnc before using the VNC support") self._xvfb_process = yield from asyncio.create_subprocess_exec("Xvfb", "-nolisten", "tcp", ":{}".format(self._display), "-screen", "0", self._console_resolution + "x16") - self._x11vnc_process = yield from asyncio.create_subprocess_exec("x11vnc", "-forever", "-nopw", "-shared", "-geometry", self._console_resolution, "-display", "WAIT:{}".format(self._display), "-rfbport", str(self.console), "-noncache", "-listen", self._manager.port_manager.console_host) + # We pass a port for TCPV6 due to a crash in X11VNC if not here: https://github.com/GNS3/gns3-server/issues/569 + self._x11vnc_process = yield from asyncio.create_subprocess_exec("x11vnc", "-forever", "-nopw", "-shared", "-geometry", self._console_resolution, "-display", "WAIT:{}".format(self._display), "-rfbport", str(self.console), "-rfbportv6", str(self.console), "-noncache", "-listen", self._manager.port_manager.console_host) x11_socket = os.path.join("/tmp/.X11-unix/", "X{}".format(self._display)) yield from wait_for_file_creation(x11_socket) diff --git a/tests/modules/docker/test_docker_vm.py b/tests/modules/docker/test_docker_vm.py index b3bffd88..1849d7c8 100644 --- a/tests/modules/docker/test_docker_vm.py +++ b/tests/modules/docker/test_docker_vm.py @@ -891,7 +891,7 @@ def test_start_vnc(vm, loop): loop.run_until_complete(asyncio.async(vm._start_vnc())) assert vm._display is not None mock_exec.assert_any_call("Xvfb", "-nolisten", "tcp", ":{}".format(vm._display), "-screen", "0", "1280x1024x16") - mock_exec.assert_any_call("x11vnc", "-forever", "-nopw", "-shared", "-geometry", "1280x1024", "-display", "WAIT:{}".format(vm._display), "-rfbport", str(vm.console), "-noncache", "-listen", "127.0.0.1") + mock_exec.assert_any_call("x11vnc", "-forever", "-nopw", "-shared", "-geometry", "1280x1024", "-display", "WAIT:{}".format(vm._display), "-rfbport", str(vm.console), "-rfbportv6", str(vm.console), "-noncache", "-listen", "127.0.0.1") mock_wait.assert_called_with("/tmp/.X11-unix/X{}".format(vm._display)) From 343f2b574d8ba272e3ecd22f99ed04be1405865f Mon Sep 17 00:00:00 2001 From: Julien Duponchelle Date: Mon, 13 Jun 2016 21:20:29 +0200 Subject: [PATCH 4/4] Avoid loosing console port for Docker Fix #569 --- gns3server/modules/docker/docker_vm.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gns3server/modules/docker/docker_vm.py b/gns3server/modules/docker/docker_vm.py index 56ba1c04..31ff5fbb 100644 --- a/gns3server/modules/docker/docker_vm.py +++ b/gns3server/modules/docker/docker_vm.py @@ -321,7 +321,7 @@ class DockerVM(BaseVM): aux = self.aux state = yield from self._get_container_state() - yield from self.close() + yield from self.reset() yield from self.create() self.console = console self.aux = aux @@ -567,7 +567,10 @@ class DockerVM(BaseVM): if not (yield from super().close()): return False + yield from self.reset() + @asyncio.coroutine + def reset(self): try: if self.console_type == "vnc": if self._x11vnc_process: