Statistics
| Branch: | Tag: | Revision:

root / test / py / cmdlib / cmdlib_unittest.py @ 560ef132

History | View | Annotate | Download (34.2 kB)

1 6de7c41d Iustin Pop
#!/usr/bin/python
2 6de7c41d Iustin Pop
#
3 6de7c41d Iustin Pop
4 da5f09ef Bernardo Dal Seno
# Copyright (C) 2008, 2011, 2012, 2013 Google Inc.
5 6de7c41d Iustin Pop
#
6 6de7c41d Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 6de7c41d Iustin Pop
# it under the terms of the GNU General Public License as published by
8 6de7c41d Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 6de7c41d Iustin Pop
# (at your option) any later version.
10 6de7c41d Iustin Pop
#
11 6de7c41d Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 6de7c41d Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 6de7c41d Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 6de7c41d Iustin Pop
# General Public License for more details.
15 6de7c41d Iustin Pop
#
16 6de7c41d Iustin Pop
# You should have received a copy of the GNU General Public License
17 6de7c41d Iustin Pop
# along with this program; if not, write to the Free Software
18 6de7c41d Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 fd7b69c0 Michael Hanselmann
# 02110-1301, USA.
20 6de7c41d Iustin Pop
21 6de7c41d Iustin Pop
22 6de7c41d Iustin Pop
"""Script for unittesting the cmdlib module"""
23 6de7c41d Iustin Pop
24 6de7c41d Iustin Pop
25 6de7c41d Iustin Pop
import unittest
26 d755483c Michael Hanselmann
import itertools
27 99ccf8b9 René Nussbaumer
import copy
28 6de7c41d Iustin Pop
29 83f72637 Michael Hanselmann
from ganeti import constants
30 b8812691 Iustin Pop
from ganeti import mcpu
31 6de7c41d Iustin Pop
from ganeti import cmdlib
32 7352d33b Thomas Thrainer
from ganeti.cmdlib import cluster
33 763ad5be Thomas Thrainer
from ganeti.cmdlib import instance_storage
34 763ad5be Thomas Thrainer
from ganeti.cmdlib import instance_utils
35 7352d33b Thomas Thrainer
from ganeti.cmdlib import common
36 ec3cc4a8 Thomas Thrainer
from ganeti.cmdlib import query
37 b8812691 Iustin Pop
from ganeti import opcodes
38 6de7c41d Iustin Pop
from ganeti import errors
39 e58f87a9 Michael Hanselmann
from ganeti import luxi
40 65e183af Michael Hanselmann
from ganeti import ht
41 8ec505dd Adeodato Simo
from ganeti import objects
42 ef86bf28 Michael Hanselmann
from ganeti import locking
43 0fcd0cad René Nussbaumer
from ganeti.masterd import iallocator
44 6de7c41d Iustin Pop
45 25231ec5 Michael Hanselmann
import testutils
46 bd5f214b Apollon Oikonomopoulos
import mocks
47 25231ec5 Michael Hanselmann
48 6de7c41d Iustin Pop
49 b8812691 Iustin Pop
class TestOpcodeParams(testutils.GanetiTestCase):
50 b8812691 Iustin Pop
  def testParamsStructures(self):
51 b8812691 Iustin Pop
    for op in sorted(mcpu.Processor.DISPATCH_TABLE):
52 b8812691 Iustin Pop
      lu = mcpu.Processor.DISPATCH_TABLE[op]
53 b8812691 Iustin Pop
      lu_name = lu.__name__
54 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_REQP"),
55 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_REQP" % lu_name))
56 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_DEFS"),
57 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_DEFS" % lu_name))
58 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_PARAMS"),
59 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_PARAMS" % lu_name))
60 b8812691 Iustin Pop
61 b8812691 Iustin Pop
62 bd5f214b Apollon Oikonomopoulos
class TestIAllocatorChecks(testutils.GanetiTestCase):
63 bd5f214b Apollon Oikonomopoulos
  def testFunction(self):
64 bd5f214b Apollon Oikonomopoulos
    class TestLU(object):
65 bd5f214b Apollon Oikonomopoulos
      def __init__(self, opcode):
66 bd5f214b Apollon Oikonomopoulos
        self.cfg = mocks.FakeConfig()
67 bd5f214b Apollon Oikonomopoulos
        self.op = opcode
68 bd5f214b Apollon Oikonomopoulos
69 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
70 ff0d18e6 Iustin Pop
       OP_PARAMS = [
71 8e4968ca Jose A. Lopes
        ("iallocator", None, ht.TAny, None),
72 8e4968ca Jose A. Lopes
        ("node", None, ht.TAny, None),
73 65e183af Michael Hanselmann
        ]
74 bd5f214b Apollon Oikonomopoulos
75 bd5f214b Apollon Oikonomopoulos
    default_iallocator = mocks.FakeConfig().GetDefaultIAllocator()
76 bd5f214b Apollon Oikonomopoulos
    other_iallocator = default_iallocator + "_not"
77 bd5f214b Apollon Oikonomopoulos
78 ff0d18e6 Iustin Pop
    op = OpTest()
79 bd5f214b Apollon Oikonomopoulos
    lu = TestLU(op)
80 bd5f214b Apollon Oikonomopoulos
81 5eacbcae Thomas Thrainer
    c_i = lambda: common.CheckIAllocatorOrNode(lu, "iallocator", "node")
82 bd5f214b Apollon Oikonomopoulos
83 bd5f214b Apollon Oikonomopoulos
    # Neither node nor iallocator given
84 43a8f36a Bernardo Dal Seno
    for n in (None, []):
85 43a8f36a Bernardo Dal Seno
      op.iallocator = None
86 43a8f36a Bernardo Dal Seno
      op.node = n
87 43a8f36a Bernardo Dal Seno
      c_i()
88 43a8f36a Bernardo Dal Seno
      self.assertEqual(lu.op.iallocator, default_iallocator)
89 43a8f36a Bernardo Dal Seno
      self.assertEqual(lu.op.node, n)
90 bd5f214b Apollon Oikonomopoulos
91 bd5f214b Apollon Oikonomopoulos
    # Both, iallocator and node given
92 43a8f36a Bernardo Dal Seno
    for a in ("test", constants.DEFAULT_IALLOCATOR_SHORTCUT):
93 43a8f36a Bernardo Dal Seno
      op.iallocator = a
94 43a8f36a Bernardo Dal Seno
      op.node = "test"
95 43a8f36a Bernardo Dal Seno
      self.assertRaises(errors.OpPrereqError, c_i)
96 bd5f214b Apollon Oikonomopoulos
97 bd5f214b Apollon Oikonomopoulos
    # Only iallocator given
98 43a8f36a Bernardo Dal Seno
    for n in (None, []):
99 43a8f36a Bernardo Dal Seno
      op.iallocator = other_iallocator
100 43a8f36a Bernardo Dal Seno
      op.node = n
101 43a8f36a Bernardo Dal Seno
      c_i()
102 43a8f36a Bernardo Dal Seno
      self.assertEqual(lu.op.iallocator, other_iallocator)
103 43a8f36a Bernardo Dal Seno
      self.assertEqual(lu.op.node, n)
104 bd5f214b Apollon Oikonomopoulos
105 bd5f214b Apollon Oikonomopoulos
    # Only node given
106 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
107 bd5f214b Apollon Oikonomopoulos
    op.node = "node"
108 bd5f214b Apollon Oikonomopoulos
    c_i()
109 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, None)
110 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, "node")
111 bd5f214b Apollon Oikonomopoulos
112 43a8f36a Bernardo Dal Seno
    # Asked for default iallocator, no node given
113 43a8f36a Bernardo Dal Seno
    op.iallocator = constants.DEFAULT_IALLOCATOR_SHORTCUT
114 43a8f36a Bernardo Dal Seno
    op.node = None
115 43a8f36a Bernardo Dal Seno
    c_i()
116 43a8f36a Bernardo Dal Seno
    self.assertEqual(lu.op.iallocator, default_iallocator)
117 43a8f36a Bernardo Dal Seno
    self.assertEqual(lu.op.node, None)
118 43a8f36a Bernardo Dal Seno
119 bd5f214b Apollon Oikonomopoulos
    # No node, iallocator or default iallocator
120 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
121 bd5f214b Apollon Oikonomopoulos
    op.node = None
122 bd5f214b Apollon Oikonomopoulos
    lu.cfg.GetDefaultIAllocator = lambda: None
123 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
124 bd5f214b Apollon Oikonomopoulos
125 bd5f214b Apollon Oikonomopoulos
126 b469eb4d Iustin Pop
class TestLUTestJqueue(unittest.TestCase):
127 e58f87a9 Michael Hanselmann
  def test(self):
128 b469eb4d Iustin Pop
    self.assert_(cmdlib.LUTestJqueue._CLIENT_CONNECT_TIMEOUT <
129 e58f87a9 Michael Hanselmann
                 (luxi.WFJC_TIMEOUT * 0.75),
130 e58f87a9 Michael Hanselmann
                 msg=("Client timeout too high, might not notice bugs"
131 e58f87a9 Michael Hanselmann
                      " in WaitForJobChange"))
132 e58f87a9 Michael Hanselmann
133 e58f87a9 Michael Hanselmann
134 83f72637 Michael Hanselmann
class TestLUQuery(unittest.TestCase):
135 83f72637 Michael Hanselmann
  def test(self):
136 ec3cc4a8 Thomas Thrainer
    self.assertEqual(sorted(query._QUERY_IMPL.keys()),
137 abd66bf8 Michael Hanselmann
                     sorted(constants.QR_VIA_OP))
138 83f72637 Michael Hanselmann
139 a9532fb0 Helga Velroyen
    assert constants.QR_NODE in constants.QR_VIA_LUXI
140 2a02d6fe Helga Velroyen
    assert constants.QR_INSTANCE in constants.QR_VIA_LUXI
141 83f72637 Michael Hanselmann
142 abd66bf8 Michael Hanselmann
    for i in constants.QR_VIA_OP:
143 ec3cc4a8 Thomas Thrainer
      self.assert_(query._GetQueryImplementation(i))
144 83f72637 Michael Hanselmann
145 ec3cc4a8 Thomas Thrainer
    self.assertRaises(errors.OpPrereqError, query._GetQueryImplementation,
146 22b7f6f8 Thomas Thrainer
                      "")
147 ec3cc4a8 Thomas Thrainer
    self.assertRaises(errors.OpPrereqError, query._GetQueryImplementation,
148 83f72637 Michael Hanselmann
                      "xyz")
