Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cli_unittest.py @ aa29e95f

History | View | Annotate | Download (24.6 kB)

1 2241e2b9 Iustin Pop
#!/usr/bin/python
2 2241e2b9 Iustin Pop
#
3 2241e2b9 Iustin Pop
4 2241e2b9 Iustin Pop
# Copyright (C) 2008 Google Inc.
5 2241e2b9 Iustin Pop
#
6 2241e2b9 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 2241e2b9 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 2241e2b9 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 2241e2b9 Iustin Pop
# (at your option) any later version.
10 2241e2b9 Iustin Pop
#
11 2241e2b9 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 2241e2b9 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 2241e2b9 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 2241e2b9 Iustin Pop
# General Public License for more details.
15 2241e2b9 Iustin Pop
#
16 2241e2b9 Iustin Pop
# You should have received a copy of the GNU General Public License
17 2241e2b9 Iustin Pop
# along with this program; if not, write to the Free Software
18 2241e2b9 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 2241e2b9 Iustin Pop
# 02110-1301, USA.
20 2241e2b9 Iustin Pop
21 2241e2b9 Iustin Pop
22 2241e2b9 Iustin Pop
"""Script for unittesting the cli module"""
23 2241e2b9 Iustin Pop
24 2241e2b9 Iustin Pop
import unittest
25 46fbdd04 Iustin Pop
from cStringIO import StringIO
26 2241e2b9 Iustin Pop
27 2241e2b9 Iustin Pop
import ganeti
28 2241e2b9 Iustin Pop
import testutils
29 25231ec5 Michael Hanselmann
30 2241e2b9 Iustin Pop
from ganeti import constants
31 2241e2b9 Iustin Pop
from ganeti import cli
32 4e338533 Michael Hanselmann
from ganeti import errors
33 4e338533 Michael Hanselmann
from ganeti import utils
34 ee3aedff Michael Hanselmann
from ganeti import objects
35 a8469393 Iustin Pop
from ganeti.errors import OpPrereqError, ParameterError
36 2241e2b9 Iustin Pop
37 25231ec5 Michael Hanselmann
38 2241e2b9 Iustin Pop
class TestParseTimespec(unittest.TestCase):
39 2241e2b9 Iustin Pop
  """Testing case for ParseTimespec"""
40 2241e2b9 Iustin Pop
41 2241e2b9 Iustin Pop
  def testValidTimes(self):
42 2241e2b9 Iustin Pop
    """Test valid timespecs"""
43 2241e2b9 Iustin Pop
    test_data = [
44 2241e2b9 Iustin Pop
      ('1s', 1),
45 2241e2b9 Iustin Pop
      ('1', 1),
46 2241e2b9 Iustin Pop
      ('1m', 60),
47 2241e2b9 Iustin Pop
      ('1h', 60 * 60),
48 2241e2b9 Iustin Pop
      ('1d', 60 * 60 * 24),
49 2241e2b9 Iustin Pop
      ('1w', 60 * 60 * 24 * 7),
50 2241e2b9 Iustin Pop
      ('4h', 4 * 60 * 60),
51 2241e2b9 Iustin Pop
      ('61m', 61 * 60),
52 2241e2b9 Iustin Pop
      ]
53 2241e2b9 Iustin Pop
    for value, expected_result in test_data:
54 2241e2b9 Iustin Pop
      self.failUnlessEqual(cli.ParseTimespec(value), expected_result)
55 2241e2b9 Iustin Pop
56 2241e2b9 Iustin Pop
  def testInvalidTime(self):
57 2241e2b9 Iustin Pop
    """Test invalid timespecs"""
58 2241e2b9 Iustin Pop
    test_data = [
59 2241e2b9 Iustin Pop
      '1y',
60 2241e2b9 Iustin Pop
      '',
61 2241e2b9 Iustin Pop
      'aaa',
62 2241e2b9 Iustin Pop
      's',
63 2241e2b9 Iustin Pop
      ]
64 2241e2b9 Iustin Pop
    for value in test_data:
65 2241e2b9 Iustin Pop
      self.failUnlessRaises(OpPrereqError, cli.ParseTimespec, value)
66 2241e2b9 Iustin Pop
67 2241e2b9 Iustin Pop
68 a8469393 Iustin Pop
class TestSplitKeyVal(unittest.TestCase):
69 a8469393 Iustin Pop
  """Testing case for cli._SplitKeyVal"""
70 fcd62d84 Iustin Pop
  DATA = "a=b,c,no_d,-e"
71 fcd62d84 Iustin Pop
  RESULT = {"a": "b", "c": True, "d": False, "e": None}
72 a8469393 Iustin Pop
73 a8469393 Iustin Pop
  def testSplitKeyVal(self):
74 a8469393 Iustin Pop
    """Test splitting"""
75 a8469393 Iustin Pop
    self.failUnlessEqual(cli._SplitKeyVal("option", self.DATA), self.RESULT)
76 a8469393 Iustin Pop
77 a8469393 Iustin Pop
  def testDuplicateParam(self):
78 a8469393 Iustin Pop
    """Test duplicate parameters"""
79 a8469393 Iustin Pop
    for data in ("a=1,a=2", "a,no_a"):
80 a8469393 Iustin Pop
      self.failUnlessRaises(ParameterError, cli._SplitKeyVal,
81 a8469393 Iustin Pop
                            "option", data)
82 a8469393 Iustin Pop
83 4f31882e Guido Trotter
  def testEmptyData(self):
84 4f31882e Guido Trotter
    """Test how we handle splitting an empty string"""
85 4f31882e Guido Trotter
    self.failUnlessEqual(cli._SplitKeyVal("option", ""), {})
