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 <smirnov.andrey@gmail.com>
This commit is contained in:
Andrey Smirnov 2019-10-23 17:49:45 +03:00 committed by Andrey Smirnov
parent d44f10f094
commit f48830e7db
2 changed files with 47 additions and 46 deletions

View File

@ -7,10 +7,10 @@ package containerd_test
import ( import (
"bytes" "bytes"
"context" "context"
"encoding/hex"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"math/rand"
"os" "os"
"path/filepath" "path/filepath"
"sync" "sync"
@ -20,6 +20,7 @@ import (
"github.com/containerd/containerd" "github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/namespaces"
"github.com/containerd/containerd/oci" "github.com/containerd/containerd/oci"
"github.com/google/uuid"
specs "github.com/opencontainers/runtime-spec/specs-go" specs "github.com/opencontainers/runtime-spec/specs-go"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
@ -49,6 +50,8 @@ type ContainerdSuite struct {
containerdWg sync.WaitGroup containerdWg sync.WaitGroup
containerdAddress string containerdAddress string
containerID string
client *containerd.Client client *containerd.Client
image containerd.Image image containerd.Image
} }
@ -94,7 +97,8 @@ func (suite *ContainerdSuite) SetupSuite() {
suite.client, err = containerd.New(suite.containerdAddress) suite.client, err = containerd.New(suite.containerdAddress)
suite.Require().NoError(err) 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) ctx := namespaces.WithNamespace(context.Background(), suite.containerdNamespace)
@ -102,6 +106,10 @@ func (suite *ContainerdSuite) SetupSuite() {
suite.Require().NoError(err) suite.Require().NoError(err)
} }
func (suite *ContainerdSuite) SetupTest() {
suite.containerID = uuid.New().String()
}
func (suite *ContainerdSuite) TearDownSuite() { func (suite *ContainerdSuite) TearDownSuite() {
suite.Require().NoError(suite.client.Close()) suite.Require().NoError(suite.client.Close())
@ -126,7 +134,7 @@ func (suite *ContainerdSuite) getLogContents(filename string) []byte {
func (suite *ContainerdSuite) TestRunSuccess() { func (suite *ContainerdSuite) TestRunSuccess() {
r := containerdrunner.NewRunner(false, &runner.Args{ r := containerdrunner.NewRunner(false, &runner.Args{
ID: "test", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "exit 0"}, ProcessArgs: []string{"/bin/sh", "-c", "exit 0"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -145,10 +153,8 @@ func (suite *ContainerdSuite) TestRunSuccess() {
} }
func (suite *ContainerdSuite) TestRunTwice() { func (suite *ContainerdSuite) TestRunTwice() {
const ID = "runtwice"
r := containerdrunner.NewRunner(false, &runner.Args{ r := containerdrunner.NewRunner(false, &runner.Args{
ID: ID, ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "exit 0"}, ProcessArgs: []string{"/bin/sh", "-c", "exit 0"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -167,15 +173,6 @@ func (suite *ContainerdSuite) TestRunTwice() {
suite.Assert().NoError(r.Run(MockEventSink)) suite.Assert().NoError(r.Run(MockEventSink))
// calling stop when Run has finished is no-op // calling stop when Run has finished is no-op
suite.Assert().NoError(r.Stop()) 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 // able to start the container by cleaning up container created by the first
// runner // runner
r1 := containerdrunner.NewRunner(false, &runner.Args{ r1 := containerdrunner.NewRunner(false, &runner.Args{
ID: "cleanup1", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "exit 1"}, ProcessArgs: []string{"/bin/sh", "-c", "exit 1"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -198,7 +195,7 @@ func (suite *ContainerdSuite) TestContainerCleanup() {
suite.Require().NoError(r1.Open(context.Background())) suite.Require().NoError(r1.Open(context.Background()))
r2 := containerdrunner.NewRunner(false, &runner.Args{ r2 := containerdrunner.NewRunner(false, &runner.Args{
ID: "cleanup1", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "exit 0"}, ProcessArgs: []string{"/bin/sh", "-c", "exit 0"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -217,7 +214,7 @@ func (suite *ContainerdSuite) TestContainerCleanup() {
func (suite *ContainerdSuite) TestRunLogs() { func (suite *ContainerdSuite) TestRunLogs() {
r := containerdrunner.NewRunner(false, &runner.Args{ r := containerdrunner.NewRunner(false, &runner.Args{
ID: "logtest", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "echo -n \"Test 1\nTest 2\n\""}, ProcessArgs: []string{"/bin/sh", "-c", "echo -n \"Test 1\nTest 2\n\""},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -232,7 +229,7 @@ func (suite *ContainerdSuite) TestRunLogs() {
suite.Assert().NoError(r.Run(MockEventSink)) 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) suite.Assert().NoError(err)
// nolint: errcheck // nolint: errcheck
@ -253,7 +250,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() {
_ = os.Remove(testFile) _ = os.Remove(testFile)
r := restart.New(containerdrunner.NewRunner(false, &runner.Args{ 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)"}, ProcessArgs: []string{"/bin/sh", "-c", "test -f " + testFile + " && echo ok || (echo fail; false)"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -283,7 +280,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
time.Sleep(500 * time.Millisecond) 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 break
} }
} }
@ -302,7 +299,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() {
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
time.Sleep(500 * time.Millisecond) 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 break
} }
} }
@ -317,7 +314,7 @@ func (suite *ContainerdSuite) TestStopFailingAndRestarting() {
suite.Assert().NoError(r.Stop()) suite.Assert().NoError(r.Stop())
<-done <-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("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) 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() { func (suite *ContainerdSuite) TestStopSigKill() {
r := containerdrunner.NewRunner(false, &runner.Args{ r := containerdrunner.NewRunner(false, &runner.Args{
ID: "nokill", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "trap -- '' SIGTERM; while :; do :; done"}, ProcessArgs: []string{"/bin/sh", "-c", "trap -- '' SIGTERM; while :; do :; done"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),

View File

@ -6,19 +6,18 @@ package containerd_test
import ( import (
"context" "context"
"fmt" "encoding/hex"
"io/ioutil" "io/ioutil"
"math/rand"
"os" "os"
"path/filepath" "path/filepath"
"sync" "sync"
"testing" "testing"
"time"
"github.com/containerd/containerd" "github.com/containerd/containerd"
containerdcntrs "github.com/containerd/containerd/containers" containerdcntrs "github.com/containerd/containerd/containers"
"github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/namespaces"
"github.com/containerd/containerd/oci" "github.com/containerd/containerd/oci"
"github.com/google/uuid"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/talos-systems/talos/internal/app/machined/pkg/system/events" "github.com/talos-systems/talos/internal/app/machined/pkg/system/events"
@ -48,6 +47,8 @@ type ContainerdSuite struct {
containerdWg sync.WaitGroup containerdWg sync.WaitGroup
containerdAddress string containerdAddress string
containerID string
client *containerd.Client client *containerd.Client
image containerd.Image image containerd.Image
@ -112,7 +113,9 @@ func (suite *ContainerdSuite) SetupSuite() {
suite.client, err = containerd.New(suite.containerdAddress) suite.client, err = containerd.New(suite.containerdAddress)
suite.Require().NoError(err) 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) ctx := namespaces.WithNamespace(context.Background(), suite.containerdNamespace)
suite.image, err = suite.client.Pull(ctx, busyboxImage, containerd.WithPullUnpack) suite.image, err = suite.client.Pull(ctx, busyboxImage, containerd.WithPullUnpack)
@ -130,6 +133,7 @@ func (suite *ContainerdSuite) TearDownSuite() {
func (suite *ContainerdSuite) SetupTest() { func (suite *ContainerdSuite) SetupTest() {
suite.containerRunners = nil suite.containerRunners = nil
suite.containerID = uuid.New().String()
} }
func (suite *ContainerdSuite) run(runners ...runner.Runner) { func (suite *ContainerdSuite) run(runners ...runner.Runner) {
@ -176,7 +180,7 @@ func (suite *ContainerdSuite) TearDownTest() {
func (suite *ContainerdSuite) runK8sContainers() { func (suite *ContainerdSuite) runK8sContainers() {
suite.run(containerdrunner.NewRunner(false, &runner.Args{ suite.run(containerdrunner.NewRunner(false, &runner.Args{
ID: "test1", ID: suite.containerID + "1",
ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -192,7 +196,7 @@ func (suite *ContainerdSuite) runK8sContainers() {
})), })),
runner.WithContainerdAddress(suite.containerdAddress), runner.WithContainerdAddress(suite.containerdAddress),
), containerdrunner.NewRunner(false, &runner.Args{ ), containerdrunner.NewRunner(false, &runner.Args{
ID: "test2", ID: suite.containerID + "2",
ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -212,7 +216,7 @@ func (suite *ContainerdSuite) runK8sContainers() {
func (suite *ContainerdSuite) TestPodsNonK8s() { func (suite *ContainerdSuite) TestPodsNonK8s() {
suite.run(containerdrunner.NewRunner(false, &runner.Args{ suite.run(containerdrunner.NewRunner(false, &runner.Args{
ID: "test", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -227,12 +231,12 @@ func (suite *ContainerdSuite) TestPodsNonK8s() {
pods, err := i.Pods() pods, err := i.Pods()
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(pods, 1) 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.Assert().Equal("", pods[0].Sandbox)
suite.Require().Len(pods[0].Containers, 1) suite.Require().Len(pods[0].Containers, 1)
suite.Assert().Equal("test", pods[0].Containers[0].Display) suite.Assert().Equal(suite.containerID, pods[0].Containers[0].Display)
suite.Assert().Equal("test", pods[0].Containers[0].Name) suite.Assert().Equal(suite.containerID, pods[0].Containers[0].Name)
suite.Assert().Equal("test", pods[0].Containers[0].ID) suite.Assert().Equal(suite.containerID, pods[0].Containers[0].ID)
suite.Assert().Equal(busyboxImage, pods[0].Containers[0].Image) suite.Assert().Equal(busyboxImage, pods[0].Containers[0].Image)
suite.Assert().Equal("RUNNING", pods[0].Containers[0].Status) suite.Assert().Equal("RUNNING", pods[0].Containers[0].Status)
suite.Assert().NotNil(pods[0].Containers[0].Metrics) suite.Assert().NotNil(pods[0].Containers[0].Metrics)
@ -254,8 +258,8 @@ func (suite *ContainerdSuite) TestPodsK8s() {
suite.Require().Len(pods[0].Containers, 2) suite.Require().Len(pods[0].Containers, 2)
suite.Assert().Equal("ns1/fun", pods[0].Containers[0].Display) suite.Assert().Equal("ns1/fun", pods[0].Containers[0].Display)
suite.Assert().Equal("test1", pods[0].Containers[0].Name) suite.Assert().Equal(suite.containerID+"1", pods[0].Containers[0].Name)
suite.Assert().Equal("test1", pods[0].Containers[0].ID) suite.Assert().Equal(suite.containerID+"1", pods[0].Containers[0].ID)
suite.Assert().Equal("sandbox", pods[0].Containers[0].Sandbox) suite.Assert().Equal("sandbox", pods[0].Containers[0].Sandbox)
suite.Assert().Equal("0", pods[0].Containers[0].RestartCount) suite.Assert().Equal("0", pods[0].Containers[0].RestartCount)
suite.Assert().Equal("", pods[0].Containers[0].GetLogFile()) 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("ns1/fun:run", pods[0].Containers[1].Display)
suite.Assert().Equal("run", pods[0].Containers[1].Name) 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", pods[0].Containers[1].Sandbox)
suite.Assert().Equal("sandbox/run/0.log", pods[0].Containers[1].GetLogFile()) suite.Assert().Equal("sandbox/run/0.log", pods[0].Containers[1].GetLogFile())
suite.Assert().Equal(busyboxImage, pods[0].Containers[1].Image) suite.Assert().Equal(busyboxImage, pods[0].Containers[1].Image)
@ -277,7 +281,7 @@ func (suite *ContainerdSuite) TestPodsK8s() {
func (suite *ContainerdSuite) TestContainerNonK8s() { func (suite *ContainerdSuite) TestContainerNonK8s() {
suite.run(containerdrunner.NewRunner(false, &runner.Args{ suite.run(containerdrunner.NewRunner(false, &runner.Args{
ID: "shelltest", ID: suite.containerID,
ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"}, ProcessArgs: []string{"/bin/sh", "-c", "sleep 3600"},
}, },
runner.WithLogPath(suite.tmpDir), runner.WithLogPath(suite.tmpDir),
@ -289,12 +293,12 @@ func (suite *ContainerdSuite) TestContainerNonK8s() {
i, err := ctrd.NewInspector(context.Background(), suite.containerdNamespace, ctrd.WithContainerdAddress(suite.containerdAddress)) i, err := ctrd.NewInspector(context.Background(), suite.containerdNamespace, ctrd.WithContainerdAddress(suite.containerdAddress))
suite.Assert().NoError(err) suite.Assert().NoError(err)
cntr, err := i.Container("shelltest") cntr, err := i.Container(suite.containerID)
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().NotNil(cntr) suite.Require().NotNil(cntr)
suite.Assert().Equal("shelltest", cntr.Name) suite.Assert().Equal(suite.containerID, cntr.Name)
suite.Assert().Equal("shelltest", cntr.Display) suite.Assert().Equal(suite.containerID, cntr.Display)
suite.Assert().Equal("shelltest", cntr.ID) suite.Assert().Equal(suite.containerID, cntr.ID)
suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved
suite.Assert().Equal("RUNNING", cntr.Status) suite.Assert().Equal("RUNNING", cntr.Status)
@ -314,9 +318,9 @@ func (suite *ContainerdSuite) TestContainerK8s() {
cntr, err := i.Container("ns1/fun") cntr, err := i.Container("ns1/fun")
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().NotNil(cntr) 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("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("sandbox", cntr.Sandbox)
suite.Assert().Equal("", cntr.GetLogFile()) suite.Assert().Equal("", cntr.GetLogFile())
suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved
@ -327,7 +331,7 @@ func (suite *ContainerdSuite) TestContainerK8s() {
suite.Require().NotNil(cntr) suite.Require().NotNil(cntr)
suite.Assert().Equal("run", cntr.Name) suite.Assert().Equal("run", cntr.Name)
suite.Assert().Equal("ns1/fun:run", cntr.Display) 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", cntr.Sandbox)
suite.Assert().Equal("sandbox/run/0.log", cntr.GetLogFile()) suite.Assert().Equal("sandbox/run/0.log", cntr.GetLogFile())
suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved suite.Assert().Equal(busyboxImageDigest, cntr.Image) // image is not resolved