root / test / py / ganeti.client.gnt_job_unittest.py @ 06fb92cf
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() |