Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cmdlib_unittest.py @ abd66bf8

History | View | Annotate | Download (7 kB)

1 6de7c41d Iustin Pop
#!/usr/bin/python
2 6de7c41d Iustin Pop
#
3 6de7c41d Iustin Pop
4 ff0d18e6 Iustin Pop
# Copyright (C) 2008, 2011 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 6de7c41d Iustin Pop
# 0.0510-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 os
26 6de7c41d Iustin Pop
import unittest
27 6de7c41d Iustin Pop
import time
28 b98bf262 Michael Hanselmann
import tempfile
29 b98bf262 Michael Hanselmann
import shutil
30 6de7c41d Iustin Pop
31 83f72637 Michael Hanselmann
from ganeti import constants
32 b8812691 Iustin Pop
from ganeti import mcpu
33 6de7c41d Iustin Pop
from ganeti import cmdlib
34 b8812691 Iustin Pop
from ganeti import opcodes
35 6de7c41d Iustin Pop
from ganeti import errors
36 b8812691 Iustin Pop
from ganeti import utils
37 e58f87a9 Michael Hanselmann
from ganeti import luxi
38 65e183af Michael Hanselmann
from ganeti import ht
39 8ec505dd Adeodato Simo
from ganeti import objects
40 6de7c41d Iustin Pop
41 25231ec5 Michael Hanselmann
import testutils
42 bd5f214b Apollon Oikonomopoulos
import mocks
43 25231ec5 Michael Hanselmann
44 6de7c41d Iustin Pop
45 b98bf262 Michael Hanselmann
class TestCertVerification(testutils.GanetiTestCase):
46 b98bf262 Michael Hanselmann
  def setUp(self):
47 b98bf262 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
48 b98bf262 Michael Hanselmann
49 b98bf262 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
50 b98bf262 Michael Hanselmann
51 b98bf262 Michael Hanselmann
  def tearDown(self):
52 b98bf262 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
53 b98bf262 Michael Hanselmann
54 b98bf262 Michael Hanselmann
  def testVerifyCertificate(self):
55 b98bf262 Michael Hanselmann
    cmdlib._VerifyCertificate(self._TestDataFilename("cert1.pem"))
56 b98bf262 Michael Hanselmann
57 b98bf262 Michael Hanselmann
    nonexist_filename = os.path.join(self.tmpdir, "does-not-exist")
58 b98bf262 Michael Hanselmann
59 b98bf262 Michael Hanselmann
    (errcode, msg) = cmdlib._VerifyCertificate(nonexist_filename)
60 a3d32770 Iustin Pop
    self.assertEqual(errcode, cmdlib.LUClusterVerify.ETYPE_ERROR)
61 b98bf262 Michael Hanselmann
62 b98bf262 Michael Hanselmann
    # Try to load non-certificate file
63 24d70417 Michael Hanselmann
    invalid_cert = self._TestDataFilename("bdev-net.txt")
64 b98bf262 Michael Hanselmann
    (errcode, msg) = cmdlib._VerifyCertificate(invalid_cert)
65 a3d32770 Iustin Pop
    self.assertEqual(errcode, cmdlib.LUClusterVerify.ETYPE_ERROR)
66 b98bf262 Michael Hanselmann
67 b98bf262 Michael Hanselmann
68 b8812691 Iustin Pop
class TestOpcodeParams(testutils.GanetiTestCase):
69 b8812691 Iustin Pop
  def testParamsStructures(self):
70 b8812691 Iustin Pop
    for op in sorted(mcpu.Processor.DISPATCH_TABLE):
71 b8812691 Iustin Pop
      lu = mcpu.Processor.DISPATCH_TABLE[op]
72 b8812691 Iustin Pop
      lu_name = lu.__name__
73 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_REQP"),
74 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_REQP" % lu_name))
75 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_DEFS"),
76 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_DEFS" % lu_name))
77 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_PARAMS"),
78 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_PARAMS" % lu_name))
79 b8812691 Iustin Pop
80 b8812691 Iustin Pop
81 bd5f214b Apollon Oikonomopoulos
class TestIAllocatorChecks(testutils.GanetiTestCase):
82 bd5f214b Apollon Oikonomopoulos
  def testFunction(self):
83 bd5f214b Apollon Oikonomopoulos
    class TestLU(object):
84 bd5f214b Apollon Oikonomopoulos
      def __init__(self, opcode):
85 bd5f214b Apollon Oikonomopoulos
        self.cfg = mocks.FakeConfig()
