Fixed docker tests
This commit is contained in:
parent
b71f687f62
commit
839ecd1df6
|
@ -49,7 +49,10 @@ func dockerTask() (*structs.Task, int, int) {
|
||||||
return &structs.Task{
|
return &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "redis-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"image": "busybox",
|
||||||
|
"load": []string{"busybox.tar"},
|
||||||
|
"command": "/bin/nc",
|
||||||
|
"args": []string{"-l", "127.0.0.1", "0"},
|
||||||
},
|
},
|
||||||
LogConfig: &structs.LogConfig{
|
LogConfig: &structs.LogConfig{
|
||||||
MaxFiles: 10,
|
MaxFiles: 10,
|
||||||
|
@ -92,6 +95,7 @@ func dockerSetup(t *testing.T, task *structs.Task) (*docker.Client, DriverHandle
|
||||||
|
|
||||||
driverCtx, execCtx := testDriverContexts(task)
|
driverCtx, execCtx := testDriverContexts(task)
|
||||||
driver := NewDockerDriver(driverCtx)
|
driver := NewDockerDriver(driverCtx)
|
||||||
|
copyImage(execCtx, task, t)
|
||||||
|
|
||||||
handle, err := driver.Start(execCtx, task)
|
handle, err := driver.Start(execCtx, task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -113,7 +117,6 @@ func dockerSetup(t *testing.T, task *structs.Task) (*docker.Client, DriverHandle
|
||||||
|
|
||||||
// This test should always pass, even if docker daemon is not available
|
// This test should always pass, even if docker daemon is not available
|
||||||
func TestDockerDriver_Fingerprint(t *testing.T) {
|
func TestDockerDriver_Fingerprint(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
driverCtx, _ := testDriverContexts(&structs.Task{Name: "foo"})
|
driverCtx, _ := testDriverContexts(&structs.Task{Name: "foo"})
|
||||||
d := NewDockerDriver(driverCtx)
|
d := NewDockerDriver(driverCtx)
|
||||||
node := &structs.Node{
|
node := &structs.Node{
|
||||||
|
@ -133,15 +136,17 @@ func TestDockerDriver_Fingerprint(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_StartOpen_Wait(t *testing.T) {
|
func TestDockerDriver_StartOpen_Wait(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
if !testutil.DockerIsConnected(t) {
|
if !testutil.DockerIsConnected(t) {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "nc-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"load": []string{"busybox.tar"},
|
||||||
|
"image": "busybox",
|
||||||
|
"command": "/bin/nc",
|
||||||
|
"args": []string{"-l", "127.0.0.1", "0"},
|
||||||
},
|
},
|
||||||
LogConfig: &structs.LogConfig{
|
LogConfig: &structs.LogConfig{
|
||||||
MaxFiles: 10,
|
MaxFiles: 10,
|
||||||
|
@ -153,6 +158,7 @@ func TestDockerDriver_StartOpen_Wait(t *testing.T) {
|
||||||
driverCtx, execCtx := testDriverContexts(task)
|
driverCtx, execCtx := testDriverContexts(task)
|
||||||
defer execCtx.AllocDir.Destroy()
|
defer execCtx.AllocDir.Destroy()
|
||||||
d := NewDockerDriver(driverCtx)
|
d := NewDockerDriver(driverCtx)
|
||||||
|
copyImage(execCtx, task, t)
|
||||||
|
|
||||||
handle, err := d.Start(execCtx, task)
|
handle, err := d.Start(execCtx, task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -174,13 +180,13 @@ func TestDockerDriver_StartOpen_Wait(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_Start_Wait(t *testing.T) {
|
func TestDockerDriver_Start_Wait(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "nc-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"load": []string{"busybox.tar"},
|
||||||
"command": "/usr/local/bin/redis-server",
|
"image": "busybox",
|
||||||
"args": []string{"-v"},
|
"command": "/bin/echo",
|
||||||
|
"args": []string{"hello"},
|
||||||
},
|
},
|
||||||
Resources: &structs.Resources{
|
Resources: &structs.Resources{
|
||||||
MemoryMB: 256,
|
MemoryMB: 256,
|
||||||
|
@ -212,7 +218,6 @@ func TestDockerDriver_Start_Wait(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_Start_LoadImage(t *testing.T) {
|
func TestDockerDriver_Start_LoadImage(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
if !testutil.DockerIsConnected(t) {
|
if !testutil.DockerIsConnected(t) {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
|
@ -278,7 +283,6 @@ func TestDockerDriver_Start_LoadImage(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_Start_Wait_AllocDir(t *testing.T) {
|
func TestDockerDriver_Start_Wait_AllocDir(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
// This test requires that the alloc dir be mounted into docker as a volume.
|
// This test requires that the alloc dir be mounted into docker as a volume.
|
||||||
// Because this cannot happen when docker is run remotely, e.g. when running
|
// Because this cannot happen when docker is run remotely, e.g. when running
|
||||||
// docker in a VM, we skip this when we detect Docker is being run remotely.
|
// docker in a VM, we skip this when we detect Docker is being run remotely.
|
||||||
|
@ -289,10 +293,11 @@ func TestDockerDriver_Start_Wait_AllocDir(t *testing.T) {
|
||||||
exp := []byte{'w', 'i', 'n'}
|
exp := []byte{'w', 'i', 'n'}
|
||||||
file := "output.txt"
|
file := "output.txt"
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "nc-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"image": "busybox",
|
||||||
"command": "/bin/bash",
|
"load": []string{"busybox.tar"},
|
||||||
|
"command": "/bin/sh",
|
||||||
"args": []string{
|
"args": []string{
|
||||||
"-c",
|
"-c",
|
||||||
fmt.Sprintf(`sleep 1; echo -n %s > $%s/%s`,
|
fmt.Sprintf(`sleep 1; echo -n %s > $%s/%s`,
|
||||||
|
@ -312,6 +317,7 @@ func TestDockerDriver_Start_Wait_AllocDir(t *testing.T) {
|
||||||
driverCtx, execCtx := testDriverContexts(task)
|
driverCtx, execCtx := testDriverContexts(task)
|
||||||
defer execCtx.AllocDir.Destroy()
|
defer execCtx.AllocDir.Destroy()
|
||||||
d := NewDockerDriver(driverCtx)
|
d := NewDockerDriver(driverCtx)
|
||||||
|
copyImage(execCtx, task, t)
|
||||||
|
|
||||||
handle, err := d.Start(execCtx, task)
|
handle, err := d.Start(execCtx, task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -344,11 +350,11 @@ func TestDockerDriver_Start_Wait_AllocDir(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_Start_Kill_Wait(t *testing.T) {
|
func TestDockerDriver_Start_Kill_Wait(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "nc-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"image": "busybox",
|
||||||
|
"load": []string{"busybox.tar"},
|
||||||
"command": "/bin/sleep",
|
"command": "/bin/sleep",
|
||||||
"args": []string{"10"},
|
"args": []string{"10"},
|
||||||
},
|
},
|
||||||
|
@ -381,7 +387,6 @@ func TestDockerDriver_Start_Kill_Wait(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_StartN(t *testing.T) {
|
func TestDockerDriver_StartN(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
if !testutil.DockerIsConnected(t) {
|
if !testutil.DockerIsConnected(t) {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
|
@ -401,6 +406,7 @@ func TestDockerDriver_StartN(t *testing.T) {
|
||||||
driverCtx, execCtx := testDriverContexts(task)
|
driverCtx, execCtx := testDriverContexts(task)
|
||||||
defer execCtx.AllocDir.Destroy()
|
defer execCtx.AllocDir.Destroy()
|
||||||
d := NewDockerDriver(driverCtx)
|
d := NewDockerDriver(driverCtx)
|
||||||
|
copyImage(execCtx, task, t)
|
||||||
|
|
||||||
handles[idx], err = d.Start(execCtx, task)
|
handles[idx], err = d.Start(execCtx, task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -426,19 +432,21 @@ func TestDockerDriver_StartN(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_StartNVersions(t *testing.T) {
|
func TestDockerDriver_StartNVersions(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
if !testutil.DockerIsConnected(t) {
|
if !testutil.DockerIsConnected(t) {
|
||||||
t.SkipNow()
|
t.SkipNow()
|
||||||
}
|
}
|
||||||
|
|
||||||
task1, _, _ := dockerTask()
|
task1, _, _ := dockerTask()
|
||||||
task1.Config["image"] = "redis"
|
task1.Config["image"] = "busybox"
|
||||||
|
task1.Config["load"] = []string{"busybox.tar"}
|
||||||
|
|
||||||
task2, _, _ := dockerTask()
|
task2, _, _ := dockerTask()
|
||||||
task2.Config["image"] = "redis:latest"
|
task2.Config["image"] = "busybox:musl"
|
||||||
|
task2.Config["load"] = []string{"busybox_musl.tar"}
|
||||||
|
|
||||||
task3, _, _ := dockerTask()
|
task3, _, _ := dockerTask()
|
||||||
task3.Config["image"] = "redis:3.0"
|
task3.Config["image"] = "busybox:glibc"
|
||||||
|
task3.Config["load"] = []string{"busybox_glibc.tar"}
|
||||||
|
|
||||||
taskList := []*structs.Task{task1, task2, task3}
|
taskList := []*structs.Task{task1, task2, task3}
|
||||||
|
|
||||||
|
@ -452,6 +460,7 @@ func TestDockerDriver_StartNVersions(t *testing.T) {
|
||||||
driverCtx, execCtx := testDriverContexts(task)
|
driverCtx, execCtx := testDriverContexts(task)
|
||||||
defer execCtx.AllocDir.Destroy()
|
defer execCtx.AllocDir.Destroy()
|
||||||
d := NewDockerDriver(driverCtx)
|
d := NewDockerDriver(driverCtx)
|
||||||
|
copyImage(execCtx, task, t)
|
||||||
|
|
||||||
handles[idx], err = d.Start(execCtx, task)
|
handles[idx], err = d.Start(execCtx, task)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -492,13 +501,15 @@ func waitForExist(t *testing.T, client *docker.Client, handle *DockerHandle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_NetworkMode_Host(t *testing.T) {
|
func TestDockerDriver_NetworkMode_Host(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
expected := "host"
|
expected := "host"
|
||||||
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "nc-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"image": "busybox",
|
||||||
|
"load": []string{"busybox.tar"},
|
||||||
|
"command": "/bin/nc",
|
||||||
|
"args": []string{"-l", "127.0.0.1", "0"},
|
||||||
"network_mode": expected,
|
"network_mode": expected,
|
||||||
},
|
},
|
||||||
Resources: &structs.Resources{
|
Resources: &structs.Resources{
|
||||||
|
@ -528,7 +539,6 @@ func TestDockerDriver_NetworkMode_Host(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_Labels(t *testing.T) {
|
func TestDockerDriver_Labels(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task, _, _ := dockerTask()
|
task, _, _ := dockerTask()
|
||||||
task.Config["labels"] = []map[string]string{
|
task.Config["labels"] = []map[string]string{
|
||||||
map[string]string{
|
map[string]string{
|
||||||
|
@ -557,7 +567,6 @@ func TestDockerDriver_Labels(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_DNS(t *testing.T) {
|
func TestDockerDriver_DNS(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task, _, _ := dockerTask()
|
task, _, _ := dockerTask()
|
||||||
task.Config["dns_servers"] = []string{"8.8.8.8", "8.8.4.4"}
|
task.Config["dns_servers"] = []string{"8.8.8.8", "8.8.4.4"}
|
||||||
task.Config["dns_search_domains"] = []string{"example.com", "example.org", "example.net"}
|
task.Config["dns_search_domains"] = []string{"example.com", "example.org", "example.net"}
|
||||||
|
@ -582,7 +591,6 @@ func TestDockerDriver_DNS(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerWorkDir(t *testing.T) {
|
func TestDockerWorkDir(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task, _, _ := dockerTask()
|
task, _, _ := dockerTask()
|
||||||
task.Config["work_dir"] = "/some/path"
|
task.Config["work_dir"] = "/some/path"
|
||||||
|
|
||||||
|
@ -609,7 +617,6 @@ func inSlice(needle string, haystack []string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_PortsNoMap(t *testing.T) {
|
func TestDockerDriver_PortsNoMap(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task, res, dyn := dockerTask()
|
task, res, dyn := dockerTask()
|
||||||
|
|
||||||
client, handle, cleanup := dockerSetup(t, task)
|
client, handle, cleanup := dockerSetup(t, task)
|
||||||
|
@ -628,8 +635,6 @@ func TestDockerDriver_PortsNoMap(t *testing.T) {
|
||||||
docker.Port(fmt.Sprintf("%d/udp", res)): struct{}{},
|
docker.Port(fmt.Sprintf("%d/udp", res)): struct{}{},
|
||||||
docker.Port(fmt.Sprintf("%d/tcp", dyn)): struct{}{},
|
docker.Port(fmt.Sprintf("%d/tcp", dyn)): struct{}{},
|
||||||
docker.Port(fmt.Sprintf("%d/udp", dyn)): struct{}{},
|
docker.Port(fmt.Sprintf("%d/udp", dyn)): struct{}{},
|
||||||
// This one comes from the redis container
|
|
||||||
docker.Port("6379/tcp"): struct{}{},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if !reflect.DeepEqual(container.Config.ExposedPorts, expectedExposedPorts) {
|
if !reflect.DeepEqual(container.Config.ExposedPorts, expectedExposedPorts) {
|
||||||
|
@ -662,7 +667,6 @@ func TestDockerDriver_PortsNoMap(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_PortsMapping(t *testing.T) {
|
func TestDockerDriver_PortsMapping(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task, res, dyn := dockerTask()
|
task, res, dyn := dockerTask()
|
||||||
task.Config["port_map"] = []map[string]string{
|
task.Config["port_map"] = []map[string]string{
|
||||||
map[string]string{
|
map[string]string{
|
||||||
|
@ -720,14 +724,13 @@ func TestDockerDriver_PortsMapping(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_User(t *testing.T) {
|
func TestDockerDriver_User(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "redis-demo",
|
||||||
User: "alice",
|
User: "alice",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "redis",
|
"image": "busybox",
|
||||||
"command": "sleep",
|
"load": []string{"busybox.tar"},
|
||||||
|
"command": "/bin/sleep",
|
||||||
"args": []string{"10000"},
|
"args": []string{"10000"},
|
||||||
},
|
},
|
||||||
Resources: &structs.Resources{
|
Resources: &structs.Resources{
|
||||||
|
@ -747,6 +750,7 @@ func TestDockerDriver_User(t *testing.T) {
|
||||||
driverCtx, execCtx := testDriverContexts(task)
|
driverCtx, execCtx := testDriverContexts(task)
|
||||||
driver := NewDockerDriver(driverCtx)
|
driver := NewDockerDriver(driverCtx)
|
||||||
defer execCtx.AllocDir.Destroy()
|
defer execCtx.AllocDir.Destroy()
|
||||||
|
copyImage(execCtx, task, t)
|
||||||
|
|
||||||
// It should fail because the user "alice" does not exist on the given
|
// It should fail because the user "alice" does not exist on the given
|
||||||
// image.
|
// image.
|
||||||
|
@ -757,8 +761,7 @@ func TestDockerDriver_User(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
msgs := []string{
|
msgs := []string{
|
||||||
"System error: Unable to find user alice",
|
"linux spec user",
|
||||||
"linux spec user: Unable to find user alice",
|
|
||||||
}
|
}
|
||||||
var found bool
|
var found bool
|
||||||
for _, msg := range msgs {
|
for _, msg := range msgs {
|
||||||
|
@ -773,11 +776,11 @@ func TestDockerDriver_User(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_CleanupContainer(t *testing.T) {
|
func TestDockerDriver_CleanupContainer(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "redis-demo",
|
Name: "redis-demo",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "busybox",
|
"image": "busybox",
|
||||||
|
"load": []string{"busybox.tar"},
|
||||||
"command": "/bin/echo",
|
"command": "/bin/echo",
|
||||||
"args": []string{"hello"},
|
"args": []string{"hello"},
|
||||||
},
|
},
|
||||||
|
@ -817,15 +820,14 @@ func TestDockerDriver_CleanupContainer(t *testing.T) {
|
||||||
case <-time.After(time.Duration(tu.TestMultiplier()*5) * time.Second):
|
case <-time.After(time.Duration(tu.TestMultiplier()*5) * time.Second):
|
||||||
t.Fatalf("timeout")
|
t.Fatalf("timeout")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDockerDriver_Stats(t *testing.T) {
|
func TestDockerDriver_Stats(t *testing.T) {
|
||||||
t.Parallel()
|
|
||||||
task := &structs.Task{
|
task := &structs.Task{
|
||||||
Name: "sleep",
|
Name: "sleep",
|
||||||
Config: map[string]interface{}{
|
Config: map[string]interface{}{
|
||||||
"image": "busybox",
|
"image": "busybox",
|
||||||
|
"load": []string{"busybox.tar"},
|
||||||
"command": "/bin/sleep",
|
"command": "/bin/sleep",
|
||||||
"args": []string{"100"},
|
"args": []string{"100"},
|
||||||
},
|
},
|
||||||
|
@ -867,3 +869,9 @@ func TestDockerDriver_Stats(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func copyImage(execCtx *ExecContext, task *structs.Task, t *testing.T) {
|
||||||
|
taskDir, _ := execCtx.AllocDir.TaskDirs[task.Name]
|
||||||
|
dst := filepath.Join(taskDir, allocdir.TaskLocal, "busybox.tar")
|
||||||
|
copyFile("./test-resources/docker/busybox.tar", dst, t)
|
||||||
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -11,8 +11,9 @@ go build -o $TEMPDIR/nomad || exit 1
|
||||||
# Run the tests
|
# Run the tests
|
||||||
echo "--> Running tests"
|
echo "--> Running tests"
|
||||||
GOBIN="`which go`"
|
GOBIN="`which go`"
|
||||||
go list ./... | grep -v '^github.com/hashicorp/nomad/vendor/' | \
|
$GOBIN test -v -timeout=900s github.com/hashicorp/nomad/client/driver -run "TestDockerDriver*"
|
||||||
sudo \
|
#go list ./... | grep -v '^github.com/hashicorp/nomad/vendor/' | \
|
||||||
-E PATH=$TEMPDIR:$PATH \
|
# sudo \
|
||||||
-E GOPATH=$GOPATH \
|
# -E PATH=$TEMPDIR:$PATH \
|
||||||
xargs $GOBIN test -v ${GOTEST_FLAGS:--cover -timeout=900s}
|
# -E GOPATH=$GOPATH \
|
||||||
|
# xargs $GOBIN test -v ${GOTEST_FLAGS:--cover -timeout=900s}
|
||||||
|
|
Loading…
Reference in New Issue