Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cli_unittest.py @ 3b877f08

History | View | Annotate | Download (26.3 kB)

1 2241e2b9 Iustin Pop
#!/usr/bin/python
2 2241e2b9 Iustin Pop
#
3 2241e2b9 Iustin Pop
4 f0b1bafe Iustin Pop
# Copyright (C) 2008, 2011 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 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "nodeA"), (constants.RS_NORMAL, 128),
269 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, False), (constants.RS_NORMAL, 1468006),
270 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, [])],
271 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "other"), (constants.RS_NORMAL, 512),
272 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, True), (constants.RS_NORMAL, 16),
273 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, [1, 2, 3])],
274 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "xyz"), (constants.RS_NORMAL, 1024),
275 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, True), (constants.RS_NORMAL, 4096),
276 cfb084ae Renรฉ Nussbaumer
       (constants.RS_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 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "a"), (constants.RS_NORMAL, 1024),
299 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, 0)],
300 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "b"), (constants.RS_NORMAL, 144996),
301 cfb084ae Renรฉ Nussbaumer
       (constants.RS_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 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "x"), (constants.RS_NORMAL, ["a", "b", "c"]),
323 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, 1234)],
324 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "y"), (constants.RS_NORMAL, range(10)),
325 cfb084ae Renรฉ Nussbaumer
       (constants.RS_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 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "instance1.example.com"),
353 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, 21125), (constants.RS_NORMAL, "Hello World!")],
354 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, "mail.other.net"),
355 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, -9000), (constants.RS_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 a6070ef7 Michael Hanselmann
      objects.QueryFieldDefinition(name="offline", title="OffLine",
383 a6070ef7 Michael Hanselmann
                                   kind=constants.QFT_TEXT),
384 ee3aedff Michael Hanselmann
      ]
385 ee3aedff Michael Hanselmann
386 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
387 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, 1), (constants.RS_UNKNOWN, None),
388 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, False), (constants.RS_NORMAL, ""),
389 cfb084ae Renรฉ Nussbaumer
       (constants.RS_OFFLINE, None)],
390 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, 2), (constants.RS_UNKNOWN, None),
391 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NODATA, None), (constants.RS_NORMAL, "x"),
392 cfb084ae Renรฉ Nussbaumer
       (constants.RS_OFFLINE, None)],
393 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, 3), (constants.RS_UNKNOWN, None),
394 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, False), (constants.RS_UNAVAIL, None),
395 cfb084ae Renรฉ Nussbaumer
       (constants.RS_OFFLINE, None)],
396 ee3aedff Michael Hanselmann
      ])
397 ee3aedff Michael Hanselmann
398 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=True,
399 f0b1bafe Iustin Pop
                                           separator="|", verbose=True),
400 ee3aedff Michael Hanselmann
      (cli.QR_UNKNOWN, [
401 a6070ef7 Michael Hanselmann
      "ID|unk|Unavail|NoData|OffLine",
402 a6070ef7 Michael Hanselmann
      "1|(unknown)|N||(offline)",
403 a6070ef7 Michael Hanselmann
      "2|(unknown)|(nodata)|x|(offline)",
404 a6070ef7 Michael Hanselmann
      "3|(unknown)|N|(unavail)|(offline)",
405 ee3aedff Michael Hanselmann
      ]))
406 f0b1bafe Iustin Pop
    self.assertEqual(cli.FormatQueryResult(response, header=True,
407 f0b1bafe Iustin Pop
                                           separator="|", verbose=False),
408 f0b1bafe Iustin Pop
      (cli.QR_UNKNOWN, [
409 f0b1bafe Iustin Pop
      "ID|unk|Unavail|NoData|OffLine",
410 f0b1bafe Iustin Pop
      "1|??|N||*",
411 f0b1bafe Iustin Pop
      "2|??|?|x|*",
412 f0b1bafe Iustin Pop
      "3|??|N|-|*",
413 f0b1bafe Iustin Pop
      ]))
414 ee3aedff Michael Hanselmann
415 ee3aedff Michael Hanselmann
  def testNoData(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="name", title="Name",
420 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
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=True),
426 ee3aedff Michael Hanselmann
                     (cli.QR_NORMAL, ["ID Name"]))
427 ee3aedff Michael Hanselmann
428 ee3aedff Michael Hanselmann
  def testNoDataWithUnknown(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="unk", title="unk",
433 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_UNKNOWN),
434 ee3aedff Michael Hanselmann
      ]