86 bd5f214b Apollon Oikonomopoulos
        self.op = opcode
87 bd5f214b Apollon Oikonomopoulos
88 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
89 ff0d18e6 Iustin Pop
       OP_PARAMS = [
90 197b323b Michael Hanselmann
        ("iallocator", None, ht.NoType, None),
91 197b323b Michael Hanselmann
        ("node", None, ht.NoType, None),
92 65e183af Michael Hanselmann
        ]
93 bd5f214b Apollon Oikonomopoulos
94 bd5f214b Apollon Oikonomopoulos
    default_iallocator = mocks.FakeConfig().GetDefaultIAllocator()
95 bd5f214b Apollon Oikonomopoulos
    other_iallocator = default_iallocator + "_not"
96 bd5f214b Apollon Oikonomopoulos
97 ff0d18e6 Iustin Pop
    op = OpTest()
98 bd5f214b Apollon Oikonomopoulos
    lu = TestLU(op)
99 bd5f214b Apollon Oikonomopoulos
100 bd5f214b Apollon Oikonomopoulos
    c_i = lambda: cmdlib._CheckIAllocatorOrNode(lu, "iallocator", "node")
101 bd5f214b Apollon Oikonomopoulos
102 bd5f214b Apollon Oikonomopoulos
    # Neither node nor iallocator given
103 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
104 bd5f214b Apollon Oikonomopoulos
    op.node = None
105 bd5f214b Apollon Oikonomopoulos
    c_i()
106 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, default_iallocator)
107 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
108 bd5f214b Apollon Oikonomopoulos
109 bd5f214b Apollon Oikonomopoulos
    # Both, iallocator and node given
110 bd5f214b Apollon Oikonomopoulos
    op.iallocator = "test"
111 bd5f214b Apollon Oikonomopoulos
    op.node = "test"
112 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
113 bd5f214b Apollon Oikonomopoulos
114 bd5f214b Apollon Oikonomopoulos
    # Only iallocator given
115 bd5f214b Apollon Oikonomopoulos
    op.iallocator = other_iallocator
116 bd5f214b Apollon Oikonomopoulos
    op.node = None
117 bd5f214b Apollon Oikonomopoulos
    c_i()
118 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, other_iallocator)
119 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
120 bd5f214b Apollon Oikonomopoulos
121 bd5f214b Apollon Oikonomopoulos
    # Only node given
122 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
123 bd5f214b Apollon Oikonomopoulos
    op.node = "node"
124 bd5f214b Apollon Oikonomopoulos
    c_i()
125 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, None)
126 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, "node")
127 bd5f214b Apollon Oikonomopoulos
128 bd5f214b Apollon Oikonomopoulos
    # No node, iallocator or default iallocator
129 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
130 bd5f214b Apollon Oikonomopoulos
    op.node = None
131 bd5f214b Apollon Oikonomopoulos
    lu.cfg.GetDefaultIAllocator = lambda: None
132 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
133 bd5f214b Apollon Oikonomopoulos
134 bd5f214b Apollon Oikonomopoulos
135 b469eb4d Iustin Pop
class TestLUTestJqueue(unittest.TestCase):
136 e58f87a9 Michael Hanselmann
  def test(self):
137 b469eb4d Iustin Pop
    self.assert_(cmdlib.LUTestJqueue._CLIENT_CONNECT_TIMEOUT <
138 e58f87a9 Michael Hanselmann
                 (luxi.WFJC_TIMEOUT * 0.75),
139 e58f87a9 Michael Hanselmann
                 msg=("Client timeout too high, might not notice bugs"
140 e58f87a9 Michael Hanselmann
                      " in WaitForJobChange"))
141 e58f87a9 Michael Hanselmann
142 e58f87a9 Michael Hanselmann
143 83f72637 Michael Hanselmann
class TestLUQuery(unittest.TestCase):
144 83f72637 Michael Hanselmann
  def test(self):
145 83f72637 Michael Hanselmann
    self.assertEqual(sorted(cmdlib._QUERY_IMPL.keys()),
146 abd66bf8 Michael Hanselmann
                     sorted(constants.QR_VIA_OP))
147 83f72637 Michael Hanselmann
148 abd66bf8 Michael Hanselmann
    assert constants.QR_NODE in constants.QR_VIA_OP
149 abd66bf8 Michael Hanselmann
    assert constants.QR_INSTANCE in constants.QR_VIA_OP
150 83f72637 Michael Hanselmann
151 abd66bf8 Michael Hanselmann
    for i in constants.QR_VIA_OP:
152 83f72637 Michael Hanselmann
      self.assert_(cmdlib._GetQueryImplementation(i))
153 83f72637 Michael Hanselmann
154 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation, "")
155 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation,
156 83f72637 Michael Hanselmann
                      "xyz")
157 83f72637 Michael Hanselmann
158 83f72637 Michael Hanselmann
159 934704ae Iustin Pop
class TestLUGroupAssignNodes(unittest.TestCase):
160 8ec505dd Adeodato Simo
161 8ec505dd Adeodato Simo
  def testCheckAssignmentForSplitInstances(self):
162 8ec505dd Adeodato Simo
    node_data = dict((name, objects.Node(name=name, group=group))
163 8ec505dd Adeodato Simo
                     for (name, group) in [("n1a", "g1"), ("n1b", "g1"),
164 8ec505dd Adeodato Simo
                                           ("n2a", "g2"), ("n2b", "g2"),
165 8ec505dd Adeodato Simo
                                           ("n3a", "g3"), ("n3b", "g3"),
166 8ec505dd Adeodato Simo
                                           ("n3c", "g3"),
167 8ec505dd Adeodato Simo
                                           ])
168 8ec505dd Adeodato Simo
169 8ec505dd Adeodato Simo
    def Instance(name, pnode, snode):
170 8ec505dd Adeodato Simo
      if snode is None:
171 8ec505dd Adeodato Simo
        disks = []
172 8ec505dd Adeodato Simo
        disk_template = constants.DT_DISKLESS
173 8ec505dd Adeodato Simo
      else:
174 8ec505dd Adeodato Simo
        disks = [objects.Disk(dev_type=constants.LD_DRBD8,
175 8ec505dd Adeodato Simo
                              logical_id=[pnode, snode, 1, 17, 17])]
176 8ec505dd Adeodato Simo
        disk_template = constants.DT_DRBD8
177 8ec505dd Adeodato Simo
178 8ec505dd Adeodato Simo
      return objects.Instance(name=name, primary_node=pnode, disks=disks,
179 8ec505dd Adeodato Simo
                              disk_template=disk_template)
180 8ec505dd Adeodato Simo
181 8ec505dd Adeodato Simo
    instance_data = dict((name, Instance(name, pnode, snode))
182 8ec505dd Adeodato Simo
                         for name, pnode, snode in [("inst1a", "n1a", "n1b"),
183 8ec505dd Adeodato Simo
                                                    ("inst1b", "n1b", "n1a"),
184 8ec505dd Adeodato Simo
                                                    ("inst2a", "n2a", "n2b"),
185 8ec505dd Adeodato Simo
                                                    ("inst3a", "n3a", None),
186 8ec505dd Adeodato Simo
                                                    ("inst3b", "n3b", "n1b"),
187 8ec505dd Adeodato Simo
                                                    ("inst3c", "n3b", "n2b"),
188 8ec505dd Adeodato Simo
                                                    ])
189 8ec505dd Adeodato Simo
190 8ec505dd Adeodato Simo
    # Test first with the existing state.
191 8ec505dd Adeodato Simo
    (new, prev) = \
192 934704ae Iustin Pop
      cmdlib.LUGroupAssignNodes.CheckAssignmentForSplitInstances([],
193 8ec505dd Adeodato Simo
                                                                 node_data,
194 8ec505dd Adeodato Simo
                                                                 instance_data)
195 8ec505dd Adeodato Simo
196 8ec505dd Adeodato Simo
    self.assertEqual([], new)
197 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst3b", "inst3c"]), set(prev))
198 8ec505dd Adeodato Simo
199 8ec505dd Adeodato Simo
    # And now some changes.
200 8ec505dd Adeodato Simo
    (new, prev) = \
201 934704ae Iustin Pop
      cmdlib.LUGroupAssignNodes.CheckAssignmentForSplitInstances([("n1b",
202 8ec505dd Adeodato Simo
                                                                   "g3")],
203 8ec505dd Adeodato Simo
                                                                 node_data,
204 8ec505dd Adeodato Simo
                                                                 instance_data)
205 8ec505dd Adeodato Simo
206 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst1a", "inst1b"]), set(new))
207 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst3c"]), set(prev))
208 8ec505dd Adeodato Simo
209 8ec505dd Adeodato Simo
210 b98bf262 Michael Hanselmann
if __name__ == "__main__":
211 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()