86 4f31882e Guido Trotter
87 8b46606c Guido Trotter
class TestIdentKeyVal(unittest.TestCase):
88 8b46606c Guido Trotter
  """Testing case for cli.check_ident_key_val"""
89 8b46606c Guido Trotter
90 8b46606c Guido Trotter
  def testIdentKeyVal(self):
91 8b46606c Guido Trotter
    """Test identkeyval"""
92 8b46606c Guido Trotter
    def cikv(value):
93 8b46606c Guido Trotter
      return cli.check_ident_key_val("option", "opt", value)
94 8b46606c Guido Trotter
95 8b46606c Guido Trotter
    self.assertEqual(cikv("foo:bar"), ("foo", {"bar": True}))
96 8b46606c Guido Trotter
    self.assertEqual(cikv("foo:bar=baz"), ("foo", {"bar": "baz"}))
97 8b46606c Guido Trotter
    self.assertEqual(cikv("bar:b=c,c=a"), ("bar", {"b": "c", "c": "a"}))
98 8b46606c Guido Trotter
    self.assertEqual(cikv("no_bar"), ("bar", False))
99 8b46606c Guido Trotter
    self.assertRaises(ParameterError, cikv, "no_bar:foo")
100 8b46606c Guido Trotter
    self.assertRaises(ParameterError, cikv, "no_bar:foo=baz")
101 8b46606c Guido Trotter
    self.assertEqual(cikv("-foo"), ("foo", None))
102 8b46606c Guido Trotter
    self.assertRaises(ParameterError, cikv, "-foo:a=c")
103 8b46606c Guido Trotter
104 a8469393 Iustin Pop
105 46fbdd04 Iustin Pop
class TestToStream(unittest.TestCase):
106 4e338533 Michael Hanselmann
  """Test the ToStream functions"""
107 46fbdd04 Iustin Pop
108 46fbdd04 Iustin Pop
  def testBasic(self):
109 46fbdd04 Iustin Pop
    for data in ["foo",
110 46fbdd04 Iustin Pop
                 "foo %s",
111 46fbdd04 Iustin Pop
                 "foo %(test)s",
112 46fbdd04 Iustin Pop
                 "foo %s %s",
113 46fbdd04 Iustin Pop
                 "",
114 46fbdd04 Iustin Pop
                 ]:
115 46fbdd04 Iustin Pop
      buf = StringIO()
116 46fbdd04 Iustin Pop
      cli._ToStream(buf, data)
117 46fbdd04 Iustin Pop
      self.failUnlessEqual(buf.getvalue(), data+'\n')
118 46fbdd04 Iustin Pop
119 46fbdd04 Iustin Pop
  def testParams(self):
120 46fbdd04 Iustin Pop
      buf = StringIO()
121 46fbdd04 Iustin Pop
      cli._ToStream(buf, "foo %s", 1)
122 46fbdd04 Iustin Pop
      self.failUnlessEqual(buf.getvalue(), "foo 1\n")
123 46fbdd04 Iustin Pop
      buf = StringIO()
124 46fbdd04 Iustin Pop
      cli._ToStream(buf, "foo %s", (15,16))
125 46fbdd04 Iustin Pop
      self.failUnlessEqual(buf.getvalue(), "foo (15, 16)\n")
126 46fbdd04 Iustin Pop
      buf = StringIO()
127 46fbdd04 Iustin Pop
      cli._ToStream(buf, "foo %s %s", "a", "b")
128 46fbdd04 Iustin Pop
      self.failUnlessEqual(buf.getvalue(), "foo a b\n")
129 46fbdd04 Iustin Pop
130 2ebf1568 Michael Hanselmann
131 2ebf1568 Michael Hanselmann
class TestGenerateTable(unittest.TestCase):
132 2ebf1568 Michael Hanselmann
  HEADERS = dict([("f%s" % i, "Field%s" % i) for i in range(5)])
133 2ebf1568 Michael Hanselmann
134 2ebf1568 Michael Hanselmann
  FIELDS1 = ["f1", "f2"]
135 2ebf1568 Michael Hanselmann
  DATA1 = [
136 2ebf1568 Michael Hanselmann
    ["abc", 1234],
137 2ebf1568 Michael Hanselmann
    ["foobar", 56],
138 2ebf1568 Michael Hanselmann
    ["b", -14],
139 2ebf1568 Michael Hanselmann
    ]
140 2ebf1568 Michael Hanselmann
141 2ebf1568 Michael Hanselmann
  def _test(self, headers, fields, separator, data,
142 2ebf1568 Michael Hanselmann
            numfields, unitfields, units, expected):
143 2ebf1568 Michael Hanselmann
    table = cli.GenerateTable(headers, fields, separator, data,
144 2ebf1568 Michael Hanselmann
                              numfields=numfields, unitfields=unitfields,
145 2ebf1568 Michael Hanselmann
                              units=units)
146 2ebf1568 Michael Hanselmann
    self.assertEqual(table, expected)
147 2ebf1568 Michael Hanselmann
148 2ebf1568 Michael Hanselmann
  def testPlain(self):
149 2ebf1568 Michael Hanselmann
    exp = [
150 2ebf1568 Michael Hanselmann
      "Field1 Field2",
151 2ebf1568 Michael Hanselmann
      "abc    1234",
152 2ebf1568 Michael Hanselmann
      "foobar 56",
153 2ebf1568 Michael Hanselmann
      "b      -14",
154 2ebf1568 Michael Hanselmann
      ]
155 2ebf1568 Michael Hanselmann
    self._test(self.HEADERS, self.FIELDS1, None, self.DATA1,
156 2ebf1568 Michael Hanselmann
               None, None, "m", exp)
