Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.jqueue_unittest.py @ 8f5c488d

History | View | Annotate | Download (10.7 kB)

1 989a8bee Michael Hanselmann
#!/usr/bin/python
2 989a8bee Michael Hanselmann
#
3 989a8bee Michael Hanselmann
4 989a8bee Michael Hanselmann
# Copyright (C) 2010 Google Inc.
5 989a8bee Michael Hanselmann
#
6 989a8bee Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 989a8bee Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 989a8bee Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 989a8bee Michael Hanselmann
# (at your option) any later version.
10 989a8bee Michael Hanselmann
#
11 989a8bee Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 989a8bee Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 989a8bee Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 989a8bee Michael Hanselmann
# General Public License for more details.
15 989a8bee Michael Hanselmann
#
16 989a8bee Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 989a8bee Michael Hanselmann
# along with this program; if not, write to the Free Software
18 989a8bee Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 989a8bee Michael Hanselmann
# 02110-1301, USA.
20 989a8bee Michael Hanselmann
21 989a8bee Michael Hanselmann
22 989a8bee Michael Hanselmann
"""Script for testing ganeti.jqueue"""
23 989a8bee Michael Hanselmann
24 989a8bee Michael Hanselmann
import os
25 989a8bee Michael Hanselmann
import sys
26 989a8bee Michael Hanselmann
import unittest
27 989a8bee Michael Hanselmann
import tempfile
28 989a8bee Michael Hanselmann
import shutil
29 989a8bee Michael Hanselmann
import errno
30 989a8bee Michael Hanselmann
31 989a8bee Michael Hanselmann
from ganeti import constants
32 989a8bee Michael Hanselmann
from ganeti import utils
33 989a8bee Michael Hanselmann
from ganeti import errors
34 989a8bee Michael Hanselmann
from ganeti import jqueue
35 8f5c488d Michael Hanselmann
from ganeti import opcodes
36 8f5c488d Michael Hanselmann
from ganeti import compat
37 989a8bee Michael Hanselmann
38 989a8bee Michael Hanselmann
import testutils
39 989a8bee Michael Hanselmann
40 989a8bee Michael Hanselmann
41 989a8bee Michael Hanselmann
class _FakeJob:
42 989a8bee Michael Hanselmann
  def __init__(self, job_id, status):
43 989a8bee Michael Hanselmann
    self.id = job_id
44 989a8bee Michael Hanselmann
    self._status = status
45 989a8bee Michael Hanselmann
    self._log = []
46 989a8bee Michael Hanselmann
47 989a8bee Michael Hanselmann
  def SetStatus(self, status):
48 989a8bee Michael Hanselmann
    self._status = status
49 989a8bee Michael Hanselmann
50 989a8bee Michael Hanselmann
  def AddLogEntry(self, msg):
51 989a8bee Michael Hanselmann
    self._log.append((len(self._log), msg))
52 989a8bee Michael Hanselmann
53 989a8bee Michael Hanselmann
  def CalcStatus(self):
54 989a8bee Michael Hanselmann
    return self._status
55 989a8bee Michael Hanselmann
56 989a8bee Michael Hanselmann
  def GetInfo(self, fields):
57 989a8bee Michael Hanselmann
    result = []
58 989a8bee Michael Hanselmann
59 989a8bee Michael Hanselmann
    for name in fields:
60 989a8bee Michael Hanselmann
      if name == "status":
61 989a8bee Michael Hanselmann
        result.append(self._status)
62 989a8bee Michael Hanselmann
      else:
63 989a8bee Michael Hanselmann
        raise Exception("Unknown field")
64 989a8bee Michael Hanselmann
65 989a8bee Michael Hanselmann
    return result
66 989a8bee Michael Hanselmann
67 989a8bee Michael Hanselmann
  def GetLogEntries(self, newer_than):
68 989a8bee Michael Hanselmann
    assert newer_than is None or newer_than >= 0
69 989a8bee Michael Hanselmann
70 989a8bee Michael Hanselmann
    if newer_than is None:
71 989a8bee Michael Hanselmann
      return self._log
72 989a8bee Michael Hanselmann
73 989a8bee Michael Hanselmann
    return self._log[newer_than:]
74 989a8bee Michael Hanselmann
75 989a8bee Michael Hanselmann
76 989a8bee Michael Hanselmann
class TestJobChangesChecker(unittest.TestCase):
77 989a8bee Michael Hanselmann
  def testStatus(self):