435 ee3aedff Michael Hanselmann
436 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
437 ee3aedff Michael Hanselmann
438 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=False),
439 ee3aedff Michael Hanselmann
                     (cli.QR_UNKNOWN, []))
440 ee3aedff Michael Hanselmann
441 ee3aedff Michael Hanselmann
  def testStatus(self):
442 ee3aedff Michael Hanselmann
    fields = [
443 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="id", title="ID",
444 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_NUMBER),
445 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="unavail", title="Unavail",
446 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_BOOL),
447 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="nodata", title="NoData",
448 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
449 a6070ef7 Michael Hanselmann
      objects.QueryFieldDefinition(name="offline", title="OffLine",
450 a6070ef7 Michael Hanselmann
                                   kind=constants.QFT_TEXT),
451 ee3aedff Michael Hanselmann
      ]
452 ee3aedff Michael Hanselmann
453 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[
454 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, 1), (constants.RS_NORMAL, False),
455 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, ""), (constants.RS_OFFLINE, None)],
456 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, 2), (constants.RS_NODATA, None),
457 cfb084ae Renรฉ Nussbaumer
       (constants.RS_NORMAL, "x"), (constants.RS_NORMAL, "abc")],
458 cfb084ae Renรฉ Nussbaumer
      [(constants.RS_NORMAL, 3), (constants.RS_NORMAL, False),
459 cfb084ae Renรฉ Nussbaumer
       (constants.RS_UNAVAIL, None), (constants.RS_OFFLINE, None)],
460 ee3aedff Michael Hanselmann
      ])
461 ee3aedff Michael Hanselmann
462 ee3aedff Michael Hanselmann
    self.assertEqual(cli.FormatQueryResult(response, header=False,
463 f0b1bafe Iustin Pop
                                           separator="|", verbose=True),
464 ee3aedff Michael Hanselmann
      (cli.QR_INCOMPLETE, [
465 a6070ef7 Michael Hanselmann
      "1|N||(offline)",
466 a6070ef7 Michael Hanselmann
      "2|(nodata)|x|abc",
467 a6070ef7 Michael Hanselmann
      "3|N|(unavail)|(offline)",
468 ee3aedff Michael Hanselmann
      ]))
469 f0b1bafe Iustin Pop
    self.assertEqual(cli.FormatQueryResult(response, header=False,
470 f0b1bafe Iustin Pop
                                           separator="|", verbose=False),
471 f0b1bafe Iustin Pop
      (cli.QR_INCOMPLETE, [
472 f0b1bafe Iustin Pop
      "1|N||*",
473 f0b1bafe Iustin Pop
      "2|?|x|abc",
474 f0b1bafe Iustin Pop
      "3|N|-|*",
475 f0b1bafe Iustin Pop
      ]))
476 ee3aedff Michael Hanselmann
477 ee3aedff Michael Hanselmann
  def testInvalidFieldType(self):
478 ee3aedff Michael Hanselmann
    fields = [
479 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="x", title="x",
480 ee3aedff Michael Hanselmann
                                   kind="#some#other#type"),
481 ee3aedff Michael Hanselmann
      ]
482 ee3aedff Michael Hanselmann
483 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
484 ee3aedff Michael Hanselmann
485 ee3aedff Michael Hanselmann
    self.assertRaises(NotImplementedError, cli.FormatQueryResult, response)
486 ee3aedff Michael Hanselmann
487 ee3aedff Michael Hanselmann
  def testInvalidFieldStatus(self):
488 ee3aedff Michael Hanselmann
    fields = [
489 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="x", title="x",
490 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
491 ee3aedff Michael Hanselmann
      ]
492 ee3aedff Michael Hanselmann
493 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[[(-1, None)]])
494 ee3aedff Michael Hanselmann
    self.assertRaises(NotImplementedError, cli.FormatQueryResult, response)
495 ee3aedff Michael Hanselmann
496 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[[(-1, "x")]])
497 ee3aedff Michael Hanselmann
    self.assertRaises(AssertionError, cli.FormatQueryResult, response)
498 ee3aedff Michael Hanselmann
499 ee3aedff Michael Hanselmann
  def testEmptyFieldTitle(self):
500 ee3aedff Michael Hanselmann
    fields = [
501 ee3aedff Michael Hanselmann
      objects.QueryFieldDefinition(name="x", title="",
502 ee3aedff Michael Hanselmann
                                   kind=constants.QFT_TEXT),
503 ee3aedff Michael Hanselmann
      ]