157 2ebf1568 Michael Hanselmann
158 2ebf1568 Michael Hanselmann
  def testNoFields(self):
159 2ebf1568 Michael Hanselmann
    self._test(self.HEADERS, [], None, [[], []],
160 2ebf1568 Michael Hanselmann
               None, None, "m", ["", "", ""])
161 2ebf1568 Michael Hanselmann
    self._test(None, [], None, [[], []],
162 2ebf1568 Michael Hanselmann
               None, None, "m", ["", ""])
163 2ebf1568 Michael Hanselmann
164 2ebf1568 Michael Hanselmann
  def testSeparator(self):
165 2ebf1568 Michael Hanselmann
    for sep in ["#", ":", ",", "^", "!", "%", "|", "###", "%%", "!!!", "||"]:
166 2ebf1568 Michael Hanselmann
      exp = [
167 2ebf1568 Michael Hanselmann
        "Field1%sField2" % sep,
168 2ebf1568 Michael Hanselmann
        "abc%s1234" % sep,
169 2ebf1568 Michael Hanselmann
        "foobar%s56" % sep,
170 2ebf1568 Michael Hanselmann
        "b%s-14" % sep,
171 2ebf1568 Michael Hanselmann
        ]
172 2ebf1568 Michael Hanselmann
      self._test(self.HEADERS, self.FIELDS1, sep, self.DATA1,
173 2ebf1568 Michael Hanselmann
                 None, None, "m", exp)
174 2ebf1568 Michael Hanselmann
175 2ebf1568 Michael Hanselmann
  def testNoHeader(self):
176 2ebf1568 Michael Hanselmann
    exp = [
177 2ebf1568 Michael Hanselmann
      "abc    1234",
178 2ebf1568 Michael Hanselmann
      "foobar 56",
179 2ebf1568 Michael Hanselmann
      "b      -14",
180 2ebf1568 Michael Hanselmann
      ]
181 2ebf1568 Michael Hanselmann
    self._test(None, self.FIELDS1, None, self.DATA1,
182 2ebf1568 Michael Hanselmann
               None, None, "m", exp)
183 2ebf1568 Michael Hanselmann
184 2ebf1568 Michael Hanselmann
  def testUnknownField(self):
185 2ebf1568 Michael Hanselmann
    headers = {
186 2ebf1568 Michael Hanselmann
      "f1": "Field1",
187 2ebf1568 Michael Hanselmann
      }
188 2ebf1568 Michael Hanselmann
    exp = [
189 2ebf1568 Michael Hanselmann
      "Field1 UNKNOWN",
190 2ebf1568 Michael Hanselmann
      "abc    1234",
191 2ebf1568 Michael Hanselmann
      "foobar 56",
192 2ebf1568 Michael Hanselmann
      "b      -14",
193 2ebf1568 Michael Hanselmann
      ]
194 2ebf1568 Michael Hanselmann
    self._test(headers, ["f1", "UNKNOWN"], None, self.DATA1,
195 2ebf1568 Michael Hanselmann
               None, None, "m", exp)
196 2ebf1568 Michael Hanselmann
197 2ebf1568 Michael Hanselmann
  def testNumfields(self):
198 2ebf1568 Michael Hanselmann
    fields = ["f1", "f2", "f3"]
199 2ebf1568 Michael Hanselmann
    data = [
200 2ebf1568 Michael Hanselmann
      ["abc", 1234, 0],
201 2ebf1568 Michael Hanselmann
      ["foobar", 56, 3],
202 2ebf1568 Michael Hanselmann
      ["b", -14, "-"],
203 2ebf1568 Michael Hanselmann
      ]
204 2ebf1568 Michael Hanselmann
    exp = [
205 2ebf1568 Michael Hanselmann
      "Field1 Field2 Field3",
206 2ebf1568 Michael Hanselmann
      "abc      1234      0",
207 2ebf1568 Michael Hanselmann
      "foobar     56      3",
208 2ebf1568 Michael Hanselmann
      "b         -14      -",
209 2ebf1568 Michael Hanselmann
      ]
210 2ebf1568 Michael Hanselmann
    self._test(self.HEADERS, fields, None, data,
211 2ebf1568 Michael Hanselmann
               ["f2", "f3"], None, "m", exp)
212 2ebf1568 Michael Hanselmann
213 2ebf1568 Michael Hanselmann
  def testUnitfields(self):
214 2ebf1568 Michael Hanselmann
    expnosep = [
215 2ebf1568 Michael Hanselmann
      "Field1 Field2 Field3",
216 2ebf1568 Michael Hanselmann
      "abc      1234     0M",
217 2ebf1568 Michael Hanselmann
      "foobar     56     3M",
218 2ebf1568 Michael Hanselmann
      "b         -14      -",
219 2ebf1568 Michael Hanselmann
      ]
220 2ebf1568 Michael Hanselmann
221 2ebf1568 Michael Hanselmann
    expsep = [
222 2ebf1568 Michael Hanselmann
      "Field1:Field2:Field3",
223 2ebf1568 Michael Hanselmann
      "abc:1234:0M",
224 2ebf1568 Michael Hanselmann
      "foobar:56:3M",
225 2ebf1568 Michael Hanselmann
      "b:-14:-",
226 2ebf1568 Michael Hanselmann
      ]
227 2ebf1568 Michael Hanselmann
228 2ebf1568 Michael Hanselmann
    for sep, expected in [(None, expnosep), (":", expsep)]:
229 2ebf1568 Michael Hanselmann
      fields = ["f1", "f2", "f3"]
