Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.opcodes_unittest.py @ 81f7ea25

History | View | Annotate | Download (14.1 kB)

1 c32b908e Michael Hanselmann
#!/usr/bin/python
2 c32b908e Michael Hanselmann
#
3 c32b908e Michael Hanselmann
4 687c10d9 Iustin Pop
# Copyright (C) 2010, 2011 Google Inc.
5 c32b908e Michael Hanselmann
#
6 c32b908e Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 c32b908e Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 c32b908e Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 c32b908e Michael Hanselmann
# (at your option) any later version.
10 c32b908e Michael Hanselmann
#
11 c32b908e Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 c32b908e Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 c32b908e Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 c32b908e Michael Hanselmann
# General Public License for more details.
15 c32b908e Michael Hanselmann
#
16 c32b908e Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 c32b908e Michael Hanselmann
# along with this program; if not, write to the Free Software
18 c32b908e Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 c32b908e Michael Hanselmann
# 02110-1301, USA.
20 c32b908e Michael Hanselmann
21 c32b908e Michael Hanselmann
22 c32b908e Michael Hanselmann
"""Script for testing ganeti.backend"""
23 c32b908e Michael Hanselmann
24 c32b908e Michael Hanselmann
import os
25 c32b908e Michael Hanselmann
import sys
26 c32b908e Michael Hanselmann
import unittest
27 c32b908e Michael Hanselmann
28 c32b908e Michael Hanselmann
from ganeti import utils
29 c32b908e Michael Hanselmann
from ganeti import opcodes
30 65e183af Michael Hanselmann
from ganeti import ht
31 1cbef6d8 Michael Hanselmann
from ganeti import constants
32 1cbef6d8 Michael Hanselmann
from ganeti import errors
33 45d4c81c Michael Hanselmann
from ganeti import compat
34 c32b908e Michael Hanselmann
35 c32b908e Michael Hanselmann
import testutils
36 c32b908e Michael Hanselmann
37 c32b908e Michael Hanselmann
38 5fa3d337 Michael Hanselmann
#: Unless an opcode is included in the following list it must have a result
39 5fa3d337 Michael Hanselmann
#: check of some sort
40 5fa3d337 Michael Hanselmann
MISSING_RESULT_CHECK = frozenset([
41 5fa3d337 Michael Hanselmann
  opcodes.OpTestAllocator,
42 5fa3d337 Michael Hanselmann
  opcodes.OpTestDelay,
43 5fa3d337 Michael Hanselmann
  opcodes.OpTestDummy,
44 5fa3d337 Michael Hanselmann
  opcodes.OpTestJqueue,
45 5fa3d337 Michael Hanselmann
  ])
46 5fa3d337 Michael Hanselmann
47 5fa3d337 Michael Hanselmann
48 c32b908e Michael Hanselmann
class TestOpcodes(unittest.TestCase):
49 c32b908e Michael Hanselmann
  def test(self):
50 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, None)
51 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, "")
52 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, {})
53 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, {"OP_ID": ""})
54 c32b908e Michael Hanselmann
55 c32b908e Michael Hanselmann
    for cls in opcodes.OP_MAPPING.values():
56 c32b908e Michael Hanselmann
      self.assert_(cls.OP_ID.startswith("OP_"))
57 dbc96028 Michael Hanselmann
      self.assert_(len(cls.OP_ID) > 3)
58 c32b908e Michael Hanselmann
      self.assertEqual(cls.OP_ID, cls.OP_ID.upper())
59 ff0d18e6 Iustin Pop
      self.assertEqual(cls.OP_ID, opcodes._NameToId(cls.__name__))
60 3ce9a5e7 Michael Hanselmann
      self.assertFalse(compat.any(cls.OP_ID.startswith(prefix)
61 3ce9a5e7 Michael Hanselmann
                                  for prefix in opcodes._SUMMARY_PREFIX.keys()))
62 5fa3d337 Michael Hanselmann
      if cls in MISSING_RESULT_CHECK:
63 5fa3d337 Michael Hanselmann
        self.assertTrue(cls.OP_RESULT is None,
64 5fa3d337 Michael Hanselmann
                        msg=("%s is listed to not have a result check" %
65 5fa3d337 Michael Hanselmann
                             cls.OP_ID))
66 5fa3d337 Michael Hanselmann
      else:
67 5fa3d337 Michael Hanselmann
        self.assertTrue(callable(cls.OP_RESULT),
68 5fa3d337 Michael Hanselmann
                        msg=("%s should have a result check" % cls.OP_ID))
69 c32b908e Michael Hanselmann
70 c32b908e Michael Hanselmann
      self.assertRaises(TypeError, cls, unsupported_parameter="some value")
71 c32b908e Michael Hanselmann
72 c32b908e Michael Hanselmann
      args = [
73 c32b908e Michael Hanselmann
        # No variables
74 c32b908e Michael Hanselmann
        {},
75 c32b908e Michael Hanselmann
76 c32b908e Michael Hanselmann
        # Variables supported by all opcodes
77 c32b908e Michael Hanselmann
        {"dry_run": False, "debug_level": 0, },
78 c32b908e Michael Hanselmann
79 c32b908e Michael Hanselmann
        # All variables
80 c32b908e Michael Hanselmann
        dict([(name, False) for name in cls._all_slots()])
81 c32b908e Michael Hanselmann
        ]
82 c32b908e Michael Hanselmann
83 c32b908e Michael Hanselmann
      for i in args:
84 c32b908e Michael Hanselmann
        op = cls(**i)
85 c32b908e Michael Hanselmann
86 c32b908e Michael Hanselmann
        self.assertEqual(op.OP_ID, cls.OP_ID)
87 c32b908e Michael Hanselmann
        self._checkSummary(op)
88 c32b908e Michael Hanselmann
89 c32b908e Michael Hanselmann
        # Try a restore
90 c32b908e Michael Hanselmann
        state = op.__getstate__()
91 c32b908e Michael Hanselmann
        self.assert_(isinstance(state, dict))
92 c32b908e Michael Hanselmann
93 c32b908e Michael Hanselmann
        restored = opcodes.OpCode.LoadOpCode(state)
94 c32b908e Michael Hanselmann
        self.assert_(isinstance(restored, cls))
95 c32b908e Michael Hanselmann
        self._checkSummary(restored)
96 c32b908e Michael Hanselmann
97 65e183af Michael Hanselmann
        for name in ["x_y_z", "hello_world"]:
98 65e183af Michael Hanselmann
          assert name not in cls._all_slots()
99 65e183af Michael Hanselmann
          for value in [None, True, False, [], "Hello World"]:
100 65e183af Michael Hanselmann
            self.assertRaises(AttributeError, setattr, op, name, value)
101 65e183af Michael Hanselmann
102 c32b908e Michael Hanselmann
  def _checkSummary(self, op):
103 c32b908e Michael Hanselmann
    summary = op.Summary()
104 c32b908e Michael Hanselmann
105 c32b908e Michael Hanselmann
    if hasattr(op, "OP_DSC_FIELD"):
106 c32b908e Michael Hanselmann
      self.assert_(("OP_%s" % summary).startswith("%s(" % op.OP_ID))
107 c32b908e Michael Hanselmann
      self.assert_(summary.endswith(")"))
108 c32b908e Michael Hanselmann
    else:
109 c32b908e Michael Hanselmann
      self.assertEqual("OP_%s" % summary, op.OP_ID)
110 c32b908e Michael Hanselmann
111 65ffb373 Michael Hanselmann
  def testSummary(self):
112 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
113 65ffb373 Michael Hanselmann
      OP_DSC_FIELD = "data"
114 65ffb373 Michael Hanselmann
      OP_PARAMS = [
115 197b323b Michael Hanselmann
        ("data", ht.NoDefault, ht.TString, None),
116 65ffb373 Michael Hanselmann
        ]
