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() |