Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.opcodes_unittest.py @ 6252c0bd

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