117 65ffb373 Michael Hanselmann
118 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data="").Summary(), "TEST()")
119 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data="Hello World").Summary(),
120 65ffb373 Michael Hanselmann
                     "TEST(Hello World)")
121 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data="node1.example.com").Summary(),
122 65ffb373 Michael Hanselmann
                     "TEST(node1.example.com)")
123 65ffb373 Michael Hanselmann
124 3ce9a5e7 Michael Hanselmann
  def testTinySummary(self):
125 3ce9a5e7 Michael Hanselmann
    self.assertFalse(utils.FindDuplicates(opcodes._SUMMARY_PREFIX.values()))
126 3ce9a5e7 Michael Hanselmann
    self.assertTrue(compat.all(prefix.endswith("_") and supplement.endswith("_")
127 3ce9a5e7 Michael Hanselmann
                               for (prefix, supplement) in
128 3ce9a5e7 Michael Hanselmann
                                 opcodes._SUMMARY_PREFIX.items()))
129 3ce9a5e7 Michael Hanselmann
130 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpClusterPostInit().TinySummary(), "C_POST_INIT")
131 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpNodeRemove().TinySummary(), "N_REMOVE")
132 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpInstanceMigrate().TinySummary(), "I_MIGRATE")
133 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpGroupQuery().TinySummary(), "G_QUERY")
134 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpTestJqueue().TinySummary(), "TEST_JQUEUE")
135 3ce9a5e7 Michael Hanselmann
136 65ffb373 Michael Hanselmann
  def testListSummary(self):
137 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
138 65ffb373 Michael Hanselmann
      OP_DSC_FIELD = "data"
139 65ffb373 Michael Hanselmann
      OP_PARAMS = [
140 197b323b Michael Hanselmann
        ("data", ht.NoDefault, ht.TList, None),
141 65ffb373 Michael Hanselmann
        ]
142 65ffb373 Michael Hanselmann
143 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data=["a", "b", "c"]).Summary(),
144 65ffb373 Michael Hanselmann
                     "TEST(a,b,c)")
145 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data=["a", None, "c"]).Summary(),
146 65ffb373 Michael Hanselmann
                     "TEST(a,None,c)")
147 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data=[1, 2, 3, 4]).Summary(), "TEST(1,2,3,4)")
148 65ffb373 Michael Hanselmann
149 dbc96028 Michael Hanselmann
  def testOpId(self):
150 dbc96028 Michael Hanselmann
    self.assertFalse(utils.FindDuplicates(cls.OP_ID
151 dbc96028 Michael Hanselmann
                                          for cls in opcodes._GetOpList()))
152 dbc96028 Michael Hanselmann
    self.assertEqual(len(opcodes._GetOpList()), len(opcodes.OP_MAPPING))
153 dbc96028 Michael Hanselmann
154 65e183af Michael Hanselmann
  def testParams(self):
155 65e183af Michael Hanselmann
    supported_by_all = set(["debug_level", "dry_run", "priority"])
156 65e183af Michael Hanselmann
157 687c10d9 Iustin Pop
    self.assertTrue(opcodes.BaseOpCode not in opcodes.OP_MAPPING.values())
158 687c10d9 Iustin Pop
    self.assertTrue(opcodes.OpCode not in opcodes.OP_MAPPING.values())
159 65e183af Michael Hanselmann
160 687c10d9 Iustin Pop
    for cls in opcodes.OP_MAPPING.values() + [opcodes.OpCode]:
161 65e183af Michael Hanselmann
      all_slots = cls._all_slots()
162 65e183af Michael Hanselmann
163 65e183af Michael Hanselmann
      self.assertEqual(len(set(all_slots) & supported_by_all), 3,
164 65e183af Michael Hanselmann
                       msg=("Opcode %s doesn't support all base"
165 65e183af Michael Hanselmann
                            " parameters (%r)" % (cls.OP_ID, supported_by_all)))