504 ee3aedff Michael Hanselmann
505 ee3aedff Michael Hanselmann
    response = objects.QueryResponse(fields=fields, data=[])
506 ee3aedff Michael Hanselmann
    self.assertRaises(AssertionError, cli.FormatQueryResult, response)
507 ee3aedff Michael Hanselmann
508 ee3aedff Michael Hanselmann
509 4e338533 Michael Hanselmann
class _MockJobPollCb(cli.JobPollCbBase, cli.JobPollReportCbBase):
510 4e338533 Michael Hanselmann
  def __init__(self, tc, job_id):
511 4e338533 Michael Hanselmann
    self.tc = tc
512 4e338533 Michael Hanselmann
    self.job_id = job_id
513 4e338533 Michael Hanselmann
    self._wfjcr = []
514 4e338533 Michael Hanselmann
    self._jobstatus = []
515 4e338533 Michael Hanselmann
    self._expect_notchanged = False
516 4e338533 Michael Hanselmann
    self._expect_log = []
517 4e338533 Michael Hanselmann
518 4e338533 Michael Hanselmann
  def CheckEmpty(self):
519 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._wfjcr)
520 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._jobstatus)
521 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_notchanged)
522 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_log)
523 4e338533 Michael Hanselmann
524 4e338533 Michael Hanselmann
  def AddWfjcResult(self, *args):
525 4e338533 Michael Hanselmann
    self._wfjcr.append(args)
526 4e338533 Michael Hanselmann
527 4e338533 Michael Hanselmann
  def AddQueryJobsResult(self, *args):
528 4e338533 Michael Hanselmann
    self._jobstatus.append(args)
529 4e338533 Michael Hanselmann
530 4e338533 Michael Hanselmann
  def WaitForJobChangeOnce(self, job_id, fields,
531 4e338533 Michael Hanselmann
                           prev_job_info, prev_log_serial):
532 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_id, self.job_id)
533 4e338533 Michael Hanselmann
    self.tc.assertEqualValues(fields, ["status"])
534 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_notchanged)
535 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_log)
536 4e338533 Michael Hanselmann
537 4e338533 Michael Hanselmann
    (exp_prev_job_info, exp_prev_log_serial, result) = self._wfjcr.pop(0)
538 4e338533 Michael Hanselmann
    self.tc.assertEqualValues(prev_job_info, exp_prev_job_info)
539 4e338533 Michael Hanselmann
    self.tc.assertEqual(prev_log_serial, exp_prev_log_serial)
540 4e338533 Michael Hanselmann
541 4e338533 Michael Hanselmann
    if result == constants.JOB_NOTCHANGED:
542 4e338533 Michael Hanselmann
      self._expect_notchanged = True
543 4e338533 Michael Hanselmann
    elif result:
544 4e338533 Michael Hanselmann
      (_, logmsgs) = result
545 4e338533 Michael Hanselmann
      if logmsgs:
546 4e338533 Michael Hanselmann
        self._expect_log.extend(logmsgs)
547 4e338533 Michael Hanselmann
548 4e338533 Michael Hanselmann
    return result
549 4e338533 Michael Hanselmann
550 4e338533 Michael Hanselmann
  def QueryJobs(self, job_ids, fields):
551 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_ids, [self.job_id])
552 4e338533 Michael Hanselmann
    self.tc.assertEqualValues(fields, ["status", "opstatus", "opresult"])
553 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_notchanged)
554 4e338533 Michael Hanselmann
    self.tc.assertFalse(self._expect_log)
555 4e338533 Michael Hanselmann
556 4e338533 Michael Hanselmann
    result = self._jobstatus.pop(0)
557 4e338533 Michael Hanselmann
    self.tc.assertEqual(len(fields), len(result))
558 4e338533 Michael Hanselmann
    return [result]
559 4e338533 Michael Hanselmann
560 4e338533 Michael Hanselmann
  def ReportLogMessage(self, job_id, serial, timestamp, log_type, log_msg):
561 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_id, self.job_id)
562 4e338533 Michael Hanselmann
    self.tc.assertEqualValues((serial, timestamp, log_type, log_msg),
563 4e338533 Michael Hanselmann
                              self._expect_log.pop(0))
564 4e338533 Michael Hanselmann
565 4e338533 Michael Hanselmann
  def ReportNotChanged(self, job_id, status):