230 2ebf1568 Michael Hanselmann
      data = [
231 2ebf1568 Michael Hanselmann
        ["abc", 1234, 0],
232 2ebf1568 Michael Hanselmann
        ["foobar", 56, 3],
233 2ebf1568 Michael Hanselmann
        ["b", -14, "-"],
234 2ebf1568 Michael Hanselmann
        ]
235 2ebf1568 Michael Hanselmann
      self._test(self.HEADERS, fields, sep, data,
236 2ebf1568 Michael Hanselmann
                 ["f2", "f3"], ["f3"], "h", expected)
237 2ebf1568 Michael Hanselmann
238 2ebf1568 Michael Hanselmann
  def testUnusual(self):
239 2ebf1568 Michael Hanselmann
    data = [
240 2ebf1568 Michael Hanselmann
      ["%", "xyz"],
241 2ebf1568 Michael Hanselmann
      ["%%", "abc"],
242 2ebf1568 Michael Hanselmann
      ]
243 2ebf1568 Michael Hanselmann
    exp = [
244 2ebf1568 Michael Hanselmann
      "Field1 Field2",
245 2ebf1568 Michael Hanselmann
      "%      xyz",
246 2ebf1568 Michael Hanselmann
      "%%     abc",
247 2ebf1568 Michael Hanselmann
      ]
248 2ebf1568 Michael Hanselmann
    self._test(self.HEADERS, ["f1", "f2"], None, data,
249 2ebf1568 Michael Hanselmann
               None, None, "m", exp)
250 2ebf1568 Michael Hanselmann
251 2ebf1568 Michael Hanselmann
252 ee3aedff Michael Hanselmann
class TestFormatQueryResult(unittest.TestCase):
253 ee3aedff Michael Hanselmann
  def test(self):
254 ee3aedff Michael Hanselmann
    fields = [
255 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="name", title="Name",
256 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
257 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="size", title="Size",
258 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
259 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="act", title="Active",
260 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
261 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="mem", title="Memory",
262 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_UNIT),
263 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="other", title="SomeList",
264 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_OTHER),
265 ee3aedff Michael Hanselmann
      ]
266 ee3aedff Michael Hanselmann
267 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
268 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "nodeA"), (constants.QRFS_NORMAL, 128),
269 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, False), (constants.QRFS_NORMAL, 1468006),
270 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, [])],
271 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "other"), (constants.QRFS_NORMAL, 512),
272 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, True), (constants.QRFS_NORMAL, 16),
273 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, [1, 2, 3])],
274 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "xyz"), (constants.QRFS_NORMAL, 1024),
275 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, True), (constants.QRFS_NORMAL, 4096),
276 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, [{}, {}])],
277 ee3aedff Michael Hanselmann
      ])
278 ee3aedff Michael Hanselmann
279 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, unit="h", header=True),
280 ee3aedff Michael Hanselmann
      (cli.QR_NORMAL, [
281 ee3aedff Michael Hanselmann
      "Name  Size Active Memory SomeList",
282 ee3aedff Michael Hanselmann
      "nodeA  128 N        1.4T []",
283 ee3aedff Michael Hanselmann
      "other  512 Y         16M [1, 2, 3]",
284 ee3aedff Michael Hanselmann
      "xyz   1024 Y        4.0G [{}, {}]",
285 ee3aedff Michael Hanselmann
      ]))
286 ee3aedff Michael Hanselmann
287 ee3aedff Michael Hanselmann
  def testTimestampAndUnit(self):
288 ee3aedff Michael Hanselmann
    fields = [
289 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="name", title="Name",
290 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
291 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="size", title="Size",
292 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_UNIT),
293 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="mtime", title="ModTime",
294 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TIMESTAMP),
295 ee3aedff Michael Hanselmann
      ]
296 ee3aedff Michael Hanselmann
297 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
298 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "a"), (constants.QRFS_NORMAL, 1024),
299 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, 0)],
300 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "b"), (constants.QRFS_NORMAL, 144996),
301 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, 1291746295)],
302 ee3aedff Michael Hanselmann
      ])
303 ee3aedff Michael Hanselmann
304 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, unit="m", header=True),
305 ee3aedff Michael Hanselmann
      (cli.QR_NORMAL, [
306 ee3aedff Michael Hanselmann
      "Name   Size ModTime",
307 ee3aedff Michael Hanselmann
      "a      1024 %s" % utils.FormatTime(0),
308 ee3aedff Michael Hanselmann
      "b    144996 %s" % utils.FormatTime(1291746295),
309 ee3aedff Michael Hanselmann
      ]))
310 ee3aedff Michael Hanselmann
311 ee3aedff Michael Hanselmann
  def testOverride(self):
312 ee3aedff Michael Hanselmann
    fields = [
313 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="name", title="Name",
314 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
315 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="cust", title="Custom",
316 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_OTHER),
317 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="xt", title="XTime",
318 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TIMESTAMP),
319 ee3aedff Michael Hanselmann
      ]
320 ee3aedff Michael Hanselmann
321 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
322 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "x"), (constants.QRFS_NORMAL, ["a", "b", "c"]),
323 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, 1234)],
324 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "y"), (constants.QRFS_NORMAL, range(10)),
325 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, 1291746295)],
326 ee3aedff Michael Hanselmann
      ])
327 ee3aedff Michael Hanselmann
328 ee3aedff Michael Hanselmann
    override = {
329 ee3aedff Michael Hanselmann
      "cust": (utils.CommaJoin, False),
330 ee3aedff Michael Hanselmann
      "xt": (hex, True),
331 ee3aedff Michael Hanselmann
      }
332 ee3aedff Michael Hanselmann
333 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, unit="h", header=True,
334 ee3aedff Michael Hanselmann
                                           format_override=override),