149 83f72637 Michael Hanselmann
150 83f72637 Michael Hanselmann
151 d755483c Michael Hanselmann
class _FakeLU:
152 129cce69 Michael Hanselmann
  def __init__(self, cfg=NotImplemented, proc=NotImplemented,
153 129cce69 Michael Hanselmann
               rpc=NotImplemented):
154 d755483c Michael Hanselmann
    self.warning_log = []
155 d755483c Michael Hanselmann
    self.info_log = []
156 ff02b60f René Nussbaumer
    self.cfg = cfg
157 a8e3e009 Michael Hanselmann
    self.proc = proc
158 129cce69 Michael Hanselmann
    self.rpc = rpc
159 d755483c Michael Hanselmann
160 d755483c Michael Hanselmann
  def LogWarning(self, text, *args):
161 d755483c Michael Hanselmann
    self.warning_log.append((text, args))
162 d755483c Michael Hanselmann
163 d755483c Michael Hanselmann
  def LogInfo(self, text, *args):
164 d755483c Michael Hanselmann
    self.info_log.append((text, args))
165 d755483c Michael Hanselmann
166 d755483c Michael Hanselmann
167 d755483c Michael Hanselmann
class TestLoadNodeEvacResult(unittest.TestCase):
168 d755483c Michael Hanselmann
  def testSuccess(self):
169 d755483c Michael Hanselmann
    for moved in [[], [
170 d755483c Michael Hanselmann
      ("inst20153.example.com", "grp2", ["nodeA4509", "nodeB2912"]),
171 d755483c Michael Hanselmann
      ]]:
172 d755483c Michael Hanselmann
      for early_release in [False, True]:
173 d755483c Michael Hanselmann
        for use_nodes in [False, True]:
174 d755483c Michael Hanselmann
          jobs = [
175 d755483c Michael Hanselmann
            [opcodes.OpInstanceReplaceDisks().__getstate__()],
176 d755483c Michael Hanselmann
            [opcodes.OpInstanceMigrate().__getstate__()],
177 d755483c Michael Hanselmann
            ]
178 d755483c Michael Hanselmann
179 d755483c Michael Hanselmann
          alloc_result = (moved, [], jobs)
180 0fcd0cad René Nussbaumer
          assert iallocator._NEVAC_RESULT(alloc_result)
181 d755483c Michael Hanselmann
182 d755483c Michael Hanselmann
          lu = _FakeLU()
183 5eacbcae Thomas Thrainer
          result = common.LoadNodeEvacResult(lu, alloc_result,
184 5eacbcae Thomas Thrainer
                                             early_release, use_nodes)
185 d755483c Michael Hanselmann
186 d755483c Michael Hanselmann
          if moved:
187 d755483c Michael Hanselmann
            (_, (info_args, )) = lu.info_log.pop(0)
188 d755483c Michael Hanselmann
            for (instname, instgroup, instnodes) in moved:
189 d755483c Michael Hanselmann
              self.assertTrue(instname in info_args)
190 d755483c Michael Hanselmann
              if use_nodes:
191 d755483c Michael Hanselmann
                for i in instnodes:
192 d755483c Michael Hanselmann
                  self.assertTrue(i in info_args)
193 d755483c Michael Hanselmann
              else:
194 d755483c Michael Hanselmann
                self.assertTrue(instgroup in info_args)
195 d755483c Michael Hanselmann
196 d755483c Michael Hanselmann
          self.assertFalse(lu.info_log)
197 d755483c Michael Hanselmann
          self.assertFalse(lu.warning_log)
198 d755483c Michael Hanselmann
199 d755483c Michael Hanselmann
          for op in itertools.chain(*result):
200 d755483c Michael Hanselmann
            if hasattr(op.__class__, "early_release"):
201 d755483c Michael Hanselmann
              self.assertEqual(op.early_release, early_release)
202 d755483c Michael Hanselmann
            else:
203 d755483c Michael Hanselmann
              self.assertFalse(hasattr(op, "early_release"))
204 d755483c Michael Hanselmann
205 d755483c Michael Hanselmann
  def testFailed(self):
206 d755483c Michael Hanselmann
    alloc_result = ([], [
207 d755483c Michael Hanselmann
      ("inst5191.example.com", "errormsg21178"),
208 d755483c Michael Hanselmann
      ], [])
209 0fcd0cad René Nussbaumer
    assert iallocator._NEVAC_RESULT(alloc_result)
210 d755483c Michael Hanselmann
211 d755483c Michael Hanselmann
    lu = _FakeLU()
212 5eacbcae Thomas Thrainer
    self.assertRaises(errors.OpExecError, common.LoadNodeEvacResult,
213 d755483c Michael Hanselmann
                      lu, alloc_result, False, False)
214 d755483c Michael Hanselmann
    self.assertFalse(lu.info_log)
215 d755483c Michael Hanselmann
    (_, (args, )) = lu.warning_log.pop(0)
216 d755483c Michael Hanselmann
    self.assertTrue("inst5191.example.com" in args)
217 d755483c Michael Hanselmann
    self.assertTrue("errormsg21178" in args)
218 d755483c Michael Hanselmann
    self.assertFalse(lu.warning_log)
219 d755483c Michael Hanselmann
220 d755483c Michael Hanselmann
221 784cd737 René Nussbaumer
class TestUpdateAndVerifySubDict(unittest.TestCase):
222 784cd737 René Nussbaumer
  def setUp(self):
223 784cd737 René Nussbaumer
    self.type_check = {
224 784cd737 René Nussbaumer
        "a": constants.VTYPE_INT,
225 784cd737 René Nussbaumer
        "b": constants.VTYPE_STRING,
226 784cd737 René Nussbaumer
        "c": constants.VTYPE_BOOL,
227 784cd737 René Nussbaumer
        "d": constants.VTYPE_STRING,
228 784cd737 René Nussbaumer
        }
229 784cd737 René Nussbaumer
230 784cd737 René Nussbaumer
  def test(self):
231 784cd737 René Nussbaumer
    old_test = {
232 784cd737 René Nussbaumer
      "foo": {
233 784cd737 René Nussbaumer
        "d": "blubb",
234 784cd737 René Nussbaumer
        "a": 321,
235 784cd737 René Nussbaumer
        },
236 784cd737 René Nussbaumer
      "baz": {
237 784cd737 René Nussbaumer
        "a": 678,
238 784cd737 René Nussbaumer
        "b": "678",
239 784cd737 René Nussbaumer
        "c": True,
240 784cd737 René Nussbaumer
        },
241 784cd737 René Nussbaumer
      }
242 784cd737 René Nussbaumer
    test = {
243 784cd737 René Nussbaumer
      "foo": {
244 784cd737 René Nussbaumer
        "a": 123,
245 784cd737 René Nussbaumer
        "b": "123",
246 784cd737 René Nussbaumer
        "c": True,
247 784cd737 René Nussbaumer
        },
248 784cd737 René Nussbaumer
      "bar": {
249 784cd737 René Nussbaumer
        "a": 321,
250 784cd737 René Nussbaumer
        "b": "321",
251 784cd737 René Nussbaumer
        "c": False,
252 784cd737 René Nussbaumer
        },
253 784cd737 René Nussbaumer
      }
254 784cd737 René Nussbaumer
255 784cd737 René Nussbaumer
    mv = {
256 784cd737 René Nussbaumer
      "foo": {
257 784cd737 René Nussbaumer
        "a": 123,
258 784cd737 René Nussbaumer
        "b": "123",
259 784cd737 René Nussbaumer
        "c": True,
260 784cd737 René Nussbaumer
        "d": "blubb"
261 784cd737 René Nussbaumer
        },
262 784cd737 René Nussbaumer
      "bar": {
263 784cd737 René Nussbaumer
        "a": 321,
264 784cd737 René Nussbaumer
        "b": "321",
265 784cd737 René Nussbaumer
        "c": False,
266 784cd737 René Nussbaumer
        },
267 784cd737 René Nussbaumer
      "baz": {
268 784cd737 René Nussbaumer
        "a": 678,
269 784cd737 René Nussbaumer
        "b": "678",
270 784cd737 René Nussbaumer
        "c": True,
271 784cd737 René Nussbaumer
        },
272 784cd737 René Nussbaumer
      }
273 784cd737 René Nussbaumer
274 7352d33b Thomas Thrainer
    verified = common._UpdateAndVerifySubDict(old_test, test, self.type_check)
275 784cd737 René Nussbaumer
    self.assertEqual(verified, mv)
276 784cd737 René Nussbaumer
277 784cd737 René Nussbaumer
  def testWrong(self):
278 784cd737 René Nussbaumer
    test = {
279 784cd737 René Nussbaumer
      "foo": {
280 784cd737 René Nussbaumer
        "a": "blubb",
281 784cd737 René Nussbaumer
        "b": "123",
282 784cd737 René Nussbaumer
        "c": True,
283 784cd737 René Nussbaumer
        },
284 784cd737 René Nussbaumer
      "bar": {
285 784cd737 René Nussbaumer
        "a": 321,
286 784cd737 René Nussbaumer
        "b": "321",
287 784cd737 René Nussbaumer
        "c": False,
288 784cd737 René Nussbaumer
        },
289 784cd737 René Nussbaumer
      }
290 784cd737 René Nussbaumer
291 784cd737 René Nussbaumer
    self.assertRaises(errors.TypeEnforcementError,
292 7352d33b Thomas Thrainer
                      common._UpdateAndVerifySubDict, {}, test,
293 7352d33b Thomas Thrainer
                      self.type_check)
294 784cd737 René Nussbaumer
295 784cd737 René Nussbaumer
296 0ba177e2 René Nussbaumer
class TestHvStateHelper(unittest.TestCase):
297 0ba177e2 René Nussbaumer
  def testWithoutOpData(self):
298 5eacbcae Thomas Thrainer
    self.assertEqual(common.MergeAndVerifyHvState(None, NotImplemented),
299 7352d33b Thomas Thrainer
                     None)
300 0ba177e2 René Nussbaumer
301 0ba177e2 René Nussbaumer
  def testWithoutOldData(self):
302 0ba177e2 René Nussbaumer
    new = {
303 0ba177e2 René Nussbaumer
      constants.HT_XEN_PVM: {
304 0ba177e2 René Nussbaumer
        constants.HVST_MEMORY_TOTAL: 4096,
305 0ba177e2 René Nussbaumer
        },
306 0ba177e2 René Nussbaumer
      }
