[ARVADOS] created: ad58141530559c7e0c7849811e83efe65ec33306

Git user git at public.curoverse.com
Thu Mar 10 22:25:24 EST 2016


        at  ad58141530559c7e0c7849811e83efe65ec33306 (commit)


commit ad58141530559c7e0c7849811e83efe65ec33306
Author: radhika <radhika at curoverse.com>
Date:   Thu Mar 10 22:24:06 2016 -0500

    6518: create sbatch and strigger commands using func declarations so that they can be overridden in tests.

diff --git a/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go b/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
index 7f41a0a..c945269 100644
--- a/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
+++ b/services/crunch-dispatch-slurm/crunch-dispatch-slurm.go
@@ -136,6 +136,17 @@ func dispatchSlurm(priorityPollInterval int, crunchRunCommand, finishCommand str
 	}
 }
 
+// sbatchCmd
+var sbatchCmd = func(uuid string) *exec.Cmd {
+	return exec.Command("sbatch", "--job-name="+uuid, "--share", "--parsable")
+}
+
+// striggerCmd
+var striggerCmd = func(jobid, containerUUID, finishCommand, apiHost, apiToken, apiInsecure string) *exec.Cmd {
+	return exec.Command("strigger", "--set", "--jobid="+jobid, "--fini",
+		fmt.Sprintf("--program=%s %s %s %s %s", finishCommand, apiHost, apiToken, apiInsecure, containerUUID))
+}
+
 func submit(container Container, crunchRunCommand string) (jobid string, submiterr error) {
 	submiterr = nil
 
@@ -152,7 +163,7 @@ func submit(container Container, crunchRunCommand string) (jobid string, submite
 		}
 	}()
 