335 ee3aedff Michael Hanselmann
      (cli.QR_NORMAL, [
336 ee3aedff Michael Hanselmann
      "Name Custom                            XTime",
337 ee3aedff Michael Hanselmann
      "x    a, b, c                           0x4d2",
338 ee3aedff Michael Hanselmann
      "y    0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0x4cfe7bf7",
339 ee3aedff Michael Hanselmann
      ]))
340 ee3aedff Michael Hanselmann
341 ee3aedff Michael Hanselmann
  def testSeparator(self):
342 ee3aedff Michael Hanselmann
    fields = [
343 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="name", title="Name",
344 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
345 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="count", title="Count",
346 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
347 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="desc", title="Description",
348 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
349 ee3aedff Michael Hanselmann
      ]
350 ee3aedff Michael Hanselmann
351 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
352 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "instance1.example.com"),
353 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, 21125), (constants.QRFS_NORMAL, "Hello World!")],
354 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, "mail.other.net"),
355 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, -9000), (constants.QRFS_NORMAL, "a,b,c")],
356 ee3aedff Michael Hanselmann
      ])
357 ee3aedff Michael Hanselmann
358 ee3aedff Michael Hanselmann
    for sep in [":", "|", "#", "|||", "###", "@@@", "@#@"]:
359 ee3aedff Michael Hanselmann
      for header in [None, "Name%sCount%sDescription" % (sep, sep)]:
360 ee3aedff Michael Hanselmann
        exp = []
361 ee3aedff Michael Hanselmann
        if header:
362 ee3aedff Michael Hanselmann
          exp.append(header)
363 ee3aedff Michael Hanselmann
        exp.extend([
364 ee3aedff Michael Hanselmann
          "instance1.example.com%s21125%sHello World!" % (sep, sep),
365 ee3aedff Michael Hanselmann
          "mail.other.net%s-9000%sa,b,c" % (sep, sep),
366 ee3aedff Michael Hanselmann
          ])
367 ee3aedff Michael Hanselmann
368 ee3aedff Michael Hanselmann
        self.assertEqual(cli.FormatQueryResult(response, separator=sep,
369 ee3aedff Michael Hanselmann
                                               header=bool(header)),
370 ee3aedff Michael Hanselmann
                         (cli.QR_NORMAL, exp))
371 ee3aedff Michael Hanselmann
372 ee3aedff Michael Hanselmann
  def testStatusWithUnknown(self):
373 ee3aedff Michael Hanselmann
    fields = [
374 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="id", title="ID",
375 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
376 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="unk", title="unk",
377 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_UNKNOWN),
378 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="unavail", title="Unavail",
379 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
380 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="nodata", title="NoData",
381 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
382 ee3aedff Michael Hanselmann
      ]
383 ee3aedff Michael Hanselmann
384 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
385 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, 1), (constants.QRFS_UNKNOWN, None),
386 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, False), (constants.QRFS_NORMAL, "")],
387 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, 2), (constants.QRFS_UNKNOWN, None),
388 ee3aedff Michael Hanselmann
       (constants.QRFS_NODATA, None), (constants.QRFS_NORMAL, "x")],
389 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, 3), (constants.QRFS_UNKNOWN, None),
390 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, False), (constants.QRFS_UNAVAIL, None)],
391 ee3aedff Michael Hanselmann
      ])
392 ee3aedff Michael Hanselmann
393 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=True,
394 ee3aedff Michael Hanselmann
                                           separator="|"),
395 ee3aedff Michael Hanselmann
      (cli.QR_UNKNOWN, [
396 ee3aedff Michael Hanselmann
      "ID|unk|Unavail|NoData",
397 ee3aedff Michael Hanselmann
      "1|<unknown>|N|",
398 ee3aedff Michael Hanselmann
      "2|<unknown>|<nodata>|x",
399 ee3aedff Michael Hanselmann
      "3|<unknown>|N|<unavail>",
400 ee3aedff Michael Hanselmann
      ]))
401 ee3aedff Michael Hanselmann
402 ee3aedff Michael Hanselmann
  def testNoData(self):
403 ee3aedff Michael Hanselmann
    fields = [
404 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="id", title="ID",
405 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
406 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="name", title="Name",
407 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
408 ee3aedff Michael Hanselmann
      ]
409 ee3aedff Michael Hanselmann
410 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
411 ee3aedff Michael Hanselmann
412 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=True),
413 ee3aedff Michael Hanselmann
                     (cli.QR_NORMAL, ["ID Name"]))
414 ee3aedff Michael Hanselmann
415 ee3aedff Michael Hanselmann
  def testNoDataWithUnknown(self):
416 ee3aedff Michael Hanselmann
    fields = [
417 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="id", title="ID",
418 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
419 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="unk", title="unk",
420 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_UNKNOWN),
421 ee3aedff Michael Hanselmann
      ]
422 ee3aedff Michael Hanselmann
423 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
424 ee3aedff Michael Hanselmann
425 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=False),
426 ee3aedff Michael Hanselmann
                     (cli.QR_UNKNOWN, []))
427 ee3aedff Michael Hanselmann
428 ee3aedff Michael Hanselmann
  def testStatus(self):
429 ee3aedff Michael Hanselmann
    fields = [
430 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="id", title="ID",
431 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
432 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="unavail", title="Unavail",
433 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
434 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="nodata", title="NoData",
435 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
436 ee3aedff Michael Hanselmann
      ]
437 ee3aedff Michael Hanselmann
438 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
439 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, 1), (constants.QRFS_NORMAL, False),
440 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, "")],
441 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, 2), (constants.QRFS_NODATA, None),
442 ee3aedff Michael Hanselmann
       (constants.QRFS_NORMAL, "x")],
