Statistics
| Branch: | Tag: | Revision:

root / test / py / ganeti.opcodes_unittest.py @ d5104ca4

History | View | Annotate | Download (13.9 kB)

1 c32b908e Michael Hanselmann
#!/usr/bin/python
2 c32b908e Michael Hanselmann
#
3 c32b908e Michael Hanselmann
4 08f31176 Iustin Pop
# Copyright (C) 2010, 2011, 2012 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 580b1fdd Jose A. Lopes
from ganeti import opcodes_base
31 65e183af Michael Hanselmann
from ganeti import ht
32 1cbef6d8 Michael Hanselmann
from ganeti import constants
33 1cbef6d8 Michael Hanselmann
from ganeti import errors
34 45d4c81c Michael Hanselmann
from ganeti import compat
35 c32b908e Michael Hanselmann
36 c32b908e Michael Hanselmann
import testutils
37 c32b908e Michael Hanselmann
38 c32b908e Michael Hanselmann
39 c32b908e Michael Hanselmann
class TestOpcodes(unittest.TestCase):
40 c32b908e Michael Hanselmann
  def test(self):
41 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, None)
42 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, "")
43 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, {})
44 c32b908e Michael Hanselmann
    self.assertRaises(ValueError, opcodes.OpCode.LoadOpCode, {"OP_ID": ""})
45 c32b908e Michael Hanselmann
46 c32b908e Michael Hanselmann
    for cls in opcodes.OP_MAPPING.values():
47 c32b908e Michael Hanselmann
      self.assert_(cls.OP_ID.startswith("OP_"))
48 dbc96028 Michael Hanselmann
      self.assert_(len(cls.OP_ID) > 3)
49 c32b908e Michael Hanselmann
      self.assertEqual(cls.OP_ID, cls.OP_ID.upper())
50 580b1fdd Jose A. Lopes
      self.assertEqual(cls.OP_ID, opcodes_base._NameToId(cls.__name__))
51 aea2f8d6 Jose A. Lopes
      self.assertFalse(
52 aea2f8d6 Jose A. Lopes
        compat.any(cls.OP_ID.startswith(prefix)
53 aea2f8d6 Jose A. Lopes
                   for prefix in opcodes_base.SUMMARY_PREFIX.keys()))
54 aea2f8d6 Jose A. Lopes
      self.assertTrue(callable(cls.OP_RESULT),
55 aea2f8d6 Jose A. Lopes
                      msg=("%s should have a result check" % cls.OP_ID))
56 c32b908e Michael Hanselmann
57 c32b908e Michael Hanselmann
      self.assertRaises(TypeError, cls, unsupported_parameter="some value")
58 c32b908e Michael Hanselmann
59 c32b908e Michael Hanselmann
      args = [
60 c32b908e Michael Hanselmann
        # No variables
61 c32b908e Michael Hanselmann
        {},
62 c32b908e Michael Hanselmann
63 c32b908e Michael Hanselmann
        # Variables supported by all opcodes
64 c32b908e Michael Hanselmann
        {"dry_run": False, "debug_level": 0, },
65 c32b908e Michael Hanselmann
66 c32b908e Michael Hanselmann
        # All variables
67 12e62af5 René Nussbaumer
        dict([(name, []) for name in cls.GetAllSlots()])
68 c32b908e Michael Hanselmann
        ]
69 c32b908e Michael Hanselmann
70 c32b908e Michael Hanselmann
      for i in args:
71 c32b908e Michael Hanselmann
        op = cls(**i)
72 c32b908e Michael Hanselmann
73 c32b908e Michael Hanselmann
        self.assertEqual(op.OP_ID, cls.OP_ID)
74 c32b908e Michael Hanselmann
        self._checkSummary(op)
75 c32b908e Michael Hanselmann
76 c32b908e Michael Hanselmann
        # Try a restore
77 c32b908e Michael Hanselmann
        state = op.__getstate__()
78 c32b908e Michael Hanselmann
        self.assert_(isinstance(state, dict))
79 c32b908e Michael Hanselmann
80 c32b908e Michael Hanselmann
        restored = opcodes.OpCode.LoadOpCode(state)
81 c32b908e Michael Hanselmann
        self.assert_(isinstance(restored, cls))
82 c32b908e Michael Hanselmann
        self._checkSummary(restored)
83 c32b908e Michael Hanselmann
84 65e183af Michael Hanselmann
        for name in ["x_y_z", "hello_world"]:
85 32683096 René Nussbaumer
          assert name not in cls.GetAllSlots()
86 65e183af Michael Hanselmann
          for value in [None, True, False, [], "Hello World"]:
87 65e183af Michael Hanselmann
            self.assertRaises(AttributeError, setattr, op, name, value)
88 65e183af Michael Hanselmann
89 c32b908e Michael Hanselmann
  def _checkSummary(self, op):
90 c32b908e Michael Hanselmann
    summary = op.Summary()
91 c32b908e Michael Hanselmann
92 c32b908e Michael Hanselmann
    if hasattr(op, "OP_DSC_FIELD"):
93 c32b908e Michael Hanselmann
      self.assert_(("OP_%s" % summary).startswith("%s(" % op.OP_ID))
94 c32b908e Michael Hanselmann
      self.assert_(summary.endswith(")"))
95 c32b908e Michael Hanselmann
    else:
96 c32b908e Michael Hanselmann
      self.assertEqual("OP_%s" % summary, op.OP_ID)
97 c32b908e Michael Hanselmann
98 65ffb373 Michael Hanselmann
  def testSummary(self):
99 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
100 65ffb373 Michael Hanselmann
      OP_DSC_FIELD = "data"
101 65ffb373 Michael Hanselmann
      OP_PARAMS = [
102 197b323b Michael Hanselmann
        ("data", ht.NoDefault, ht.TString, None),
103 65ffb373 Michael Hanselmann
        ]
104 65ffb373 Michael Hanselmann
105 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data="").Summary(), "TEST()")
106 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data="Hello World").Summary(),
107 65ffb373 Michael Hanselmann
                     "TEST(Hello World)")
108 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data="node1.example.com").Summary(),
109 65ffb373 Michael Hanselmann
                     "TEST(node1.example.com)")
110 65ffb373 Michael Hanselmann
111 8bc17ebb Iustin Pop
  def testSummaryFormatter(self):
112 8bc17ebb Iustin Pop
    class OpTest(opcodes.OpCode):
113 8bc17ebb Iustin Pop
      OP_DSC_FIELD = "data"
114 8bc17ebb Iustin Pop
      OP_DSC_FORMATTER = lambda _, v: "a"
115 8bc17ebb Iustin Pop
      OP_PARAMS = [
116 8bc17ebb Iustin Pop
        ("data", ht.NoDefault, ht.TString, None),
117 8bc17ebb Iustin Pop
        ]
118 8bc17ebb Iustin Pop
    self.assertEqual(OpTest(data="").Summary(), "TEST(a)")
119 8bc17ebb Iustin Pop
    self.assertEqual(OpTest(data="b").Summary(), "TEST(a)")
120 8bc17ebb Iustin Pop
121 3ce9a5e7 Michael Hanselmann
  def testTinySummary(self):
122 580b1fdd Jose A. Lopes
    self.assertFalse(
123 580b1fdd Jose A. Lopes
      utils.FindDuplicates(opcodes_base.SUMMARY_PREFIX.values()))
124 3ce9a5e7 Michael Hanselmann
    self.assertTrue(compat.all(prefix.endswith("_") and supplement.endswith("_")
125 3ce9a5e7 Michael Hanselmann
                               for (prefix, supplement) in
126 580b1fdd Jose A. Lopes
                                 opcodes_base.SUMMARY_PREFIX.items()))
127 3ce9a5e7 Michael Hanselmann
128 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpClusterPostInit().TinySummary(), "C_POST_INIT")
129 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpNodeRemove().TinySummary(), "N_REMOVE")
130 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpInstanceMigrate().TinySummary(), "I_MIGRATE")
131 3ce9a5e7 Michael Hanselmann
    self.assertEqual(opcodes.OpTestJqueue().TinySummary(), "TEST_JQUEUE")
132 3ce9a5e7 Michael Hanselmann
133 65ffb373 Michael Hanselmann
  def testListSummary(self):
134 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
135 65ffb373 Michael Hanselmann
      OP_DSC_FIELD = "data"
136 65ffb373 Michael Hanselmann
      OP_PARAMS = [
137 197b323b Michael Hanselmann
        ("data", ht.NoDefault, ht.TList, None),
138 65ffb373 Michael Hanselmann
        ]
139 65ffb373 Michael Hanselmann
140 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data=["a", "b", "c"]).Summary(),
141 65ffb373 Michael Hanselmann
                     "TEST(a,b,c)")
