Merge branch '21535-multi-wf-delete'
[arvados.git] / lib / lsf / dispatch_test.go
index e51e719066cbdf2b3f71d245eea9a7fc326fcbc3..e1e0bcae310ed2a52c9cfa4c8be281ba1ab96716 100644 (file)
@@ -34,6 +34,7 @@ type suite struct {
        crTooBig      arvados.ContainerRequest
        crPending     arvados.ContainerRequest
        crCUDARequest arvados.ContainerRequest
+       crMaxRunTime  arvados.ContainerRequest
 }
 
 func (s *suite) TearDownTest(c *check.C) {
@@ -45,6 +46,7 @@ func (s *suite) SetUpTest(c *check.C) {
        c.Assert(err, check.IsNil)
        cluster, err := cfg.GetCluster("")
        c.Assert(err, check.IsNil)
+       cluster.Containers.ReserveExtraRAM = 256 << 20
        cluster.Containers.CloudVMs.PollInterval = arvados.Duration(time.Second / 4)
        cluster.Containers.MinRetryPeriod = arvados.Duration(time.Second / 4)
        cluster.InstanceTypes = arvados.InstanceTypeMap{
@@ -78,8 +80,9 @@ func (s *suite) SetUpTest(c *check.C) {
        err = arvados.NewClientFromEnv().RequestAndDecode(&s.crPending, "POST", "arvados/v1/container_requests", nil, map[string]interface{}{
                "container_request": map[string]interface{}{
                        "runtime_constraints": arvados.RuntimeConstraints{
-                               RAM:   100000000,
-                               VCPUs: 2,
+                               RAM:           100000000,
+                               VCPUs:         2,
+                               KeepCacheDisk: 8 << 30,
                        },
                        "container_image":     arvadostest.DockerImage112PDH,
                        "command":             []string{"sleep", "1"},
@@ -114,6 +117,25 @@ func (s *suite) SetUpTest(c *check.C) {
        })
        c.Assert(err, check.IsNil)
 
+       err = arvados.NewClientFromEnv().RequestAndDecode(&s.crMaxRunTime, "POST", "arvados/v1/container_requests", nil, map[string]interface{}{
+               "container_request": map[string]interface{}{
+                       "runtime_constraints": arvados.RuntimeConstraints{
+                               RAM:   1000000,
+                               VCPUs: 1,
+                       },
+                       "scheduling_parameters": arvados.SchedulingParameters{
+                               MaxRunTime: 124,
+                       },
+                       "container_image":     arvadostest.DockerImage112PDH,
+                       "command":             []string{"sleep", "123"},
+                       "mounts":              map[string]arvados.Mount{"/mnt/out": {Kind: "tmp", Capacity: 1000}},
+                       "output_path":         "/mnt/out",
+                       "state":               arvados.ContainerRequestStateCommitted,
+                       "priority":            1,
+                       "container_count_max": 1,
+               },
+       })
+       c.Assert(err, check.IsNil)
 }
 
 type lsfstub struct {
@@ -139,12 +161,7 @@ func (stub lsfstub) stubCommand(s *suite, c *check.C) func(prog string, args ...
                }
                switch prog {
                case "bsub":
-                       defaultArgs := s.disp.Cluster.Containers.LSF.BsubArgumentsList
-                       if args[5] == s.crCUDARequest.ContainerUUID {
-                               c.Assert(len(args), check.Equals, len(defaultArgs)+len(s.disp.Cluster.Containers.LSF.BsubCUDAArguments))
-                       } else {
-                               c.Assert(len(args), check.Equals, len(defaultArgs))
-                       }
+                       c.Assert(len(args) > 5, check.Equals, true)
                        // %%J must have been rewritten to %J
                        c.Check(args[1], check.Equals, "/tmp/crunch-run.%J.out")
                        args = args[4:]
@@ -179,10 +196,10 @@ func (stub lsfstub) stubCommand(s *suite, c *check.C) func(prog string, args ...
                                c.Check(args, check.DeepEquals, []string{
                                        "-J", s.crPending.ContainerUUID,
                                        "-n", "2",
-                                       "-D", "608MB",
-                                       "-R", "rusage[mem=608MB:tmp=256MB] span[hosts=1]",
-                                       "-R", "select[mem>=608MB]",
-                                       "-R", "select[tmp>=256MB]",
+                                       "-D", "352MB",
+                                       "-R", "rusage[mem=352MB:tmp=8448MB] span[hosts=1]",
+                                       "-R", "select[mem>=352MB]",
+                                       "-R", "select[tmp>=8448MB]",
                                        "-R", "select[ncpus>=2]"})
                                mtx.Lock()
                                fakejobq[nextjobid] = args[1]
@@ -202,6 +219,21 @@ func (stub lsfstub) stubCommand(s *suite, c *check.C) func(prog string, args ...
                                fakejobq[nextjobid] = args[1]
                                nextjobid++
                                mtx.Unlock()
+                       case s.crMaxRunTime.ContainerUUID:
+                               c.Check(args, check.DeepEquals, []string{
+                                       "-J", s.crMaxRunTime.ContainerUUID,
+                                       "-n", "1",
+                                       "-D", "257MB",
+                                       "-R", "rusage[mem=257MB:tmp=2304MB] span[hosts=1]",
+                                       "-R", "select[mem>=257MB]",
+                                       "-R", "select[tmp>=2304MB]",
+                                       "-R", "select[ncpus>=1]",
+                                       "-We", "8", // 124s + 5m overhead + roundup = 8m
+                               })
+                               mtx.Lock()
+                               fakejobq[nextjobid] = args[1]
+                               nextjobid++
+                               mtx.Unlock()
                        default:
                                c.Errorf("unexpected uuid passed to bsub: args %q", args)
                                return exec.Command("false")