307 5eacbcae Thomas Thrainer
    self.assertEqual(common.MergeAndVerifyHvState(new, None), new)
308 0ba177e2 René Nussbaumer
309 0ba177e2 René Nussbaumer
  def testWithWrongHv(self):
310 0ba177e2 René Nussbaumer
    new = {
311 0ba177e2 René Nussbaumer
      "i-dont-exist": {
312 0ba177e2 René Nussbaumer
        constants.HVST_MEMORY_TOTAL: 4096,
313 0ba177e2 René Nussbaumer
        },
314 0ba177e2 René Nussbaumer
      }
315 5eacbcae Thomas Thrainer
    self.assertRaises(errors.OpPrereqError, common.MergeAndVerifyHvState,
316 7352d33b Thomas Thrainer
                      new, None)
317 0ba177e2 René Nussbaumer
318 0ba177e2 René Nussbaumer
class TestDiskStateHelper(unittest.TestCase):
319 0ba177e2 René Nussbaumer
  def testWithoutOpData(self):
320 5eacbcae Thomas Thrainer
    self.assertEqual(common.MergeAndVerifyDiskState(None, NotImplemented),
321 0ba177e2 René Nussbaumer
                     None)
322 0ba177e2 René Nussbaumer
323 0ba177e2 René Nussbaumer
  def testWithoutOldData(self):
324 0ba177e2 René Nussbaumer
    new = {
325 0c5f1b13 Thomas Thrainer
      constants.DT_PLAIN: {
326 0ba177e2 René Nussbaumer
        "xenvg": {
327 0ba177e2 René Nussbaumer
          constants.DS_DISK_RESERVED: 1024,
328 0ba177e2 René Nussbaumer
          },
329 0ba177e2 René Nussbaumer
        },
330 0ba177e2 René Nussbaumer
      }
331 5eacbcae Thomas Thrainer
    self.assertEqual(common.MergeAndVerifyDiskState(new, None), new)
332 0ba177e2 René Nussbaumer
333 0ba177e2 René Nussbaumer
  def testWithWrongStorageType(self):
334 0ba177e2 René Nussbaumer
    new = {
335 0ba177e2 René Nussbaumer
      "i-dont-exist": {
336 0ba177e2 René Nussbaumer
        "xenvg": {
337 0ba177e2 René Nussbaumer
          constants.DS_DISK_RESERVED: 1024,
338 0ba177e2 René Nussbaumer
          },
339 0ba177e2 René Nussbaumer
        },
340 0ba177e2 René Nussbaumer
      }
341 5eacbcae Thomas Thrainer
    self.assertRaises(errors.OpPrereqError, common.MergeAndVerifyDiskState,
342 0ba177e2 René Nussbaumer
                      new, None)
343 0ba177e2 René Nussbaumer
344 0ba177e2 René Nussbaumer
345 2096d068 René Nussbaumer
class TestComputeMinMaxSpec(unittest.TestCase):
346 2096d068 René Nussbaumer
  def setUp(self):
347 da5f09ef Bernardo Dal Seno
    self.ispecs = {
348 2096d068 René Nussbaumer
      constants.ISPECS_MAX: {
349 2096d068 René Nussbaumer
        constants.ISPEC_MEM_SIZE: 512,
350 2096d068 René Nussbaumer
        constants.ISPEC_DISK_SIZE: 1024,
351 2096d068 René Nussbaumer
        },
352 2096d068 René Nussbaumer
      constants.ISPECS_MIN: {
353 2096d068 René Nussbaumer
        constants.ISPEC_MEM_SIZE: 128,
354 2096d068 René Nussbaumer
        constants.ISPEC_DISK_COUNT: 1,
355 2096d068 René Nussbaumer
        },
356 2096d068 René Nussbaumer
      }
357 2096d068 René Nussbaumer
358 2096d068 René Nussbaumer
  def testNoneValue(self):
359 7352d33b Thomas Thrainer
    self.assertTrue(common._ComputeMinMaxSpec(constants.ISPEC_MEM_SIZE, None,
360 da5f09ef Bernardo Dal Seno
                                              self.ispecs, None) is None)
361 2096d068 René Nussbaumer
362 2096d068 René Nussbaumer
  def testAutoValue(self):
363 7352d33b Thomas Thrainer
    self.assertTrue(common._ComputeMinMaxSpec(constants.ISPEC_MEM_SIZE, None,
364 da5f09ef Bernardo Dal Seno
                                              self.ispecs,
365 2096d068 René Nussbaumer
                                              constants.VALUE_AUTO) is None)
366 2096d068 René Nussbaumer
367 2096d068 René Nussbaumer
  def testNotDefined(self):
368 7352d33b Thomas Thrainer
    self.assertTrue(common._ComputeMinMaxSpec(constants.ISPEC_NIC_COUNT, None,
369 da5f09ef Bernardo Dal Seno
                                              self.ispecs, 3) is None)
370 2096d068 René Nussbaumer
371 2096d068 René Nussbaumer
  def testNoMinDefined(self):
372 7352d33b Thomas Thrainer
    self.assertTrue(common._ComputeMinMaxSpec(constants.ISPEC_DISK_SIZE, None,
373 da5f09ef Bernardo Dal Seno
                                              self.ispecs, 128) is None)
374 2096d068 René Nussbaumer
375 2096d068 René Nussbaumer
  def testNoMaxDefined(self):
376 7352d33b Thomas Thrainer
    self.assertTrue(common._ComputeMinMaxSpec(constants.ISPEC_DISK_COUNT,
377 7352d33b Thomas Thrainer
                                              None, self.ispecs, 16) is None)
378 2096d068 René Nussbaumer
379 2096d068 René Nussbaumer
  def testOutOfRange(self):
380 2096d068 René Nussbaumer
    for (name, val) in ((constants.ISPEC_MEM_SIZE, 64),
381 2096d068 René Nussbaumer
                        (constants.ISPEC_MEM_SIZE, 768),
382 2096d068 René Nussbaumer
                        (constants.ISPEC_DISK_SIZE, 4096),
383 2096d068 René Nussbaumer
                        (constants.ISPEC_DISK_COUNT, 0)):
384 da5f09ef Bernardo Dal Seno
      min_v = self.ispecs[constants.ISPECS_MIN].get(name, val)
385 da5f09ef Bernardo Dal Seno
      max_v = self.ispecs[constants.ISPECS_MAX].get(name, val)
386 7352d33b Thomas Thrainer
      self.assertEqual(common._ComputeMinMaxSpec(name, None,
387 da5f09ef Bernardo Dal Seno
                                                 self.ispecs, val),
388 2096d068 René Nussbaumer
                       "%s value %s is not in range [%s, %s]" %
389 2096d068 René Nussbaumer
                       (name, val,min_v, max_v))
390 7352d33b Thomas Thrainer
      self.assertEqual(common._ComputeMinMaxSpec(name, "1",
391 da5f09ef Bernardo Dal Seno
                                                 self.ispecs, val),
392 0c2e59ac Iustin Pop
                       "%s/1 value %s is not in range [%s, %s]" %
393 0c2e59ac Iustin Pop
                       (name, val,min_v, max_v))
394 2096d068 René Nussbaumer
395 2096d068 René Nussbaumer
  def test(self):
396 2096d068 René Nussbaumer
    for (name, val) in ((constants.ISPEC_MEM_SIZE, 256),
397 2096d068 René Nussbaumer
                        (constants.ISPEC_MEM_SIZE, 128),
398 2096d068 René Nussbaumer
                        (constants.ISPEC_MEM_SIZE, 512),
399 2096d068 René Nussbaumer
                        (constants.ISPEC_DISK_SIZE, 1024),
400 2096d068 René Nussbaumer
                        (constants.ISPEC_DISK_SIZE, 0),
401 2096d068 René Nussbaumer
                        (constants.ISPEC_DISK_COUNT, 1),
402 2096d068 René Nussbaumer
                        (constants.ISPEC_DISK_COUNT, 5)):
403 7352d33b Thomas Thrainer
      self.assertTrue(common._ComputeMinMaxSpec(name, None, self.ispecs, val)
404 2096d068 René Nussbaumer
                      is None)
405 2096d068 René Nussbaumer
406 2096d068 René Nussbaumer
407 0e68bf27 René Nussbaumer
def _ValidateComputeMinMaxSpec(name, *_):
408 0fb81174 René Nussbaumer
  assert name in constants.ISPECS_PARAMETERS
409 0fb81174 René Nussbaumer
  return None
410 0fb81174 René Nussbaumer
411 0fb81174 René Nussbaumer
412 cc4b2676 Bernardo Dal Seno
def _NoDiskComputeMinMaxSpec(name, *_):
413 cc4b2676 Bernardo Dal Seno
  if name == constants.ISPEC_DISK_COUNT:
414 cc4b2676 Bernardo Dal Seno
    return name
415 cc4b2676 Bernardo Dal Seno
  else:
416 cc4b2676 Bernardo Dal Seno
    return None
417 cc4b2676 Bernardo Dal Seno
418 cc4b2676 Bernardo Dal Seno
419 0fb81174 René Nussbaumer
class _SpecWrapper:
420 0fb81174 René Nussbaumer
  def __init__(self, spec):
421 0fb81174 René Nussbaumer
    self.spec = spec
422 0fb81174 René Nussbaumer
423 0e68bf27 René Nussbaumer
  def ComputeMinMaxSpec(self, *args):
424 0fb81174 René Nussbaumer
    return self.spec.pop(0)
425 0fb81174 René Nussbaumer
426 0fb81174 René Nussbaumer
427 0fb81174 René Nussbaumer
class TestComputeIPolicySpecViolation(unittest.TestCase):
428 cc4b2676 Bernardo Dal Seno
  # Minimal policy accepted by _ComputeIPolicySpecViolation()
429 cc4b2676 Bernardo Dal Seno
  _MICRO_IPOL = {
430 cc4b2676 Bernardo Dal Seno
    constants.IPOLICY_DTS: [constants.DT_PLAIN, constants.DT_DISKLESS],
431 41044e04 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [NotImplemented],
432 cc4b2676 Bernardo Dal Seno
    }
433 cc4b2676 Bernardo Dal Seno
434 0fb81174 René Nussbaumer
  def test(self):
435 0e68bf27 René Nussbaumer
    compute_fn = _ValidateComputeMinMaxSpec
436 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicySpecViolation(self._MICRO_IPOL, 1024, 1, 1, 1,
437 5eacbcae Thomas Thrainer
                                             [1024], 1, constants.DT_PLAIN,
438 5eacbcae Thomas Thrainer
                                             _compute_fn=compute_fn)
439 0fb81174 René Nussbaumer
    self.assertEqual(ret, [])
440 0fb81174 René Nussbaumer
441 cc4b2676 Bernardo Dal Seno
  def testDiskFull(self):
442 cc4b2676 Bernardo Dal Seno
    compute_fn = _NoDiskComputeMinMaxSpec
443 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicySpecViolation(self._MICRO_IPOL, 1024, 1, 1, 1,
444 5eacbcae Thomas Thrainer
                                             [1024], 1, constants.DT_PLAIN,
445 5eacbcae Thomas Thrainer
                                             _compute_fn=compute_fn)
446 cc4b2676 Bernardo Dal Seno
    self.assertEqual(ret, [constants.ISPEC_DISK_COUNT])
447 cc4b2676 Bernardo Dal Seno
448 cc4b2676 Bernardo Dal Seno
  def testDiskLess(self):
449 cc4b2676 Bernardo Dal Seno
    compute_fn = _NoDiskComputeMinMaxSpec
450 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicySpecViolation(self._MICRO_IPOL, 1024, 1, 1, 1,
451 5eacbcae Thomas Thrainer
                                             [1024], 1, constants.DT_DISKLESS,
452 5eacbcae Thomas Thrainer
                                             _compute_fn=compute_fn)
453 cc4b2676 Bernardo Dal Seno
    self.assertEqual(ret, [])
454 cc4b2676 Bernardo Dal Seno
455 cc4b2676 Bernardo Dal Seno
  def testWrongTemplates(self):
456 cc4b2676 Bernardo Dal Seno
    compute_fn = _ValidateComputeMinMaxSpec
457 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicySpecViolation(self._MICRO_IPOL, 1024, 1, 1, 1,
458 5eacbcae Thomas Thrainer
                                             [1024], 1, constants.DT_DRBD8,
459 5eacbcae Thomas Thrainer
                                             _compute_fn=compute_fn)
460 cc4b2676 Bernardo Dal Seno
    self.assertEqual(len(ret), 1)
461 cc4b2676 Bernardo Dal Seno
    self.assertTrue("Disk template" in ret[0])
462 cc4b2676 Bernardo Dal Seno
463 0fb81174 René Nussbaumer
  def testInvalidArguments(self):
464 5eacbcae Thomas Thrainer
    self.assertRaises(AssertionError, common.ComputeIPolicySpecViolation,
465 cc4b2676 Bernardo Dal Seno
                      self._MICRO_IPOL, 1024, 1, 1, 1, [], 1,
466 cc4b2676 Bernardo Dal Seno
                      constants.DT_PLAIN,)
467 0fb81174 René Nussbaumer
468 0fb81174 René Nussbaumer
  def testInvalidSpec(self):
469 553cb5f7 René Nussbaumer
    spec = _SpecWrapper([None, False, "foo", None, "bar", None])
470 0e68bf27 René Nussbaumer
    compute_fn = spec.ComputeMinMaxSpec
471 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicySpecViolation(self._MICRO_IPOL, 1024, 1, 1, 1,
472 5eacbcae Thomas Thrainer
                                             [1024], 1, constants.DT_PLAIN,
473 5eacbcae Thomas Thrainer
                                             _compute_fn=compute_fn)
474 0fb81174 René Nussbaumer
    self.assertEqual(ret, ["foo", "bar"])
475 0fb81174 René Nussbaumer
    self.assertFalse(spec.spec)
476 0fb81174 René Nussbaumer
477 41044e04 Bernardo Dal Seno
  def testWithIPolicy(self):
478 41044e04 Bernardo Dal Seno
    mem_size = 2048
479 41044e04 Bernardo Dal Seno
    cpu_count = 2
480 41044e04 Bernardo Dal Seno
    disk_count = 1
481 41044e04 Bernardo Dal Seno
    disk_sizes = [512]
482 41044e04 Bernardo Dal Seno
    nic_count = 1
483 41044e04 Bernardo Dal Seno
    spindle_use = 4
484 41044e04 Bernardo Dal Seno
    disk_template = "mytemplate"
485 41044e04 Bernardo Dal Seno
    ispec = {
486 41044e04 Bernardo Dal Seno
      constants.ISPEC_MEM_SIZE: mem_size,
487 41044e04 Bernardo Dal Seno
      constants.ISPEC_CPU_COUNT: cpu_count,
488 41044e04 Bernardo Dal Seno
      constants.ISPEC_DISK_COUNT: disk_count,
489 41044e04 Bernardo Dal Seno
      constants.ISPEC_DISK_SIZE: disk_sizes[0],
490 41044e04 Bernardo Dal Seno
      constants.ISPEC_NIC_COUNT: nic_count,
491 41044e04 Bernardo Dal Seno
      constants.ISPEC_SPINDLE_USE: spindle_use,
492 41044e04 Bernardo Dal Seno
      }
493 41044e04 Bernardo Dal Seno
    ipolicy1 = {
494 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX: [{
495 41044e04 Bernardo Dal Seno
        constants.ISPECS_MIN: ispec,
496 41044e04 Bernardo Dal Seno
        constants.ISPECS_MAX: ispec,
497 41044e04 Bernardo Dal Seno
        }],
498 41044e04 Bernardo Dal Seno
      constants.IPOLICY_DTS: [disk_template],
499 41044e04 Bernardo Dal Seno
      }
500 41044e04 Bernardo Dal Seno
    ispec_copy = copy.deepcopy(ispec)
501 41044e04 Bernardo Dal Seno
    ipolicy2 = {
502 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX: [
503 41044e04 Bernardo Dal Seno
        {
504 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: ispec_copy,
505 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: ispec_copy,
506 41044e04 Bernardo Dal Seno
          },
507 41044e04 Bernardo Dal Seno
        {
508 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: ispec,
509 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: ispec,
510 41044e04 Bernardo Dal Seno
          },
511 41044e04 Bernardo Dal Seno
        ],
512 41044e04 Bernardo Dal Seno
      constants.IPOLICY_DTS: [disk_template],
513 41044e04 Bernardo Dal Seno
      }
514 41044e04 Bernardo Dal Seno
    ipolicy3 = {
515 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX: [
516 41044e04 Bernardo Dal Seno
        {
517 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: ispec,
518 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: ispec,
519 41044e04 Bernardo Dal Seno
          },
520 41044e04 Bernardo Dal Seno
        {
521 41044e04 Bernardo Dal Seno
          constants.ISPECS_MIN: ispec_copy,
522 41044e04 Bernardo Dal Seno
          constants.ISPECS_MAX: ispec_copy,
523 41044e04 Bernardo Dal Seno
          },
524 41044e04 Bernardo Dal Seno
        ],
525 41044e04 Bernardo Dal Seno
      constants.IPOLICY_DTS: [disk_template],
526 41044e04 Bernardo Dal Seno
      }
527 41044e04 Bernardo Dal Seno
    def AssertComputeViolation(ipolicy, violations):
528 5eacbcae Thomas Thrainer
      ret = common.ComputeIPolicySpecViolation(ipolicy, mem_size, cpu_count,
529 5eacbcae Thomas Thrainer
                                               disk_count, nic_count,
530 5eacbcae Thomas Thrainer
                                               disk_sizes, spindle_use,
531 5eacbcae Thomas Thrainer
                                               disk_template)
532 41044e04 Bernardo Dal Seno
      self.assertEqual(len(ret), violations)
533 41044e04 Bernardo Dal Seno
534 41044e04 Bernardo Dal Seno
    AssertComputeViolation(ipolicy1, 0)
535 41044e04 Bernardo Dal Seno
    AssertComputeViolation(ipolicy2, 0)
536 41044e04 Bernardo Dal Seno
    AssertComputeViolation(ipolicy3, 0)
537 41044e04 Bernardo Dal Seno
    for par in constants.ISPECS_PARAMETERS:
538 41044e04 Bernardo Dal Seno
      ispec[par] += 1
539 41044e04 Bernardo Dal Seno
      AssertComputeViolation(ipolicy1, 1)
540 41044e04 Bernardo Dal Seno
      AssertComputeViolation(ipolicy2, 0)
541 41044e04 Bernardo Dal Seno
      AssertComputeViolation(ipolicy3, 0)
542 41044e04 Bernardo Dal Seno
      ispec[par] -= 2
543 41044e04 Bernardo Dal Seno
      AssertComputeViolation(ipolicy1, 1)
544 41044e04 Bernardo Dal Seno
      AssertComputeViolation(ipolicy2, 0)
545 41044e04 Bernardo Dal Seno
      AssertComputeViolation(ipolicy3, 0)
546 41044e04 Bernardo Dal Seno
      ispec[par] += 1 # Restore
547 41044e04 Bernardo Dal Seno
    ipolicy1[constants.IPOLICY_DTS] = ["another_template"]
548 41044e04 Bernardo Dal Seno
    AssertComputeViolation(ipolicy1, 1)
549 41044e04 Bernardo Dal Seno
550 0fb81174 René Nussbaumer
551 0fb81174 René Nussbaumer
class _StubComputeIPolicySpecViolation:
552 553cb5f7 René Nussbaumer
  def __init__(self, mem_size, cpu_count, disk_count, nic_count, disk_sizes,
553 cc4b2676 Bernardo Dal Seno
               spindle_use, disk_template):
554 0fb81174 René Nussbaumer
    self.mem_size = mem_size
555 0fb81174 René Nussbaumer
    self.cpu_count = cpu_count
556 0fb81174 René Nussbaumer
    self.disk_count = disk_count
557 0fb81174 René Nussbaumer
    self.nic_count = nic_count
558 0fb81174 René Nussbaumer
    self.disk_sizes = disk_sizes
559 553cb5f7 René Nussbaumer
    self.spindle_use = spindle_use
560 cc4b2676 Bernardo Dal Seno
    self.disk_template = disk_template
561 0fb81174 René Nussbaumer
562 553cb5f7 René Nussbaumer
  def __call__(self, _, mem_size, cpu_count, disk_count, nic_count, disk_sizes,
563 cc4b2676 Bernardo Dal Seno
               spindle_use, disk_template):
564 0fb81174 René Nussbaumer
    assert self.mem_size == mem_size
565 0fb81174 René Nussbaumer
    assert self.cpu_count == cpu_count
566 0fb81174 René Nussbaumer
    assert self.disk_count == disk_count
567 0fb81174 René Nussbaumer
    assert self.nic_count == nic_count
568 0fb81174 René Nussbaumer
    assert self.disk_sizes == disk_sizes
569 553cb5f7 René Nussbaumer
    assert self.spindle_use == spindle_use
570 cc4b2676 Bernardo Dal Seno
    assert self.disk_template == disk_template
571 0fb81174 René Nussbaumer
572 0fb81174 René Nussbaumer
    return []
573 0fb81174 René Nussbaumer
574 0fb81174 René Nussbaumer
575 2477c1c5 Bernardo Dal Seno
class _FakeConfigForComputeIPolicyInstanceViolation:
576 5a13489b Bernardo Dal Seno
  def __init__(self, be, excl_stor):
577 2477c1c5 Bernardo Dal Seno
    self.cluster = objects.Cluster(beparams={"default": be})
578 5a13489b Bernardo Dal Seno
    self.excl_stor = excl_stor
579 2477c1c5 Bernardo Dal Seno
580 2477c1c5 Bernardo Dal Seno
  def GetClusterInfo(self):
581 2477c1c5 Bernardo Dal Seno
    return self.cluster
582 2477c1c5 Bernardo Dal Seno
583 5a13489b Bernardo Dal Seno
  def GetNodeInfo(self, _):
584 5a13489b Bernardo Dal Seno
    return {}
585 5a13489b Bernardo Dal Seno
586 5a13489b Bernardo Dal Seno
  def GetNdParams(self, _):
587 5a13489b Bernardo Dal Seno
    return {
588 5a13489b Bernardo Dal Seno
      constants.ND_EXCLUSIVE_STORAGE: self.excl_stor,
589 5a13489b Bernardo Dal Seno
      }
590 5a13489b Bernardo Dal Seno
591 2477c1c5 Bernardo Dal Seno
592 0fb81174 René Nussbaumer
class TestComputeIPolicyInstanceViolation(unittest.TestCase):
593 0fb81174 René Nussbaumer
  def test(self):
594 0fb81174 René Nussbaumer
    beparams = {
595 0fb81174 René Nussbaumer
      constants.BE_MAXMEM: 2048,
596 0fb81174 René Nussbaumer
      constants.BE_VCPUS: 2,
597 34700f5b René Nussbaumer
      constants.BE_SPINDLE_USE: 4,
598 0fb81174 René Nussbaumer
      }
599 5a13489b Bernardo Dal Seno
    disks = [objects.Disk(size=512, spindles=13)]
600 5a13489b Bernardo Dal Seno
    cfg = _FakeConfigForComputeIPolicyInstanceViolation(beparams, False)
601 cc4b2676 Bernardo Dal Seno
    instance = objects.Instance(beparams=beparams, disks=disks, nics=[],
602 cc4b2676 Bernardo Dal Seno
                                disk_template=constants.DT_PLAIN)
603 cc4b2676 Bernardo Dal Seno
    stub = _StubComputeIPolicySpecViolation(2048, 2, 1, 0, [512], 4,
604 cc4b2676 Bernardo Dal Seno
                                            constants.DT_PLAIN)
605 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicyInstanceViolation(NotImplemented, instance,
606 5eacbcae Thomas Thrainer
                                                 cfg, _compute_fn=stub)
607 2477c1c5 Bernardo Dal Seno
    self.assertEqual(ret, [])
608 2477c1c5 Bernardo Dal Seno
    instance2 = objects.Instance(beparams={}, disks=disks, nics=[],
609 2477c1c5 Bernardo Dal Seno
                                 disk_template=constants.DT_PLAIN)
610 5eacbcae Thomas Thrainer
    ret = common.ComputeIPolicyInstanceViolation(NotImplemented, instance2,
611 5eacbcae Thomas Thrainer
                                                 cfg, _compute_fn=stub)
612 0fb81174 René Nussbaumer
    self.assertEqual(ret, [])
613 5a13489b Bernardo Dal Seno
    cfg_es = _FakeConfigForComputeIPolicyInstanceViolation(beparams, True)
614 5a13489b Bernardo Dal Seno
    stub_es = _StubComputeIPolicySpecViolation(2048, 2, 1, 0, [512], 13,
615 5a13489b Bernardo Dal Seno
                                               constants.DT_PLAIN)
616 5a13489b Bernardo Dal Seno
    ret = common.ComputeIPolicyInstanceViolation(NotImplemented, instance,
617 5a13489b Bernardo Dal Seno
                                                 cfg_es, _compute_fn=stub_es)
618 5a13489b Bernardo Dal Seno
    self.assertEqual(ret, [])
619 5a13489b Bernardo Dal Seno
    ret = common.ComputeIPolicyInstanceViolation(NotImplemented, instance2,
620 5a13489b Bernardo Dal Seno
                                                 cfg_es, _compute_fn=stub_es)
621 5a13489b Bernardo Dal Seno
    self.assertEqual(ret, [])
622 0fb81174 René Nussbaumer
623 0fb81174 René Nussbaumer
624 0fb81174 René Nussbaumer
class _CallRecorder:
625 0fb81174 René Nussbaumer
  def __init__(self, return_value=None):
626 0fb81174 René Nussbaumer
    self.called = False
627 0fb81174 René Nussbaumer
    self.return_value = return_value
628 0fb81174 René Nussbaumer
629 0fb81174 René Nussbaumer
  def __call__(self, *args):
630 0fb81174 René Nussbaumer
    self.called = True
631 0fb81174 René Nussbaumer
    return self.return_value
632 0fb81174 René Nussbaumer
633 0fb81174 René Nussbaumer
634 0fb81174 René Nussbaumer
class TestComputeIPolicyNodeViolation(unittest.TestCase):
635 0fb81174 René Nussbaumer
  def setUp(self):
636 0fb81174 René Nussbaumer
    self.recorder = _CallRecorder(return_value=[])
637 0fb81174 René Nussbaumer
638 0fb81174 René Nussbaumer
  def testSameGroup(self):
639 763ad5be Thomas Thrainer
    ret = instance_utils._ComputeIPolicyNodeViolation(
640 763ad5be Thomas Thrainer
      NotImplemented,
641 763ad5be Thomas Thrainer
      NotImplemented,
642 763ad5be Thomas Thrainer
      "foo", "foo", NotImplemented,
643 763ad5be Thomas Thrainer
      _compute_fn=self.recorder)
644 0fb81174 René Nussbaumer
    self.assertFalse(self.recorder.called)
645 0fb81174 René Nussbaumer
    self.assertEqual(ret, [])
646 0fb81174 René Nussbaumer
647 0fb81174 René Nussbaumer
  def testDifferentGroup(self):
648 763ad5be Thomas Thrainer
    ret = instance_utils._ComputeIPolicyNodeViolation(
649 763ad5be Thomas Thrainer
      NotImplemented,
650 763ad5be Thomas Thrainer
      NotImplemented,
651 763ad5be Thomas Thrainer
      "foo", "bar", NotImplemented,
652 763ad5be Thomas Thrainer
      _compute_fn=self.recorder)
653 0fb81174 René Nussbaumer
    self.assertTrue(self.recorder.called)
654 0fb81174 René Nussbaumer
    self.assertEqual(ret, [])
655 0fb81174 René Nussbaumer
656 0fb81174 René Nussbaumer
657 fa8ef9d6 Michael Hanselmann
class TestDiskSizeInBytesToMebibytes(unittest.TestCase):
658 fa8ef9d6 Michael Hanselmann
  def testLessThanOneMebibyte(self):
659 fa8ef9d6 Michael Hanselmann
    for i in [1, 2, 7, 512, 1000, 1023]:
660 fa8ef9d6 Michael Hanselmann
      lu = _FakeLU()
661 763ad5be Thomas Thrainer
      result = instance_storage._DiskSizeInBytesToMebibytes(lu, i)
662 fa8ef9d6 Michael Hanselmann
      self.assertEqual(result, 1)
663 fa8ef9d6 Michael Hanselmann
      self.assertEqual(len(lu.warning_log), 1)
664 fa8ef9d6 Michael Hanselmann
      self.assertEqual(len(lu.warning_log[0]), 2)
665 fa8ef9d6 Michael Hanselmann
      (_, (warnsize, )) = lu.warning_log[0]
666 fa8ef9d6 Michael Hanselmann
      self.assertEqual(warnsize, (1024 * 1024) - i)
667 fa8ef9d6 Michael Hanselmann
668 fa8ef9d6 Michael Hanselmann
  def testEven(self):
669 fa8ef9d6 Michael Hanselmann
    for i in [1, 2, 7, 512, 1000, 1023]:
670 fa8ef9d6 Michael Hanselmann
      lu = _FakeLU()
671 763ad5be Thomas Thrainer
      result = instance_storage._DiskSizeInBytesToMebibytes(lu,
672 763ad5be Thomas Thrainer
                                                            i * 1024 * 1024)
673 fa8ef9d6 Michael Hanselmann
      self.assertEqual(result, i)
674 fa8ef9d6 Michael Hanselmann
      self.assertFalse(lu.warning_log)
675 fa8ef9d6 Michael Hanselmann
676 fa8ef9d6 Michael Hanselmann
  def testLargeNumber(self):
677 fa8ef9d6 Michael Hanselmann
    for i in [1, 2, 7, 512, 1000, 1023, 2724, 12420]:
678 fa8ef9d6 Michael Hanselmann
      for j in [1, 2, 486, 326, 986, 1023]:
679 fa8ef9d6 Michael Hanselmann
        lu = _FakeLU()
680 fa8ef9d6 Michael Hanselmann
        size = (1024 * 1024 * i) + j
681 763ad5be Thomas Thrainer
        result = instance_storage._DiskSizeInBytesToMebibytes(lu, size)
682 fa8ef9d6 Michael Hanselmann
        self.assertEqual(result, i + 1, msg="Amount was not rounded up")
683 fa8ef9d6 Michael Hanselmann
        self.assertEqual(len(lu.warning_log), 1)
684 fa8ef9d6 Michael Hanselmann
        self.assertEqual(len(lu.warning_log[0]), 2)
685 fa8ef9d6 Michael Hanselmann
        (_, (warnsize, )) = lu.warning_log[0]
686 fa8ef9d6 Michael Hanselmann
        self.assertEqual(warnsize, (1024 * 1024) - j)
687 129cce69 Michael Hanselmann
688 129cce69 Michael Hanselmann
689 8bb2df7d Bernardo Dal Seno
class _OpTestVerifyErrors(opcodes.OpCode):
690 8bb2df7d Bernardo Dal Seno
  OP_PARAMS = [
691 61c9a3d6 Jose A. Lopes
    ("debug_simulate_errors", False, ht.TBool, ""),
692 61c9a3d6 Jose A. Lopes
    ("error_codes", False, ht.TBool, ""),
693 61c9a3d6 Jose A. Lopes
    ("ignore_errors",
694 61c9a3d6 Jose A. Lopes
     [],
695 61c9a3d6 Jose A. Lopes
     ht.TListOf(ht.TElemOf(constants.CV_ALL_ECODES_STRINGS)),
696 61c9a3d6 Jose A. Lopes
     "")
697 8bb2df7d Bernardo Dal Seno
    ]
698 8bb2df7d Bernardo Dal Seno
699 8bb2df7d Bernardo Dal Seno
700 7352d33b Thomas Thrainer
class _LuTestVerifyErrors(cluster._VerifyErrors):
701 8bb2df7d Bernardo Dal Seno
  def __init__(self, **kwargs):
702 7352d33b Thomas Thrainer
    cluster._VerifyErrors.__init__(self)
703 8bb2df7d Bernardo Dal Seno
    self.op = _OpTestVerifyErrors(**kwargs)
704 8bb2df7d Bernardo Dal Seno
    self.op.Validate(True)
705 8bb2df7d Bernardo Dal Seno
    self.msglist = []
706 8bb2df7d Bernardo Dal Seno
    self._feedback_fn = self.msglist.append
707 8bb2df7d Bernardo Dal Seno
    self.bad = False
708 8bb2df7d Bernardo Dal Seno
709 8bb2df7d Bernardo Dal Seno
  def DispatchCallError(self, which, *args, **kwargs):
710 8bb2df7d Bernardo Dal Seno
    if which:
711 8bb2df7d Bernardo Dal Seno
      self._Error(*args, **kwargs)
712 8bb2df7d Bernardo Dal Seno
    else:
713 8bb2df7d Bernardo Dal Seno
      self._ErrorIf(True, *args, **kwargs)
714 8bb2df7d Bernardo Dal Seno
715 8bb2df7d Bernardo Dal Seno
  def CallErrorIf(self, c, *args, **kwargs):
716 8bb2df7d Bernardo Dal Seno
    self._ErrorIf(c, *args, **kwargs)
717 8bb2df7d Bernardo Dal Seno
718 8bb2df7d Bernardo Dal Seno
719 8bb2df7d Bernardo Dal Seno
class TestVerifyErrors(unittest.TestCase):
720 8bb2df7d Bernardo Dal Seno
  # Fake cluster-verify error code structures; we use two arbitary real error
721 8bb2df7d Bernardo Dal Seno
  # codes to pass validation of ignore_errors
722 8bb2df7d Bernardo Dal Seno
  (_, _ERR1ID, _) = constants.CV_ECLUSTERCFG
723 8bb2df7d Bernardo Dal Seno
  _NODESTR = "node"
724 8bb2df7d Bernardo Dal Seno
  _NODENAME = "mynode"
725 8bb2df7d Bernardo Dal Seno
  _ERR1CODE = (_NODESTR, _ERR1ID, "Error one")
726 8bb2df7d Bernardo Dal Seno
  (_, _ERR2ID, _) = constants.CV_ECLUSTERCERT
727 8bb2df7d Bernardo Dal Seno
  _INSTSTR = "instance"
728 8bb2df7d Bernardo Dal Seno
  _INSTNAME = "myinstance"
729 8bb2df7d Bernardo Dal Seno
  _ERR2CODE = (_INSTSTR, _ERR2ID, "Error two")
730 8bb2df7d Bernardo Dal Seno
  # Arguments used to call _Error() or _ErrorIf()
731 8bb2df7d Bernardo Dal Seno
  _ERR1ARGS = (_ERR1CODE, _NODENAME, "Error1 is %s", "an error")
732 8bb2df7d Bernardo Dal Seno
  _ERR2ARGS = (_ERR2CODE, _INSTNAME, "Error2 has no argument")
733 8bb2df7d Bernardo Dal Seno
  # Expected error messages
734 8bb2df7d Bernardo Dal Seno
  _ERR1MSG = _ERR1ARGS[2] % _ERR1ARGS[3]
735 8bb2df7d Bernardo Dal Seno
  _ERR2MSG = _ERR2ARGS[2]
736 8bb2df7d Bernardo Dal Seno
737 8bb2df7d Bernardo Dal Seno
  def testNoError(self):
738 8bb2df7d Bernardo Dal Seno
    lu = _LuTestVerifyErrors()
739 8bb2df7d Bernardo Dal Seno
    lu.CallErrorIf(False, self._ERR1CODE, *self._ERR1ARGS)
740 8bb2df7d Bernardo Dal Seno
    self.assertFalse(lu.bad)
741 8bb2df7d Bernardo Dal Seno
    self.assertFalse(lu.msglist)
742 8bb2df7d Bernardo Dal Seno
743 8bb2df7d Bernardo Dal Seno
  def _InitTest(self, **kwargs):
744 8bb2df7d Bernardo Dal Seno
    self.lu1 = _LuTestVerifyErrors(**kwargs)
745 8bb2df7d Bernardo Dal Seno
    self.lu2 = _LuTestVerifyErrors(**kwargs)
746 8bb2df7d Bernardo Dal Seno
747 8bb2df7d Bernardo Dal Seno
  def _CallError(self, *args, **kwargs):
748 8bb2df7d Bernardo Dal Seno
    # Check that _Error() and _ErrorIf() produce the same results
749 8bb2df7d Bernardo Dal Seno
    self.lu1.DispatchCallError(True, *args, **kwargs)
750 8bb2df7d Bernardo Dal Seno
    self.lu2.DispatchCallError(False, *args, **kwargs)
751 8bb2df7d Bernardo Dal Seno
    self.assertEqual(self.lu1.bad, self.lu2.bad)
752 8bb2df7d Bernardo Dal Seno
    self.assertEqual(self.lu1.msglist, self.lu2.msglist)
753 8bb2df7d Bernardo Dal Seno
    # Test-specific checks are made on one LU
754 8bb2df7d Bernardo Dal Seno
    return self.lu1
755 8bb2df7d Bernardo Dal Seno
756 8bb2df7d Bernardo Dal Seno
  def _checkMsgCommon(self, logstr, errmsg, itype, item, warning):
757 8bb2df7d Bernardo Dal Seno
    self.assertTrue(errmsg in logstr)
758 8bb2df7d Bernardo Dal Seno
    if warning:
759 8bb2df7d Bernardo Dal Seno
      self.assertTrue("WARNING" in logstr)
760 8bb2df7d Bernardo Dal Seno
    else:
761 8bb2df7d Bernardo Dal Seno
      self.assertTrue("ERROR" in logstr)
762 8bb2df7d Bernardo Dal Seno
    self.assertTrue(itype in logstr)
763 8bb2df7d Bernardo Dal Seno
    self.assertTrue(item in logstr)
764 8bb2df7d Bernardo Dal Seno
765 8bb2df7d Bernardo Dal Seno
  def _checkMsg1(self, logstr, warning=False):
766 8bb2df7d Bernardo Dal Seno
    self._checkMsgCommon(logstr, self._ERR1MSG, self._NODESTR,
767 8bb2df7d Bernardo Dal Seno
                         self._NODENAME, warning)
768 8bb2df7d Bernardo Dal Seno
769 8bb2df7d Bernardo Dal Seno
  def _checkMsg2(self, logstr, warning=False):
770 8bb2df7d Bernardo Dal Seno
    self._checkMsgCommon(logstr, self._ERR2MSG, self._INSTSTR,
771 8bb2df7d Bernardo Dal Seno
                         self._INSTNAME, warning)
772 8bb2df7d Bernardo Dal Seno
773 8bb2df7d Bernardo Dal Seno
  def testPlain(self):
774 8bb2df7d Bernardo Dal Seno
    self._InitTest()
775 8bb2df7d Bernardo Dal Seno
    lu = self._CallError(*self._ERR1ARGS)
776 8bb2df7d Bernardo Dal Seno
    self.assertTrue(lu.bad)
777 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 1)
778 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0])
779 8bb2df7d Bernardo Dal Seno
780 8bb2df7d Bernardo Dal Seno
  def testMultiple(self):
781 8bb2df7d Bernardo Dal Seno
    self._InitTest()
782 8bb2df7d Bernardo Dal Seno
    self._CallError(*self._ERR1ARGS)
783 8bb2df7d Bernardo Dal Seno
    lu = self._CallError(*self._ERR2ARGS)
784 8bb2df7d Bernardo Dal Seno
    self.assertTrue(lu.bad)
785 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 2)
786 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0])
787 8bb2df7d Bernardo Dal Seno
    self._checkMsg2(lu.msglist[1])
788 8bb2df7d Bernardo Dal Seno
789 8bb2df7d Bernardo Dal Seno
  def testIgnore(self):
790 8bb2df7d Bernardo Dal Seno
    self._InitTest(ignore_errors=[self._ERR1ID])
791 8bb2df7d Bernardo Dal Seno
    lu = self._CallError(*self._ERR1ARGS)
792 8bb2df7d Bernardo Dal Seno
    self.assertFalse(lu.bad)
793 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 1)
794 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0], warning=True)
795 8bb2df7d Bernardo Dal Seno
796 8bb2df7d Bernardo Dal Seno
  def testWarning(self):
797 8bb2df7d Bernardo Dal Seno
    self._InitTest()
798 8bb2df7d Bernardo Dal Seno
    lu = self._CallError(*self._ERR1ARGS,
799 8bb2df7d Bernardo Dal Seno
                         code=_LuTestVerifyErrors.ETYPE_WARNING)
800 8bb2df7d Bernardo Dal Seno
    self.assertFalse(lu.bad)
801 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 1)
802 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0], warning=True)
803 8bb2df7d Bernardo Dal Seno
804 8bb2df7d Bernardo Dal Seno
  def testWarning2(self):
805 8bb2df7d Bernardo Dal Seno
    self._InitTest()
806 8bb2df7d Bernardo Dal Seno
    self._CallError(*self._ERR1ARGS)
807 8bb2df7d Bernardo Dal Seno
    lu = self._CallError(*self._ERR2ARGS,
808 8bb2df7d Bernardo Dal Seno
                         code=_LuTestVerifyErrors.ETYPE_WARNING)
809 8bb2df7d Bernardo Dal Seno
    self.assertTrue(lu.bad)
810 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 2)
811 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0])
812 8bb2df7d Bernardo Dal Seno
    self._checkMsg2(lu.msglist[1], warning=True)
813 8bb2df7d Bernardo Dal Seno
814 8bb2df7d Bernardo Dal Seno
  def testDebugSimulate(self):
815 8bb2df7d Bernardo Dal Seno
    lu = _LuTestVerifyErrors(debug_simulate_errors=True)
816 8bb2df7d Bernardo Dal Seno
    lu.CallErrorIf(False, *self._ERR1ARGS)
817 8bb2df7d Bernardo Dal Seno
    self.assertTrue(lu.bad)
818 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 1)
819 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0])
820 8bb2df7d Bernardo Dal Seno
821 8bb2df7d Bernardo Dal Seno
  def testErrCodes(self):
822 8bb2df7d Bernardo Dal Seno
    self._InitTest(error_codes=True)
823 8bb2df7d Bernardo Dal Seno
    lu = self._CallError(*self._ERR1ARGS)
824 8bb2df7d Bernardo Dal Seno
    self.assertTrue(lu.bad)
825 8bb2df7d Bernardo Dal Seno
    self.assertEqual(len(lu.msglist), 1)
826 8bb2df7d Bernardo Dal Seno
    self._checkMsg1(lu.msglist[0])
827 8bb2df7d Bernardo Dal Seno
    self.assertTrue(self._ERR1ID in lu.msglist[0])
828 8bb2df7d Bernardo Dal Seno
829 8bb2df7d Bernardo Dal Seno
830 5dd7d15b Bernardo Dal Seno
class TestGetUpdatedIPolicy(unittest.TestCase):
831 5dd7d15b Bernardo Dal Seno
  """Tests for cmdlib._GetUpdatedIPolicy()"""
832 5dd7d15b Bernardo Dal Seno
  _OLD_CLUSTER_POLICY = {
833 5dd7d15b Bernardo Dal Seno
    constants.IPOLICY_VCPU_RATIO: 1.5,
834 41044e04 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [
835 41044e04 Bernardo Dal Seno
      {
836 41044e04 Bernardo Dal Seno
        constants.ISPECS_MIN: {
837 41044e04 Bernardo Dal Seno
          constants.ISPEC_MEM_SIZE: 32768,
838 41044e04 Bernardo Dal Seno
          constants.ISPEC_CPU_COUNT: 8,
839 41044e04 Bernardo Dal Seno
          constants.ISPEC_DISK_COUNT: 1,
840 41044e04 Bernardo Dal Seno
          constants.ISPEC_DISK_SIZE: 1024,
841 41044e04 Bernardo Dal Seno
          constants.ISPEC_NIC_COUNT: 1,
842 41044e04 Bernardo Dal Seno
          constants.ISPEC_SPINDLE_USE: 1,
843 41044e04 Bernardo Dal Seno
          },
844 41044e04 Bernardo Dal Seno
        constants.ISPECS_MAX: {
845 41044e04 Bernardo Dal Seno
          constants.ISPEC_MEM_SIZE: 65536,
846 41044e04 Bernardo Dal Seno
          constants.ISPEC_CPU_COUNT: 10,
847 41044e04 Bernardo Dal Seno
          constants.ISPEC_DISK_COUNT: 5,
848 41044e04 Bernardo Dal Seno
          constants.ISPEC_DISK_SIZE: 1024 * 1024,
849 41044e04 Bernardo Dal Seno
          constants.ISPEC_NIC_COUNT: 3,
850 41044e04 Bernardo Dal Seno
          constants.ISPEC_SPINDLE_USE: 12,
851 41044e04 Bernardo Dal Seno
          },
852 41044e04 Bernardo Dal Seno
        },
853 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX_DEFAULTS,
854 41044e04 Bernardo Dal Seno
      ],
855 0f511c8a Bernardo Dal Seno
    constants.ISPECS_STD: constants.IPOLICY_DEFAULTS[constants.ISPECS_STD],
856 5dd7d15b Bernardo Dal Seno
    }
857 5dd7d15b Bernardo Dal Seno
  _OLD_GROUP_POLICY = {
858 5dd7d15b Bernardo Dal Seno
    constants.IPOLICY_SPINDLE_RATIO: 2.5,
859 41044e04 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [{
860 da5f09ef Bernardo Dal Seno
      constants.ISPECS_MIN: {
861 0f511c8a Bernardo Dal Seno
        constants.ISPEC_MEM_SIZE: 128,
862 0f511c8a Bernardo Dal Seno
        constants.ISPEC_CPU_COUNT: 1,
863 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_COUNT: 1,
864 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_SIZE: 1024,
865 0f511c8a Bernardo Dal Seno
        constants.ISPEC_NIC_COUNT: 1,
866 0f511c8a Bernardo Dal Seno
        constants.ISPEC_SPINDLE_USE: 1,
867 0f511c8a Bernardo Dal Seno
        },
868 0f511c8a Bernardo Dal Seno
      constants.ISPECS_MAX: {
869 0f511c8a Bernardo Dal Seno
        constants.ISPEC_MEM_SIZE: 32768,
870 0f511c8a Bernardo Dal Seno
        constants.ISPEC_CPU_COUNT: 8,
871 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_COUNT: 5,
872 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_SIZE: 1024 * 1024,
873 0f511c8a Bernardo Dal Seno
        constants.ISPEC_NIC_COUNT: 3,
874 0f511c8a Bernardo Dal Seno
        constants.ISPEC_SPINDLE_USE: 12,
875 da5f09ef Bernardo Dal Seno
        },
876 41044e04 Bernardo Dal Seno
      }],
877 5dd7d15b Bernardo Dal Seno
    }
878 5dd7d15b Bernardo Dal Seno
879 5dd7d15b Bernardo Dal Seno
  def _TestSetSpecs(self, old_policy, isgroup):
880 41044e04 Bernardo Dal Seno
    diff_minmax = [{
881 0f511c8a Bernardo Dal Seno
      constants.ISPECS_MIN: {
882 0f511c8a Bernardo Dal Seno
        constants.ISPEC_MEM_SIZE: 64,
883 0f511c8a Bernardo Dal Seno
        constants.ISPEC_CPU_COUNT: 1,
884 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_COUNT: 2,
885 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_SIZE: 64,
886 0f511c8a Bernardo Dal Seno
        constants.ISPEC_NIC_COUNT: 1,
887 0f511c8a Bernardo Dal Seno
        constants.ISPEC_SPINDLE_USE: 1,
888 0f511c8a Bernardo Dal Seno
        },
889 0f511c8a Bernardo Dal Seno
      constants.ISPECS_MAX: {
890 0f511c8a Bernardo Dal Seno
        constants.ISPEC_MEM_SIZE: 16384,
891 0f511c8a Bernardo Dal Seno
        constants.ISPEC_CPU_COUNT: 10,
892 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_COUNT: 12,
893 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_SIZE: 1024,
894 0f511c8a Bernardo Dal Seno
        constants.ISPEC_NIC_COUNT: 9,
895 0f511c8a Bernardo Dal Seno
        constants.ISPEC_SPINDLE_USE: 18,
896 0f511c8a Bernardo Dal Seno
        },
897 41044e04 Bernardo Dal Seno
      }]
898 0f511c8a Bernardo Dal Seno
    diff_std = {
899 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_COUNT: 10,
900 0f511c8a Bernardo Dal Seno
        constants.ISPEC_DISK_SIZE: 512,
901 0f511c8a Bernardo Dal Seno
        }
902 5dd7d15b Bernardo Dal Seno
    diff_policy = {
903 0f511c8a Bernardo Dal Seno
      constants.ISPECS_MINMAX: diff_minmax
904 5dd7d15b Bernardo Dal Seno
      }
905 da5f09ef Bernardo Dal Seno
    if not isgroup:
906 da5f09ef Bernardo Dal Seno
      diff_policy[constants.ISPECS_STD] = diff_std
907 5eacbcae Thomas Thrainer
    new_policy = common.GetUpdatedIPolicy(old_policy, diff_policy,
908 5eacbcae Thomas Thrainer
                                          group_policy=isgroup)
909 da5f09ef Bernardo Dal Seno
910 da5f09ef Bernardo Dal Seno
    self.assertTrue(constants.ISPECS_MINMAX in new_policy)
911 0f511c8a Bernardo Dal Seno
    self.assertEqual(new_policy[constants.ISPECS_MINMAX], diff_minmax)
912 5dd7d15b Bernardo Dal Seno
    for key in old_policy:
913 5dd7d15b Bernardo Dal Seno
      if not key in diff_policy:
914 5dd7d15b Bernardo Dal Seno
        self.assertTrue(key in new_policy)
915 5dd7d15b Bernardo Dal Seno
        self.assertEqual(new_policy[key], old_policy[key])
916 da5f09ef Bernardo Dal Seno
917 da5f09ef Bernardo Dal Seno
    if not isgroup:
918 da5f09ef Bernardo Dal Seno
      new_std = new_policy[constants.ISPECS_STD]
919 da5f09ef Bernardo Dal Seno
      for key in diff_std:
920 da5f09ef Bernardo Dal Seno
        self.assertTrue(key in new_std)
921 da5f09ef Bernardo Dal Seno
        self.assertEqual(new_std[key], diff_std[key])
922 0f511c8a Bernardo Dal Seno
      old_std = old_policy.get(constants.ISPECS_STD, {})
923 0f511c8a Bernardo Dal Seno
      for key in old_std:
924 0f511c8a Bernardo Dal Seno
        self.assertTrue(key in new_std)
925 0f511c8a Bernardo Dal Seno
        if key not in diff_std:
926 0f511c8a Bernardo Dal Seno
          self.assertEqual(new_std[key], old_std[key])
927 da5f09ef Bernardo Dal Seno
928 0f511c8a Bernardo Dal Seno
  def _TestSet(self, old_policy, diff_policy, isgroup):
929 5eacbcae Thomas Thrainer
    new_policy = common.GetUpdatedIPolicy(old_policy, diff_policy,
930 5dd7d15b Bernardo Dal Seno
                                           group_policy=isgroup)
931 5dd7d15b Bernardo Dal Seno
    for key in diff_policy:
932 5dd7d15b Bernardo Dal Seno
      self.assertTrue(key in new_policy)
933 5dd7d15b Bernardo Dal Seno
      self.assertEqual(new_policy[key], diff_policy[key])
934 5dd7d15b Bernardo Dal Seno
    for key in old_policy:
935 5dd7d15b Bernardo Dal Seno
      if not key in diff_policy:
936 5dd7d15b Bernardo Dal Seno
        self.assertTrue(key in new_policy)
937 5dd7d15b Bernardo Dal Seno
        self.assertEqual(new_policy[key], old_policy[key])
938 5dd7d15b Bernardo Dal Seno
939 5dd7d15b Bernardo Dal Seno
  def testSet(self):
940 0f511c8a Bernardo Dal Seno
    diff_policy = {
941 0f511c8a Bernardo Dal Seno
      constants.IPOLICY_VCPU_RATIO: 3,
942 0f511c8a Bernardo Dal Seno
      constants.IPOLICY_DTS: [constants.DT_FILE],
943 0f511c8a Bernardo Dal Seno
      }
944 0f511c8a Bernardo Dal Seno
    self._TestSet(self._OLD_GROUP_POLICY, diff_policy, True)
945 5dd7d15b Bernardo Dal Seno
    self._TestSetSpecs(self._OLD_GROUP_POLICY, True)
946 0f511c8a Bernardo Dal Seno
    self._TestSet({}, diff_policy, True)
947 0f511c8a Bernardo Dal Seno
    self._TestSetSpecs({}, True)
948 0f511c8a Bernardo Dal Seno
    self._TestSet(self._OLD_CLUSTER_POLICY, diff_policy, False)
949 5dd7d15b Bernardo Dal Seno
    self._TestSetSpecs(self._OLD_CLUSTER_POLICY, False)
950 5dd7d15b Bernardo Dal Seno
951 5dd7d15b Bernardo Dal Seno
  def testUnset(self):
952 5dd7d15b Bernardo Dal Seno
    old_policy = self._OLD_GROUP_POLICY
953 5dd7d15b Bernardo Dal Seno
    diff_policy = {
954 5dd7d15b Bernardo Dal Seno
      constants.IPOLICY_SPINDLE_RATIO: constants.VALUE_DEFAULT,
955 5dd7d15b Bernardo Dal Seno
      }
956 5eacbcae Thomas Thrainer
    new_policy = common.GetUpdatedIPolicy(old_policy, diff_policy,
957 5eacbcae Thomas Thrainer
                                          group_policy=True)
958 5dd7d15b Bernardo Dal Seno
    for key in diff_policy:
959 5dd7d15b Bernardo Dal Seno
      self.assertFalse(key in new_policy)
960 5dd7d15b Bernardo Dal Seno
    for key in old_policy:
961 5dd7d15b Bernardo Dal Seno
      if not key in diff_policy:
962 5dd7d15b Bernardo Dal Seno
        self.assertTrue(key in new_policy)
963 5dd7d15b Bernardo Dal Seno
        self.assertEqual(new_policy[key], old_policy[key])
964 5dd7d15b Bernardo Dal Seno
965 5eacbcae Thomas Thrainer
    self.assertRaises(errors.OpPrereqError, common.GetUpdatedIPolicy,
966 0f511c8a Bernardo Dal Seno
                      old_policy, diff_policy, group_policy=False)
967 0f511c8a Bernardo Dal Seno
968 41044e04 Bernardo Dal Seno
  def testUnsetEmpty(self):
969 41044e04 Bernardo Dal Seno
    old_policy = {}
970 41044e04 Bernardo Dal Seno
    for key in constants.IPOLICY_ALL_KEYS:
971 41044e04 Bernardo Dal Seno
      diff_policy = {
972 41044e04 Bernardo Dal Seno
        key: constants.VALUE_DEFAULT,
973 41044e04 Bernardo Dal Seno
        }
974 5eacbcae Thomas Thrainer
    new_policy = common.GetUpdatedIPolicy(old_policy, diff_policy,
975 5eacbcae Thomas Thrainer
                                          group_policy=True)
976 41044e04 Bernardo Dal Seno
    self.assertEqual(new_policy, old_policy)
977 41044e04 Bernardo Dal Seno
978 5dd7d15b Bernardo Dal Seno
  def _TestInvalidKeys(self, old_policy, isgroup):
979 0f511c8a Bernardo Dal Seno
    INVALID_KEY = "this_key_shouldnt_be_allowed"
980 5dd7d15b Bernardo Dal Seno
    INVALID_DICT = {
981 0f511c8a Bernardo Dal Seno
      INVALID_KEY: 3,
982 5dd7d15b Bernardo Dal Seno
      }
983 5dd7d15b Bernardo Dal Seno
    invalid_policy = INVALID_DICT
984 5eacbcae Thomas Thrainer
    self.assertRaises(errors.OpPrereqError, common.GetUpdatedIPolicy,
985 5dd7d15b Bernardo Dal Seno
                      old_policy, invalid_policy, group_policy=isgroup)
986 da5f09ef Bernardo Dal Seno
    invalid_ispecs = {
987 41044e04 Bernardo Dal Seno
      constants.ISPECS_MINMAX: [INVALID_DICT],
988 da5f09ef Bernardo Dal Seno
      }
989 5eacbcae Thomas Thrainer
    self.assertRaises(errors.TypeEnforcementError, common.GetUpdatedIPolicy,
990 da5f09ef Bernardo Dal Seno
                      old_policy, invalid_ispecs, group_policy=isgroup)
991 0f511c8a Bernardo Dal Seno
    if isgroup:
992 0f511c8a Bernardo Dal Seno
      invalid_for_group = {
993 0f511c8a Bernardo Dal Seno
        constants.ISPECS_STD: constants.IPOLICY_DEFAULTS[constants.ISPECS_STD],
994 5dd7d15b Bernardo Dal Seno
        }
995 5eacbcae Thomas Thrainer
      self.assertRaises(errors.OpPrereqError, common.GetUpdatedIPolicy,
996 0f511c8a Bernardo Dal Seno
                        old_policy, invalid_for_group, group_policy=isgroup)
997 0f511c8a Bernardo Dal Seno
    good_ispecs = self._OLD_CLUSTER_POLICY[constants.ISPECS_MINMAX]
998 0f511c8a Bernardo Dal Seno
    invalid_ispecs = copy.deepcopy(good_ispecs)
999 0f511c8a Bernardo Dal Seno
    invalid_policy = {
1000 0f511c8a Bernardo Dal Seno
      constants.ISPECS_MINMAX: invalid_ispecs,
1001 0f511c8a Bernardo Dal Seno
      }
1002 41044e04 Bernardo Dal Seno
    for minmax in invalid_ispecs:
1003 41044e04 Bernardo Dal Seno
      for key in constants.ISPECS_MINMAX_KEYS:
1004 41044e04 Bernardo Dal Seno
        ispec = minmax[key]
1005 41044e04 Bernardo Dal Seno
        ispec[INVALID_KEY] = None
1006 0f511c8a Bernardo Dal Seno
        self.assertRaises(errors.TypeEnforcementError,
1007 5eacbcae Thomas Thrainer
                          common.GetUpdatedIPolicy, old_policy,
1008 41044e04 Bernardo Dal Seno
                          invalid_policy, group_policy=isgroup)
1009 41044e04 Bernardo Dal Seno
        del ispec[INVALID_KEY]
1010 41044e04 Bernardo Dal Seno
        for par in constants.ISPECS_PARAMETERS:
1011 41044e04 Bernardo Dal Seno
          oldv = ispec[par]
1012 41044e04 Bernardo Dal Seno
          ispec[par] = "this_is_not_good"
1013 41044e04 Bernardo Dal Seno
          self.assertRaises(errors.TypeEnforcementError,
1014 5eacbcae Thomas Thrainer
                            common.GetUpdatedIPolicy,
1015 41044e04 Bernardo Dal Seno
                            old_policy, invalid_policy, group_policy=isgroup)
1016 41044e04 Bernardo Dal Seno
          ispec[par] = oldv
1017 0f511c8a Bernardo Dal Seno
    # This is to make sure that no two errors were present during the tests
1018 5eacbcae Thomas Thrainer
    common.GetUpdatedIPolicy(old_policy, invalid_policy,
1019 5eacbcae Thomas Thrainer
                             group_policy=isgroup)
1020 5dd7d15b Bernardo Dal Seno
1021 5dd7d15b Bernardo Dal Seno
  def testInvalidKeys(self):
1022 5dd7d15b Bernardo Dal Seno
    self._TestInvalidKeys(self._OLD_GROUP_POLICY, True)
1023 5dd7d15b Bernardo Dal Seno
    self._TestInvalidKeys(self._OLD_CLUSTER_POLICY, False)
1024 5dd7d15b Bernardo Dal Seno
1025 0f511c8a Bernardo Dal Seno
  def testInvalidValues(self):
1026 0f511c8a Bernardo Dal Seno
    for par in (constants.IPOLICY_PARAMETERS |
1027 0f511c8a Bernardo Dal Seno
                frozenset([constants.IPOLICY_DTS])):
1028 0f511c8a Bernardo Dal Seno
      bad_policy = {
1029 0f511c8a Bernardo Dal Seno
        par: "invalid_value",
1030 0f511c8a Bernardo Dal Seno
        }
1031 5eacbcae Thomas Thrainer
      self.assertRaises(errors.OpPrereqError, common.GetUpdatedIPolicy, {},
1032 0f511c8a Bernardo Dal Seno
                        bad_policy, group_policy=True)
1033 5dd7d15b Bernardo Dal Seno
1034 66222813 Thomas Thrainer
1035 66222813 Thomas Thrainer
class TestCopyLockList(unittest.TestCase):
1036 66222813 Thomas Thrainer
  def test(self):
1037 66222813 Thomas Thrainer
    self.assertEqual(instance_utils.CopyLockList([]), [])
1038 66222813 Thomas Thrainer
    self.assertEqual(instance_utils.CopyLockList(None), None)
1039 66222813 Thomas Thrainer
    self.assertEqual(instance_utils.CopyLockList(locking.ALL_SET),
1040 66222813 Thomas Thrainer
                     locking.ALL_SET)
1041 66222813 Thomas Thrainer
1042 66222813 Thomas Thrainer
    names = ["foo", "bar"]
1043 66222813 Thomas Thrainer
    output = instance_utils.CopyLockList(names)
1044 66222813 Thomas Thrainer
    self.assertEqual(names, output)
1045 66222813 Thomas Thrainer
    self.assertNotEqual(id(names), id(output), msg="List was not copied")
1046 66222813 Thomas Thrainer
1047 66222813 Thomas Thrainer
1048 b98bf262 Michael Hanselmann
if __name__ == "__main__":
1049 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()