From b2e0a1b29191d8d3c952c09d46f39f403a314d38 Mon Sep 17 00:00:00 2001 From: Andrew Caudwell Date: Mon, 11 Jun 2018 10:19:09 +1200 Subject: [PATCH] Don't release NIO UDP ports when updating docker container. When a docker container was updated, the NIO UDP ports were being released from port_manager, but they were still stored in self._ethernet_adapters. When the container was restarted, the same NIO ports would be used. However, if a new connection was then added, it could assign a port that was already in use. The end result was that traffic would be bridged across the wrong interface connection. --- gns3server/compute/docker/docker_vm.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/gns3server/compute/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py index 66e5d6f7..242078ee 100644 --- a/gns3server/compute/docker/docker_vm.py +++ b/gns3server/compute/docker/docker_vm.py @@ -386,7 +386,8 @@ class DockerVM(BaseNode): aux = self.aux state = yield from self._get_container_state() - yield from self.reset() + # reset the docker container, but don't release the NIO UDP ports + yield from self.reset(False) yield from self.create() self.console = console self.aux = aux @@ -680,7 +681,8 @@ class DockerVM(BaseNode): yield from self.reset() @asyncio.coroutine - def reset(self): + def reset(self, release_nio_udp_ports=True): + try: state = yield from self._get_container_state() if state == "paused" or state == "running": @@ -706,11 +708,12 @@ class DockerVM(BaseNode): log.info("Docker container '{name}' [{image}] removed".format( name=self._name, image=self._image)) - 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) + if release_nio_udp_ports: + 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 (DockerHttp404Error, RuntimeError) as e: log.debug("Docker error when closing: {}".format(str(e)))