166 65e183af Michael Hanselmann
167 65e183af Michael Hanselmann
      # All opcodes must have OP_PARAMS
168 65e183af Michael Hanselmann
      self.assert_(hasattr(cls, "OP_PARAMS"),
169 65e183af Michael Hanselmann
                   msg="%s doesn't have OP_PARAMS" % cls.OP_ID)
170 65e183af Michael Hanselmann
171 197b323b Michael Hanselmann
      param_names = [name for (name, _, _, _) in cls.GetAllParams()]
172 65e183af Michael Hanselmann
173 65e183af Michael Hanselmann
      self.assertEqual(all_slots, param_names)
174 65e183af Michael Hanselmann
175 65e183af Michael Hanselmann
      # Without inheritance
176 197b323b Michael Hanselmann
      self.assertEqual(cls.__slots__,
177 197b323b Michael Hanselmann
                       [name for (name, _, _, _) in cls.OP_PARAMS])
178 65e183af Michael Hanselmann
179 65e183af Michael Hanselmann
      # This won't work if parameters are converted to a dictionary
180 65e183af Michael Hanselmann
      duplicates = utils.FindDuplicates(param_names)
181 65e183af Michael Hanselmann
      self.assertFalse(duplicates,
182 65e183af Michael Hanselmann
                       msg=("Found duplicate parameters %r in %s" %
183 65e183af Michael Hanselmann
                            (duplicates, cls.OP_ID)))
184 65e183af Michael Hanselmann
185 65e183af Michael Hanselmann
      # Check parameter definitions
186 197b323b Michael Hanselmann
      for attr_name, aval, test, doc in cls.GetAllParams():
187 65e183af Michael Hanselmann
        self.assert_(attr_name)
188 65e183af Michael Hanselmann
        self.assert_(test is None or test is ht.NoType or callable(test),
189 65e183af Michael Hanselmann
                     msg=("Invalid type check for %s.%s" %
190 65e183af Michael Hanselmann
                          (cls.OP_ID, attr_name)))
191 45d4c81c Michael Hanselmann
        self.assertTrue(doc is None or isinstance(doc, basestring))
192 65e183af Michael Hanselmann
193 65e183af Michael Hanselmann
        if callable(aval):
194 65e183af Michael Hanselmann
          self.assertFalse(callable(aval()),
195 65e183af Michael Hanselmann
                           msg="Default value returned by function is callable")
196 65e183af Michael Hanselmann
197 45d4c81c Michael Hanselmann
      # If any parameter has documentation, all others need to have it as well
198 45d4c81c Michael Hanselmann
      has_doc = [doc is not None for (_, _, _, doc) in cls.OP_PARAMS]
199 45d4c81c Michael Hanselmann
      self.assertTrue(not compat.any(has_doc) or compat.all(has_doc),
200 45d4c81c Michael Hanselmann
                      msg="%s does not document all parameters" % cls)
201 45d4c81c Michael Hanselmann
202 1cbef6d8 Michael Hanselmann
  def testValidateNoModification(self):
203 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
204 1cbef6d8 Michael Hanselmann
      OP_PARAMS = [
205 197b323b Michael Hanselmann
        ("nodef", ht.NoDefault, ht.TMaybeString, None),
206 197b323b Michael Hanselmann
        ("wdef", "default", ht.TMaybeString, None),
207 197b323b Michael Hanselmann
        ("number", 0, ht.TInt, None),
208 197b323b Michael Hanselmann
        ("notype", None, ht.NoType, None),
209 1cbef6d8 Michael Hanselmann
        ]
210 1cbef6d8 Michael Hanselmann
211 1cbef6d8 Michael Hanselmann
    # Missing required parameter "nodef"
212 ff0d18e6 Iustin Pop
    op = OpTest()
213 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
214 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
215 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "nodef"))
216 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "wdef"))
217 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "number"))
218 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
219 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
220 1cbef6d8 Michael Hanselmann
221 1cbef6d8 Michael Hanselmann
    # Required parameter "nodef" is provided
