"git.curoverse.com/arvados.git/sdk/go/arvados"
"git.curoverse.com/arvados.git/sdk/go/arvadosclient"
"git.curoverse.com/arvados.git/sdk/go/dispatch"
+ "io"
"io/ioutil"
"log"
"math"
// Config used by crunch-dispatch-slurm
type Config struct {
- SbatchArguments []string
- PollPeriod *time.Duration
- CrunchRunCommand *string
+ SbatchArguments []string
+ PollPeriod *time.Duration
+
+ // crunch-run command to invoke. The container UUID will be
+ // appended. If nil, []string{"crunch-run"} will be used.
+ //
+ // Example: []string{"crunch-run", "--cgroup-parent-subsystem=memory"}
+ CrunchRunCommand []string
}
func main() {
10*time.Second,
"Time duration to poll for queued containers")
- config.CrunchRunCommand = flags.String(
- "crunch-run-command",
- "/usr/bin/crunch-run",
- "Crunch command to run container")
-
// Parse args; omit the first arg which is the command name
flags.Parse(os.Args[1:])
return err
}
+ if config.CrunchRunCommand == nil {
+ config.CrunchRunCommand = []string{"crunch-run"}
+ }
+
arv, err := arvadosclient.MakeArvadosClient()
if err != nil {
log.Printf("Error making Arvados client: %v", err)
// Submit job to slurm using sbatch.
func submit(dispatcher *dispatch.Dispatcher,
- container arvados.Container, crunchRunCommand string) (submitErr error) {
+ container arvados.Container, crunchRunCommand []string) (submitErr error) {
defer func() {
// If we didn't get as far as submitting a slurm job,
// unlock the container and return it to the queue.
// Send a tiny script on stdin to execute the crunch-run command
// slurm actually enforces that this must be a #! script
- fmt.Fprintf(stdinWriter, "#!/bin/sh\nexec '%s' '%s'\n", crunchRunCommand, container.UUID)
+ io.WriteString(stdinWriter, execScript(append(crunchRunCommand, container.UUID)))
stdinWriter.Close()
err = cmd.Wait()
log.Printf("About to submit queued container %v", container.UUID)
- if err := submit(dispatcher, container, *config.CrunchRunCommand); err != nil {
+ if err := submit(dispatcher, container, config.CrunchRunCommand); err != nil {
log.Printf("Error submitting container %s to slurm: %v",
container.UUID, err)
// maybe sbatch is broken, put it back to queued
c.Check(err, IsNil)
c.Check(len(containers.Items), Equals, 1)
- echo := "echo"
- config.CrunchRunCommand = &echo
+ config.CrunchRunCommand = []string{"echo"}
doneProcessing := make(chan struct{})
dispatcher := dispatch.Dispatcher{
log.SetOutput(io.MultiWriter(buf, os.Stderr))
defer log.SetOutput(os.Stderr)
- config.CrunchRunCommand = &crunchCmd
+ config.CrunchRunCommand = []string{crunchCmd}
doneProcessing := make(chan struct{})
dispatcher := dispatch.Dispatcher{
--- /dev/null
+package main
+
+import (
+ . "gopkg.in/check.v1"
+)
+
+var _ = Suite(&ScriptSuite{})
+
+type ScriptSuite struct{}
+
+func (s *ScriptSuite) TestExecScript(c *C) {
+ for _, test := range []struct {
+ args []string
+ script string
+ }{
+ {nil, `exec`},
+ {[]string{`foo`}, `exec 'foo'`},
+ {[]string{`foo`, `bar baz`}, `exec 'foo' 'bar baz'`},
+ {[]string{`foo"`, "'waz 'qux\n"}, `exec 'foo"' ''\''waz '\''qux` + "\n" + `'`},
+ } {
+ c.Logf("%+v -> %+v", test.args, test.script)
+ c.Check(execScript(test.args), Equals, "#!/bin/sh\n"+test.script+"\n")
+ }
+}