7582: More tests, add vwd support
authorPeter Amstutz <peter.amstutz@curoverse.com>
Wed, 21 Oct 2015 17:38:57 +0000 (13:38 -0400)
committerPeter Amstutz <peter.amstutz@curoverse.com>
Wed, 21 Oct 2015 17:38:57 +0000 (13:38 -0400)
sdk/go/crunchrunner/crunchrunner.go
sdk/go/crunchrunner/crunchrunner_test.go

index b8b6234f91d32fd4ca645433c1b89ec0970b013f..0ca7ce9e9bd1f118423495547771a3a207bfff16 100644 (file)
@@ -12,13 +12,13 @@ import (
 
 type TaskDef struct {
        commands           []string          `json:"commands"`
-       env                map[string]string `json:"task.env"`
-       stdin              string            `json:"task.stdin"`
-       stdout             string            `json:"task.stdout"`
-       vwd                map[string]string `json:"task.vwd"`
-       successCodes       []int             `json:"task.successCodes"`
-       permanentFailCodes []int             `json:"task.permanentFailCodes"`
-       temporaryFailCodes []int             `json:"task.temporaryFailCodes"`
+       env                map[string]string `json:"env"`
+       stdin              string            `json:"stdin"`
+       stdout             string            `json:"stdout"`
+       vwd                map[string]string `json:"vwd"`
+       successCodes       []int             `json:"successCodes"`
+       permanentFailCodes []int             `json:"permanentFailCodes"`
+       temporaryFailCodes []int             `json:"temporaryFailCodes"`
 }
 
 type Tasks struct {
@@ -39,7 +39,7 @@ type Task struct {
        progress                 float32 `json:"sequence"`
 }
 
-func setupDirectories(tmpdir string) (outdir string, err error) {
+func setupDirectories(tmpdir, taskUuid string) (outdir string, err error) {
        err = os.Chdir(tmpdir)
        if err != nil {
                return "", err
@@ -50,12 +50,12 @@ func setupDirectories(tmpdir string) (outdir string, err error) {
                return "", err
        }
 
-       err = os.Mkdir("outdir", 0700)
+       err = os.Mkdir(taskUuid, 0700)
        if err != nil {
                return "", err
        }
 
-       os.Chdir("outdir")
+       os.Chdir(taskUuid)
        if err != nil {
                return "", err
        }
@@ -71,16 +71,17 @@ func setupDirectories(tmpdir string) (outdir string, err error) {
 func setupCommand(cmd *exec.Cmd, taskp TaskDef, keepmount, outdir string) error {
        var err error
 
-       //if taskp.vwd != nil {
-       // Set up VWD symlinks in outdir
-       // TODO
-       //}
+       if taskp.vwd != nil {
+               for k, v := range taskp.vwd {
+                       os.Symlink(keepmount+"/"+v, outdir+"/"+k)
+               }
+       }
 
        if taskp.stdin != "" {
                // Set up stdin redirection
                cmd.Stdin, err = os.Open(keepmount + "/" + taskp.stdin)
                if err != nil {
-                       log.Fatal(err)
+                       return err
                }
        }
 
@@ -88,7 +89,7 @@ func setupCommand(cmd *exec.Cmd, taskp TaskDef, keepmount, outdir string) error
                // Set up stdout redirection
                cmd.Stdout, err = os.Create(outdir + "/" + taskp.stdout)
                if err != nil {
-                       log.Fatal(err)
+                       return err
                }
        } else {
                cmd.Stdout = os.Stdout
@@ -183,7 +184,7 @@ func runner(api arvadosclient.IArvadosClient,
        cmd := exec.Command(taskp.commands[0], taskp.commands[1:]...)
 
        var outdir string
-       outdir, err = setupDirectories(tmpdir)
+       outdir, err = setupDirectories(tmpdir, taskUuid)
        if err != nil {
                return TempFail{err}
        }
@@ -203,7 +204,11 @@ func runner(api arvadosclient.IArvadosClient,
        err = cmd.Run()
 
        if err != nil {
-               return TempFail{err}
+               // Run() returns ExitError on non-zero exit code, but we handle
+               // that down below.  So only return if it's not ExitError.
+               if _, ok := err.(*exec.ExitError); !ok {
+                       return TempFail{err}
+               }
        }
 
        const success = 1
@@ -218,7 +223,7 @@ func runner(api arvadosclient.IArvadosClient,
        } else if inCodes(exitCode, taskp.permanentFailCodes) {
                status = permfail
        } else if inCodes(exitCode, taskp.temporaryFailCodes) {
-               os.Exit(TASK_TEMPFAIL)
+               return TempFail{nil}
        } else if cmd.ProcessState.Success() {
                status = success
        } else {
index 127c434bc947ec9a0f4f8fe4c4c976a854828a79..29b092b2ab05a33bc8645be764931d74ae1730c0 100644 (file)
@@ -63,7 +63,7 @@ func (s *TestSuite) TestSimpleRun(c *C) {
 }
 
 func checkOutput(c *C, tmpdir string) {
-       file, err := os.Open(tmpdir + "/" + "outdir/output.txt")
+       file, err := os.Open(tmpdir + "/zzzz-ot0gb-111111111111111/output.txt")
        c.Assert(err, IsNil)
 
        data := make([]byte, 100)
@@ -105,8 +105,8 @@ func (s *TestSuite) TestRedirect(c *C) {
 
        tmpfile, _ := ioutil.TempFile("", "")
        tmpfile.Write([]byte("foo\n"))
-       tmpfile.Sync()
-       defer tmpfile.Close()
+       tmpfile.Close()
+       defer os.Remove(tmpfile.Name())
 
        tmpdir, _ := ioutil.TempDir("", "")
        defer func() {
@@ -213,3 +213,111 @@ func (s *TestSuite) TestScheduleSubtask(c *C) {
        c.Check(err, IsNil)
 
 }
+
+func (s *TestSuite) TestRunFail(c *C) {
+
+       api := ArvTestClient{}
+
+       tmpdir, _ := ioutil.TempDir("", "")
+       defer func() {
+               os.RemoveAll(tmpdir)
+       }()
+
+       err := runner(api,
+               "zzzz-8i9sb-111111111111111",
+               "zzzz-ot0gb-111111111111111",
+               tmpdir,
+               "",
+               Job{script_parameters: Tasks{[]TaskDef{TaskDef{
+                       commands: []string{"/bin/sh", "-c", "exit 1"}}}}},
+               Task{sequence: 0})
+       c.Check(err, FitsTypeOf, PermFail{})
+}
+
+func (s *TestSuite) TestRunSuccessCode(c *C) {
+
+       api := ArvTestClient{}
+
+       tmpdir, _ := ioutil.TempDir("", "")
+       defer func() {
+               os.RemoveAll(tmpdir)
+       }()
+
+       err := runner(api,
+               "zzzz-8i9sb-111111111111111",
+               "zzzz-ot0gb-111111111111111",
+               tmpdir,
+               "",
+               Job{script_parameters: Tasks{[]TaskDef{TaskDef{
+                       commands:     []string{"/bin/sh", "-c", "exit 1"},
+                       successCodes: []int{0, 1}}}}},
+               Task{sequence: 0})
+       c.Check(err, IsNil)
+}
+
+func (s *TestSuite) TestRunFailCode(c *C) {
+       api := ArvTestClient{}
+
+       tmpdir, _ := ioutil.TempDir("", "")
+       defer func() {
+               os.RemoveAll(tmpdir)
+       }()
+
+       err := runner(api,
+               "zzzz-8i9sb-111111111111111",
+               "zzzz-ot0gb-111111111111111",
+               tmpdir,
+               "",
+               Job{script_parameters: Tasks{[]TaskDef{TaskDef{
+                       commands:           []string{"/bin/sh", "-c", "exit 0"},
+                       permanentFailCodes: []int{0, 1}}}}},
+               Task{sequence: 0})
+       c.Check(err, FitsTypeOf, PermFail{})
+}
+
+func (s *TestSuite) TestRunTempFailCode(c *C) {
+       api := ArvTestClient{}
+
+       tmpdir, _ := ioutil.TempDir("", "")
+       defer func() {
+               os.RemoveAll(tmpdir)
+       }()
+
+       err := runner(api,
+               "zzzz-8i9sb-111111111111111",
+               "zzzz-ot0gb-111111111111111",
+               tmpdir,
+               "",
+               Job{script_parameters: Tasks{[]TaskDef{TaskDef{
+                       commands:           []string{"/bin/sh", "-c", "exit 1"},
+                       temporaryFailCodes: []int{1}}}}},
+               Task{sequence: 0})
+       c.Check(err, FitsTypeOf, TempFail{})
+}
+
+func (s *TestSuite) TestVwd(c *C) {
+       api := ArvTestClient{}
+
+       tmpfile, _ := ioutil.TempFile("", "")
+       tmpfile.Write([]byte("foo\n"))
+       tmpfile.Close()
+       defer os.Remove(tmpfile.Name())
+
+       tmpdir, _ := ioutil.TempDir("", "")
+       defer func() {
+               os.RemoveAll(tmpdir)
+       }()
+
+       err := runner(api,
+               "zzzz-8i9sb-111111111111111",
+               "zzzz-ot0gb-111111111111111",
+               tmpdir,
+               "",
+               Job{script_parameters: Tasks{[]TaskDef{TaskDef{
+                       commands: []string{"ls", "output.txt"},
+                       vwd: map[string]string{
+                               "output.txt": tmpfile.Name()}}}}},
+               Task{sequence: 0})
+       c.Check(err, IsNil)
+       checkOutput(c, tmpdir)
+}