222 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo")
223 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
224 1cbef6d8 Michael Hanselmann
    op.Validate(False)
225 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
226 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
227 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "wdef"))
228 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "number"))
229 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
230 1cbef6d8 Michael Hanselmann
231 1cbef6d8 Michael Hanselmann
    # Missing required parameter "nodef"
232 ff0d18e6 Iustin Pop
    op = OpTest(wdef="hello", number=999)
233 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
234 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
235 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "nodef"))
236 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
237 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
238 1cbef6d8 Michael Hanselmann
239 1cbef6d8 Michael Hanselmann
    # Wrong type for "nodef"
240 ff0d18e6 Iustin Pop
    op = OpTest(nodef=987)
241 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
242 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
243 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, 987)
244 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
245 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
246 1cbef6d8 Michael Hanselmann
247 1cbef6d8 Michael Hanselmann
    # Testing different types for "notype"
248 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo", notype=[1, 2, 3])
249 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
250 1cbef6d8 Michael Hanselmann
    op.Validate(False)
251 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
252 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.notype, [1, 2, 3])
253 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
254 1cbef6d8 Michael Hanselmann
255 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo", notype="Hello World")
256 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
257 1cbef6d8 Michael Hanselmann
    op.Validate(False)
258 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
259 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.notype, "Hello World")
260 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
261 1cbef6d8 Michael Hanselmann
262 1cbef6d8 Michael Hanselmann
  def testValidateSetDefaults(self):
263 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
264 1cbef6d8 Michael Hanselmann
      OP_PARAMS = [
265 1cbef6d8 Michael Hanselmann
        # Static default value
266 197b323b Michael Hanselmann
        ("value1", "default", ht.TMaybeString, None),
267 1cbef6d8 Michael Hanselmann
268 1cbef6d8 Michael Hanselmann
        # Default value callback
269 197b323b Michael Hanselmann
        ("value2", lambda: "result", ht.TMaybeString, None),
270 1cbef6d8 Michael Hanselmann
        ]
271 1cbef6d8 Michael Hanselmann
272 ff0d18e6 Iustin Pop
    op = OpTest()
273 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
274 1cbef6d8 Michael Hanselmann
    op.Validate(True)
275 1cbef6d8 Michael Hanselmann
    self.assertNotEqual(op.__getstate__(), before,
276 1cbef6d8 Michael Hanselmann
                        msg="Opcode was not modified")
277 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value1, "default")
278 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value2, "result")
279 1cbef6d8 Michael Hanselmann
    self.assert_(op.dry_run is None)
280 1cbef6d8 Michael Hanselmann
    self.assert_(op.debug_level is None)
281 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.priority, constants.OP_PRIO_DEFAULT)
282 1cbef6d8 Michael Hanselmann
283 ff0d18e6 Iustin Pop
    op = OpTest(value1="hello", value2="world", debug_level=123)
284 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
285 1cbef6d8 Michael Hanselmann
    op.Validate(True)
286 1cbef6d8 Michael Hanselmann
    self.assertNotEqual(op.__getstate__(), before,
287 1cbef6d8 Michael Hanselmann
                        msg="Opcode was not modified")
288 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value1, "hello")
289 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value2, "world")
290 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.debug_level, 123)
291 1cbef6d8 Michael Hanselmann
292 c32b908e Michael Hanselmann
293 b247c6fc Michael Hanselmann
class TestOpcodeDepends(unittest.TestCase):
294 b247c6fc Michael Hanselmann
  def test(self):
295 b247c6fc Michael Hanselmann
    check_relative = opcodes._BuildJobDepCheck(True)
296 b247c6fc Michael Hanselmann
    check_norelative = opcodes.TNoRelativeJobDependencies
297 b247c6fc Michael Hanselmann
298 b247c6fc Michael Hanselmann
    for fn in [check_relative, check_norelative]:
299 b247c6fc Michael Hanselmann
      self.assertTrue(fn(None))