142 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data=["a", None, "c"]).Summary(),
143 65ffb373 Michael Hanselmann
                     "TEST(a,None,c)")
144 ff0d18e6 Iustin Pop
    self.assertEqual(OpTest(data=[1, 2, 3, 4]).Summary(), "TEST(1,2,3,4)")
145 65ffb373 Michael Hanselmann
146 dbc96028 Michael Hanselmann
  def testOpId(self):
147 dbc96028 Michael Hanselmann
    self.assertFalse(utils.FindDuplicates(cls.OP_ID
148 dbc96028 Michael Hanselmann
                                          for cls in opcodes._GetOpList()))
149 dbc96028 Michael Hanselmann
    self.assertEqual(len(opcodes._GetOpList()), len(opcodes.OP_MAPPING))
150 dbc96028 Michael Hanselmann
151 65e183af Michael Hanselmann
  def testParams(self):
152 65e183af Michael Hanselmann
    supported_by_all = set(["debug_level", "dry_run", "priority"])
153 65e183af Michael Hanselmann
154 580b1fdd Jose A. Lopes
    self.assertTrue(opcodes_base.BaseOpCode not in opcodes.OP_MAPPING.values())
155 687c10d9 Iustin Pop
    self.assertTrue(opcodes.OpCode not in opcodes.OP_MAPPING.values())
156 65e183af Michael Hanselmann
157 687c10d9 Iustin Pop
    for cls in opcodes.OP_MAPPING.values() + [opcodes.OpCode]:
158 32683096 René Nussbaumer
      all_slots = cls.GetAllSlots()
159 65e183af Michael Hanselmann
160 65e183af Michael Hanselmann
      self.assertEqual(len(set(all_slots) & supported_by_all), 3,
161 65e183af Michael Hanselmann
                       msg=("Opcode %s doesn't support all base"
162 65e183af Michael Hanselmann
                            " parameters (%r)" % (cls.OP_ID, supported_by_all)))
163 65e183af Michael Hanselmann
164 65e183af Michael Hanselmann
      # All opcodes must have OP_PARAMS
165 65e183af Michael Hanselmann
      self.assert_(hasattr(cls, "OP_PARAMS"),
166 65e183af Michael Hanselmann
                   msg="%s doesn't have OP_PARAMS" % cls.OP_ID)
167 65e183af Michael Hanselmann
168 197b323b Michael Hanselmann
      param_names = [name for (name, _, _, _) in cls.GetAllParams()]
169 65e183af Michael Hanselmann
170 65e183af Michael Hanselmann
      self.assertEqual(all_slots, param_names)
171 65e183af Michael Hanselmann
172 65e183af Michael Hanselmann
      # Without inheritance
173 197b323b Michael Hanselmann
      self.assertEqual(cls.__slots__,
174 197b323b Michael Hanselmann
                       [name for (name, _, _, _) in cls.OP_PARAMS])
175 65e183af Michael Hanselmann
176 65e183af Michael Hanselmann
      # This won't work if parameters are converted to a dictionary
177 65e183af Michael Hanselmann
      duplicates = utils.FindDuplicates(param_names)
178 65e183af Michael Hanselmann
      self.assertFalse(duplicates,
179 65e183af Michael Hanselmann
                       msg=("Found duplicate parameters %r in %s" %
180 65e183af Michael Hanselmann
                            (duplicates, cls.OP_ID)))
181 65e183af Michael Hanselmann
182 65e183af Michael Hanselmann
      # Check parameter definitions
183 197b323b Michael Hanselmann
      for attr_name, aval, test, doc in cls.GetAllParams():
184 65e183af Michael Hanselmann
        self.assert_(attr_name)
185 8e4968ca Jose A. Lopes
        self.assertTrue(callable(test),
186 65e183af Michael Hanselmann
                     msg=("Invalid type check for %s.%s" %
187 65e183af Michael Hanselmann
                          (cls.OP_ID, attr_name)))
188 45d4c81c Michael Hanselmann
        self.assertTrue(doc is None or isinstance(doc, basestring))
189 65e183af Michael Hanselmann
190 65e183af Michael Hanselmann
        if callable(aval):
191 6ae72286 Michael Hanselmann
          default_value = aval()
192 6ae72286 Michael Hanselmann
          self.assertFalse(callable(default_value),
193 08f31176 Iustin Pop
                           msg=("Default value of %s.%s returned by function"
194 08f31176 Iustin Pop
                                " is callable" % (cls.OP_ID, attr_name)))
