From 5f17e0f6c91b36a8f33d1efa1be879d6eb80132f Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Thu, 3 Nov 2016 15:44:45 -0700 Subject: [PATCH] Handle NetworkDettach for the case of network-id When a container is attached to an "--attachable" network, it strictly forms the attacherKey using either the network-id or network-name because at the time of attachment, the daemon may not have the network downloaded locally from the manager. Hence, when the NetworkDettach is called, it should use either network-name or network-id. This fix addresses the missing network-id based dettachment case. Signed-off-by: Madhu Venugopal --- daemon/container_operations.go | 8 ++++++- integration-cli/docker_cli_swarm_test.go | 28 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/daemon/container_operations.go b/daemon/container_operations.go index 18d6b8280b..ca6a377fec 100644 --- a/daemon/container_operations.go +++ b/daemon/container_operations.go @@ -793,7 +793,10 @@ func (daemon *Daemon) disconnectFromNetwork(container *container.Container, n li if daemon.clusterProvider != nil && n.Info().Dynamic() && !container.Managed { if err := daemon.clusterProvider.DetachNetwork(n.Name(), container.ID); err != nil { - logrus.Warnf("error detaching from network %s: %v", n, err) + logrus.Warnf("error detaching from network %s: %v", n.Name(), err) + if err := daemon.clusterProvider.DetachNetwork(n.ID(), container.ID); err != nil { + logrus.Warnf("error detaching from network %s: %v", n.ID(), err) + } } } @@ -891,6 +894,9 @@ func (daemon *Daemon) releaseNetwork(container *container.Container) { if daemon.clusterProvider != nil && nw.Info().Dynamic() && !container.Managed { if err := daemon.clusterProvider.DetachNetwork(nw.Name(), container.ID); err != nil { logrus.Warnf("error detaching from network %s: %v", nw.Name(), err) + if err := daemon.clusterProvider.DetachNetwork(nw.ID(), container.ID); err != nil { + logrus.Warnf("error detaching from network %s: %v", nw.ID(), err) + } } } diff --git a/integration-cli/docker_cli_swarm_test.go b/integration-cli/docker_cli_swarm_test.go index d4c1e97f3d..ec8bae9fab 100644 --- a/integration-cli/docker_cli_swarm_test.go +++ b/integration-cli/docker_cli_swarm_test.go @@ -295,6 +295,34 @@ func (s *DockerSwarmSuite) TestSwarmContainerEndpointOptions(c *check.C) { c.Assert(err, check.IsNil) } +func (s *DockerSwarmSuite) TestSwarmContainerAttachByNetworkId(c *check.C) { + d := s.AddDaemon(c, true, true) + + out, err := d.Cmd("network", "create", "--attachable", "-d", "overlay", "testnet") + c.Assert(err, checker.IsNil) + c.Assert(strings.TrimSpace(out), checker.Not(checker.Equals), "") + networkID := strings.TrimSpace(out) + + out, err = d.Cmd("run", "-d", "--net", networkID, "busybox", "top") + c.Assert(err, checker.IsNil) + cID := strings.TrimSpace(out) + d.waitRun(cID) + + _, err = d.Cmd("rm", "-f", cID) + c.Assert(err, checker.IsNil) + + out, err = d.Cmd("network", "rm", "testnet") + c.Assert(err, checker.IsNil) + + checkNetwork := func(*check.C) (interface{}, check.CommentInterface) { + out, err := d.Cmd("network", "ls") + c.Assert(err, checker.IsNil) + return out, nil + } + + waitAndAssert(c, 3*time.Second, checkNetwork, checker.Not(checker.Contains), "testnet") +} + func (s *DockerSwarmSuite) TestSwarmRemoveInternalNetwork(c *check.C) { d := s.AddDaemon(c, true, true)