Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.client.gnt_job_unittest.py @ d01e51a5

History | View | Annotate | Download (5 kB)

1 e1c701e7 Michael Hanselmann
#!/usr/bin/python
2 e1c701e7 Michael Hanselmann
#
3 e1c701e7 Michael Hanselmann
4 e1c701e7 Michael Hanselmann
# Copyright (C) 2012 Google Inc.
5 e1c701e7 Michael Hanselmann
#
6 e1c701e7 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 e1c701e7 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 e1c701e7 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 e1c701e7 Michael Hanselmann
# (at your option) any later version.
10 e1c701e7 Michael Hanselmann
#
11 e1c701e7 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 e1c701e7 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 e1c701e7 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 e1c701e7 Michael Hanselmann
# General Public License for more details.
15 e1c701e7 Michael Hanselmann
#
16 e1c701e7 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 e1c701e7 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 e1c701e7 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 e1c701e7 Michael Hanselmann
# 02110-1301, USA.
20 e1c701e7 Michael Hanselmann
21 e1c701e7 Michael Hanselmann
22 e1c701e7 Michael Hanselmann
"""Script for testing ganeti.client.gnt_job"""
23 e1c701e7 Michael Hanselmann
24 e1c701e7 Michael Hanselmann
import unittest
25 e1c701e7 Michael Hanselmann
import optparse
26 e1c701e7 Michael Hanselmann
27 e1c701e7 Michael Hanselmann
from ganeti.client import gnt_job
28 e1c701e7 Michael Hanselmann
from ganeti import utils
29 e1c701e7 Michael Hanselmann
from ganeti import errors
30 e1c701e7 Michael Hanselmann
from ganeti import query
31 e1c701e7 Michael Hanselmann
from ganeti import qlang
32 e1c701e7 Michael Hanselmann
from ganeti import objects
33 e1c701e7 Michael Hanselmann
from ganeti import compat
34 e1c701e7 Michael Hanselmann
from ganeti import constants
35 e1c701e7 Michael Hanselmann
36 e1c701e7 Michael Hanselmann
import testutils
37 e1c701e7 Michael Hanselmann
38 e1c701e7 Michael Hanselmann
39 e1c701e7 Michael Hanselmann
class _ClientForCancelJob:
40 e1c701e7 Michael Hanselmann
  def __init__(self, cancel_cb, query_cb):
41 e1c701e7 Michael Hanselmann
    self.cancelled = []
42 e1c701e7 Michael Hanselmann
    self._cancel_cb = cancel_cb
43 e1c701e7 Michael Hanselmann
    self._query_cb = query_cb
44 e1c701e7 Michael Hanselmann
45 e1c701e7 Michael Hanselmann
  def CancelJob(self, job_id):
46 e1c701e7 Michael Hanselmann
    self.cancelled.append(job_id)
47 e1c701e7 Michael Hanselmann
    return self._cancel_cb(job_id)
48 e1c701e7 Michael Hanselmann
49 e1c701e7 Michael Hanselmann
  def Query(self, kind, selected, qfilter):
50 e1c701e7 Michael Hanselmann
    assert kind == constants.QR_JOB
51 e1c701e7 Michael Hanselmann
    assert selected == ["id", "status", "summary"]
52 e1c701e7 Michael Hanselmann
53 e1c701e7 Michael Hanselmann
    fields = query.GetAllFields(query._GetQueryFields(query.JOB_FIELDS,
54 e1c701e7 Michael Hanselmann
                                                      selected))
55 e1c701e7 Michael Hanselmann
56 e1c701e7 Michael Hanselmann
    return objects.QueryResponse(data=self._query_cb(qfilter),
57 e1c701e7 Michael Hanselmann
                                 fields=fields)
58 e1c701e7 Michael Hanselmann
59 e1c701e7 Michael Hanselmann
60 e1c701e7 Michael Hanselmann
class TestCancelJob(unittest.TestCase):
61 e1c701e7 Michael Hanselmann
  def setUp(self):
62 e1c701e7 Michael Hanselmann
    unittest.TestCase.setUp(self)
63 e1c701e7 Michael Hanselmann
    self.stdout = []
64 e1c701e7 Michael Hanselmann
65 e1c701e7 Michael Hanselmann
  def _ToStdout(self, line):
66 e1c701e7 Michael Hanselmann
    self.stdout.append(line)
67 e1c701e7 Michael Hanselmann
68 e1c701e7 Michael Hanselmann
  def _Ask(self, answer, question):
69 e1c701e7 Michael Hanselmann
    self.assertTrue(question.endswith("?"))
70 e1c701e7 Michael Hanselmann
    return answer
71 e1c701e7 Michael Hanselmann
72 e1c701e7 Michael Hanselmann
  def testStatusFilterAndArguments(self):
73 e1c701e7 Michael Hanselmann
    opts = optparse.Values(dict(status_filter=frozenset()))
74 e1c701e7 Michael Hanselmann
    try:
75 e1c701e7 Michael Hanselmann
      gnt_job.CancelJobs(opts, ["a"], cl=NotImplemented,
76 e1c701e7 Michael Hanselmann
                         _stdout_fn=NotImplemented, _ask_fn=NotImplemented)
77 e1c701e7 Michael Hanselmann
    except errors.OpPrereqError, err:
78 e1c701e7 Michael Hanselmann
      self.assertEqual(err.args[1], errors.ECODE_INVAL)
79 e1c701e7 Michael Hanselmann
    else:
80 e1c701e7 Michael Hanselmann
      self.fail("Did not raise exception")
81 e1c701e7 Michael Hanselmann
82 e1c701e7 Michael Hanselmann
  def _TestArguments(self, force):
83 e1c701e7 Michael Hanselmann
    opts = optparse.Values(dict(status_filter=None, force=force))
84 e1c701e7 Michael Hanselmann
85 e1c701e7 Michael Hanselmann
    def _CancelCb(job_id):
86 e1c701e7 Michael Hanselmann
      self.assertTrue(job_id in ("24185", "3252"))
87 e1c701e7 Michael Hanselmann
      return (True, "%s will be cancelled" % job_id)
88 e1c701e7 Michael Hanselmann
89 e1c701e7 Michael Hanselmann
    cl = _ClientForCancelJob(_CancelCb, NotImplemented)
90 e1c701e7 Michael Hanselmann
    self.assertEqual(gnt_job.CancelJobs(opts, ["24185", "3252"], cl=cl,
91 e1c701e7 Michael Hanselmann
                                        _stdout_fn=self._ToStdout,
92 e1c701e7 Michael Hanselmann
                                        _ask_fn=NotImplemented),
93 e1c701e7 Michael Hanselmann
                     constants.EXIT_SUCCESS)
94 e1c701e7 Michael Hanselmann
    self.assertEqual(cl.cancelled, ["24185", "3252"])
95 e1c701e7 Michael Hanselmann
    self.assertEqual(self.stdout, [
96 e1c701e7 Michael Hanselmann
      "24185 will be cancelled",
97 e1c701e7 Michael Hanselmann
      "3252 will be cancelled",
98 e1c701e7 Michael Hanselmann
      ])
99 e1c701e7 Michael Hanselmann
100 e1c701e7 Michael Hanselmann
  def testArgumentsWithForce(self):
101 e1c701e7 Michael Hanselmann
    self._TestArguments(True)
102 e1c701e7 Michael Hanselmann
103 e1c701e7 Michael Hanselmann
  def testArgumentsNoForce(self):
104 e1c701e7 Michael Hanselmann
    self._TestArguments(False)
105 e1c701e7 Michael Hanselmann
106 e1c701e7 Michael Hanselmann
  def testArgumentsWithError(self):
107 e1c701e7 Michael Hanselmann
    opts = optparse.Values(dict(status_filter=None, force=True))
108 e1c701e7 Michael Hanselmann
109 e1c701e7 Michael Hanselmann
    def _CancelCb(job_id):
110 e1c701e7 Michael Hanselmann
      if job_id == "10788":
111 e1c701e7 Michael Hanselmann
        return (False, "error %s" % job_id)
112 e1c701e7 Michael Hanselmann
      else:
113 e1c701e7 Michael Hanselmann
        return (True, "%s will be cancelled" % job_id)
114 e1c701e7 Michael Hanselmann
115 e1c701e7 Michael Hanselmann
    cl = _ClientForCancelJob(_CancelCb, NotImplemented)
116 e1c701e7 Michael Hanselmann
    self.assertEqual(gnt_job.CancelJobs(opts, ["203", "10788", "30801"], cl=cl,
117 e1c701e7 Michael Hanselmann
                                        _stdout_fn=self._ToStdout,
118 e1c701e7 Michael Hanselmann
                                        _ask_fn=NotImplemented),
119 e1c701e7 Michael Hanselmann
                     constants.EXIT_FAILURE)
120 e1c701e7 Michael Hanselmann
    self.assertEqual(cl.cancelled, ["203", "10788", "30801"])
121 e1c701e7 Michael Hanselmann
    self.assertEqual(self.stdout, [
122 e1c701e7 Michael Hanselmann
      "203 will be cancelled",
123 e1c701e7 Michael Hanselmann
      "error 10788",
124 e1c701e7 Michael Hanselmann
      "30801 will be cancelled",
125 e1c701e7 Michael Hanselmann
      ])
126 e1c701e7 Michael Hanselmann
127 e1c701e7 Michael Hanselmann
  def testFilterPending(self):
128 e1c701e7 Michael Hanselmann
    opts = optparse.Values(dict(status_filter=constants.JOBS_PENDING,
129 e1c701e7 Michael Hanselmann
                                force=False))
130 e1c701e7 Michael Hanselmann
131 e1c701e7 Michael Hanselmann
    def _Query(qfilter):
132 e1c701e7 Michael Hanselmann
      # Need to sort as constants.JOBS_PENDING has no stable order
133 e1c701e7 Michael Hanselmann
      assert isinstance(constants.JOBS_PENDING, frozenset)
134 e1c701e7 Michael Hanselmann
      self.assertEqual(sorted(qfilter),
135 e1c701e7 Michael Hanselmann
                       sorted(qlang.MakeSimpleFilter("status",
136 e1c701e7 Michael Hanselmann
                                                     constants.JOBS_PENDING)))
137 e1c701e7 Michael Hanselmann
138 e1c701e7 Michael Hanselmann
      return [
139 e1c701e7 Michael Hanselmann
        [(constants.RS_UNAVAIL, None),
140 e1c701e7 Michael Hanselmann
         (constants.RS_UNAVAIL, None),
141 e1c701e7 Michael Hanselmann
         (constants.RS_UNAVAIL, None)],
142 e1c701e7 Michael Hanselmann
        [(constants.RS_NORMAL, 32532),
143 e1c701e7 Michael Hanselmann
         (constants.RS_NORMAL, constants.JOB_STATUS_QUEUED),
144 e1c701e7 Michael Hanselmann
         (constants.RS_NORMAL, ["op1", "op2", "op3"])],
145 e1c701e7 Michael Hanselmann
        ]
146 e1c701e7 Michael Hanselmann
147 e1c701e7 Michael Hanselmann
    cl = _ClientForCancelJob(NotImplemented, _Query)
148 e1c701e7 Michael Hanselmann
149 e1c701e7 Michael Hanselmann
    result = gnt_job.CancelJobs(opts, [], cl=cl,
150 e1c701e7 Michael Hanselmann
                                _stdout_fn=self._ToStdout,
151 e1c701e7 Michael Hanselmann
                                _ask_fn=compat.partial(self._Ask, False))
152 e1c701e7 Michael Hanselmann
    self.assertEqual(result, constants.EXIT_CONFIRMATION)
153 e1c701e7 Michael Hanselmann
154 e1c701e7 Michael Hanselmann
155 e1c701e7 Michael Hanselmann
if __name__ == "__main__":
156 e1c701e7 Michael Hanselmann
  testutils.GanetiTestProgram()