78 989a8bee Michael Hanselmann
    job = _FakeJob(9094, constants.JOB_STATUS_QUEUED)
79 989a8bee Michael Hanselmann
    checker = jqueue._JobChangesChecker(["status"], None, None)
80 989a8bee Michael Hanselmann
    self.assertEqual(checker(job), ([constants.JOB_STATUS_QUEUED], []))
81 989a8bee Michael Hanselmann
82 989a8bee Michael Hanselmann
    job.SetStatus(constants.JOB_STATUS_RUNNING)
83 989a8bee Michael Hanselmann
    self.assertEqual(checker(job), ([constants.JOB_STATUS_RUNNING], []))
84 989a8bee Michael Hanselmann
85 989a8bee Michael Hanselmann
    job.SetStatus(constants.JOB_STATUS_SUCCESS)
86 989a8bee Michael Hanselmann
    self.assertEqual(checker(job), ([constants.JOB_STATUS_SUCCESS], []))
87 989a8bee Michael Hanselmann
88 989a8bee Michael Hanselmann
    # job.id is used by checker
89 989a8bee Michael Hanselmann
    self.assertEqual(job.id, 9094)
90 989a8bee Michael Hanselmann
91 989a8bee Michael Hanselmann
  def testStatusWithPrev(self):
92 989a8bee Michael Hanselmann
    job = _FakeJob(12807, constants.JOB_STATUS_QUEUED)
93 989a8bee Michael Hanselmann
    checker = jqueue._JobChangesChecker(["status"],
94 989a8bee Michael Hanselmann
                                        [constants.JOB_STATUS_QUEUED], None)
95 989a8bee Michael Hanselmann
    self.assert_(checker(job) is None)
96 989a8bee Michael Hanselmann
97 989a8bee Michael Hanselmann
    job.SetStatus(constants.JOB_STATUS_RUNNING)
98 989a8bee Michael Hanselmann
    self.assertEqual(checker(job), ([constants.JOB_STATUS_RUNNING], []))
99 989a8bee Michael Hanselmann
100 989a8bee Michael Hanselmann
  def testFinalStatus(self):
101 989a8bee Michael Hanselmann
    for status in constants.JOBS_FINALIZED:
102 989a8bee Michael Hanselmann
      job = _FakeJob(2178711, status)
103 989a8bee Michael Hanselmann
      checker = jqueue._JobChangesChecker(["status"], [status], None)
104 989a8bee Michael Hanselmann
      # There won't be any changes in this status, hence it should signal
105 989a8bee Michael Hanselmann
      # a change immediately
106 989a8bee Michael Hanselmann
      self.assertEqual(checker(job), ([status], []))
107 989a8bee Michael Hanselmann
108 989a8bee Michael Hanselmann
  def testLog(self):
109 989a8bee Michael Hanselmann
    job = _FakeJob(9094, constants.JOB_STATUS_RUNNING)
110 989a8bee Michael Hanselmann
    checker = jqueue._JobChangesChecker(["status"], None, None)
111 989a8bee Michael Hanselmann
    self.assertEqual(checker(job), ([constants.JOB_STATUS_RUNNING], []))
112 989a8bee Michael Hanselmann
113 989a8bee Michael Hanselmann
    job.AddLogEntry("Hello World")
114 989a8bee Michael Hanselmann
    (job_info, log_entries) = checker(job)
115 989a8bee Michael Hanselmann
    self.assertEqual(job_info, [constants.JOB_STATUS_RUNNING])
116 989a8bee Michael Hanselmann
    self.assertEqual(log_entries, [[0, "Hello World"]])
117 989a8bee Michael Hanselmann
118 989a8bee Michael Hanselmann
    checker2 = jqueue._JobChangesChecker(["status"], job_info, len(log_entries))
119 989a8bee Michael Hanselmann
    self.assert_(checker2(job) is None)
120 989a8bee Michael Hanselmann
121 989a8bee Michael Hanselmann
    job.AddLogEntry("Foo Bar")
122 989a8bee Michael Hanselmann
    job.SetStatus(constants.JOB_STATUS_ERROR)
123 989a8bee Michael Hanselmann
124 989a8bee Michael Hanselmann
    (job_info, log_entries) = checker2(job)
125 989a8bee Michael Hanselmann
    self.assertEqual(job_info, [constants.JOB_STATUS_ERROR])
