Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cmdlib_unittest.py @ 8572f1fe

History | View | Annotate | Download (7 kB)

1 6de7c41d Iustin Pop
#!/usr/bin/python
2 6de7c41d Iustin Pop
#
3 6de7c41d Iustin Pop
4 6de7c41d Iustin Pop
# Copyright (C) 2008 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 b98bf262 Michael Hanselmann
    self.assertEqual(errcode, cmdlib.LUVerifyCluster.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 b98bf262 Michael Hanselmann
    self.assertEqual(errcode, cmdlib.LUVerifyCluster.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 bd5f214b Apollon Oikonomopoulos
    class TestOpcode(opcodes.OpCode):
89 bd5f214b Apollon Oikonomopoulos
      OP_ID = "OP_TEST"
90 65e183af Michael Hanselmann
      OP_PARAMS = [
91 65e183af Michael Hanselmann
        ("iallocator", None, ht.NoType),
92 65e183af Michael Hanselmann
        ("node", None, ht.NoType),
93 65e183af Michael Hanselmann
        ]
94 bd5f214b Apollon Oikonomopoulos
95 bd5f214b Apollon Oikonomopoulos
    default_iallocator = mocks.FakeConfig().GetDefaultIAllocator()
96 bd5f214b Apollon Oikonomopoulos
    other_iallocator = default_iallocator + "_not"
97 bd5f214b Apollon Oikonomopoulos
98 bd5f214b Apollon Oikonomopoulos
    op = TestOpcode()
99 bd5f214b Apollon Oikonomopoulos
    lu = TestLU(op)
100 bd5f214b Apollon Oikonomopoulos
101 bd5f214b Apollon Oikonomopoulos
    c_i = lambda: cmdlib._CheckIAllocatorOrNode(lu, "iallocator", "node")
102 bd5f214b Apollon Oikonomopoulos
103 bd5f214b Apollon Oikonomopoulos
    # Neither node nor iallocator given
104 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
105 bd5f214b Apollon Oikonomopoulos
    op.node = None
106 bd5f214b Apollon Oikonomopoulos
    c_i()
107 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, default_iallocator)
108 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
109 bd5f214b Apollon Oikonomopoulos
110 bd5f214b Apollon Oikonomopoulos
    # Both, iallocator and node given
111 bd5f214b Apollon Oikonomopoulos
    op.iallocator = "test"
112 bd5f214b Apollon Oikonomopoulos
    op.node = "test"
113 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
114 bd5f214b Apollon Oikonomopoulos
115 bd5f214b Apollon Oikonomopoulos
    # Only iallocator given
116 bd5f214b Apollon Oikonomopoulos
    op.iallocator = other_iallocator
117 bd5f214b Apollon Oikonomopoulos
    op.node = None
118 bd5f214b Apollon Oikonomopoulos
    c_i()
119 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, other_iallocator)
120 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
121 bd5f214b Apollon Oikonomopoulos
122 bd5f214b Apollon Oikonomopoulos
    # Only node given
123 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
124 bd5f214b Apollon Oikonomopoulos
    op.node = "node"
125 bd5f214b Apollon Oikonomopoulos
    c_i()
126 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, None)
127 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, "node")
128 bd5f214b Apollon Oikonomopoulos
129 bd5f214b Apollon Oikonomopoulos
    # No node, iallocator or default iallocator
130 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
131 bd5f214b Apollon Oikonomopoulos
    op.node = None
132 bd5f214b Apollon Oikonomopoulos
    lu.cfg.GetDefaultIAllocator = lambda: None
133 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
134 bd5f214b Apollon Oikonomopoulos
135 bd5f214b Apollon Oikonomopoulos
136 e58f87a9 Michael Hanselmann
class TestLUTestJobqueue(unittest.TestCase):
137 e58f87a9 Michael Hanselmann
  def test(self):
138 e58f87a9 Michael Hanselmann
    self.assert_(cmdlib.LUTestJobqueue._CLIENT_CONNECT_TIMEOUT <
139 e58f87a9 Michael Hanselmann
                 (luxi.WFJC_TIMEOUT * 0.75),
140 e58f87a9 Michael Hanselmann
                 msg=("Client timeout too high, might not notice bugs"
141 e58f87a9 Michael Hanselmann
                      " in WaitForJobChange"))
142 e58f87a9 Michael Hanselmann
143 e58f87a9 Michael Hanselmann
144 83f72637 Michael Hanselmann
class TestLUQuery(unittest.TestCase):
145 83f72637 Michael Hanselmann
  def test(self):
146 83f72637 Michael Hanselmann
    self.assertEqual(sorted(cmdlib._QUERY_IMPL.keys()),
147 83f72637 Michael Hanselmann
                     sorted(constants.QR_OP_QUERY))