300 b247c6fc Michael Hanselmann
      self.assertTrue(fn([]))
301 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(1, [])]))
302 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(719833, [])]))
303 b247c6fc Michael Hanselmann
      self.assertTrue(fn([("24879", [])]))
304 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(2028, [constants.JOB_STATUS_ERROR])]))
305 b247c6fc Michael Hanselmann
      self.assertTrue(fn([
306 b247c6fc Michael Hanselmann
        (2028, [constants.JOB_STATUS_ERROR]),
307 b247c6fc Michael Hanselmann
        (18750, []),
308 b247c6fc Michael Hanselmann
        (5063, [constants.JOB_STATUS_SUCCESS, constants.JOB_STATUS_ERROR]),
309 b247c6fc Michael Hanselmann
        ]))
310 b247c6fc Michael Hanselmann
311 b247c6fc Michael Hanselmann
      self.assertFalse(fn(1))
312 b247c6fc Michael Hanselmann
      self.assertFalse(fn([(9, )]))
313 b247c6fc Michael Hanselmann
      self.assertFalse(fn([(15194, constants.JOB_STATUS_ERROR)]))
314 b247c6fc Michael Hanselmann
315 b247c6fc Michael Hanselmann
    for i in [
316 b247c6fc Michael Hanselmann
      [(-1, [])],
317 b247c6fc Michael Hanselmann
      [(-27740, [constants.JOB_STATUS_CANCELED, constants.JOB_STATUS_ERROR]),
318 b247c6fc Michael Hanselmann
       (-1, [constants.JOB_STATUS_ERROR]),
319 b247c6fc Michael Hanselmann
       (9921, [])],
320 b247c6fc Michael Hanselmann
      ]:
321 b247c6fc Michael Hanselmann
      self.assertTrue(check_relative(i))
322 b247c6fc Michael Hanselmann
      self.assertFalse(check_norelative(i))
323 b247c6fc Michael Hanselmann
324 b247c6fc Michael Hanselmann
325 bdfd7802 Michael Hanselmann
class TestResultChecks(unittest.TestCase):
326 bdfd7802 Michael Hanselmann
  def testJobIdList(self):
327 bdfd7802 Michael Hanselmann
    for i in [[], [(False, "error")], [(False, "")],
328 bdfd7802 Michael Hanselmann
              [(True, 123), (True, "999")]]:
329 bdfd7802 Michael Hanselmann
      self.assertTrue(opcodes.TJobIdList(i))
330 bdfd7802 Michael Hanselmann
331 bdfd7802 Michael Hanselmann
    for i in ["", [("x", 1)], [[], []], [[False, "", None], [True, 123]]]:
332 bdfd7802 Michael Hanselmann
      self.assertFalse(opcodes.TJobIdList(i))
333 bdfd7802 Michael Hanselmann
334 bdfd7802 Michael Hanselmann
  def testJobIdListOnly(self):
335 bdfd7802 Michael Hanselmann
    self.assertTrue(opcodes.TJobIdListOnly({
336 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [],
337 bdfd7802 Michael Hanselmann
      }))
338 bdfd7802 Michael Hanselmann
    self.assertTrue(opcodes.TJobIdListOnly({
339 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [(True, "9282")],
340 bdfd7802 Michael Hanselmann
      }))
341 bdfd7802 Michael Hanselmann
342 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
343 bdfd7802 Michael Hanselmann
      "x": None,
344 bdfd7802 Michael Hanselmann
      }))
345 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
346 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [],
347 bdfd7802 Michael Hanselmann
      "x": None,
348 bdfd7802 Michael Hanselmann
      }))
349 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
350 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [("foo", "bar")],
351 bdfd7802 Michael Hanselmann
      }))
352 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
353 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [("one", "two", "three")],
354 bdfd7802 Michael Hanselmann
      }))