126 989a8bee Michael Hanselmann
    self.assertEqual(log_entries, [[1, "Foo Bar"]])
127 989a8bee Michael Hanselmann
128 989a8bee Michael Hanselmann
    checker3 = jqueue._JobChangesChecker(["status"], None, None)
129 989a8bee Michael Hanselmann
    (job_info, log_entries) = checker3(job)
130 989a8bee Michael Hanselmann
    self.assertEqual(job_info, [constants.JOB_STATUS_ERROR])
131 989a8bee Michael Hanselmann
    self.assertEqual(log_entries, [[0, "Hello World"], [1, "Foo Bar"]])
132 989a8bee Michael Hanselmann
133 989a8bee Michael Hanselmann
134 989a8bee Michael Hanselmann
class TestJobChangesWaiter(unittest.TestCase):
135 989a8bee Michael Hanselmann
  def setUp(self):
136 989a8bee Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
137 989a8bee Michael Hanselmann
    self.filename = utils.PathJoin(self.tmpdir, "job-1")
138 989a8bee Michael Hanselmann
    utils.WriteFile(self.filename, data="")
139 989a8bee Michael Hanselmann
140 989a8bee Michael Hanselmann
  def tearDown(self):
141 989a8bee Michael Hanselmann
    shutil.rmtree(self.tmpdir)
142 989a8bee Michael Hanselmann
143 989a8bee Michael Hanselmann
  def _EnsureNotifierClosed(self, notifier):
144 989a8bee Michael Hanselmann
    try:
145 989a8bee Michael Hanselmann
      os.fstat(notifier._fd)
146 989a8bee Michael Hanselmann
    except EnvironmentError, err:
147 989a8bee Michael Hanselmann
      self.assertEqual(err.errno, errno.EBADF)
148 989a8bee Michael Hanselmann
    else:
149 989a8bee Michael Hanselmann
      self.fail("File descriptor wasn't closed")
150 989a8bee Michael Hanselmann
151 989a8bee Michael Hanselmann
  def testClose(self):
152 989a8bee Michael Hanselmann
    for wait in [False, True]:
153 989a8bee Michael Hanselmann
      waiter = jqueue._JobFileChangesWaiter(self.filename)
154 989a8bee Michael Hanselmann
      try:
155 989a8bee Michael Hanselmann
        if wait:
156 989a8bee Michael Hanselmann
          waiter.Wait(0.001)
157 989a8bee Michael Hanselmann
      finally:
158 989a8bee Michael Hanselmann
        waiter.Close()
159 989a8bee Michael Hanselmann
160 989a8bee Michael Hanselmann
      # Ensure file descriptor was closed
161 989a8bee Michael Hanselmann
      self._EnsureNotifierClosed(waiter._notifier)
162 989a8bee Michael Hanselmann
163 989a8bee Michael Hanselmann
  def testChangingFile(self):
164 989a8bee Michael Hanselmann
    waiter = jqueue._JobFileChangesWaiter(self.filename)
165 989a8bee Michael Hanselmann
    try:
166 989a8bee Michael Hanselmann
      self.assertFalse(waiter.Wait(0.1))
167 989a8bee Michael Hanselmann
      utils.WriteFile(self.filename, data="changed")
168 989a8bee Michael Hanselmann
      self.assert_(waiter.Wait(60))
169 989a8bee Michael Hanselmann
    finally:
170 989a8bee Michael Hanselmann
      waiter.Close()
171 989a8bee Michael Hanselmann
172 989a8bee Michael Hanselmann
    self._EnsureNotifierClosed(waiter._notifier)
173 989a8bee Michael Hanselmann
174 989a8bee Michael Hanselmann
  def testChangingFile2(self):
175 989a8bee Michael Hanselmann
    waiter = jqueue._JobChangesWaiter(self.filename)
176 989a8bee Michael Hanselmann
    try:
177 989a8bee Michael Hanselmann
      self.assertFalse(waiter._filewaiter)
178 989a8bee Michael Hanselmann
      self.assert_(waiter.Wait(0.1))
179 989a8bee Michael Hanselmann
      self.assert_(waiter._filewaiter)
180 989a8bee Michael Hanselmann
181 989a8bee Michael Hanselmann
      # File waiter is now used, but there have been no changes
182 989a8bee Michael Hanselmann
      self.assertFalse(waiter.Wait(0.1))
183 989a8bee Michael Hanselmann
      utils.WriteFile(self.filename, data="changed")