195 6ae72286 Michael Hanselmann
        else:
196 6ae72286 Michael Hanselmann
          default_value = aval
197 6ae72286 Michael Hanselmann
198 8e4968ca Jose A. Lopes
        if aval is not ht.NoDefault and aval is not None:
199 6ae72286 Michael Hanselmann
          self.assertTrue(test(default_value),
200 08f31176 Iustin Pop
                          msg=("Default value of %s.%s does not verify" %
201 6ae72286 Michael Hanselmann
                               (cls.OP_ID, attr_name)))
202 65e183af Michael Hanselmann
203 45d4c81c Michael Hanselmann
      # If any parameter has documentation, all others need to have it as well
204 45d4c81c Michael Hanselmann
      has_doc = [doc is not None for (_, _, _, doc) in cls.OP_PARAMS]
205 45d4c81c Michael Hanselmann
      self.assertTrue(not compat.any(has_doc) or compat.all(has_doc),
206 45d4c81c Michael Hanselmann
                      msg="%s does not document all parameters" % cls)
207 45d4c81c Michael Hanselmann
208 1cbef6d8 Michael Hanselmann
  def testValidateNoModification(self):
209 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
210 1cbef6d8 Michael Hanselmann
      OP_PARAMS = [
211 6888a6ed Jose A. Lopes
        ("nodef", None, ht.TString, None),
212 197b323b Michael Hanselmann
        ("wdef", "default", ht.TMaybeString, None),
213 197b323b Michael Hanselmann
        ("number", 0, ht.TInt, None),
214 8e4968ca Jose A. Lopes
        ("notype", None, ht.TAny, None),
215 1cbef6d8 Michael Hanselmann
        ]
216 1cbef6d8 Michael Hanselmann
217 1cbef6d8 Michael Hanselmann
    # Missing required parameter "nodef"
218 ff0d18e6 Iustin Pop
    op = OpTest()
219 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
220 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
221 a9e1819b Klaus Aehlig
    self.assertTrue(op.nodef is None)
222 a9e1819b Klaus Aehlig
    self.assertEqual(op.wdef, "default")
223 a9e1819b Klaus Aehlig
    self.assertEqual(op.number, 0)
224 a9e1819b Klaus Aehlig
    self.assertTrue(op.notype is None)
225 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
226 1cbef6d8 Michael Hanselmann
227 1cbef6d8 Michael Hanselmann
    # Required parameter "nodef" is provided
228 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo")
229 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
230 1cbef6d8 Michael Hanselmann
    op.Validate(False)
231 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
232 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
233 a9e1819b Klaus Aehlig
    self.assertEqual(op.wdef, "default")
234 a9e1819b Klaus Aehlig
    self.assertEqual(op.number, 0)
235 a9e1819b Klaus Aehlig
    self.assertTrue(op.notype is None)
236 1cbef6d8 Michael Hanselmann
237 1cbef6d8 Michael Hanselmann
    # Missing required parameter "nodef"
238 ff0d18e6 Iustin Pop
    op = OpTest(wdef="hello", number=999)
239 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
240 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
241 a9e1819b Klaus Aehlig
    self.assertTrue(op.nodef is None)
242 a9e1819b Klaus Aehlig
    self.assertTrue(op.notype is None)
243 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
244 1cbef6d8 Michael Hanselmann
245 1cbef6d8 Michael Hanselmann
    # Wrong type for "nodef"
246 ff0d18e6 Iustin Pop
    op = OpTest(nodef=987)
247 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
248 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
249 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, 987)
250 a9e1819b Klaus Aehlig
    self.assertTrue(op.notype is None)
251 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
252 1cbef6d8 Michael Hanselmann
253 1cbef6d8 Michael Hanselmann
    # Testing different types for "notype"
254 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo", notype=[1, 2, 3])
255 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
256 1cbef6d8 Michael Hanselmann
    op.Validate(False)
257 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
258 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.notype, [1, 2, 3])
259 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
260 1cbef6d8 Michael Hanselmann
261 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo", notype="Hello World")
262 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
263 1cbef6d8 Michael Hanselmann
    op.Validate(False)
264 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
265 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.notype, "Hello World")
266 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
267 1cbef6d8 Michael Hanselmann
268 1cbef6d8 Michael Hanselmann
  def testValidateSetDefaults(self):