566 4e338533 Michael Hanselmann
    self.tc.assertEqual(job_id, self.job_id)
567 4e338533 Michael Hanselmann
    self.tc.assert_(self._expect_notchanged)
568 4e338533 Michael Hanselmann
    self._expect_notchanged = False
569 4e338533 Michael Hanselmann
570 4e338533 Michael Hanselmann
571 4e338533 Michael Hanselmann
class TestGenericPollJob(testutils.GanetiTestCase):
572 4e338533 Michael Hanselmann
  def testSuccessWithLog(self):
573 4e338533 Michael Hanselmann
    job_id = 29609
574 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
575 4e338533 Michael Hanselmann
576 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
577 4e338533 Michael Hanselmann
578 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None,
579 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_QUEUED, ), None))
580 4e338533 Michael Hanselmann
581 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_QUEUED, ), None,
582 4e338533 Michael Hanselmann
                      constants.JOB_NOTCHANGED)
583 4e338533 Michael Hanselmann
584 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_QUEUED, ), None,
585 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_RUNNING, ),
586 4e338533 Michael Hanselmann
                       [(1, utils.SplitTime(1273491611.0),
587 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 1"),
588 4e338533 Michael Hanselmann
                        (2, utils.SplitTime(1273491615.9),
589 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 2"),
590 4e338533 Michael Hanselmann
                        (3, utils.SplitTime(1273491625.02),
591 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 3"),
592 4e338533 Michael Hanselmann
                        (4, utils.SplitTime(1273491635.05),
593 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 4"),
594 4e338533 Michael Hanselmann
                        (37, utils.SplitTime(1273491645.0),
595 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 5"),
596 4e338533 Michael Hanselmann
                        (203, utils.SplitTime(127349155.0),
597 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step 6")]))
598 4e338533 Michael Hanselmann
599 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_RUNNING, ), 203,
600 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_RUNNING, ),
601 4e338533 Michael Hanselmann
                       [(300, utils.SplitTime(1273491711.01),
602 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step X"),
603 4e338533 Michael Hanselmann
                        (302, utils.SplitTime(1273491815.8),
604 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step Y"),
605 4e338533 Michael Hanselmann
                        (303, utils.SplitTime(1273491925.32),
606 4e338533 Michael Hanselmann
                         constants.ELOG_MESSAGE, "Step Z")]))
607 4e338533 Michael Hanselmann
608 4e338533 Michael Hanselmann
    cbs.AddWfjcResult((constants.JOB_STATUS_RUNNING, ), 303,
609 4e338533 Michael Hanselmann
                      ((constants.JOB_STATUS_SUCCESS, ), None))
610 4e338533 Michael Hanselmann
611 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_SUCCESS,
612 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_SUCCESS,
613 4e338533 Michael Hanselmann
                            constants.OP_STATUS_SUCCESS],
614 4e338533 Michael Hanselmann
                           ["Hello World", "Foo man bar"])
615 4e338533 Michael Hanselmann
616 4e338533 Michael Hanselmann
    self.assertEqual(["Hello World", "Foo man bar"],
617 4e338533 Michael Hanselmann
                     cli.GenericPollJob(job_id, cbs, cbs))
618 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
619 4e338533 Michael Hanselmann
620 4e338533 Michael Hanselmann
  def testJobLost(self):
621 4e338533 Michael Hanselmann
    job_id = 13746
622 4e338533 Michael Hanselmann
623 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
624 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
625 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, None)
626 4e338533 Michael Hanselmann
    self.assertRaises(errors.JobLost, cli.GenericPollJob, job_id, cbs, cbs)
627 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
628 4e338533 Michael Hanselmann
629 4e338533 Michael Hanselmann
  def testError(self):
630 4e338533 Michael Hanselmann
    job_id = 31088
631 4e338533 Michael Hanselmann
632 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
633 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
634 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_ERROR, ), None))
635 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_ERROR,
636 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_SUCCESS,
637 4e338533 Michael Hanselmann
                            constants.OP_STATUS_ERROR],
638 4e338533 Michael Hanselmann
                           ["Hello World", "Error code 123"])
639 4e338533 Michael Hanselmann
    self.assertRaises(errors.OpExecError, cli.GenericPollJob, job_id, cbs, cbs)
640 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
641 4e338533 Michael Hanselmann
642 4e338533 Michael Hanselmann
  def testError2(self):
