2016-03-24 23:33:04 +00:00
|
|
|
package executor
|
|
|
|
|
|
|
|
import (
|
2016-03-25 23:56:40 +00:00
|
|
|
"log"
|
|
|
|
"os"
|
2016-03-24 23:33:04 +00:00
|
|
|
"strings"
|
|
|
|
"testing"
|
2016-03-25 23:56:40 +00:00
|
|
|
"time"
|
2016-03-25 02:00:24 +00:00
|
|
|
|
|
|
|
docker "github.com/fsouza/go-dockerclient"
|
2016-03-25 23:56:40 +00:00
|
|
|
|
|
|
|
cstructs "github.com/hashicorp/nomad/client/driver/structs"
|
|
|
|
"github.com/hashicorp/nomad/client/testutil"
|
2016-03-24 23:33:04 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestExecScriptCheckNoIsolation(t *testing.T) {
|
|
|
|
check := &ExecScriptCheck{
|
|
|
|
id: "foo",
|
|
|
|
cmd: "/bin/echo",
|
|
|
|
args: []string{"hello", "world"},
|
|
|
|
taskDir: "/tmp",
|
|
|
|
FSIsolation: false,
|
|
|
|
}
|
|
|
|
|
|
|
|
res := check.Run()
|
|
|
|
expectedOutput := "hello world"
|
|
|
|
expectedExitCode := 0
|
|
|
|
if res.Err != nil {
|
|
|
|
t.Fatalf("err: %v", res.Err)
|
|
|
|
}
|
|
|
|
if strings.TrimSpace(res.Output) != expectedOutput {
|
|
|
|
t.Fatalf("output expected: %v, actual: %v", expectedOutput, res.Output)
|
|
|
|
}
|
|
|
|
|
|
|
|
if res.ExitCode != expectedExitCode {
|
|
|
|
t.Fatalf("exitcode expected: %v, actual: %v", expectedExitCode, res.ExitCode)
|
|
|
|
}
|
|
|
|
}
|
2016-03-25 23:56:40 +00:00
|
|
|
|
|
|
|
func TestExecScriptCheckWithIsolation(t *testing.T) {
|
|
|
|
testutil.ExecCompatible(t)
|
|
|
|
|
|
|
|
execCmd := ExecCommand{Cmd: "/bin/echo", Args: []string{"hello world"}}
|
|
|
|
ctx := testExecutorContext(t)
|
|
|
|
defer ctx.AllocDir.Destroy()
|
|
|
|
|
|
|
|
execCmd.FSIsolation = true
|
|
|
|
execCmd.ResourceLimits = true
|
|
|
|
execCmd.User = cstructs.DefaultUnpriviledgedUser
|
|
|
|
|
|
|
|
executor := NewExecutor(log.New(os.Stdout, "", log.LstdFlags))
|
|
|
|
_, err := executor.LaunchCmd(&execCmd, ctx)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error in launching command: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
check := &ExecScriptCheck{
|
|
|
|
id: "foo",
|
|
|
|
cmd: "/bin/echo",
|
|
|
|
args: []string{"hello", "world"},
|
2016-03-26 00:48:05 +00:00
|
|
|
taskDir: ctx.AllocDir.TaskDirs["web"],
|
2016-03-25 23:56:40 +00:00
|
|
|
FSIsolation: true,
|
|
|
|
}
|
|
|
|
|
|
|
|
res := check.Run()
|
|
|
|
expectedOutput := "hello world"
|
|
|
|
expectedExitCode := 0
|
|
|
|
if res.Err != nil {
|
|
|
|
t.Fatalf("err: %v", res.Err)
|
|
|
|
}
|
|
|
|
if strings.TrimSpace(res.Output) != expectedOutput {
|
|
|
|
t.Fatalf("output expected: %v, actual: %v", expectedOutput, res.Output)
|
|
|
|
}
|
|
|
|
|
|
|
|
if res.ExitCode != expectedExitCode {
|
|
|
|
t.Fatalf("exitcode expected: %v, actual: %v", expectedExitCode, res.ExitCode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestDockerScriptCheck(t *testing.T) {
|
2016-03-26 00:10:08 +00:00
|
|
|
if !testutil.DockerIsConnected(t) {
|
2016-03-25 23:56:40 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
client, err := docker.NewClientFromEnv()
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error creating docker client: %v", err)
|
|
|
|
}
|
|
|
|
|
2016-03-26 01:21:43 +00:00
|
|
|
if err := client.PullImage(docker.PullImageOptions{Repository: "busybox", Tag: "latest"},
|
2016-03-25 23:56:40 +00:00
|
|
|
docker.AuthConfiguration{}); err != nil {
|
|
|
|
t.Fatalf("error pulling redis: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
container, err := client.CreateContainer(docker.CreateContainerOptions{
|
|
|
|
Config: &docker.Config{
|
|
|
|
Image: "busybox",
|
|
|
|
Cmd: []string{"/bin/sleep", "1000"},
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("error creating container: %v", err)
|
|
|
|
}
|
2016-03-26 00:02:53 +00:00
|
|
|
defer removeContainer(client, container.ID)
|
2016-03-25 23:56:40 +00:00
|
|
|
|
|
|
|
if err := client.StartContainer(container.ID, &docker.HostConfig{}); err != nil {
|
|
|
|
t.Fatalf("error starting container", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
check := &DockerScriptCheck{
|
|
|
|
id: "1",
|
|
|
|
interval: 5 * time.Second,
|
|
|
|
containerID: container.ID,
|
|
|
|
logger: log.New(os.Stdout, "", log.LstdFlags),
|
|
|
|
cmd: "/bin/echo",
|
|
|
|
args: []string{"hello", "world"},
|
|
|
|
}
|
|
|
|
|
|
|
|
res := check.Run()
|
|
|
|
expectedOutput := "hello world"
|
|
|
|
expectedExitCode := 0
|
|
|
|
if res.Err != nil {
|
|
|
|
t.Fatalf("err: %v", res.Err)
|
|
|
|
}
|
|
|
|
if strings.TrimSpace(res.Output) != expectedOutput {
|
|
|
|
t.Fatalf("output expected: %v, actual: %v", expectedOutput, res.Output)
|
|
|
|
}
|
|
|
|
|
|
|
|
if res.ExitCode != expectedExitCode {
|
|
|
|
t.Fatalf("exitcode expected: %v, actual: %v", expectedExitCode, res.ExitCode)
|
|
|
|
}
|
|
|
|
}
|
2016-03-26 00:02:53 +00:00
|
|
|
|
|
|
|
// removeContainer kills and removes a container
|
|
|
|
func removeContainer(client *docker.Client, containerID string) {
|
|
|
|
client.KillContainer(docker.KillContainerOptions{ID: containerID})
|
|
|
|
client.RemoveContainer(docker.RemoveContainerOptions{ID: containerID, Force: true})
|
|
|
|
}
|