184 989a8bee Michael Hanselmann
      self.assert_(waiter.Wait(60))
185 989a8bee Michael Hanselmann
    finally:
186 989a8bee Michael Hanselmann
      waiter.Close()
187 989a8bee Michael Hanselmann
188 989a8bee Michael Hanselmann
    self._EnsureNotifierClosed(waiter._filewaiter._notifier)
189 989a8bee Michael Hanselmann
190 989a8bee Michael Hanselmann
191 989a8bee Michael Hanselmann
class TestWaitForJobChangesHelper(unittest.TestCase):
192 989a8bee Michael Hanselmann
  def setUp(self):
193 989a8bee Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
194 989a8bee Michael Hanselmann
    self.filename = utils.PathJoin(self.tmpdir, "job-2614226563")
195 989a8bee Michael Hanselmann
    utils.WriteFile(self.filename, data="")
196 989a8bee Michael Hanselmann
197 989a8bee Michael Hanselmann
  def tearDown(self):
198 989a8bee Michael Hanselmann
    shutil.rmtree(self.tmpdir)
199 989a8bee Michael Hanselmann
200 989a8bee Michael Hanselmann
  def _LoadWaitingJob(self):
201 989a8bee Michael Hanselmann
    return _FakeJob(2614226563, constants.JOB_STATUS_WAITLOCK)
202 989a8bee Michael Hanselmann
203 989a8bee Michael Hanselmann
  def _LoadLostJob(self):
204 989a8bee Michael Hanselmann
    return None
205 989a8bee Michael Hanselmann
206 989a8bee Michael Hanselmann
  def testNoChanges(self):
207 989a8bee Michael Hanselmann
    wfjc = jqueue._WaitForJobChangesHelper()
208 989a8bee Michael Hanselmann
209 989a8bee Michael Hanselmann
    # No change
210 989a8bee Michael Hanselmann
    self.assertEqual(wfjc(self.filename, self._LoadWaitingJob, ["status"],
211 989a8bee Michael Hanselmann
                          [constants.JOB_STATUS_WAITLOCK], None, 0.1),
212 989a8bee Michael Hanselmann
                     constants.JOB_NOTCHANGED)
213 989a8bee Michael Hanselmann
214 989a8bee Michael Hanselmann
    # No previous information
215 989a8bee Michael Hanselmann
    self.assertEqual(wfjc(self.filename, self._LoadWaitingJob,
216 989a8bee Michael Hanselmann
                          ["status"], None, None, 1.0),
217 989a8bee Michael Hanselmann
                     ([constants.JOB_STATUS_WAITLOCK], []))
218 989a8bee Michael Hanselmann
219 989a8bee Michael Hanselmann
  def testLostJob(self):
220 989a8bee Michael Hanselmann
    wfjc = jqueue._WaitForJobChangesHelper()
221 989a8bee Michael Hanselmann
    self.assert_(wfjc(self.filename, self._LoadLostJob,
222 989a8bee Michael Hanselmann
                      ["status"], None, None, 1.0) is None)
223 989a8bee Michael Hanselmann
224 989a8bee Michael Hanselmann
225 6760e4ed Michael Hanselmann
class TestEncodeOpError(unittest.TestCase):
226 6760e4ed Michael Hanselmann
  def test(self):
227 6760e4ed Michael Hanselmann
    encerr = jqueue._EncodeOpError(errors.LockError("Test 1"))
228 6760e4ed Michael Hanselmann
    self.assert_(isinstance(encerr, tuple))
229 6760e4ed Michael Hanselmann
    self.assertRaises(errors.LockError, errors.MaybeRaise, encerr)
230 6760e4ed Michael Hanselmann
231 6760e4ed Michael Hanselmann
    encerr = jqueue._EncodeOpError(errors.GenericError("Test 2"))
232 6760e4ed Michael Hanselmann
    self.assert_(isinstance(encerr, tuple))
233 6760e4ed Michael Hanselmann
    self.assertRaises(errors.GenericError, errors.MaybeRaise, encerr)
234 6760e4ed Michael Hanselmann
235 6760e4ed Michael Hanselmann
    encerr = jqueue._EncodeOpError(NotImplementedError("Foo"))
236 6760e4ed Michael Hanselmann
    self.assert_(isinstance(encerr, tuple))
237 6760e4ed Michael Hanselmann
    self.assertRaises(errors.OpExecError, errors.MaybeRaise, encerr)