443 ee3aedff Michael Hanselmann
      [(constants.QRFS_NORMAL, 3), (constants.QRFS_NORMAL, False),
444 ee3aedff Michael Hanselmann
       (constants.QRFS_UNAVAIL, None)],
445 ee3aedff Michael Hanselmann
      ])
446 ee3aedff Michael Hanselmann
447 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=False,
448 ee3aedff Michael Hanselmann
                                           separator="|"),
449 ee3aedff Michael Hanselmann
      (cli.QR_INCOMPLETE, [
450 ee3aedff Michael Hanselmann
      "1|N|",
451 ee3aedff Michael Hanselmann
      "2|<nodata>|x",
452 ee3aedff Michael Hanselmann
      "3|N|<unavail>",
453 ee3aedff Michael Hanselmann
      ]))
454 ee3aedff Michael Hanselmann
455 ee3aedff Michael Hanselmann
  def testInvalidFieldType(self):
456 ee3aedff Michael Hanselmann
    fields = [
457 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="x", title="x",
458 ee3aedff Michael Hanselmann
                                   kind="#some#other#type"),
459 ee3aedff Michael Hanselmann
      ]
460 ee3aedff Michael Hanselmann
461 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
462 ee3aedff Michael Hanselmann
463 ee3aedff Michael Hanselmann
    self.assertRaises(NotImplementedError, cli.FormatQueryResult, response)
464 ee3aedff Michael Hanselmann
465 ee3aedff Michael Hanselmann
  def testInvalidFieldStatus(self):
466 ee3aedff Michael Hanselmann
    fields = [
467 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="x", title="x",
468 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
469 ee3aedff Michael Hanselmann
      ]
470 ee3aedff Michael Hanselmann
471 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[[(-1, None)]])
472 ee3aedff Michael Hanselmann
    self.assertRaises(NotImplementedError, cli.FormatQueryResult, response)
473 ee3aedff Michael Hanselmann
474 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[[(-1, "x")]])
475 ee3aedff Michael Hanselmann
    self.assertRaises(AssertionError, cli.FormatQueryResult, response)
476 ee3aedff Michael Hanselmann
477 ee3aedff Michael Hanselmann
  def testEmptyFieldTitle(self):
478 ee3aedff Michael Hanselmann
    fields = [
479 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="x", title="",
480 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
481 ee3aedff Michael Hanselmann
      ]
482 ee3aedff Michael Hanselmann
483 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
484 ee3aedff Michael Hanselmann
    self.assertRaises(AssertionError, cli.FormatQueryResult, response)
485 ee3aedff Michael Hanselmann
486 ee3aedff Michael Hanselmann
487 4e338533 Michael Hanselmann
class _MockJobPollCb(cli.JobPollCbBase, cli.JobPollReportCbBase):
488 4e338533 Michael Hanselmann
  def __init__(self, tc, job_id):
489 4e338533 Michael Hanselmann
    self.tc = tc
490 4e338533 Michael Hanselmann
    self.job_id = job_id
491 4e338533 Michael Hanselmann
    self._wfjcr = []
492 4e338533 Michael Hanselmann
    self._jobstatus = []
493 4e338533 Michael Hanselmann
    self._expect_notchanged = False
494 4e338533 Michael Hanselmann
    self._expect_log = []
495 4e338533 Michael Hanselmann
496 4e338533 Michael Hanselmann
  def CheckEmpty(self):
497 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._wfjcr)
498 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._jobstatus)
499 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_notchanged)
500 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_log)
501 4e338533 Michael Hanselmann
502 4e338533 Michael Hanselmann
  def AddWfjcResult(self, *args):
503 4e338533 Michael Hanselmann
    self._wfjcr.append(args)
504 4e338533 Michael Hanselmann
505 4e338533 Michael Hanselmann
  def AddQueryJobsResult(self, *args):
506 4e338533 Michael Hanselmann
    self._jobstatus.append(args)
507 4e338533 Michael Hanselmann
508 4e338533 Michael Hanselmann
  def WaitForJobChangeOnce(self, job_id, fields,
509 4e338533 Michael Hanselmann
                           prev_job_info, prev_log_serial):
510 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_id, self.job_id)
511 4e338533 Michael Hanselmann
    self.tc.assertEqualValues(fields, ["status"])
512 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_notchanged)
513 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_log)
514 4e338533 Michael Hanselmann
515 4e338533 Michael Hanselmann
    (exp_prev_job_info, exp_prev_log_serial, result) = self._wfjcr.pop(0)
516 4e338533 Michael Hanselmann
    self.tc.assertEqualValues(prev_job_info, exp_prev_job_info)
517 4e338533 Michael Hanselmann
    self.tc.assertEqual(prev_log_serial, exp_prev_log_serial)
518 4e338533 Michael Hanselmann
519 4e338533 Michael Hanselmann
    if result == constants.JOB_NOTCHANGED:
520 4e338533 Michael Hanselmann
      self._expect_notchanged = True
521 4e338533 Michael Hanselmann
    elif result:
522 4e338533 Michael Hanselmann
      (_, logmsgs) = result
523 4e338533 Michael Hanselmann
      if logmsgs:
524 4e338533 Michael Hanselmann
        self._expect_log.extend(logmsgs)
525 4e338533 Michael Hanselmann
526 4e338533 Michael Hanselmann
    return result
527 4e338533 Michael Hanselmann
528 4e338533 Michael Hanselmann
  def QueryJobs(self, job_ids, fields):
529 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_ids, [self.job_id])
530 4e338533 Michael Hanselmann
    self.tc.assertEqualValues(fields, ["status", "opstatus", "opresult"])
