Revision 30c945d0

b/lib/jqueue.py
990 990

  
991 991
      # Consistency check
992 992
      assert compat.all(i.status in (constants.OP_STATUS_QUEUED,
993
                                     constants.OP_STATUS_CANCELING,
993 994
                                     constants.OP_STATUS_CANCELED)
994 995
                        for i in job.ops[opctx.index + 1:])
995 996

  
996 997
      assert op.status in (constants.OP_STATUS_QUEUED,
997 998
                           constants.OP_STATUS_WAITLOCK,
999
                           constants.OP_STATUS_CANCELING,
998 1000
                           constants.OP_STATUS_CANCELED)
999 1001

  
1000 1002
      assert (op.priority <= constants.OP_PRIO_LOWEST and
1001 1003
              op.priority >= constants.OP_PRIO_HIGHEST)
1002 1004

  
1003
      if op.status != constants.OP_STATUS_CANCELED:
1005
      if op.status not in (constants.OP_STATUS_CANCELING,
1006
                           constants.OP_STATUS_CANCELED):
1007
        assert op.status in (constants.OP_STATUS_QUEUED,
1008
                             constants.OP_STATUS_WAITLOCK)
1009

  
1004 1010
        # Prepare to start opcode
1005 1011
        if self._MarkWaitlock(job, op):
1006 1012
          # Write to disk
b/test/ganeti.jqueue_unittest.py
669 669
                            for op in job.ops))
670 670

  
671 671
    opexec = _FakeExecOpCodeForProc(queue, None, None)
672
    jqueue._JobProcessor(queue, opexec, job)()
672
    self.assert_(jqueue._JobProcessor(queue, opexec, job)())
673

  
674
    # Check result
675
    self.assertEqual(job.CalcStatus(), constants.JOB_STATUS_CANCELED)
676
    self.assertEqual(job.GetInfo(["status"]), [constants.JOB_STATUS_CANCELED])
677
    self.assertFalse(job.start_timestamp)
678
    self.assert_(job.end_timestamp)
679
    self.assertFalse(compat.any(op.start_timestamp or op.end_timestamp
680
                                for op in job.ops))
681
    self.assertEqual(job.GetInfo(["opstatus", "opresult"]),
682
                     [[constants.OP_STATUS_CANCELED for _ in job.ops],
683
                      ["Job canceled by request" for _ in job.ops]])
684

  
685
  def testCancelWhileWaitlockInQueue(self):
686
    queue = _FakeQueueForProc()
687

  
688
    ops = [opcodes.OpTestDummy(result="Res%s" % i, fail=False)
689
           for i in range(5)]
690

  
691
    # Create job
692
    job_id = 8645
693
    job = self._CreateJob(queue, job_id, ops)
694

  
695
    self.assertEqual(job.CalcStatus(), constants.JOB_STATUS_QUEUED)
696

  
697
    job.ops[0].status = constants.OP_STATUS_WAITLOCK
698

  
699
    assert len(job.ops) == 5
700

  
701
    self.assertEqual(job.CalcStatus(), constants.JOB_STATUS_WAITLOCK)
702

  
703
    # Mark as cancelling
704
    (success, _) = job.Cancel()
705
    self.assert_(success)
706

  
707
    self.assertRaises(IndexError, queue.GetNextUpdate)
708

  
709
    self.assert_(compat.all(op.status == constants.OP_STATUS_CANCELING
710
                            for op in job.ops))
711

  
712
    opexec = _FakeExecOpCodeForProc(queue, None, None)
713
    self.assert_(jqueue._JobProcessor(queue, opexec, job)())
673 714

  
674 715
    # Check result
675 716
    self.assertEqual(job.CalcStatus(), constants.JOB_STATUS_CANCELED)

Also available in: Unified diff