diff --git a/drivers/rawexec/driver_test.go b/drivers/rawexec/driver_test.go index 186475747..d07583131 100644 --- a/drivers/rawexec/driver_test.go +++ b/drivers/rawexec/driver_test.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "strconv" "sync" "syscall" @@ -25,7 +26,6 @@ import ( pstructs "github.com/hashicorp/nomad/plugins/shared/structs" "github.com/hashicorp/nomad/testutil" "github.com/stretchr/testify/require" - "golang.org/x/sys/unix" ) func TestMain(m *testing.M) { @@ -164,73 +164,6 @@ func TestRawExecDriver_StartWait(t *testing.T) { require.NoError(harness.DestroyTask(task.ID, true)) } -func TestRawExecDriver_StartWaitStop(t *testing.T) { - t.Parallel() - require := require.New(t) - - d := NewRawExecDriver(testlog.HCLogger(t)) - harness := dtestutil.NewDriverHarness(t, d) - defer harness.Kill() - - // Disable cgroups so test works without root - config := &Config{NoCgroups: true} - var data []byte - require.NoError(basePlug.MsgPackEncode(&data, config)) - bconfig := &basePlug.Config{PluginConfig: data} - require.NoError(harness.SetConfig(bconfig)) - - task := &drivers.TaskConfig{ - ID: uuid.Generate(), - Name: "test", - } - - taskConfig := map[string]interface{}{} - taskConfig["command"] = testtask.Path() - taskConfig["args"] = []string{"sleep", "100s"} - - encodeDriverHelper(require, task, taskConfig) - - cleanup := harness.MkAllocDir(task, false) - defer cleanup() - - handle, _, err := harness.StartTask(task) - require.NoError(err) - - ch, err := harness.WaitTask(context.Background(), handle.Config.ID) - require.NoError(err) - - require.NoError(harness.WaitUntilStarted(task.ID, 1*time.Second)) - - go func() { - harness.StopTask(task.ID, 2*time.Second, "SIGINT") - }() - - select { - case result := <-ch: - require.Equal(int(unix.SIGINT), result.Signal) - case <-time.After(10 * time.Second): - require.Fail("timeout waiting for task to shutdown") - } - - // Ensure that the task is marked as dead, but account - // for WaitTask() closing channel before internal state is updated - testutil.WaitForResult(func() (bool, error) { - status, err := harness.InspectTask(task.ID) - if err != nil { - return false, fmt.Errorf("inspecting task failed: %v", err) - } - if status.State != drivers.TaskStateExited { - return false, fmt.Errorf("task hasn't exited yet; status: %v", status.State) - } - - return true, nil - }, func(err error) { - require.NoError(err) - }) - - require.NoError(harness.DestroyTask(task.ID, true)) -} - func TestRawExecDriver_StartWaitRecoverWaitStop(t *testing.T) { t.Parallel() require := require.New(t) @@ -312,7 +245,6 @@ func TestRawExecDriver_StartWaitRecoverWaitStop(t *testing.T) { wg.Wait() require.NoError(d.DestroyTask(task.ID, false)) require.True(waitDone) - } func TestRawExecDriver_Start_Wait_AllocDir(t *testing.T) { @@ -483,17 +415,31 @@ func TestRawExecDriver_Exec(t *testing.T) { _, _, err := harness.StartTask(task) require.NoError(err) - // Exec a command that should work - res, err := harness.ExecTask(task.ID, []string{"/usr/bin/stat", "/tmp"}, 1*time.Second) - require.NoError(err) - require.True(res.ExitResult.Successful()) - require.True(len(res.Stdout) > 100) + if runtime.GOOS == "windows" { + // Exec a command that should work + res, err := harness.ExecTask(task.ID, []string{"echo", "hello"}, 1*time.Second) + require.NoError(err) + require.True(res.ExitResult.Successful()) + require.True(len(res.Stdout) > 100) - // Exec a command that should fail - res, err = harness.ExecTask(task.ID, []string{"/usr/bin/stat", "notarealfile123abc"}, 1*time.Second) - require.NoError(err) - require.False(res.ExitResult.Successful()) - require.Contains(string(res.Stdout), "No such file or directory") + // Exec a command that should fail + res, err = harness.ExecTask(task.ID, []string{"stat", "notarealfile123abc"}, 1*time.Second) + require.NoError(err) + require.False(res.ExitResult.Successful()) + require.Contains(string(res.Stdout), "not recognized") + } else { + // Exec a command that should work + res, err := harness.ExecTask(task.ID, []string{"/usr/bin/stat", "/tmp"}, 1*time.Second) + require.NoError(err) + require.True(res.ExitResult.Successful()) + require.True(len(res.Stdout) > 100) + + // Exec a command that should fail + res, err = harness.ExecTask(task.ID, []string{"/usr/bin/stat", "notarealfile123abc"}, 1*time.Second) + require.NoError(err) + require.False(res.ExitResult.Successful()) + require.Contains(string(res.Stdout), "No such file or directory") + } require.NoError(harness.DestroyTask(task.ID, true)) } diff --git a/drivers/rawexec/driver_unix_test.go b/drivers/rawexec/driver_unix_test.go index 3682a6753..568f16ebe 100644 --- a/drivers/rawexec/driver_unix_test.go +++ b/drivers/rawexec/driver_unix_test.go @@ -16,10 +16,12 @@ import ( "github.com/hashicorp/nomad/helper/testlog" "github.com/hashicorp/nomad/helper/testtask" "github.com/hashicorp/nomad/helper/uuid" + basePlug "github.com/hashicorp/nomad/plugins/base" "github.com/hashicorp/nomad/plugins/drivers" dtestutil "github.com/hashicorp/nomad/plugins/drivers/testutils" "github.com/hashicorp/nomad/testutil" "github.com/stretchr/testify/require" + "golang.org/x/sys/unix" ) func TestRawExecDriver_User(t *testing.T) { @@ -128,3 +130,70 @@ done return true, nil }, func(err error) { require.NoError(err) }) } + +func TestRawExecDriver_StartWaitStop(t *testing.T) { + t.Parallel() + require := require.New(t) + + d := NewRawExecDriver(testlog.HCLogger(t)) + harness := dtestutil.NewDriverHarness(t, d) + defer harness.Kill() + + // Disable cgroups so test works without root + config := &Config{NoCgroups: true} + var data []byte + require.NoError(basePlug.MsgPackEncode(&data, config)) + bconfig := &basePlug.Config{PluginConfig: data} + require.NoError(harness.SetConfig(bconfig)) + + task := &drivers.TaskConfig{ + ID: uuid.Generate(), + Name: "test", + } + + taskConfig := map[string]interface{}{} + taskConfig["command"] = testtask.Path() + taskConfig["args"] = []string{"sleep", "100s"} + + encodeDriverHelper(require, task, taskConfig) + + cleanup := harness.MkAllocDir(task, false) + defer cleanup() + + handle, _, err := harness.StartTask(task) + require.NoError(err) + + ch, err := harness.WaitTask(context.Background(), handle.Config.ID) + require.NoError(err) + + require.NoError(harness.WaitUntilStarted(task.ID, 1*time.Second)) + + go func() { + harness.StopTask(task.ID, 2*time.Second, "SIGINT") + }() + + select { + case result := <-ch: + require.Equal(int(unix.SIGINT), result.Signal) + case <-time.After(10 * time.Second): + require.Fail("timeout waiting for task to shutdown") + } + + // Ensure that the task is marked as dead, but account + // for WaitTask() closing channel before internal state is updated + testutil.WaitForResult(func() (bool, error) { + status, err := harness.InspectTask(task.ID) + if err != nil { + return false, fmt.Errorf("inspecting task failed: %v", err) + } + if status.State != drivers.TaskStateExited { + return false, fmt.Errorf("task hasn't exited yet; status: %v", status.State) + } + + return true, nil + }, func(err error) { + require.NoError(err) + }) + + require.NoError(harness.DestroyTask(task.ID, true)) +}