531 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_notchanged)
532 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_log)
533 4e338533 Michael Hanselmann
534 4e338533 Michael Hanselmann
    result = self._jobstatus.pop(0)
535 4e338533 Michael Hanselmann
    self.tc.assertEqual(len(fields), len(result))
536 4e338533 Michael Hanselmann
    return [result]
537 4e338533 Michael Hanselmann
538 4e338533 Michael Hanselmann
  def ReportLogMessage(self, job_id, serial, timestamp, log_type, log_msg):
539 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_id, self.job_id)
540 4e338533 Michael Hanselmann
    self.tc.assertEqualValues((serial, timestamp, log_type, log_msg),
541 4e338533 Michael Hanselmann
                              self._expect_log.pop(0))
542 4e338533 Michael Hanselmann
543 4e338533 Michael Hanselmann
  def ReportNotChanged(self, job_id, status):
544 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_id, self.job_id)
545 4e338533 Michael Hanselmann
    self.tc.assert_(self._expect_notchanged)
546 4e338533 Michael Hanselmann
    self._expect_notchanged = False
547 4e338533 Michael Hanselmann
548 4e338533 Michael Hanselmann
549 4e338533 Michael Hanselmann
class TestGenericPollJob(testutils.GanetiTestCase):
550 4e338533 Michael Hanselmann
  def testSuccessWithLog(self):
551 4e338533 Michael Hanselmann
    job_id = 29609
552 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
553 4e338533 Michael Hanselmann
554 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
555 4e338533 Michael Hanselmann
556 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None,
557 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_QUEUED, ), None))
558 4e338533 Michael Hanselmann
559 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_QUEUED, ), None,
560 4e338533 Michael Hanselmann
                      constants.JOB_NOTCHANGED)
561 4e338533 Michael Hanselmann
562 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_QUEUED, ), None,
563 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_RUNNING, ),
564 4e338533 Michael Hanselmann
                       [(1, utils.SplitTime(1273491611.0),
565 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 1"),
566 4e338533 Michael Hanselmann
                        (2, utils.SplitTime(1273491615.9),
567 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 2"),
568 4e338533 Michael Hanselmann
                        (3, utils.SplitTime(1273491625.02),
569 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 3"),
570 4e338533 Michael Hanselmann
                        (4, utils.SplitTime(1273491635.05),
571 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 4"),
572 4e338533 Michael Hanselmann
                        (37, utils.SplitTime(1273491645.0),
573 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 5"),
574 4e338533 Michael Hanselmann
                        (203, utils.SplitTime(127349155.0),
575 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 6")]))
576 4e338533 Michael Hanselmann
577 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_RUNNING, ), 203,
578 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_RUNNING, ),
579 4e338533 Michael Hanselmann
                       [(300, utils.SplitTime(1273491711.01),
580 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step X"),
581 4e338533 Michael Hanselmann
                        (302, utils.SplitTime(1273491815.8),
582 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step Y"),
583 4e338533 Michael Hanselmann
                        (303, utils.SplitTime(1273491925.32),
584 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step Z")]))
585 4e338533 Michael Hanselmann
586 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_RUNNING, ), 303,
587 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_SUCCESS, ), None))
588 4e338533 Michael Hanselmann
589 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_SUCCESS,
590 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_SUCCESS,
591 4e338533 Michael Hanselmann
                            constants.OP_STATUS_SUCCESS],
592 4e338533 Michael Hanselmann
                           ["Hello World", "Foo man bar"])
593 4e338533 Michael Hanselmann
594 4e338533 Michael Hanselmann
    self.assertEqual(["Hello World", "Foo man bar"],
595 4e338533 Michael Hanselmann
                     cli.GenericPollJob(job_id, cbs, cbs))
596 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
597 4e338533 Michael Hanselmann
598 4e338533 Michael Hanselmann
  def testJobLost(self):
599 4e338533 Michael Hanselmann
    job_id = 13746
600 4e338533 Michael Hanselmann
601 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
602 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
603 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, None)
604 4e338533 Michael Hanselmann
    self.assertRaises(errors.JobLost, cli.GenericPollJob, job_id, cbs, cbs)
605 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
606 4e338533 Michael Hanselmann
607 4e338533 Michael Hanselmann
  def testError(self):
608 4e338533 Michael Hanselmann
    job_id = 31088
609 4e338533 Michael Hanselmann
610 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
611 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
612 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_ERROR, ), None))
613 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_ERROR,
614 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_SUCCESS,
615 4e338533 Michael Hanselmann
                            constants.OP_STATUS_ERROR],
616 4e338533 Michael Hanselmann
                           ["Hello World", "Error code 123"])
617 4e338533 Michael Hanselmann
    self.assertRaises(errors.OpExecError, cli.GenericPollJob, job_id, cbs, cbs)
618 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
619 4e338533 Michael Hanselmann
620 4e338533 Michael Hanselmann
  def testError2(self):
621 4e338533 Michael Hanselmann
    job_id = 22235
622 4e338533 Michael Hanselmann
623 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
624 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_ERROR, ), None))
625 4e338533 Michael Hanselmann
    encexc = errors.EncodeException(errors.LockError("problem"))
626 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_ERROR,
627 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_ERROR], [encexc])
628 4e338533 Michael Hanselmann
    self.assertRaises(errors.LockError, cli.GenericPollJob, job_id, cbs, cbs)
629 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
630 4e338533 Michael Hanselmann
631 4e338533 Michael Hanselmann
  def testWeirdError(self):
632 4e338533 Michael Hanselmann
    job_id = 28847
633 4e338533 Michael Hanselmann
634 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
635 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_ERROR, ), None))
636 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_ERROR,
637 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_RUNNING,
638 4e338533 Michael Hanselmann
                            constants.OP_STATUS_RUNNING],