-	cmd := exec.Command("sbatch", "--job-name="+container.UUID, "--share", "--parsable")
+	cmd := sbatchCmd(container.UUID)
 	stdinWriter, stdinerr := cmd.StdinPipe()
 	if stdinerr != nil {
 		submiterr = fmt.Errorf("Error creating stdin pipe %v: %q", container.UUID, stdinerr)
@@ -210,8 +221,7 @@ func submit(container Container, crunchRunCommand string) (jobid string, submite
 }
 
 func strigger(jobid, containerUUID, finishCommand, apiHost, apiToken, apiInsecure string) {
-	cmd := exec.Command("strigger", "--set", "--jobid="+jobid, "--fini",
-		fmt.Sprintf("--program=%s %s %s %s %s", finishCommand, apiHost, apiToken, apiInsecure, containerUUID))
+	cmd := striggerCmd(jobid, containerUUID, finishCommand, apiHost, apiToken, apiInsecure)
 	cmd.Stdout = os.Stdout
 	cmd.Stderr = os.Stderr
 	err := cmd.Run()
diff --git a/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go b/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
new file mode 100644
index 0000000..9b13f00
--- /dev/null
+++ b/services/crunch-dispatch-slurm/crunch-dispatch-slurm_test.go
@@ -0,0 +1,149 @@
+package main
+
+import (
+	"git.curoverse.com/arvados.git/sdk/go/arvadosclient"
+	"git.curoverse.com/arvados.git/sdk/go/arvadostest"
+
+	"io/ioutil"
+	"log"
+	"net/http"
+	"net/http/httptest"
+	"os"
+	"os/exec"
+	"strings"
+	"syscall"
+	"testing"
+	"time"
+
+	. "gopkg.in/check.v1"
+)
+
+// Gocheck boilerplate
+func Test(t *testing.T) {
+	TestingT(t)
+}
+
+var _ = Suite(&TestSuite{})
+var _ = Suite(&MockArvadosServerSuite{})
+
+type TestSuite struct{}
+type MockArvadosServerSuite struct{}
+
+var initialArgs []string
+
+func (s *TestSuite) SetUpSuite(c *C) {
+	initialArgs = os.Args
+	arvadostest.StartAPI()
+}
+
+func (s *TestSuite) TearDownSuite(c *C) {
+	arvadostest.StopAPI()
+}
+
+func (s *TestSuite) SetUpTest(c *C) {
+	args := []string{"crunch-dispatch-slurm"}
+	os.Args = args
+
+	var err error
+	arv, err = arvadosclient.MakeArvadosClient()
+	if err != nil {
+		c.Fatalf("Error making arvados client: %s", err)
+	}
+}
+
+func (s *TestSuite) TearDownTest(c *C) {
+	arvadostest.ResetEnv()
+	os.Args = initialArgs
+}
+
+func (s *MockArvadosServerSuite) TearDownTest(c *C) {
+	arvadostest.ResetEnv()
+}
+
+func (s *TestSuite) Test_doMain(c *C) {
+	args := []string{"-poll-interval", "2", "-container-priority-poll-interval", "1", "-crunch-run-command", "echo"}
+	os.Args = append(os.Args, args...)
+
+	// Override sbatchCmd
+	defer func(orig func(string) *exec.Cmd) {
+		sbatchCmd = orig
+	}(sbatchCmd)
+	sbatchCmd = func(uuid string) *exec.Cmd {
+		return exec.Command("echo", uuid)
+	}
+
+	// Override striggerCmd
+	defer func(orig func(jobid, containerUUID, finishCommand, apiHost, apiToken, apiInsecure string) *exec.Cmd) {
+		striggerCmd = orig
+	}(striggerCmd)
+	striggerCmd = func(jobid, containerUUID, finishCommand, apiHost, apiToken, apiInsecure string) *exec.Cmd {
+		go func() {
+			time.Sleep(5 * time.Second)
+			arv.Update("containers", containerUUID,
+				arvadosclient.Dict{
+					"container": arvadosclient.Dict{"state": "Complete"}},
+				nil)
+		}()
+		return exec.Command("echo", "strigger")
+	}
+
+	go func() {
+		time.Sleep(8 * time.Second)
+		sigChan <- syscall.SIGINT
+	}()
+
+	err := doMain()
+	c.Check(err, IsNil)
+
+	// There should be no queued containers now
+	params := arvadosclient.Dict{
+		"filters": [][]string{[]string{"state", "=", "Queued"}},
+	}
+	var containers ContainerList
+	err = arv.List("containers", params, &containers)
+	c.Check(err, IsNil)
+	c.Assert(len(containers.Items), Equals, 0)
+
+	// Previously "Queued" container should now be in "Complete" state
+	var container Container
+	err = arv.Get("containers", "zzzzz-dz642-queuedcontainer", nil, &container)
+	c.Check(err, IsNil)
+	c.Check(container.State, Equals, "Complete")
+}
+
+func (s *MockArvadosServerSuite) Test_APIErrorGettingContainers(c *C) {
+	apiStubResponses := make(map[string]arvadostest.StubResponse)
+	apiStubResponses["/arvados/v1/containers"] = arvadostest.StubResponse{500, string(`{}`)}
+
+	testWithServerStub(c, apiStubResponses, "echo", "Error getting list of queued containers")
+}
+
+func testWithServerStub(c *C, apiStubResponses map[string]arvadostest.StubResponse, crunchCmd string, expected string) {
+	apiStub := arvadostest.ServerStub{apiStubResponses}
+
+	api := httptest.NewServer(&apiStub)
+	defer api.Close()
+
+	arv = arvadosclient.ArvadosClient{
+		Scheme:    "http",
+		ApiServer: api.URL[7:],
+		ApiToken:  "abc123",
+		Client:    &http.Client{Transport: &http.Transport{}},
+		Retries:   0,
+	}
+
+	tempfile, err := ioutil.TempFile(os.TempDir(), "temp-log-file")
+	c.Check(err, IsNil)
+	defer os.Remove(tempfile.Name())
+	log.SetOutput(tempfile)
+
+	go func() {
+		time.Sleep(2 * time.Second)
+		sigChan <- syscall.SIGTERM
+	}()
+
+	runQueuedContainers(2, 1, crunchCmd, crunchCmd)
+
+	buf, _ := ioutil.ReadFile(tempfile.Name())
+	c.Check(strings.Contains(string(buf), expected), Equals, true)
+}

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list