2015-04-18 16:46:47 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2015-06-05 20:09:53 +00:00
|
|
|
"fmt"
|
2017-08-25 22:48:36 +00:00
|
|
|
"io/ioutil"
|
2016-10-15 17:20:34 +00:00
|
|
|
"net/http/httptest"
|
2016-03-09 08:18:30 +00:00
|
|
|
"os"
|
2017-07-12 20:31:13 +00:00
|
|
|
"path"
|
2016-03-09 08:18:30 +00:00
|
|
|
"path/filepath"
|
2017-08-25 22:48:36 +00:00
|
|
|
"strconv"
|
2016-06-29 18:00:11 +00:00
|
|
|
"sync"
|
2016-07-28 14:19:09 +00:00
|
|
|
"syscall"
|
2015-04-18 16:46:47 +00:00
|
|
|
"testing"
|
2017-07-12 20:31:13 +00:00
|
|
|
"time"
|
2015-04-18 16:46:47 +00:00
|
|
|
|
2016-09-06 18:18:12 +00:00
|
|
|
"github.com/docker/docker/api/types/swarm"
|
2017-07-12 20:31:13 +00:00
|
|
|
"github.com/docker/docker/integration-cli/checker"
|
2017-03-23 17:35:22 +00:00
|
|
|
"github.com/docker/docker/integration-cli/cli"
|
2017-04-10 12:42:21 +00:00
|
|
|
"github.com/docker/docker/integration-cli/cli/build/fakestorage"
|
2016-12-09 09:17:53 +00:00
|
|
|
"github.com/docker/docker/integration-cli/daemon"
|
2016-12-25 19:28:38 +00:00
|
|
|
"github.com/docker/docker/integration-cli/environment"
|
2017-07-12 20:31:13 +00:00
|
|
|
"github.com/docker/docker/integration-cli/fixtures/plugin"
|
2016-12-30 18:10:04 +00:00
|
|
|
"github.com/docker/docker/integration-cli/registry"
|
2018-04-10 14:29:48 +00:00
|
|
|
testdaemon "github.com/docker/docker/internal/test/daemon"
|
2017-08-25 22:48:36 +00:00
|
|
|
ienv "github.com/docker/docker/internal/test/environment"
|
2015-06-05 20:09:53 +00:00
|
|
|
"github.com/docker/docker/pkg/reexec"
|
2015-04-18 16:46:47 +00:00
|
|
|
"github.com/go-check/check"
|
2017-07-12 20:31:13 +00:00
|
|
|
"golang.org/x/net/context"
|
2015-04-18 16:46:47 +00:00
|
|
|
)
|
|
|
|
|
2016-12-25 19:28:38 +00:00
|
|
|
const (
|
|
|
|
// the private registry to use for tests
|
|
|
|
privateRegistryURL = "127.0.0.1:5000"
|
|
|
|
|
|
|
|
// path to containerd's ctr binary
|
|
|
|
ctrBinary = "docker-containerd-ctr"
|
|
|
|
|
|
|
|
// the docker daemon binary to use
|
|
|
|
dockerdBinary = "dockerd"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
testEnv *environment.Execution
|
|
|
|
|
|
|
|
// the docker client binary to use
|
2017-04-17 23:18:46 +00:00
|
|
|
dockerBinary = ""
|
2016-12-25 19:28:38 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
var err error
|
|
|
|
|
2015-06-05 20:09:53 +00:00
|
|
|
reexec.Init() // This is required for external graphdriver tests
|
|
|
|
|
2016-12-25 19:28:38 +00:00
|
|
|
testEnv, err = environment.New()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestMain(m *testing.M) {
|
2017-03-23 17:35:22 +00:00
|
|
|
dockerBinary = testEnv.DockerBinary()
|
2017-10-24 18:24:25 +00:00
|
|
|
err := ienv.EnsureFrozenImagesLinux(&testEnv.Execution)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
2017-08-25 22:48:36 +00:00
|
|
|
testEnv.Print()
|
|
|
|
os.Exit(m.Run())
|
2016-12-25 19:28:38 +00:00
|
|
|
}
|
2015-06-05 20:09:53 +00:00
|
|
|
|
2016-12-25 19:28:38 +00:00
|
|
|
func Test(t *testing.T) {
|
2017-08-25 22:48:36 +00:00
|
|
|
cli.SetTestEnvironment(testEnv)
|
|
|
|
fakestorage.SetTestEnvironment(&testEnv.Execution)
|
2017-09-08 14:42:10 +00:00
|
|
|
ienv.ProtectAll(t, &testEnv.Execution)
|
2015-04-22 18:20:32 +00:00
|
|
|
check.TestingT(t)
|
|
|
|
}
|
2015-04-18 16:46:47 +00:00
|
|
|
|
2015-04-24 21:16:56 +00:00
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerSuite{})
|
|
|
|
}
|
|
|
|
|
2015-04-18 16:46:47 +00:00
|
|
|
type DockerSuite struct {
|
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerSuite) OnTimeout(c *check.C) {
|
2018-03-02 13:45:14 +00:00
|
|
|
if testEnv.IsRemoteDaemon() {
|
2017-09-13 21:00:55 +00:00
|
|
|
return
|
|
|
|
}
|
2017-08-25 22:48:36 +00:00
|
|
|
path := filepath.Join(os.Getenv("DEST"), "docker.pid")
|
|
|
|
b, err := ioutil.ReadFile(path)
|
|
|
|
if err != nil {
|
|
|
|
c.Fatalf("Failed to get daemon PID from %s\n", path)
|
|
|
|
}
|
|
|
|
|
|
|
|
rawPid, err := strconv.ParseInt(string(b), 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
c.Fatalf("Failed to parse pid from %s: %s\n", path, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
daemonPid := int(rawPid)
|
2017-09-13 21:00:55 +00:00
|
|
|
if daemonPid > 0 {
|
2018-04-10 14:29:48 +00:00
|
|
|
testdaemon.SignalDaemonDump(daemonPid)
|
2016-07-27 18:17:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-18 16:46:47 +00:00
|
|
|
func (s *DockerSuite) TearDownTest(c *check.C) {
|
2017-08-25 22:48:36 +00:00
|
|
|
testEnv.Clean(c)
|
2015-04-18 16:46:47 +00:00
|
|
|
}
|
|
|
|
|
2015-04-24 21:16:56 +00:00
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerRegistrySuite{
|
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type DockerRegistrySuite struct {
|
|
|
|
ds *DockerSuite
|
2016-12-30 18:10:04 +00:00
|
|
|
reg *registry.V2
|
2016-12-09 09:17:53 +00:00
|
|
|
d *daemon.Daemon
|
2015-04-24 21:16:56 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerRegistrySuite) OnTimeout(c *check.C) {
|
|
|
|
s.d.DumpStackAndQuit()
|
|
|
|
}
|
|
|
|
|
2015-04-24 21:16:56 +00:00
|
|
|
func (s *DockerRegistrySuite) SetUpTest(c *check.C) {
|
2017-09-14 17:17:49 +00:00
|
|
|
testRequires(c, DaemonIsLinux, registry.Hosting, SameHostDaemon)
|
2016-03-14 20:11:35 +00:00
|
|
|
s.reg = setupRegistry(c, false, "", "")
|
2016-12-09 09:17:53 +00:00
|
|
|
s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
|
2018-01-15 14:30:05 +00:00
|
|
|
Experimental: testEnv.DaemonInfo.ExperimentalBuild,
|
2016-12-09 09:17:53 +00:00
|
|
|
})
|
2015-04-24 21:16:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerRegistrySuite) TearDownTest(c *check.C) {
|
2015-07-23 09:40:54 +00:00
|
|
|
if s.reg != nil {
|
|
|
|
s.reg.Close()
|
|
|
|
}
|
2016-01-13 09:51:01 +00:00
|
|
|
if s.d != nil {
|
2016-12-09 22:20:14 +00:00
|
|
|
s.d.Stop(c)
|
2015-07-23 09:40:54 +00:00
|
|
|
}
|
2016-01-13 09:51:01 +00:00
|
|
|
s.ds.TearDownTest(c)
|
2015-04-24 21:16:56 +00:00
|
|
|
}
|
2015-04-26 02:47:42 +00:00
|
|
|
|
2015-12-18 23:06:23 +00:00
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerSchema1RegistrySuite{
|
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type DockerSchema1RegistrySuite struct {
|
|
|
|
ds *DockerSuite
|
2016-12-30 18:10:04 +00:00
|
|
|
reg *registry.V2
|
2016-12-09 09:17:53 +00:00
|
|
|
d *daemon.Daemon
|
2015-12-18 23:06:23 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerSchema1RegistrySuite) OnTimeout(c *check.C) {
|
|
|
|
s.d.DumpStackAndQuit()
|
|
|
|
}
|
|
|
|
|
2015-12-18 23:06:23 +00:00
|
|
|
func (s *DockerSchema1RegistrySuite) SetUpTest(c *check.C) {
|
2017-09-14 17:17:49 +00:00
|
|
|
testRequires(c, DaemonIsLinux, registry.Hosting, NotArm64, SameHostDaemon)
|
2016-03-14 20:11:35 +00:00
|
|
|
s.reg = setupRegistry(c, true, "", "")
|
2016-12-09 09:17:53 +00:00
|
|
|
s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
|
2018-01-15 14:30:05 +00:00
|
|
|
Experimental: testEnv.DaemonInfo.ExperimentalBuild,
|
2016-12-09 09:17:53 +00:00
|
|
|
})
|
2015-12-18 23:06:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerSchema1RegistrySuite) TearDownTest(c *check.C) {
|
|
|
|
if s.reg != nil {
|
|
|
|
s.reg.Close()
|
|
|
|
}
|
2016-01-13 09:51:01 +00:00
|
|
|
if s.d != nil {
|
2016-12-09 22:20:14 +00:00
|
|
|
s.d.Stop(c)
|
2015-12-18 23:06:23 +00:00
|
|
|
}
|
2016-01-13 09:51:01 +00:00
|
|
|
s.ds.TearDownTest(c)
|
2015-12-18 23:06:23 +00:00
|
|
|
}
|
|
|
|
|
2016-01-23 18:45:01 +00:00
|
|
|
func init() {
|
2016-03-14 20:11:35 +00:00
|
|
|
check.Suite(&DockerRegistryAuthHtpasswdSuite{
|
2016-01-23 18:45:01 +00:00
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2016-03-14 20:11:35 +00:00
|
|
|
type DockerRegistryAuthHtpasswdSuite struct {
|
2016-01-23 18:45:01 +00:00
|
|
|
ds *DockerSuite
|
2016-12-30 18:10:04 +00:00
|
|
|
reg *registry.V2
|
2016-12-09 09:17:53 +00:00
|
|
|
d *daemon.Daemon
|
2016-01-23 18:45:01 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerRegistryAuthHtpasswdSuite) OnTimeout(c *check.C) {
|
|
|
|
s.d.DumpStackAndQuit()
|
|
|
|
}
|
|
|
|
|
2016-03-14 20:11:35 +00:00
|
|
|
func (s *DockerRegistryAuthHtpasswdSuite) SetUpTest(c *check.C) {
|
2017-09-14 17:17:49 +00:00
|
|
|
testRequires(c, DaemonIsLinux, registry.Hosting, SameHostDaemon)
|
2016-03-14 20:11:35 +00:00
|
|
|
s.reg = setupRegistry(c, false, "htpasswd", "")
|
2016-12-09 09:17:53 +00:00
|
|
|
s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
|
2018-01-15 14:30:05 +00:00
|
|
|
Experimental: testEnv.DaemonInfo.ExperimentalBuild,
|
2016-12-09 09:17:53 +00:00
|
|
|
})
|
2016-01-23 18:45:01 +00:00
|
|
|
}
|
|
|
|
|
2016-03-14 20:11:35 +00:00
|
|
|
func (s *DockerRegistryAuthHtpasswdSuite) TearDownTest(c *check.C) {
|
2016-01-23 18:45:01 +00:00
|
|
|
if s.reg != nil {
|
|
|
|
out, err := s.d.Cmd("logout", privateRegistryURL)
|
|
|
|
c.Assert(err, check.IsNil, check.Commentf(out))
|
|
|
|
s.reg.Close()
|
|
|
|
}
|
|
|
|
if s.d != nil {
|
2016-12-09 22:20:14 +00:00
|
|
|
s.d.Stop(c)
|
2016-01-23 18:45:01 +00:00
|
|
|
}
|
|
|
|
s.ds.TearDownTest(c)
|
|
|
|
}
|
|
|
|
|
2016-03-14 20:11:35 +00:00
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerRegistryAuthTokenSuite{
|
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type DockerRegistryAuthTokenSuite struct {
|
|
|
|
ds *DockerSuite
|
2016-12-30 18:10:04 +00:00
|
|
|
reg *registry.V2
|
2016-12-09 09:17:53 +00:00
|
|
|
d *daemon.Daemon
|
2016-03-14 20:11:35 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerRegistryAuthTokenSuite) OnTimeout(c *check.C) {
|
|
|
|
s.d.DumpStackAndQuit()
|
|
|
|
}
|
|
|
|
|
2016-03-14 20:11:35 +00:00
|
|
|
func (s *DockerRegistryAuthTokenSuite) SetUpTest(c *check.C) {
|
2017-09-14 17:17:49 +00:00
|
|
|
testRequires(c, DaemonIsLinux, registry.Hosting, SameHostDaemon)
|
2016-12-09 09:17:53 +00:00
|
|
|
s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
|
2018-01-15 14:30:05 +00:00
|
|
|
Experimental: testEnv.DaemonInfo.ExperimentalBuild,
|
2016-12-09 09:17:53 +00:00
|
|
|
})
|
2016-03-14 20:11:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerRegistryAuthTokenSuite) TearDownTest(c *check.C) {
|
|
|
|
if s.reg != nil {
|
|
|
|
out, err := s.d.Cmd("logout", privateRegistryURL)
|
|
|
|
c.Assert(err, check.IsNil, check.Commentf(out))
|
|
|
|
s.reg.Close()
|
|
|
|
}
|
|
|
|
if s.d != nil {
|
2016-12-09 22:20:14 +00:00
|
|
|
s.d.Stop(c)
|
2016-03-14 20:11:35 +00:00
|
|
|
}
|
|
|
|
s.ds.TearDownTest(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerRegistryAuthTokenSuite) setupRegistryWithTokenService(c *check.C, tokenURL string) {
|
|
|
|
if s == nil {
|
|
|
|
c.Fatal("registry suite isn't initialized")
|
|
|
|
}
|
|
|
|
s.reg = setupRegistry(c, false, "token", tokenURL)
|
|
|
|
}
|
|
|
|
|
2015-04-26 02:47:42 +00:00
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerDaemonSuite{
|
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type DockerDaemonSuite struct {
|
|
|
|
ds *DockerSuite
|
2016-12-09 09:17:53 +00:00
|
|
|
d *daemon.Daemon
|
2015-04-26 02:47:42 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerDaemonSuite) OnTimeout(c *check.C) {
|
|
|
|
s.d.DumpStackAndQuit()
|
|
|
|
}
|
|
|
|
|
2015-04-26 02:47:42 +00:00
|
|
|
func (s *DockerDaemonSuite) SetUpTest(c *check.C) {
|
2016-12-13 11:04:53 +00:00
|
|
|
testRequires(c, DaemonIsLinux, SameHostDaemon)
|
2016-12-09 09:17:53 +00:00
|
|
|
s.d = daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
|
2018-01-15 14:30:05 +00:00
|
|
|
Experimental: testEnv.DaemonInfo.ExperimentalBuild,
|
2016-12-09 09:17:53 +00:00
|
|
|
})
|
2015-04-26 02:47:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerDaemonSuite) TearDownTest(c *check.C) {
|
2016-12-13 11:04:53 +00:00
|
|
|
testRequires(c, DaemonIsLinux, SameHostDaemon)
|
2016-01-13 09:51:01 +00:00
|
|
|
if s.d != nil {
|
2016-12-09 22:20:14 +00:00
|
|
|
s.d.Stop(c)
|
2016-01-13 09:51:01 +00:00
|
|
|
}
|
2015-04-26 02:47:42 +00:00
|
|
|
s.ds.TearDownTest(c)
|
|
|
|
}
|
2015-07-20 05:56:10 +00:00
|
|
|
|
2016-07-28 14:19:09 +00:00
|
|
|
func (s *DockerDaemonSuite) TearDownSuite(c *check.C) {
|
2018-04-10 14:29:48 +00:00
|
|
|
filepath.Walk(testdaemon.SockRoot, func(path string, fi os.FileInfo, err error) error {
|
2016-07-28 14:19:09 +00:00
|
|
|
if err != nil {
|
2016-08-10 19:18:35 +00:00
|
|
|
// ignore errors here
|
|
|
|
// not cleaning up sockets is not really an error
|
|
|
|
return nil
|
2016-07-28 14:19:09 +00:00
|
|
|
}
|
|
|
|
if fi.Mode() == os.ModeSocket {
|
|
|
|
syscall.Unlink(path)
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
2018-04-10 14:29:48 +00:00
|
|
|
os.RemoveAll(testdaemon.SockRoot)
|
2016-07-28 14:19:09 +00:00
|
|
|
}
|
|
|
|
|
2016-06-14 02:54:20 +00:00
|
|
|
const defaultSwarmPort = 2477
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerSwarmSuite{
|
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type DockerSwarmSuite struct {
|
2016-10-15 17:20:34 +00:00
|
|
|
server *httptest.Server
|
2016-06-29 18:00:11 +00:00
|
|
|
ds *DockerSuite
|
2016-12-09 09:17:53 +00:00
|
|
|
daemons []*daemon.Swarm
|
2016-06-29 18:00:11 +00:00
|
|
|
daemonsLock sync.Mutex // protect access to daemons
|
|
|
|
portIndex int
|
2016-06-14 02:54:20 +00:00
|
|
|
}
|
|
|
|
|
2016-07-27 18:17:44 +00:00
|
|
|
func (s *DockerSwarmSuite) OnTimeout(c *check.C) {
|
|
|
|
s.daemonsLock.Lock()
|
|
|
|
defer s.daemonsLock.Unlock()
|
|
|
|
for _, d := range s.daemons {
|
|
|
|
d.DumpStackAndQuit()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-06-14 02:54:20 +00:00
|
|
|
func (s *DockerSwarmSuite) SetUpTest(c *check.C) {
|
2017-09-14 17:17:49 +00:00
|
|
|
testRequires(c, DaemonIsLinux, SameHostDaemon)
|
2016-06-14 02:54:20 +00:00
|
|
|
}
|
|
|
|
|
2016-12-09 09:17:53 +00:00
|
|
|
func (s *DockerSwarmSuite) AddDaemon(c *check.C, joinSwarm, manager bool) *daemon.Swarm {
|
|
|
|
d := &daemon.Swarm{
|
|
|
|
Daemon: daemon.New(c, dockerBinary, dockerdBinary, daemon.Config{
|
2018-01-15 14:30:05 +00:00
|
|
|
Experimental: testEnv.DaemonInfo.ExperimentalBuild,
|
2016-12-09 09:17:53 +00:00
|
|
|
}),
|
|
|
|
Port: defaultSwarmPort + s.portIndex,
|
2016-06-14 02:54:20 +00:00
|
|
|
}
|
2016-12-09 09:17:53 +00:00
|
|
|
d.ListenAddr = fmt.Sprintf("0.0.0.0:%d", d.Port)
|
2016-10-06 14:09:54 +00:00
|
|
|
args := []string{"--iptables=false", "--swarm-default-advertise-addr=lo"} // avoid networking conflicts
|
2016-12-09 22:20:14 +00:00
|
|
|
d.StartWithBusybox(c, args...)
|
2016-06-14 02:54:20 +00:00
|
|
|
|
2017-10-17 03:30:05 +00:00
|
|
|
if joinSwarm {
|
2016-06-14 02:54:20 +00:00
|
|
|
if len(s.daemons) > 0 {
|
2016-12-09 09:17:53 +00:00
|
|
|
tokens := s.daemons[0].JoinTokens(c)
|
2016-07-20 18:15:08 +00:00
|
|
|
token := tokens.Worker
|
|
|
|
if manager {
|
|
|
|
token = tokens.Manager
|
|
|
|
}
|
2016-06-20 02:00:45 +00:00
|
|
|
c.Assert(d.Join(swarm.JoinRequest{
|
2016-12-09 09:17:53 +00:00
|
|
|
RemoteAddrs: []string{s.daemons[0].ListenAddr},
|
2016-07-20 18:15:08 +00:00
|
|
|
JoinToken: token,
|
2016-06-20 02:00:45 +00:00
|
|
|
}), check.IsNil)
|
2016-07-20 18:15:08 +00:00
|
|
|
} else {
|
|
|
|
c.Assert(d.Init(swarm.InitRequest{}), check.IsNil)
|
2016-06-14 02:54:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s.portIndex++
|
2016-06-29 18:00:11 +00:00
|
|
|
s.daemonsLock.Lock()
|
2016-06-14 02:54:20 +00:00
|
|
|
s.daemons = append(s.daemons, d)
|
2016-06-29 18:00:11 +00:00
|
|
|
s.daemonsLock.Unlock()
|
2016-06-14 02:54:20 +00:00
|
|
|
|
|
|
|
return d
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DockerSwarmSuite) TearDownTest(c *check.C) {
|
|
|
|
testRequires(c, DaemonIsLinux)
|
2016-06-29 18:00:11 +00:00
|
|
|
s.daemonsLock.Lock()
|
2016-06-14 02:54:20 +00:00
|
|
|
for _, d := range s.daemons {
|
2016-11-21 17:37:13 +00:00
|
|
|
if d != nil {
|
2016-12-09 22:20:14 +00:00
|
|
|
d.Stop(c)
|
2016-12-09 09:17:53 +00:00
|
|
|
// FIXME(vdemeester) should be handled by SwarmDaemon ?
|
2016-11-21 17:37:13 +00:00
|
|
|
// raft state file is quite big (64MB) so remove it after every test
|
2016-12-09 09:17:53 +00:00
|
|
|
walDir := filepath.Join(d.Root, "swarm/raft/wal")
|
2016-11-21 17:37:13 +00:00
|
|
|
if err := os.RemoveAll(walDir); err != nil {
|
|
|
|
c.Logf("error removing %v: %v", walDir, err)
|
|
|
|
}
|
2016-08-23 23:50:15 +00:00
|
|
|
|
2016-12-09 09:17:53 +00:00
|
|
|
d.CleanupExecRoot(c)
|
2016-11-21 17:37:13 +00:00
|
|
|
}
|
2016-06-14 02:54:20 +00:00
|
|
|
}
|
|
|
|
s.daemons = nil
|
2016-06-29 18:00:11 +00:00
|
|
|
s.daemonsLock.Unlock()
|
2016-06-14 02:54:20 +00:00
|
|
|
|
2016-06-29 18:00:11 +00:00
|
|
|
s.portIndex = 0
|
2016-06-14 02:54:20 +00:00
|
|
|
s.ds.TearDownTest(c)
|
|
|
|
}
|
|
|
|
|
2017-07-12 20:31:13 +00:00
|
|
|
func init() {
|
|
|
|
check.Suite(&DockerPluginSuite{
|
|
|
|
ds: &DockerSuite{},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
type DockerPluginSuite struct {
|
|
|
|
ds *DockerSuite
|
|
|
|
registry *registry.V2
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *DockerPluginSuite) registryHost() string {
|
|
|
|
return privateRegistryURL
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *DockerPluginSuite) getPluginRepo() string {
|
|
|
|
return path.Join(ps.registryHost(), "plugin", "basic")
|
|
|
|
}
|
|
|
|
func (ps *DockerPluginSuite) getPluginRepoWithTag() string {
|
|
|
|
return ps.getPluginRepo() + ":" + "latest"
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *DockerPluginSuite) SetUpSuite(c *check.C) {
|
2017-09-14 17:17:49 +00:00
|
|
|
testRequires(c, DaemonIsLinux, registry.Hosting)
|
2017-07-12 20:31:13 +00:00
|
|
|
ps.registry = setupRegistry(c, false, "", "")
|
|
|
|
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
err := plugin.CreateInRegistry(ctx, ps.getPluginRepo(), nil)
|
|
|
|
c.Assert(err, checker.IsNil, check.Commentf("failed to create plugin"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *DockerPluginSuite) TearDownSuite(c *check.C) {
|
|
|
|
if ps.registry != nil {
|
|
|
|
ps.registry.Close()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *DockerPluginSuite) TearDownTest(c *check.C) {
|
|
|
|
ps.ds.TearDownTest(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ps *DockerPluginSuite) OnTimeout(c *check.C) {
|
|
|
|
ps.ds.OnTimeout(c)
|
|
|
|
}
|