From f48830e7dba7b6600b8fdbb92ff03f8757c1f142 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Wed, 23 Oct 2019 17:49:45 +0300 Subject: [PATCH] chore: attempt to avoid containerd shim socket conflicts in tests I can't say how exactly those conflicts happen in the tests, but I tried to randomize more container IDs and namespace names (which both feed into final abstract unix socket path). Signed-off-by: Andrey Smirnov --- .../runner/containerd/containerd_test.go | 45 ++++++++--------- .../containers/containerd/containerd_test.go | 48 ++++++++++--------- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/internal/app/machined/pkg/system/runner/containerd/containerd_test.go b/internal/app/machined/pkg/system/runner/containerd/containerd_test.go index f5e9a3b46..b99d167e8 100644 --- a/internal/app/machined/pkg/system/runner/containerd/containerd_test.go +++ b/internal/app/machined/pkg/system/runner/containerd/containerd_test.go @@ -7,10 +7,10 @@ package containerd_test import ( "bytes" "context" + "encoding/hex" "fmt" "io/ioutil" "log" - "math/rand" "os" "path/filepath" "sync" @@ -20,6 +20,7 @@ import ( "github.com/containerd/containerd" "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/oci" + "github.com/google/uuid" specs "github.com/opencontainers/runtime-spec/specs-go" "github.com/stretchr/testify/suite" @@ -49,6 +50,8 @@ type ContainerdSuite struct { containerdWg sync.WaitGroup containerdAddress string + containerID string + client *containerd.Client image containerd.Image } @@ -94,7 +97,8 @@ func (suite *ContainerdSuite) SetupSuite() { suite.client, err = containerd.New(suite.containerdAddress) suite.Require().NoError(err) - suite.containerdNamespace = fmt.Sprintf("talostest%d%d", rand.Int63(), time.Now().Unix()) + namespace := ([16]byte)(uuid.New()) + suite.containerdNamespace = "talos" + hex.EncodeToString(namespace[:]) ctx := namespaces.WithNamespace(context.Background(), suite.containerdNamespace) @@ -102,6 +106,10 @@ func (suite *ContainerdSuite) SetupSuite() { suite.Require().NoError(err) } +func (suite *ContainerdSuite) SetupTest() { + suite.containerID = uuid.New().String() +} + func (suite *ContainerdSuite) TearDownSuite() { suite.Require().NoError(suite.client.Close()) @@ -126,7 +134,7 @@ func (suite *ContainerdSuite) getLogContents(filename string) []byte { func (suite *ContainerdSuite) TestRunSuccess() { r := containerdrunner.NewRunner(false, &runner.Args{ - ID: "test", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "exit 0"}, }, runner.WithLogPath(suite.tmpDir), @@ -145,10 +153,8 @@ func (suite *ContainerdSuite) TestRunSuccess() { } func (suite *ContainerdSuite) TestRunTwice() { - const ID = "runtwice" - r := containerdrunner.NewRunner(false, &runner.Args{ - ID: ID, + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "exit 0"}, }, runner.WithLogPath(suite.tmpDir), @@ -167,15 +173,6 @@ func (suite *ContainerdSuite) TestRunTwice() { suite.Assert().NoError(r.Run(MockEventSink)) // calling stop when Run has finished is no-op suite.Assert().NoError(r.Stop()) - - // TODO: workaround containerd (?) bug: https://github.com/docker/for-linux/issues/643 - for i := 0; i < 100; i++ { - time.Sleep(100 * time.Millisecond) - - if _, err := os.Stat("/containerd-shim/" + suite.containerdNamespace + "/" + ID + "/shim.sock"); err != nil && os.IsNotExist(err) { - break - } - } } } @@ -186,7 +183,7 @@ func (suite *ContainerdSuite) TestContainerCleanup() { // able to start the container by cleaning up container created by the first // runner r1 := containerdrunner.NewRunner(false, &runner.Args{ - ID: "cleanup1", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "exit 1"}, }, runner.WithLogPath(suite.tmpDir), @@ -198,7 +195,7 @@ func (suite *ContainerdSuite) TestContainerCleanup() { suite.Require().NoError(r1.Open(context.Background())) r2 := containerdrunner.NewRunner(false, &runner.Args{ - ID: "cleanup1", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "exit 0"}, }, runner.WithLogPath(suite.tmpDir), @@ -217,7 +214,7 @@ func (suite *ContainerdSuite) TestContainerCleanup() { func (suite *ContainerdSuite) TestRunLogs() { r := containerdrunner.NewRunner(false, &runner.Args{ - ID: "logtest", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "echo -n \"Test 1\nTest 2\n\""}, }, runner.WithLogPath(suite.tmpDir), @@ -232,7 +229,7 @@ func (suite *ContainerdSuite) TestRunLogs() { suite.Assert().NoError(r.Run(MockEventSink)) - logFile, err := os.Open(filepath.Join(suite.tmpDir, "logtest.log")) + logFile, err := os.Open(filepath.Join(suite.tmpDir, suite.containerID+".log")) suite.Assert().NoError(err) // nolint: errcheck @@ -253,7 +250,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() { _ = os.Remove(testFile) r := restart.New(containerdrunner.NewRunner(false, &runner.Args{ - ID: "endless", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "test -f " + testFile + " && echo ok || (echo fail; false)"}, }, runner.WithLogPath(suite.tmpDir), @@ -283,7 +280,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() { for i := 0; i < 10; i++ { time.Sleep(500 * time.Millisecond) - if bytes.Contains(suite.getLogContents("endless.log"), []byte("fail\n")) { + if bytes.Contains(suite.getLogContents(suite.containerID+".log"), []byte("fail\n")) { break } } @@ -302,7 +299,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() { for i := 0; i < 10; i++ { time.Sleep(500 * time.Millisecond) - if bytes.Contains(suite.getLogContents("endless.log"), []byte("ok\n")) { + if bytes.Contains(suite.getLogContents(suite.containerID+".log"), []byte("ok\n")) { break } } @@ -317,7 +314,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() { suite.Assert().NoError(r.Stop()) <-done - logContents := suite.getLogContents("endless.log") + logContents := suite.getLogContents(suite.containerID + ".log") suite.Assert().Truef(bytes.Contains(logContents, []byte("ok\n")), "logContents doesn't contain success entry: %v", logContents) suite.Assert().Truef(bytes.Contains(logContents, []byte("fail\n")), "logContents doesn't contain fail entry: %v", logContents) @@ -325,7 +322,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() { func (suite *ContainerdSuite) TestStopSigKill() { r := containerdrunner.NewRunner(false, &runner.Args{ - ID: "nokill", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "trap -- '' SIGTERM; while :; do :; done"}, }, runner.WithLogPath(suite.tmpDir), diff --git a/internal/pkg/containers/containerd/containerd_test.go b/internal/pkg/containers/containerd/containerd_test.go index dba940688..0b2635991 100644 --- a/internal/pkg/containers/containerd/containerd_test.go +++ b/internal/pkg/containers/containerd/containerd_test.go @@ -6,19 +6,18 @@ package containerd_test import ( "context" - "fmt" + "encoding/hex" "io/ioutil" - "math/rand" "os" "path/filepath" "sync" "testing" - "time" "github.com/containerd/containerd" containerdcntrs "github.com/containerd/containerd/containers" "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/oci" + "github.com/google/uuid" "github.com/stretchr/testify/suite" "github.com/talos-systems/talos/internal/app/machined/pkg/system/events" @@ -48,6 +47,8 @@ type ContainerdSuite struct { containerdWg sync.WaitGroup containerdAddress string + containerID string + client *containerd.Client image containerd.Image @@ -112,7 +113,9 @@ func (suite *ContainerdSuite) SetupSuite() { suite.client, err = containerd.New(suite.containerdAddress) suite.Require().NoError(err) - suite.containerdNamespace = fmt.Sprintf("talostest%d%d", rand.Int63(), time.Now().Unix()) + namespace := ([16]byte)(uuid.New()) + suite.containerdNamespace = "talos" + hex.EncodeToString(namespace[:]) + ctx := namespaces.WithNamespace(context.Background(), suite.containerdNamespace) suite.image, err = suite.client.Pull(ctx, busyboxImage, containerd.WithPullUnpack) @@ -130,6 +133,7 @@ func (suite *ContainerdSuite) TearDownSuite() { func (suite *ContainerdSuite) SetupTest() { suite.containerRunners = nil + suite.containerID = uuid.New().String() } func (suite *ContainerdSuite) run(runners ...runner.Runner) { @@ -176,7 +180,7 @@ func (suite *ContainerdSuite) TearDownTest() { func (suite *ContainerdSuite) runK8sContainers() { suite.run(containerdrunner.NewRunner(false, &runner.Args{ - ID: "test1", + ID: suite.containerID + "1", ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, }, runner.WithLogPath(suite.tmpDir), @@ -192,7 +196,7 @@ func (suite *ContainerdSuite) runK8sContainers() { })), runner.WithContainerdAddress(suite.containerdAddress), ), containerdrunner.NewRunner(false, &runner.Args{ - ID: "test2", + ID: suite.containerID + "2", ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, }, runner.WithLogPath(suite.tmpDir), @@ -212,7 +216,7 @@ func (suite *ContainerdSuite) runK8sContainers() { func (suite *ContainerdSuite) TestPodsNonK8s() { suite.run(containerdrunner.NewRunner(false, &runner.Args{ - ID: "test", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, }, runner.WithLogPath(suite.tmpDir), @@ -227,12 +231,12 @@ func (suite *ContainerdSuite) TestPodsNonK8s() { pods, err := i.Pods() suite.Require().NoError(err) suite.Require().Len(pods, 1) - suite.Assert().Equal("test", pods[0].Name) + suite.Assert().Equal(suite.containerID, pods[0].Name) suite.Assert().Equal("", pods[0].Sandbox) suite.Require().Len(pods[0].Containers, 1) - suite.Assert().Equal("test", pods[0].Containers[0].Display) - suite.Assert().Equal("test", pods[0].Containers[0].Name) - suite.Assert().Equal("test", pods[0].Containers[0].ID) + suite.Assert().Equal(suite.containerID, pods[0].Containers[0].Display) + suite.Assert().Equal(suite.containerID, pods[0].Containers[0].Name) + suite.Assert().Equal(suite.containerID, pods[0].Containers[0].ID) suite.Assert().Equal(busyboxImage, pods[0].Containers[0].Image) suite.Assert().Equal("RUNNING", pods[0].Containers[0].Status) suite.Assert().NotNil(pods[0].Containers[0].Metrics) @@ -254,8 +258,8 @@ func (suite *ContainerdSuite) TestPodsK8s() { suite.Require().Len(pods[0].Containers, 2) suite.Assert().Equal("ns1/fun", pods[0].Containers[0].Display) - suite.Assert().Equal("test1", pods[0].Containers[0].Name) - suite.Assert().Equal("test1", pods[0].Containers[0].ID) + suite.Assert().Equal(suite.containerID+"1", pods[0].Containers[0].Name) + suite.Assert().Equal(suite.containerID+"1", pods[0].Containers[0].ID) suite.Assert().Equal("sandbox", pods[0].Containers[0].Sandbox) suite.Assert().Equal("0", pods[0].Containers[0].RestartCount) suite.Assert().Equal("", pods[0].Containers[0].GetLogFile()) @@ -265,7 +269,7 @@ func (suite *ContainerdSuite) TestPodsK8s() { suite.Assert().Equal("ns1/fun:run", pods[0].Containers[1].Display) suite.Assert().Equal("run", pods[0].Containers[1].Name) - suite.Assert().Equal("test2", pods[0].Containers[1].ID) + suite.Assert().Equal(suite.containerID+"2", pods[0].Containers[1].ID) suite.Assert().Equal("sandbox", pods[0].Containers[1].Sandbox) suite.Assert().Equal("sandbox/run/0.log", pods[0].Containers[1].GetLogFile()) suite.Assert().Equal(busyboxImage, pods[0].Containers[1].Image) @@ -277,7 +281,7 @@ func (suite *ContainerdSuite) TestPodsK8s() { func (suite *ContainerdSuite) TestContainerNonK8s() { suite.run(containerdrunner.NewRunner(false, &runner.Args{ - ID: "shelltest", + ID: suite.containerID, ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, }, runner.WithLogPath(suite.tmpDir), @@ -289,12 +293,12 @@ func (suite *ContainerdSuite) TestContainerNonK8s() { i, err := ctrd.NewInspector(context.Background(), suite.containerdNamespace, ctrd.WithContainerdAddress(suite.containerdAddress)) suite.Assert().NoError(err) - cntr, err := i.Container("shelltest") + cntr, err := i.Container(suite.containerID) suite.Require().NoError(err) suite.Require().NotNil(cntr) - suite.Assert().Equal("shelltest", cntr.Name) - suite.Assert().Equal("shelltest", cntr.Display) - suite.Assert().Equal("shelltest", cntr.ID) + suite.Assert().Equal(suite.containerID, cntr.Name) + suite.Assert().Equal(suite.containerID, cntr.Display) + suite.Assert().Equal(suite.containerID, cntr.ID) suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved suite.Assert().Equal("RUNNING", cntr.Status) @@ -314,9 +318,9 @@ func (suite *ContainerdSuite) TestContainerK8s() { cntr, err := i.Container("ns1/fun") suite.Require().NoError(err) suite.Require().NotNil(cntr) - suite.Assert().Equal("test1", cntr.Name) + suite.Assert().Equal(suite.containerID+"1", cntr.Name) suite.Assert().Equal("ns1/fun", cntr.Display) - suite.Assert().Equal("test1", cntr.ID) + suite.Assert().Equal(suite.containerID+"1", cntr.ID) suite.Assert().Equal("sandbox", cntr.Sandbox) suite.Assert().Equal("", cntr.GetLogFile()) suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved @@ -327,7 +331,7 @@ func (suite *ContainerdSuite) TestContainerK8s() { suite.Require().NotNil(cntr) suite.Assert().Equal("run", cntr.Name) suite.Assert().Equal("ns1/fun:run", cntr.Display) - suite.Assert().Equal("test2", cntr.ID) + suite.Assert().Equal(suite.containerID+"2", cntr.ID) suite.Assert().Equal("sandbox", cntr.Sandbox) suite.Assert().Equal("sandbox/run/0.log", cntr.GetLogFile()) suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved