Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.opcodes_unittest.py @ e9a81214

History | View | Annotate | Download (15.3 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 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 12e62af5 René Nussbaumer
        dict([(name, []) for name in cls.GetAllSlots()])
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 32683096 René Nussbaumer
          assert name not in cls.GetAllSlots()
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 32683096 René Nussbaumer
      all_slots = cls.GetAllSlots()
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 6ae72286 Michael Hanselmann
          default_value = aval()
195 6ae72286 Michael Hanselmann
          self.assertFalse(callable(default_value),
196 08f31176 Iustin Pop
                           msg=("Default value of %s.%s returned by function"
197 08f31176 Iustin Pop
                                " is callable" % (cls.OP_ID, attr_name)))
198 6ae72286 Michael Hanselmann
        else:
199 08f31176 Iustin Pop
          self.assertFalse(isinstance(aval, (list, dict, set)),
200 08f31176 Iustin Pop
                           msg=("Default value of %s.%s is mutable (%s)" %
201 08f31176 Iustin Pop
                                (cls.OP_ID, attr_name, repr(aval))))
202 08f31176 Iustin Pop
203 6ae72286 Michael Hanselmann
          default_value = aval
204 6ae72286 Michael Hanselmann
205 6ae72286 Michael Hanselmann
        if aval is not ht.NoDefault and test is not ht.NoType:
206 6ae72286 Michael Hanselmann
          self.assertTrue(test(default_value),
207 08f31176 Iustin Pop
                          msg=("Default value of %s.%s does not verify" %
208 6ae72286 Michael Hanselmann
                               (cls.OP_ID, attr_name)))
209 65e183af Michael Hanselmann
210 45d4c81c Michael Hanselmann
      # If any parameter has documentation, all others need to have it as well
211 45d4c81c Michael Hanselmann
      has_doc = [doc is not None for (_, _, _, doc) in cls.OP_PARAMS]
212 45d4c81c Michael Hanselmann
      self.assertTrue(not compat.any(has_doc) or compat.all(has_doc),
213 45d4c81c Michael Hanselmann
                      msg="%s does not document all parameters" % cls)
214 45d4c81c Michael Hanselmann
215 1cbef6d8 Michael Hanselmann
  def testValidateNoModification(self):
216 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
217 1cbef6d8 Michael Hanselmann
      OP_PARAMS = [
218 197b323b Michael Hanselmann
        ("nodef", ht.NoDefault, ht.TMaybeString, None),
219 197b323b Michael Hanselmann
        ("wdef", "default", ht.TMaybeString, None),
220 197b323b Michael Hanselmann
        ("number", 0, ht.TInt, None),
221 197b323b Michael Hanselmann
        ("notype", None, ht.NoType, None),
222 1cbef6d8 Michael Hanselmann
        ]
223 1cbef6d8 Michael Hanselmann
224 1cbef6d8 Michael Hanselmann
    # Missing required parameter "nodef"
225 ff0d18e6 Iustin Pop
    op = OpTest()
226 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
227 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
228 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "nodef"))
229 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "wdef"))
230 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "number"))
231 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
232 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
233 1cbef6d8 Michael Hanselmann
234 1cbef6d8 Michael Hanselmann
    # Required parameter "nodef" is provided
235 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo")
236 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
237 1cbef6d8 Michael Hanselmann
    op.Validate(False)
238 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
239 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
240 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "wdef"))
241 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "number"))
242 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
243 1cbef6d8 Michael Hanselmann
244 1cbef6d8 Michael Hanselmann
    # Missing required parameter "nodef"
245 ff0d18e6 Iustin Pop
    op = OpTest(wdef="hello", number=999)
246 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
247 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
248 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "nodef"))
249 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
250 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
251 1cbef6d8 Michael Hanselmann
252 1cbef6d8 Michael Hanselmann
    # Wrong type for "nodef"
253 ff0d18e6 Iustin Pop
    op = OpTest(nodef=987)
254 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
255 1cbef6d8 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, op.Validate, False)
256 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, 987)
257 1cbef6d8 Michael Hanselmann
    self.assertFalse(hasattr(op, "notype"))
258 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
259 1cbef6d8 Michael Hanselmann
260 1cbef6d8 Michael Hanselmann
    # Testing different types for "notype"