355 bdfd7802 Michael Hanselmann
356 bdfd7802 Michael Hanselmann
357 8f227489 Michael Hanselmann
class TestClusterOsList(unittest.TestCase):
358 8f227489 Michael Hanselmann
  def test(self):
359 8f227489 Michael Hanselmann
    good = [
360 8f227489 Michael Hanselmann
      None,
361 8f227489 Michael Hanselmann
      [],
362 8f227489 Michael Hanselmann
      [(constants.DDM_ADD, "dos"),
363 8f227489 Michael Hanselmann
       (constants.DDM_REMOVE, "linux")],
364 8f227489 Michael Hanselmann
      ]
365 8f227489 Michael Hanselmann
366 8f227489 Michael Hanselmann
    for i in good:
367 8f227489 Michael Hanselmann
      self.assertTrue(opcodes._TestClusterOsList(i))
368 8f227489 Michael Hanselmann
369 8f227489 Michael Hanselmann
    wrong = ["", 0, "xy", ["Hello World"], object(),
370 8f227489 Michael Hanselmann
      [("foo", "bar")],
371 8f227489 Michael Hanselmann
      [("", "")],
372 8f227489 Michael Hanselmann
      [[constants.DDM_ADD]],
373 8f227489 Michael Hanselmann
      [(constants.DDM_ADD, "")],
374 8f227489 Michael Hanselmann
      [(constants.DDM_REMOVE, "")],
375 8f227489 Michael Hanselmann
      [(constants.DDM_ADD, None)],
376 8f227489 Michael Hanselmann
      [(constants.DDM_REMOVE, None)],
377 8f227489 Michael Hanselmann
      ]
378 8f227489 Michael Hanselmann
379 8f227489 Michael Hanselmann
    for i in wrong:
380 8f227489 Michael Hanselmann
      self.assertFalse(opcodes._TestClusterOsList(i))
381 8f227489 Michael Hanselmann
382 8f227489 Michael Hanselmann
383 ddc1de7c Michael Hanselmann
class TestOpInstanceSetParams(unittest.TestCase):
384 ddc1de7c Michael Hanselmann
  def _GenericTests(self, fn):
385 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([]))
386 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([(constants.DDM_ADD, {})]))
387 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([(constants.DDM_REMOVE, {})]))
388 ddc1de7c Michael Hanselmann
    for i in [0, 1, 2, 3, 9, 10, 1024]:
389 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([(i, {})]))
390 ddc1de7c Michael Hanselmann
391 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(None))
392 ddc1de7c Michael Hanselmann
    self.assertFalse(fn({}))
393 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(""))
394 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(0))
395 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([(-100, {})]))
396 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([(constants.DDM_ADD, 2, 3)]))
397 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([[constants.DDM_ADD]]))
398 ddc1de7c Michael Hanselmann
399 ddc1de7c Michael Hanselmann
  def testNicModifications(self):
400 0813170b Michael Hanselmann
    fn = opcodes.OpInstanceSetParams.TestNicModifications
401 ddc1de7c Michael Hanselmann
    self._GenericTests(fn)
402 ddc1de7c Michael Hanselmann
403 ddc1de7c Michael Hanselmann
    for param in constants.INIC_PARAMS:
404 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: None}]]))
405 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: param}]]))
406 ddc1de7c Michael Hanselmann
407 ddc1de7c Michael Hanselmann
  def testDiskModifications(self):
408 0813170b Michael Hanselmann
    fn = opcodes.OpInstanceSetParams.TestDiskModifications
409 ddc1de7c Michael Hanselmann
    self._GenericTests(fn)
410 ddc1de7c Michael Hanselmann
411 ddc1de7c Michael Hanselmann
    for param in constants.IDISK_PARAMS:
412 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: 0}]]))
413 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: param}]]))
414 ddc1de7c Michael Hanselmann
415 ddc1de7c Michael Hanselmann
416 c32b908e Michael Hanselmann
if __name__ == "__main__":
417 c32b908e Michael Hanselmann
  testutils.GanetiTestProgram()