643 4e338533 Michael Hanselmann
    job_id = 22235
644 4e338533 Michael Hanselmann
645 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
646 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_ERROR, ), None))
647 4e338533 Michael Hanselmann
    encexc = errors.EncodeException(errors.LockError("problem"))
648 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_ERROR,
649 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_ERROR], [encexc])
650 4e338533 Michael Hanselmann
    self.assertRaises(errors.LockError, cli.GenericPollJob, job_id, cbs, cbs)
651 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
652 4e338533 Michael Hanselmann
653 4e338533 Michael Hanselmann
  def testWeirdError(self):
654 4e338533 Michael Hanselmann
    job_id = 28847
655 4e338533 Michael Hanselmann
656 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
657 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_ERROR, ), None))
658 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_ERROR,
659 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_RUNNING,
660 4e338533 Michael Hanselmann
                            constants.OP_STATUS_RUNNING],
661 4e338533 Michael Hanselmann
                           [None, None])
662 4e338533 Michael Hanselmann
    self.assertRaises(errors.OpExecError, cli.GenericPollJob, job_id, cbs, cbs)
663 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
664 4e338533 Michael Hanselmann
665 4e338533 Michael Hanselmann
  def testCancel(self):
666 4e338533 Michael Hanselmann
    job_id = 4275
667 4e338533 Michael Hanselmann
668 4e338533 Michael Hanselmann
    cbs = _MockJobPollCb(self, job_id)
669 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, constants.JOB_NOTCHANGED)
670 4e338533 Michael Hanselmann
    cbs.AddWfjcResult(None, None, ((constants.JOB_STATUS_CANCELING, ), None))
671 4e338533 Michael Hanselmann
    cbs.AddQueryJobsResult(constants.JOB_STATUS_CANCELING,
672 4e338533 Michael Hanselmann
                           [constants.OP_STATUS_CANCELING,
673 4e338533 Michael Hanselmann
                            constants.OP_STATUS_CANCELING],
674 4e338533 Michael Hanselmann
                           [None, None])
675 4e338533 Michael Hanselmann
    self.assertRaises(errors.OpExecError, cli.GenericPollJob, job_id, cbs, cbs)
676 4e338533 Michael Hanselmann
    cbs.CheckEmpty()
677 4e338533 Michael Hanselmann
678 4e338533 Michael Hanselmann
679 8a7f1c61 Michael Hanselmann
class TestFormatLogMessage(unittest.TestCase):
680 8a7f1c61 Michael Hanselmann
  def test(self):
681 8a7f1c61 Michael Hanselmann
    self.assertEqual(cli.FormatLogMessage(constants.ELOG_MESSAGE,
682 8a7f1c61 Michael Hanselmann
                                          "Hello World"),
683 8a7f1c61 Michael Hanselmann
                     "Hello World")
684 8a7f1c61 Michael Hanselmann
    self.assertRaises(TypeError, cli.FormatLogMessage,
685 8a7f1c61 Michael Hanselmann
                      constants.ELOG_MESSAGE, [1, 2, 3])
686 8a7f1c61 Michael Hanselmann
687 8a7f1c61 Michael Hanselmann
    self.assert_(cli.FormatLogMessage("some other type", (1, 2, 3)))
688 8a7f1c61 Michael Hanselmann
689 8a7f1c61 Michael Hanselmann
690 a4ebd726 Michael Hanselmann
class TestParseFields(unittest.TestCase):
691 a4ebd726 Michael Hanselmann
  def test(self):
692 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields(None, []), [])
693 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields("name,foo,hello", []),
694 a4ebd726 Michael Hanselmann
                     ["name", "foo", "hello"])
695 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields(None, ["def", "ault", "fields", "here"]),
696 a4ebd726 Michael Hanselmann
                     ["def", "ault", "fields", "here"])
697 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields("name,foo", ["def", "ault"]),
698 a4ebd726 Michael Hanselmann
                     ["name", "foo"])
699 a4ebd726 Michael Hanselmann
    self.assertEqual(cli.ParseFields("+name,foo", ["def", "ault"]),
700 a4ebd726 Michael Hanselmann
                     ["def", "ault", "name", "foo"])
701 a4ebd726 Michael Hanselmann
702 a4ebd726 Michael Hanselmann
703 84a5b33c Michael Hanselmann
class TestConstants(unittest.TestCase):
704 84a5b33c Michael Hanselmann
  def testPriority(self):
