+func (s *TestSuite) TestIntegrationNormal(c *C) {
+ done := false
+ container := s.integrationTest(c,
+ func() *exec.Cmd {
+ if done {
+ return exec.Command("true")
+ } else {
+ return exec.Command("echo", "zzzzz-dz642-queuedcontainer 9990 100")
+ }
+ },
+ nil,
+ nil,
+ nil,
+ []string(nil),
+ func(dispatcher *dispatch.Dispatcher, container arvados.Container) {
+ dispatcher.UpdateState(container.UUID, dispatch.Running)
+ time.Sleep(3 * time.Second)
+ dispatcher.UpdateState(container.UUID, dispatch.Complete)
+ done = true
+ })
+ c.Check(container.State, Equals, arvados.ContainerStateComplete)
+}
+
+func (s *TestSuite) TestIntegrationCancel(c *C) {
+ var cmd *exec.Cmd
+ var scancelCmdLine []string
+ attempt := 0
+
+ container := s.integrationTest(c,
+ func() *exec.Cmd {
+ if cmd != nil && cmd.ProcessState != nil {
+ return exec.Command("true")
+ } else {
+ return exec.Command("echo", "zzzzz-dz642-queuedcontainer 9990 100")
+ }
+ },
+ func(container arvados.Container) *exec.Cmd {
+ if attempt++; attempt == 1 {
+ return exec.Command("false")
+ } else {
+ scancelCmdLine = scancelFunc(container).Args
+ cmd = exec.Command("echo")
+ return cmd
+ }
+ },
+ nil,
+ nil,
+ []string(nil),
+ func(dispatcher *dispatch.Dispatcher, container arvados.Container) {
+ dispatcher.UpdateState(container.UUID, dispatch.Running)
+ time.Sleep(1 * time.Second)
+ dispatcher.Arv.Update("containers", container.UUID,
+ arvadosclient.Dict{
+ "container": arvadosclient.Dict{"priority": 0}},
+ nil)
+ })
+ c.Check(container.State, Equals, arvados.ContainerStateCancelled)
+ c.Check(scancelCmdLine, DeepEquals, []string{"scancel", "--name=zzzzz-dz642-queuedcontainer"})
+}
+
+func (s *TestSuite) TestIntegrationMissingFromSqueue(c *C) {
+ container := s.integrationTest(c,
+ func() *exec.Cmd { return exec.Command("echo") },
+ nil,
+ nil,
+ nil,
+ []string{"sbatch",
+ fmt.Sprintf("--job-name=%s", "zzzzz-dz642-queuedcontainer"),
+ fmt.Sprintf("--mem=%d", 11445),
+ fmt.Sprintf("--cpus-per-task=%d", 4),
+ fmt.Sprintf("--tmp=%d", 45777),
+ fmt.Sprintf("--nice=%d", 9990)},
+ func(dispatcher *dispatch.Dispatcher, container arvados.Container) {
+ dispatcher.UpdateState(container.UUID, dispatch.Running)
+ time.Sleep(3 * time.Second)
+ dispatcher.UpdateState(container.UUID, dispatch.Complete)
+ })
+ c.Check(container.State, Equals, arvados.ContainerStateCancelled)
+}
+
+func (s *TestSuite) TestSbatchFail(c *C) {
+ container := s.integrationTest(c,
+ func() *exec.Cmd { return exec.Command("echo") },
+ nil,
+ func(container arvados.Container) *exec.Cmd {
+ return exec.Command("false")
+ },
+ nil,
+ []string(nil),
+ func(dispatcher *dispatch.Dispatcher, container arvados.Container) {
+ dispatcher.UpdateState(container.UUID, dispatch.Running)
+ dispatcher.UpdateState(container.UUID, dispatch.Complete)
+ })
+ c.Check(container.State, Equals, arvados.ContainerStateComplete)
+
+ arv, err := arvadosclient.MakeArvadosClient()
+ c.Assert(err, IsNil)
+
+ var ll arvados.LogList
+ err = arv.List("logs", arvadosclient.Dict{"filters": [][]string{
+ {"object_uuid", "=", container.UUID},
+ {"event_type", "=", "dispatch"},
+ }}, &ll)
+ c.Assert(len(ll.Items), Equals, 1)
+}
+
+func (s *MockArvadosServerSuite) TestAPIErrorGettingContainers(c *C) {