238 6760e4ed Michael Hanselmann
239 6760e4ed Michael Hanselmann
    encerr = jqueue._EncodeOpError("Hello World")
240 6760e4ed Michael Hanselmann
    self.assert_(isinstance(encerr, tuple))
241 6760e4ed Michael Hanselmann
    self.assertRaises(errors.OpExecError, errors.MaybeRaise, encerr)
242 6760e4ed Michael Hanselmann
243 6760e4ed Michael Hanselmann
244 8f5c488d Michael Hanselmann
class TestQueuedOpCode(unittest.TestCase):
245 8f5c488d Michael Hanselmann
  def testDefaults(self):
246 8f5c488d Michael Hanselmann
    def _Check(op):
247 8f5c488d Michael Hanselmann
      self.assertFalse(hasattr(op.input, "dry_run"))
248 8f5c488d Michael Hanselmann
      self.assertEqual(op.priority, constants.OP_PRIO_DEFAULT)
249 8f5c488d Michael Hanselmann
      self.assertFalse(op.log)
250 8f5c488d Michael Hanselmann
      self.assert_(op.start_timestamp is None)
251 8f5c488d Michael Hanselmann
      self.assert_(op.exec_timestamp is None)
252 8f5c488d Michael Hanselmann
      self.assert_(op.end_timestamp is None)
253 8f5c488d Michael Hanselmann
      self.assert_(op.result is None)
254 8f5c488d Michael Hanselmann
      self.assertEqual(op.status, constants.OP_STATUS_QUEUED)
255 8f5c488d Michael Hanselmann
256 8f5c488d Michael Hanselmann
    op1 = jqueue._QueuedOpCode(opcodes.OpTestDelay())
257 8f5c488d Michael Hanselmann
    _Check(op1)
258 8f5c488d Michael Hanselmann
    op2 = jqueue._QueuedOpCode.Restore(op1.Serialize())
259 8f5c488d Michael Hanselmann
    _Check(op2)
260 8f5c488d Michael Hanselmann
    self.assertEqual(op1.Serialize(), op2.Serialize())
261 8f5c488d Michael Hanselmann
262 8f5c488d Michael Hanselmann
  def testPriority(self):
263 8f5c488d Michael Hanselmann
    def _Check(op):
264 8f5c488d Michael Hanselmann
      assert constants.OP_PRIO_DEFAULT != constants.OP_PRIO_HIGH, \
265 8f5c488d Michael Hanselmann
             "Default priority equals high priority; test can't work"
266 8f5c488d Michael Hanselmann
      self.assertEqual(op.priority, constants.OP_PRIO_HIGH)
267 8f5c488d Michael Hanselmann
      self.assertEqual(op.status, constants.OP_STATUS_QUEUED)
268 8f5c488d Michael Hanselmann
269 8f5c488d Michael Hanselmann
    inpop = opcodes.OpGetTags(priority=constants.OP_PRIO_HIGH)
270 8f5c488d Michael Hanselmann
    op1 = jqueue._QueuedOpCode(inpop)
271 8f5c488d Michael Hanselmann
    _Check(op1)
272 8f5c488d Michael Hanselmann
    op2 = jqueue._QueuedOpCode.Restore(op1.Serialize())
273 8f5c488d Michael Hanselmann
    _Check(op2)
274 8f5c488d Michael Hanselmann
    self.assertEqual(op1.Serialize(), op2.Serialize())
275 8f5c488d Michael Hanselmann
276 8f5c488d Michael Hanselmann
277 8f5c488d Michael Hanselmann
class TestQueuedJob(unittest.TestCase):
278 8f5c488d Michael Hanselmann
  def testDefaults(self):
279 8f5c488d Michael Hanselmann
    job_id = 4260
280 8f5c488d Michael Hanselmann
    ops = [
281 8f5c488d Michael Hanselmann
      opcodes.OpGetTags(),
282 8f5c488d Michael Hanselmann
      opcodes.OpTestDelay(),
283 8f5c488d Michael Hanselmann
      ]
284 8f5c488d Michael Hanselmann
285 8f5c488d Michael Hanselmann
    def _Check(job):
286 8f5c488d Michael Hanselmann
      self.assertEqual(job.id, job_id)
287 8f5c488d Michael Hanselmann
      self.assertEqual(job.log_serial, 0)
288 8f5c488d Michael Hanselmann
      self.assert_(job.received_timestamp)