269 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
270 1cbef6d8 Michael Hanselmann
      OP_PARAMS = [
271 197b323b Michael Hanselmann
        ("value1", "default", ht.TMaybeString, None),
272 6888a6ed Jose A. Lopes
        ("value2", "result", ht.TMaybeString, None),
273 1cbef6d8 Michael Hanselmann
        ]
274 1cbef6d8 Michael Hanselmann
275 ff0d18e6 Iustin Pop
    op = OpTest()
276 1cbef6d8 Michael Hanselmann
    op.Validate(True)
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
    op.Validate(True)
285 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value1, "hello")
286 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value2, "world")
287 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.debug_level, 123)
288 1cbef6d8 Michael Hanselmann
289 12e62af5 René Nussbaumer
  def testOpInstanceMultiAlloc(self):
290 12e62af5 René Nussbaumer
    inst = dict([(name, []) for name in opcodes.OpInstanceCreate.GetAllSlots()])
291 12e62af5 René Nussbaumer
    inst_op = opcodes.OpInstanceCreate(**inst)
292 12e62af5 René Nussbaumer
    inst_state = inst_op.__getstate__()
293 12e62af5 René Nussbaumer
294 12e62af5 René Nussbaumer
    multialloc = opcodes.OpInstanceMultiAlloc(instances=[inst_op])
295 12e62af5 René Nussbaumer
    state = multialloc.__getstate__()
296 12e62af5 René Nussbaumer
    self.assertEquals(state["instances"], [inst_state])
297 12e62af5 René Nussbaumer
    loaded_multialloc = opcodes.OpCode.LoadOpCode(state)
298 12e62af5 René Nussbaumer
    (loaded_inst,) = loaded_multialloc.instances
299 12e62af5 René Nussbaumer
    self.assertNotEquals(loaded_inst, inst_op)
300 12e62af5 René Nussbaumer
    self.assertEquals(loaded_inst.__getstate__(), inst_state)
301 12e62af5 René Nussbaumer
302 12e62af5 René Nussbaumer
303 b247c6fc Michael Hanselmann
class TestOpcodeDepends(unittest.TestCase):
304 b247c6fc Michael Hanselmann
  def test(self):
305 580b1fdd Jose A. Lopes
    check_relative = opcodes_base.BuildJobDepCheck(True)
306 580b1fdd Jose A. Lopes
    check_norelative = opcodes_base.TNoRelativeJobDependencies
307 b247c6fc Michael Hanselmann
308 b247c6fc Michael Hanselmann
    for fn in [check_relative, check_norelative]:
309 b247c6fc Michael Hanselmann
      self.assertTrue(fn(None))
310 b247c6fc Michael Hanselmann
      self.assertTrue(fn([]))
311 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(1, [])]))
312 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(719833, [])]))
313 b247c6fc Michael Hanselmann
      self.assertTrue(fn([("24879", [])]))
314 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(2028, [constants.JOB_STATUS_ERROR])]))
315 b247c6fc Michael Hanselmann
      self.assertTrue(fn([
316 b247c6fc Michael Hanselmann
        (2028, [constants.JOB_STATUS_ERROR]),
317 b247c6fc Michael Hanselmann
        (18750, []),
318 b247c6fc Michael Hanselmann
        (5063, [constants.JOB_STATUS_SUCCESS, constants.JOB_STATUS_ERROR]),
319 b247c6fc Michael Hanselmann
        ]))
320 b247c6fc Michael Hanselmann
321 b247c6fc Michael Hanselmann
      self.assertFalse(fn(1))
322 b247c6fc Michael Hanselmann
      self.assertFalse(fn([(9, )]))
323 b247c6fc Michael Hanselmann
      self.assertFalse(fn([(15194, constants.JOB_STATUS_ERROR)]))
324 b247c6fc Michael Hanselmann
325 b247c6fc Michael Hanselmann
    for i in [
326 b247c6fc Michael Hanselmann
      [(-1, [])],
327 b247c6fc Michael Hanselmann
      [(-27740, [constants.JOB_STATUS_CANCELED, constants.JOB_STATUS_ERROR]),
328 b247c6fc Michael Hanselmann
       (-1, [constants.JOB_STATUS_ERROR]),
329 b247c6fc Michael Hanselmann
       (9921, [])],
330 b247c6fc Michael Hanselmann
      ]:
331 b247c6fc Michael Hanselmann
      self.assertTrue(check_relative(i))
332 b247c6fc Michael Hanselmann
      self.assertFalse(check_norelative(i))