261 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo", notype=[1, 2, 3])
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, [1, 2, 3])
266 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
267 1cbef6d8 Michael Hanselmann
268 ff0d18e6 Iustin Pop
    op = OpTest(nodef="foo", notype="Hello World")
269 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
270 1cbef6d8 Michael Hanselmann
    op.Validate(False)
271 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.nodef, "foo")
272 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.notype, "Hello World")
273 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.__getstate__(), before, msg="Opcode was modified")
274 1cbef6d8 Michael Hanselmann
275 1cbef6d8 Michael Hanselmann
  def testValidateSetDefaults(self):
276 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
277 1cbef6d8 Michael Hanselmann
      OP_PARAMS = [
278 1cbef6d8 Michael Hanselmann
        # Static default value
279 197b323b Michael Hanselmann
        ("value1", "default", ht.TMaybeString, None),
280 1cbef6d8 Michael Hanselmann
281 1cbef6d8 Michael Hanselmann
        # Default value callback
282 197b323b Michael Hanselmann
        ("value2", lambda: "result", ht.TMaybeString, None),
283 1cbef6d8 Michael Hanselmann
        ]
284 1cbef6d8 Michael Hanselmann
285 ff0d18e6 Iustin Pop
    op = OpTest()
286 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
287 1cbef6d8 Michael Hanselmann
    op.Validate(True)
288 1cbef6d8 Michael Hanselmann
    self.assertNotEqual(op.__getstate__(), before,
289 1cbef6d8 Michael Hanselmann
                        msg="Opcode was not modified")
290 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value1, "default")
291 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value2, "result")
292 1cbef6d8 Michael Hanselmann
    self.assert_(op.dry_run is None)
293 1cbef6d8 Michael Hanselmann
    self.assert_(op.debug_level is None)
294 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.priority, constants.OP_PRIO_DEFAULT)
295 1cbef6d8 Michael Hanselmann
296 ff0d18e6 Iustin Pop
    op = OpTest(value1="hello", value2="world", debug_level=123)
297 1cbef6d8 Michael Hanselmann
    before = op.__getstate__()
298 1cbef6d8 Michael Hanselmann
    op.Validate(True)
299 1cbef6d8 Michael Hanselmann
    self.assertNotEqual(op.__getstate__(), before,
300 1cbef6d8 Michael Hanselmann
                        msg="Opcode was not modified")
301 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value1, "hello")
302 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.value2, "world")
303 1cbef6d8 Michael Hanselmann
    self.assertEqual(op.debug_level, 123)
304 1cbef6d8 Michael Hanselmann
305 12e62af5 René Nussbaumer
  def testOpInstanceMultiAlloc(self):
306 12e62af5 René Nussbaumer
    inst = dict([(name, []) for name in opcodes.OpInstanceCreate.GetAllSlots()])
307 12e62af5 René Nussbaumer
    inst_op = opcodes.OpInstanceCreate(**inst)
308 12e62af5 René Nussbaumer
    inst_state = inst_op.__getstate__()
309 12e62af5 René Nussbaumer
310 12e62af5 René Nussbaumer
    multialloc = opcodes.OpInstanceMultiAlloc(instances=[inst_op])
311 12e62af5 René Nussbaumer
    state = multialloc.__getstate__()
312 12e62af5 René Nussbaumer
    self.assertEquals(state["instances"], [inst_state])
313 12e62af5 René Nussbaumer
    loaded_multialloc = opcodes.OpCode.LoadOpCode(state)
314 12e62af5 René Nussbaumer
    (loaded_inst,) = loaded_multialloc.instances
315 12e62af5 René Nussbaumer
    self.assertNotEquals(loaded_inst, inst_op)
316 12e62af5 René Nussbaumer
    self.assertEquals(loaded_inst.__getstate__(), inst_state)
317 12e62af5 René Nussbaumer
318 12e62af5 René Nussbaumer
319 b247c6fc Michael Hanselmann
class TestOpcodeDepends(unittest.TestCase):
320 b247c6fc Michael Hanselmann
  def test(self):
321 b247c6fc Michael Hanselmann
    check_relative = opcodes._BuildJobDepCheck(True)
322 b247c6fc Michael Hanselmann
    check_norelative = opcodes.TNoRelativeJobDependencies