289 8f5c488d Michael Hanselmann
      self.assert_(job.start_timestamp is None)
290 8f5c488d Michael Hanselmann
      self.assert_(job.end_timestamp is None)
291 8f5c488d Michael Hanselmann
      self.assertEqual(job.CalcStatus(), constants.JOB_STATUS_QUEUED)
292 8f5c488d Michael Hanselmann
      self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
293 8f5c488d Michael Hanselmann
      self.assert_(repr(job).startswith("<"))
294 8f5c488d Michael Hanselmann
      self.assertEqual(len(job.ops), len(ops))
295 8f5c488d Michael Hanselmann
      self.assert_(compat.all(inp.__getstate__() == op.input.__getstate__()
296 8f5c488d Michael Hanselmann
                              for (inp, op) in zip(ops, job.ops)))
297 8f5c488d Michael Hanselmann
298 8f5c488d Michael Hanselmann
    job1 = jqueue._QueuedJob(None, job_id, ops)
299 8f5c488d Michael Hanselmann
    _Check(job1)
300 8f5c488d Michael Hanselmann
    job2 = jqueue._QueuedJob.Restore(None, job1.Serialize())
301 8f5c488d Michael Hanselmann
    _Check(job2)
302 8f5c488d Michael Hanselmann
    self.assertEqual(job1.Serialize(), job2.Serialize())
303 8f5c488d Michael Hanselmann
304 8f5c488d Michael Hanselmann
  def testPriority(self):
305 8f5c488d Michael Hanselmann
    job_id = 4283
306 8f5c488d Michael Hanselmann
    ops = [
307 8f5c488d Michael Hanselmann
      opcodes.OpGetTags(priority=constants.OP_PRIO_DEFAULT),
308 8f5c488d Michael Hanselmann
      opcodes.OpTestDelay(),
309 8f5c488d Michael Hanselmann
      ]
310 8f5c488d Michael Hanselmann
311 8f5c488d Michael Hanselmann
    def _Check(job):
312 8f5c488d Michael Hanselmann
      self.assertEqual(job.id, job_id)
313 8f5c488d Michael Hanselmann
      self.assertEqual(job.CalcStatus(), constants.JOB_STATUS_QUEUED)
314 8f5c488d Michael Hanselmann
      self.assert_(repr(job).startswith("<"))
315 8f5c488d Michael Hanselmann
316 8f5c488d Michael Hanselmann
    job = jqueue._QueuedJob(None, job_id, ops)
317 8f5c488d Michael Hanselmann
    _Check(job)
318 8f5c488d Michael Hanselmann
    self.assert_(compat.all(op.priority == constants.OP_PRIO_DEFAULT
319 8f5c488d Michael Hanselmann
                            for op in job.ops))
320 8f5c488d Michael Hanselmann
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
321 8f5c488d Michael Hanselmann
322 8f5c488d Michael Hanselmann
    # Increase first
323 8f5c488d Michael Hanselmann
    job.ops[0].priority -= 1
324 8f5c488d Michael Hanselmann
    _Check(job)
325 8f5c488d Michael Hanselmann
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT - 1)
326 8f5c488d Michael Hanselmann
327 8f5c488d Michael Hanselmann
    # Mark opcode as finished
328 8f5c488d Michael Hanselmann
    job.ops[0].status = constants.OP_STATUS_SUCCESS
329 8f5c488d Michael Hanselmann
    _Check(job)
330 8f5c488d Michael Hanselmann
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT)
331 8f5c488d Michael Hanselmann
332 8f5c488d Michael Hanselmann
    # Increase second
333 8f5c488d Michael Hanselmann
    job.ops[1].priority -= 10
334 8f5c488d Michael Hanselmann
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT - 10)
335 8f5c488d Michael Hanselmann
336 8f5c488d Michael Hanselmann
    # Test increasing first
337 8f5c488d Michael Hanselmann
    job.ops[0].status = constants.OP_STATUS_RUNNING
338 8f5c488d Michael Hanselmann
    job.ops[0].priority -= 19
339 8f5c488d Michael Hanselmann
    self.assertEqual(job.CalcPriority(), constants.OP_PRIO_DEFAULT - 20)
340 8f5c488d Michael Hanselmann
341 8f5c488d Michael Hanselmann
342 989a8bee Michael Hanselmann
if __name__ == "__main__":
343 989a8bee Michael Hanselmann
  testutils.GanetiTestProgram()