148 83f72637 Michael Hanselmann
149 83f72637 Michael Hanselmann
    assert constants.QR_NODE in constants.QR_OP_QUERY
150 83f72637 Michael Hanselmann
    assert constants.QR_INSTANCE in constants.QR_OP_QUERY
151 83f72637 Michael Hanselmann
152 83f72637 Michael Hanselmann
    for i in constants.QR_OP_QUERY:
153 83f72637 Michael Hanselmann
      self.assert_(cmdlib._GetQueryImplementation(i))
154 83f72637 Michael Hanselmann
155 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation, "")
156 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation,
157 83f72637 Michael Hanselmann
                      "xyz")
158 83f72637 Michael Hanselmann
159 83f72637 Michael Hanselmann
160 8ec505dd Adeodato Simo
class TestLUAssignGroupNodes(unittest.TestCase):
161 8ec505dd Adeodato Simo
162 8ec505dd Adeodato Simo
  def testCheckAssignmentForSplitInstances(self):
163 8ec505dd Adeodato Simo
    node_data = dict((name, objects.Node(name=name, group=group))
164 8ec505dd Adeodato Simo
                     for (name, group) in [("n1a", "g1"), ("n1b", "g1"),
165 8ec505dd Adeodato Simo
                                           ("n2a", "g2"), ("n2b", "g2"),
166 8ec505dd Adeodato Simo
                                           ("n3a", "g3"), ("n3b", "g3"),
167 8ec505dd Adeodato Simo
                                           ("n3c", "g3"),
168 8ec505dd Adeodato Simo
                                           ])
169 8ec505dd Adeodato Simo
170 8ec505dd Adeodato Simo
    def Instance(name, pnode, snode):
171 8ec505dd Adeodato Simo
      if snode is None:
172 8ec505dd Adeodato Simo
        disks = []
173 8ec505dd Adeodato Simo
        disk_template = constants.DT_DISKLESS
174 8ec505dd Adeodato Simo
      else:
175 8ec505dd Adeodato Simo
        disks = [objects.Disk(dev_type=constants.LD_DRBD8,
176 8ec505dd Adeodato Simo
                              logical_id=[pnode, snode, 1, 17, 17])]
177 8ec505dd Adeodato Simo
        disk_template = constants.DT_DRBD8
178 8ec505dd Adeodato Simo
179 8ec505dd Adeodato Simo
      return objects.Instance(name=name, primary_node=pnode, disks=disks,
180 8ec505dd Adeodato Simo
                              disk_template=disk_template)
181 8ec505dd Adeodato Simo
182 8ec505dd Adeodato Simo
    instance_data = dict((name, Instance(name, pnode, snode))
183 8ec505dd Adeodato Simo
                         for name, pnode, snode in [("inst1a", "n1a", "n1b"),
184 8ec505dd Adeodato Simo
                                                    ("inst1b", "n1b", "n1a"),
185 8ec505dd Adeodato Simo
                                                    ("inst2a", "n2a", "n2b"),
186 8ec505dd Adeodato Simo
                                                    ("inst3a", "n3a", None),
187 8ec505dd Adeodato Simo
                                                    ("inst3b", "n3b", "n1b"),
188 8ec505dd Adeodato Simo
                                                    ("inst3c", "n3b", "n2b"),
189 8ec505dd Adeodato Simo
                                                    ])
190 8ec505dd Adeodato Simo
191 8ec505dd Adeodato Simo
    # Test first with the existing state.
192 8ec505dd Adeodato Simo
    (new, prev) = \
193 8ec505dd Adeodato Simo
      cmdlib.LUAssignGroupNodes.CheckAssignmentForSplitInstances([],
194 8ec505dd Adeodato Simo
                                                                 node_data,
195 8ec505dd Adeodato Simo
                                                                 instance_data)
196 8ec505dd Adeodato Simo
197 8ec505dd Adeodato Simo
    self.assertEqual([], new)
198 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst3b", "inst3c"]), set(prev))
199 8ec505dd Adeodato Simo
200 8ec505dd Adeodato Simo
    # And now some changes.
201 8ec505dd Adeodato Simo
    (new, prev) = \
202 8ec505dd Adeodato Simo
      cmdlib.LUAssignGroupNodes.CheckAssignmentForSplitInstances([("n1b",
203 8ec505dd Adeodato Simo
                                                                   "g3")],
204 8ec505dd Adeodato Simo
                                                                 node_data,
205 8ec505dd Adeodato Simo
                                                                 instance_data)
206 8ec505dd Adeodato Simo
207 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst1a", "inst1b"]), set(new))
208 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst3c"]), set(prev))
209 8ec505dd Adeodato Simo
210 8ec505dd Adeodato Simo
211 b98bf262 Michael Hanselmann
if __name__ == "__main__":
212 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()