323 b247c6fc Michael Hanselmann
324 b247c6fc Michael Hanselmann
    for fn in [check_relative, check_norelative]:
325 b247c6fc Michael Hanselmann
      self.assertTrue(fn(None))
326 b247c6fc Michael Hanselmann
      self.assertTrue(fn([]))
327 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(1, [])]))
328 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(719833, [])]))
329 b247c6fc Michael Hanselmann
      self.assertTrue(fn([("24879", [])]))
330 b247c6fc Michael Hanselmann
      self.assertTrue(fn([(2028, [constants.JOB_STATUS_ERROR])]))
331 b247c6fc Michael Hanselmann
      self.assertTrue(fn([
332 b247c6fc Michael Hanselmann
        (2028, [constants.JOB_STATUS_ERROR]),
333 b247c6fc Michael Hanselmann
        (18750, []),
334 b247c6fc Michael Hanselmann
        (5063, [constants.JOB_STATUS_SUCCESS, constants.JOB_STATUS_ERROR]),
335 b247c6fc Michael Hanselmann
        ]))
336 b247c6fc Michael Hanselmann
337 b247c6fc Michael Hanselmann
      self.assertFalse(fn(1))
338 b247c6fc Michael Hanselmann
      self.assertFalse(fn([(9, )]))
339 b247c6fc Michael Hanselmann
      self.assertFalse(fn([(15194, constants.JOB_STATUS_ERROR)]))
340 b247c6fc Michael Hanselmann
341 b247c6fc Michael Hanselmann
    for i in [
342 b247c6fc Michael Hanselmann
      [(-1, [])],
343 b247c6fc Michael Hanselmann
      [(-27740, [constants.JOB_STATUS_CANCELED, constants.JOB_STATUS_ERROR]),
344 b247c6fc Michael Hanselmann
       (-1, [constants.JOB_STATUS_ERROR]),
345 b247c6fc Michael Hanselmann
       (9921, [])],
346 b247c6fc Michael Hanselmann
      ]:
347 b247c6fc Michael Hanselmann
      self.assertTrue(check_relative(i))
348 b247c6fc Michael Hanselmann
      self.assertFalse(check_norelative(i))
349 b247c6fc Michael Hanselmann
350 b247c6fc Michael Hanselmann
351 bdfd7802 Michael Hanselmann
class TestResultChecks(unittest.TestCase):
352 bdfd7802 Michael Hanselmann
  def testJobIdList(self):
353 bdfd7802 Michael Hanselmann
    for i in [[], [(False, "error")], [(False, "")],
354 bdfd7802 Michael Hanselmann
              [(True, 123), (True, "999")]]:
355 bdfd7802 Michael Hanselmann
      self.assertTrue(opcodes.TJobIdList(i))
356 bdfd7802 Michael Hanselmann
357 bdfd7802 Michael Hanselmann
    for i in ["", [("x", 1)], [[], []], [[False, "", None], [True, 123]]]:
358 bdfd7802 Michael Hanselmann
      self.assertFalse(opcodes.TJobIdList(i))
359 bdfd7802 Michael Hanselmann
360 bdfd7802 Michael Hanselmann
  def testJobIdListOnly(self):
361 bdfd7802 Michael Hanselmann
    self.assertTrue(opcodes.TJobIdListOnly({
362 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [],
363 bdfd7802 Michael Hanselmann
      }))
364 bdfd7802 Michael Hanselmann
    self.assertTrue(opcodes.TJobIdListOnly({
365 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [(True, "9282")],
366 bdfd7802 Michael Hanselmann
      }))
367 bdfd7802 Michael Hanselmann
368 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
369 bdfd7802 Michael Hanselmann
      "x": None,
370 bdfd7802 Michael Hanselmann
      }))
371 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
372 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [],
373 bdfd7802 Michael Hanselmann
      "x": None,
374 bdfd7802 Michael Hanselmann
      }))
375 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
376 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [("foo", "bar")],
377 bdfd7802 Michael Hanselmann
      }))
378 bdfd7802 Michael Hanselmann
    self.assertFalse(opcodes.TJobIdListOnly({
379 bdfd7802 Michael Hanselmann
      constants.JOB_IDS_KEY: [("one", "two", "three")],
380 bdfd7802 Michael Hanselmann
      }))
381 bdfd7802 Michael Hanselmann
382 bdfd7802 Michael Hanselmann
383 8f227489 Michael Hanselmann
class TestClusterOsList(unittest.TestCase):
384 8f227489 Michael Hanselmann
  def test(self):
385 8f227489 Michael Hanselmann
    good = [
386 8f227489 Michael Hanselmann
      None,
387 8f227489 Michael Hanselmann
      [],
388 8f227489 Michael Hanselmann
      [(constants.DDM_ADD, "dos"),
389 8f227489 Michael Hanselmann
       (constants.DDM_REMOVE, "linux")],
390 8f227489 Michael Hanselmann
      ]
391 8f227489 Michael Hanselmann
392 8f227489 Michael Hanselmann
    for i in good:
393 8f227489 Michael Hanselmann
      self.assertTrue(opcodes._TestClusterOsList(i))
394 8f227489 Michael Hanselmann
395 8f227489 Michael Hanselmann
    wrong = ["", 0, "xy", ["Hello World"], object(),
396 8f227489 Michael Hanselmann
      [("foo", "bar")],
397 8f227489 Michael Hanselmann
      [("", "")],
398 8f227489 Michael Hanselmann
      [[constants.DDM_ADD]],
399 8f227489 Michael Hanselmann
      [(constants.DDM_ADD, "")],
400 8f227489 Michael Hanselmann
      [(constants.DDM_REMOVE, "")],
401 8f227489 Michael Hanselmann
      [(constants.DDM_ADD, None)],
402 8f227489 Michael Hanselmann
      [(constants.DDM_REMOVE, None)],
403 8f227489 Michael Hanselmann
      ]
404 8f227489 Michael Hanselmann
405 8f227489 Michael Hanselmann
    for i in wrong:
406 8f227489 Michael Hanselmann
      self.assertFalse(opcodes._TestClusterOsList(i))
407 8f227489 Michael Hanselmann
408 8f227489 Michael Hanselmann
409 ddc1de7c Michael Hanselmann
class TestOpInstanceSetParams(unittest.TestCase):
410 ddc1de7c Michael Hanselmann
  def _GenericTests(self, fn):
411 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([]))
412 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([(constants.DDM_ADD, {})]))
413 ddc1de7c Michael Hanselmann
    self.assertTrue(fn([(constants.DDM_REMOVE, {})]))
414 ddc1de7c Michael Hanselmann
    for i in [0, 1, 2, 3, 9, 10, 1024]:
415 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([(i, {})]))
416 ddc1de7c Michael Hanselmann
417 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(None))
418 ddc1de7c Michael Hanselmann
    self.assertFalse(fn({}))
419 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(""))
420 ddc1de7c Michael Hanselmann
    self.assertFalse(fn(0))
421 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([(-100, {})]))
422 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([(constants.DDM_ADD, 2, 3)]))
423 ddc1de7c Michael Hanselmann
    self.assertFalse(fn([[constants.DDM_ADD]]))
424 ddc1de7c Michael Hanselmann
425 ddc1de7c Michael Hanselmann
  def testNicModifications(self):
426 0813170b Michael Hanselmann
    fn = opcodes.OpInstanceSetParams.TestNicModifications
427 ddc1de7c Michael Hanselmann
    self._GenericTests(fn)
428 ddc1de7c Michael Hanselmann
429 ddc1de7c Michael Hanselmann
    for param in constants.INIC_PARAMS:
430 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: None}]]))
431 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: param}]]))
432 ddc1de7c Michael Hanselmann
433 ddc1de7c Michael Hanselmann
  def testDiskModifications(self):
434 0813170b Michael Hanselmann
    fn = opcodes.OpInstanceSetParams.TestDiskModifications
435 ddc1de7c Michael Hanselmann
    self._GenericTests(fn)
436 ddc1de7c Michael Hanselmann
437 ddc1de7c Michael Hanselmann
    for param in constants.IDISK_PARAMS:
438 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: 0}]]))
439 ddc1de7c Michael Hanselmann
      self.assertTrue(fn([[constants.DDM_ADD, {param: param}]]))
440 ddc1de7c Michael Hanselmann
441 ddc1de7c Michael Hanselmann
442 c32b908e Michael Hanselmann
if __name__ == "__main__":
443 c32b908e Michael Hanselmann
  testutils.GanetiTestProgram()