639 4e338533 Michael Hanselmann
                           [None, None])
640 4e338533 Michael Hanselmann
    self.assertRaises(errors.OpExecError, cli.GenericPollJob, job_id, cbs, cbs)
641 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
642 4e338533 Michael Hanselmann
643 4e338533 Michael Hanselmann
  def testCancel(self):
644 4e338533 Michael Hanselmann
    job_id = 4275
645 4e338533 Michael Hanselmann
646 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
647 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
648 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_CANCELING, ), None))
649 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_CANCELING,
650 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_CANCELING,
651 4e338533 Michael Hanselmann
                            constants.OP_STATUS_CANCELING],
652 4e338533 Michael Hanselmann
                           [None, None])
653 4e338533 Michael Hanselmann
    self.assertRaises(errors.OpExecError, cli.GenericPollJob, job_id, cbs, cbs)
654 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
655 4e338533 Michael Hanselmann
656 4e338533 Michael Hanselmann
657 8a7f1c61 Michael Hanselmann
class TestFormatLogMessage(unittest.TestCase):
658 8a7f1c61 Michael Hanselmann
  def test(self):
659 8a7f1c61 Michael Hanselmann
    self.assertEqual(cli.FormatLogMessage(constants.ELOG_MESSAGE,
660 8a7f1c61 Michael Hanselmann
                                          "Hello World"),
661 8a7f1c61 Michael Hanselmann
                     "Hello World")
662 8a7f1c61 Michael Hanselmann
    self.assertRaises(TypeError, cli.FormatLogMessage,
663 8a7f1c61 Michael Hanselmann
                      constants.ELOG_MESSAGE, [1, 2, 3])
664 8a7f1c61 Michael Hanselmann
665 8a7f1c61 Michael Hanselmann
    self.assert_(cli.FormatLogMessage("some other type", (1, 2, 3)))
666 8a7f1c61 Michael Hanselmann
667 8a7f1c61 Michael Hanselmann
668 a4ebd726 Michael Hanselmann
class TestParseFields(unittest.TestCase):
669 a4ebd726 Michael Hanselmann
  def test(self):
670 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields(None, []), [])
671 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields("name,foo,hello", []),
672 a4ebd726 Michael Hanselmann
                     ["name", "foo", "hello"])
673 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields(None, ["def", "ault", "fields", "here"]),
674 a4ebd726 Michael Hanselmann
                     ["def", "ault", "fields", "here"])
675 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields("name,foo", ["def", "ault"]),
676 a4ebd726 Michael Hanselmann
                     ["name", "foo"])
677 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields("+name,foo", ["def", "ault"]),
678 a4ebd726 Michael Hanselmann
                     ["def", "ault", "name", "foo"])
679 a4ebd726 Michael Hanselmann
680 a4ebd726 Michael Hanselmann
681 84a5b33c Michael Hanselmann
class TestConstants(unittest.TestCase):
682 84a5b33c Michael Hanselmann
  def testPriority(self):
683 84a5b33c Michael Hanselmann
    self.assertEqual(set(cli._PRIONAME_TO_VALUE.values()),
684 84a5b33c Michael Hanselmann
                     set(constants.OP_PRIO_SUBMIT_VALID))
685 84a5b33c Michael Hanselmann
    self.assertEqual(list(value for _, value in cli._PRIORITY_NAMES),
686 84a5b33c Michael Hanselmann
                     sorted(constants.OP_PRIO_SUBMIT_VALID, reverse=True))
687 84a5b33c Michael Hanselmann
688 84a5b33c Michael Hanselmann
689 845c79d8 Michael Hanselmann
class TestParseNicOption(unittest.TestCase):
690 845c79d8 Michael Hanselmann
  def test(self):
691 845c79d8 Michael Hanselmann
    self.assertEqual(cli.ParseNicOption([("0", { "link": "eth0", })]),
692 845c79d8 Michael Hanselmann
                     [{ "link": "eth0", }])
693 845c79d8 Michael Hanselmann
    self.assertEqual(cli.ParseNicOption([("5", { "ip": "192.0.2.7", })]),
694 845c79d8 Michael Hanselmann
                     [{}, {}, {}, {}, {}, { "ip": "192.0.2.7", }])
695 845c79d8 Michael Hanselmann
696 845c79d8 Michael Hanselmann
  def testErrors(self):
697 845c79d8 Michael Hanselmann
    for i in [None, "", "abc", "zero", "Hello World", "\0", []]:
698 845c79d8 Michael Hanselmann
      self.assertRaises(errors.OpPrereqError, cli.ParseNicOption,
699 845c79d8 Michael Hanselmann
                        [(i, { "link": "eth0", })])
700 845c79d8 Michael Hanselmann
      self.assertRaises(errors.OpPrereqError, cli.ParseNicOption,
701 845c79d8 Michael Hanselmann
                        [("0", i)])
702 845c79d8 Michael Hanselmann
703 845c79d8 Michael Hanselmann
    self.assertRaises(errors.TypeEnforcementError, cli.ParseNicOption,
704 845c79d8 Michael Hanselmann
                      [(0, { True: False, })])
705 845c79d8 Michael Hanselmann
706 845c79d8 Michael Hanselmann
    self.assertRaises(errors.TypeEnforcementError, cli.ParseNicOption,
707 845c79d8 Michael Hanselmann
                      [(3, { "mode": [], })])
708 845c79d8 Michael Hanselmann
709 845c79d8 Michael Hanselmann
710 2241e2b9 Iustin Pop
if __name__ == '__main__':
711 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()