333 b247c6fc Michael Hanselmann
334 b247c6fc Michael Hanselmann
335 bdfd7802 Michael Hanselmann
class TestResultChecks(unittest.TestCase):
336 bdfd7802 Michael Hanselmann
  def testJobIdList(self):
337 bdfd7802 Michael Hanselmann
    for i in [[], [(False, "error")], [(False, "")],
338 bdfd7802 Michael Hanselmann
              [(True, 123), (True, "999")]]:
339 72cd5493 Jose A. Lopes
      self.assertTrue(ht.TJobIdList(i))
340 bdfd7802 Michael Hanselmann
341 bdfd7802 Michael Hanselmann
    for i in ["", [("x", 1)], [[], []], [[False, "", None], [True, 123]]]:
342 72cd5493 Jose A. Lopes
      self.assertFalse(ht.TJobIdList(i))
343 bdfd7802 Michael Hanselmann
344 bdfd7802 Michael Hanselmann
  def testJobIdListOnly(self):
345 72cd5493 Jose A. Lopes
    self.assertTrue(ht.TJobIdListOnly({
346 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [],
347 bdfd7802 Michael Hanselmann
      }))
348 72cd5493 Jose A. Lopes
    self.assertTrue(ht.TJobIdListOnly({
349 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [(True, "9282")],
350 bdfd7802 Michael Hanselmann
      }))
351 bdfd7802 Michael Hanselmann
352 72cd5493 Jose A. Lopes
    self.assertFalse(ht.TJobIdListOnly({
353 bdfd7802 Michael Hanselmann
      "x": None,
354 bdfd7802 Michael Hanselmann
      }))
355 72cd5493 Jose A. Lopes
    self.assertFalse(ht.TJobIdListOnly({
356 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [],
357 bdfd7802 Michael Hanselmann
      "x": None,
358 bdfd7802 Michael Hanselmann
      }))
359 72cd5493 Jose A. Lopes
    self.assertFalse(ht.TJobIdListOnly({
360 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [("foo", "bar")],
361 bdfd7802 Michael Hanselmann
      }))
362 72cd5493 Jose A. Lopes
    self.assertFalse(ht.TJobIdListOnly({
363 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [("one", "two", "three")],
364 bdfd7802 Michael Hanselmann
      }))
365 bdfd7802 Michael Hanselmann
366 bdfd7802 Michael Hanselmann
367 ddc1de7c Michael Hanselmann
class TestOpInstanceSetParams(unittest.TestCase):
368 ddc1de7c Michael Hanselmann
  def _GenericTests(self, fn):
369 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([]))
370 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([(constants.DDM_ADD, {})]))
371 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([(constants.DDM_REMOVE, {})]))
372 ddc1de7c Michael Hanselmann
    for i in [0, 1, 2, 3, 9, 10, 1024]:
373 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([(i, {})]))
374 ddc1de7c Michael Hanselmann
375 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(None))
376 ddc1de7c Michael Hanselmann
    self.assertFalse(fn({}))
377 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(""))
378 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(0))
379 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([(-100, {})]))
380 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([(constants.DDM_ADD, 2, 3)]))
381 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([[constants.DDM_ADD]]))
382 ddc1de7c Michael Hanselmann
383 ddc1de7c Michael Hanselmann
  def testNicModifications(self):
384 72cd5493 Jose A. Lopes
    fn = ht.TSetParamsMods(ht.TINicParams)
385 ddc1de7c Michael Hanselmann
    self._GenericTests(fn)
386 ddc1de7c Michael Hanselmann
387 ddc1de7c Michael Hanselmann
    for param in constants.INIC_PARAMS:
388 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: None}]]))
389 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: param}]]))
390 ddc1de7c Michael Hanselmann
391 ddc1de7c Michael Hanselmann
  def testDiskModifications(self):
392 72cd5493 Jose A. Lopes
    fn = ht.TSetParamsMods(ht.TIDiskParams)
393 ddc1de7c Michael Hanselmann
    self._GenericTests(fn)
394 ddc1de7c Michael Hanselmann
395 ddc1de7c Michael Hanselmann
    for param in constants.IDISK_PARAMS:
396 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: 0}]]))
397 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: param}]]))
398 ddc1de7c Michael Hanselmann
399 ddc1de7c Michael Hanselmann
400 c32b908e Michael Hanselmann
if __name__ == "__main__":
401 c32b908e Michael Hanselmann
  testutils.GanetiTestProgram()