705 84a5b33c Michael Hanselmann
    self.assertEqual(set(cli._PRIONAME_TO_VALUE.values()),
706 84a5b33c Michael Hanselmann
                     set(constants.OP_PRIO_SUBMIT_VALID))
707 84a5b33c Michael Hanselmann
    self.assertEqual(list(value for _, value in cli._PRIORITY_NAMES),
708 84a5b33c Michael Hanselmann
                     sorted(constants.OP_PRIO_SUBMIT_VALID, reverse=True))
709 84a5b33c Michael Hanselmann
710 84a5b33c Michael Hanselmann
711 845c79d8 Michael Hanselmann
class TestParseNicOption(unittest.TestCase):
712 845c79d8 Michael Hanselmann
  def test(self):
713 845c79d8 Michael Hanselmann
    self.assertEqual(cli.ParseNicOption([("0", { "link": "eth0", })]),
714 845c79d8 Michael Hanselmann
                     [{ "link": "eth0", }])
715 845c79d8 Michael Hanselmann
    self.assertEqual(cli.ParseNicOption([("5", { "ip": "192.0.2.7", })]),
716 845c79d8 Michael Hanselmann
                     [{}, {}, {}, {}, {}, { "ip": "192.0.2.7", }])
717 845c79d8 Michael Hanselmann
718 845c79d8 Michael Hanselmann
  def testErrors(self):
719 845c79d8 Michael Hanselmann
    for i in [None, "", "abc", "zero", "Hello World", "\0", []]:
720 845c79d8 Michael Hanselmann
      self.assertRaises(errors.OpPrereqError, cli.ParseNicOption,
721 845c79d8 Michael Hanselmann
                        [(i, { "link": "eth0", })])
722 845c79d8 Michael Hanselmann
      self.assertRaises(errors.OpPrereqError, cli.ParseNicOption,
723 845c79d8 Michael Hanselmann
                        [("0", i)])
724 845c79d8 Michael Hanselmann
725 845c79d8 Michael Hanselmann
    self.assertRaises(errors.TypeEnforcementError, cli.ParseNicOption,
726 845c79d8 Michael Hanselmann
                      [(0, { True: False, })])
727 845c79d8 Michael Hanselmann
728 845c79d8 Michael Hanselmann
    self.assertRaises(errors.TypeEnforcementError, cli.ParseNicOption,
729 845c79d8 Michael Hanselmann
                      [(3, { "mode": [], })])
730 845c79d8 Michael Hanselmann
731 845c79d8 Michael Hanselmann
732 f2c6673d Michael Hanselmann
class TestFormatResultError(unittest.TestCase):
733 f2c6673d Michael Hanselmann
  def testNormal(self):
734 f2c6673d Michael Hanselmann
    for verbose in [False, True]:
735 f2c6673d Michael Hanselmann
      self.assertRaises(AssertionError, cli.FormatResultError,
736 f2c6673d Michael Hanselmann
                        constants.RS_NORMAL, verbose)
737 f2c6673d Michael Hanselmann
738 f2c6673d Michael Hanselmann
  def testUnknown(self):
739 f2c6673d Michael Hanselmann
    for verbose in [False, True]:
740 f2c6673d Michael Hanselmann
      self.assertRaises(NotImplementedError, cli.FormatResultError,
741 f2c6673d Michael Hanselmann
                        "#some!other!status#", verbose)
742 f2c6673d Michael Hanselmann
743 f2c6673d Michael Hanselmann
  def test(self):
744 f2c6673d Michael Hanselmann
    for status in constants.RS_ALL:
745 f2c6673d Michael Hanselmann
      if status == constants.RS_NORMAL:
746 f2c6673d Michael Hanselmann
        continue
747 f2c6673d Michael Hanselmann
748 f2c6673d Michael Hanselmann
      self.assertNotEqual(cli.FormatResultError(status, False),
749 f2c6673d Michael Hanselmann
                          cli.FormatResultError(status, True))
750 f2c6673d Michael Hanselmann
751 f2c6673d Michael Hanselmann
      result = cli.FormatResultError(status, True)
752 f2c6673d Michael Hanselmann
      self.assertTrue(result.startswith("("))
753 f2c6673d Michael Hanselmann
      self.assertTrue(result.endswith(")"))
754 f2c6673d Michael Hanselmann
755 f2c6673d Michael Hanselmann
756 2241e2b9 Iustin Pop
if __name__ == '__main__':
757 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()