From 6f63812d635533fec49a5b15c18d08f8be83b0fc Mon Sep 17 00:00:00 2001 From: Eric Li Date: Tue, 19 Jun 2018 16:48:11 +0800 Subject: [PATCH] bugfix: vendor latest libnetwork for connect panic It seems a bug of libnetwork. When libnetwork restores the sandbox, it forgets to initialize the epPriority map. So the Join panic. The latest alibaba/libnetwork has fixed the bug. We will vendor the latest libnetwork and add some test cases https://github.com/alibaba/libnetwork/commit/655f08f8be32ff847d0554ef0128a3de80665cd6 Signed-off-by: Eric Li --- test/cli_network_test.go | 79 +++++++++++++++++++ .../docker/libnetwork/sandbox_store.go | 1 + vendor/vendor.json | 9 +-- 3 files changed, 83 insertions(+), 6 deletions(-) diff --git a/test/cli_network_test.go b/test/cli_network_test.go index f9cd64276..2cd0a15d4 100644 --- a/test/cli_network_test.go +++ b/test/cli_network_test.go @@ -445,3 +445,82 @@ func (suite *PouchNetworkSuite) TestNetworkDisconnect(c *check.C) { command.PouchRun("stop", "-t", "1", name).Assert(c, icmd.Success) command.PouchRun("start", name).Assert(c, icmd.Success) } + +// TestNetworkConnectWithRestart is to verify the 'network connect' +// and 'network disconnect' after restart daemon. +func (suite *PouchNetworkSuite) TestNetworkConnectWithRestart(c *check.C) { + // start the test pouch daemon + dcfg, err := StartDefaultDaemonDebug() + if err != nil { + c.Skip("daemon start failed.") + } + defer dcfg.KillDaemon() + + // pull image + RunWithSpecifiedDaemon(dcfg, "pull", busyboxImage).Assert(c, icmd.Success) + + bridgeName := "p1" + networkName := "net1" + containerName := "TestNetworkConnectWithRestart" + + // create bridge device + br, err := createBridge("p1") + c.Assert(err, check.Equals, nil) + defer netlink.LinkDel(br) + + // create bridge network + RunWithSpecifiedDaemon(dcfg, "network", "create", + "-d", "bridge", + "--subnet=172.18.0.0/24", "--gateway=172.18.0.1", + "-o", "com.docker.network.bridge.name="+bridgeName, networkName).Assert(c, icmd.Success) + defer func() { + RunWithSpecifiedDaemon(dcfg, "network", "rm", networkName).Assert(c, icmd.Success) + }() + + // create container + RunWithSpecifiedDaemon(dcfg, "run", "-d", "--name", containerName, busyboxImage, "top").Assert(c, icmd.Success) + defer func() { + RunWithSpecifiedDaemon(dcfg, "rm", "-f", containerName).Assert(c, icmd.Success) + }() + + // restart daemon + err = RestartDaemon(dcfg) + c.Assert(err, check.IsNil) + + // connect a network + RunWithSpecifiedDaemon(dcfg, "network", "connect", networkName, containerName).Assert(c, icmd.Success) + + // inspect container check result + ret := RunWithSpecifiedDaemon(dcfg, "inspect", containerName).Assert(c, icmd.Success) + + out := ret.Stdout() + found := false + for _, line := range strings.Split(out, "\n") { + if strings.Contains(line, "net1") { + found = true + break + } + } + c.Assert(found, check.Equals, true) + + // restart daemon + err = RestartDaemon(dcfg) + c.Assert(err, check.IsNil) + + // disconnect a network + RunWithSpecifiedDaemon(dcfg, "network", "disconnect", networkName, containerName).Assert(c, icmd.Success) + + // inspect container check result + ret = RunWithSpecifiedDaemon(dcfg, "inspect", containerName).Assert(c, icmd.Success) + + out = ret.Stdout() + found = false + for _, line := range strings.Split(out, "\n") { + if strings.Contains(line, "net1") { + found = true + break + } + } + + c.Assert(found, check.Equals, false) +} diff --git a/vendor/github.com/docker/libnetwork/sandbox_store.go b/vendor/github.com/docker/libnetwork/sandbox_store.go index ebc884e6f..144cbd2b6 100644 --- a/vendor/github.com/docker/libnetwork/sandbox_store.go +++ b/vendor/github.com/docker/libnetwork/sandbox_store.go @@ -217,6 +217,7 @@ func (c *controller) sandboxCleanup(activeSandboxes map[string]interface{}) { endpoints: []*endpoint{}, populatedEndpoints: map[string]struct{}{}, dbIndex: sbs.dbIndex, + epPriority: sbs.EpPriority, isStub: true, dbExists: true, } diff --git a/vendor/vendor.json b/vendor/vendor.json index 4036eaf88..2b60a4874 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -809,13 +809,11 @@ "revisionTime": "2017-12-19T08:35:33Z" }, { - "checksumSHA1": "9fs73UF7mj6VtGjZcpYvkfZTgH4=", + "checksumSHA1": "P6rfMC0ECx56UDSrnnb8InINEVc=", "origin": "github.com/alibaba/libnetwork", "path": "github.com/docker/libnetwork", - "revision": "04a77bdbfb6f51185791ee3d61e3644f058e6b21", - "revisionTime": "2018-06-11T16:09:43Z", - "version": "=master", - "versionExact": "master" + "revision": "7c0569783f2eea427d5c2ea032856e5d0edc38dd", + "revisionTime": "2018-06-21T03:37:56Z" }, { "checksumSHA1": "PjtJFUyEOokrmiBiHmfXrX/lAug=", @@ -1912,7 +1910,6 @@ }, { "checksumSHA1": "o+lVDhZsT+PFILKt5S6CgBmcrMs=", - "origin": "github.com/alibaba/pouch/vendor/k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2", "path": "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2", "revision": "86bd9771515c19a8df7128f53b1c1fa4f00d64ee", "revisionTime": "2018-05-23T02:20:24Z"