Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cmdlib_unittest.py @ 819ca990

History | View | Annotate | Download (5.6 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 6de7c41d Iustin Pop
39 25231ec5 Michael Hanselmann
import testutils
40 bd5f214b Apollon Oikonomopoulos
import mocks
41 25231ec5 Michael Hanselmann
42 6de7c41d Iustin Pop
43 b98bf262 Michael Hanselmann
class TestCertVerification(testutils.GanetiTestCase):
44 b98bf262 Michael Hanselmann
  def setUp(self):
45 b98bf262 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
46 b98bf262 Michael Hanselmann
47 b98bf262 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
48 b98bf262 Michael Hanselmann
49 b98bf262 Michael Hanselmann
  def tearDown(self):
50 b98bf262 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
51 b98bf262 Michael Hanselmann
52 b98bf262 Michael Hanselmann
  def testVerifyCertificate(self):
53 b98bf262 Michael Hanselmann
    cmdlib._VerifyCertificate(self._TestDataFilename("cert1.pem"))
54 b98bf262 Michael Hanselmann
55 b98bf262 Michael Hanselmann
    nonexist_filename = os.path.join(self.tmpdir, "does-not-exist")
56 b98bf262 Michael Hanselmann
57 b98bf262 Michael Hanselmann
    (errcode, msg) = cmdlib._VerifyCertificate(nonexist_filename)
58 b98bf262 Michael Hanselmann
    self.assertEqual(errcode, cmdlib.LUVerifyCluster.ETYPE_ERROR)
59 b98bf262 Michael Hanselmann
60 b98bf262 Michael Hanselmann
    # Try to load non-certificate file
61 24d70417 Michael Hanselmann
    invalid_cert = self._TestDataFilename("bdev-net.txt")
62 b98bf262 Michael Hanselmann
    (errcode, msg) = cmdlib._VerifyCertificate(invalid_cert)
63 b98bf262 Michael Hanselmann
    self.assertEqual(errcode, cmdlib.LUVerifyCluster.ETYPE_ERROR)
64 b98bf262 Michael Hanselmann
65 b98bf262 Michael Hanselmann
66 b8812691 Iustin Pop
class TestOpcodeParams(testutils.GanetiTestCase):
67 b8812691 Iustin Pop
  def testParamsStructures(self):
68 b8812691 Iustin Pop
    for op in sorted(mcpu.Processor.DISPATCH_TABLE):
69 b8812691 Iustin Pop
      lu = mcpu.Processor.DISPATCH_TABLE[op]
70 b8812691 Iustin Pop
      lu_name = lu.__name__
71 b8812691 Iustin Pop
      self.failIf(hasattr(lu, "_OP_REQP"), "LU '%s' has old-style _OP_REQP" %
72 b8812691 Iustin Pop
                  lu_name)
73 b8812691 Iustin Pop
      self.failIf(hasattr(lu, "_OP_DEFS"), "LU '%s' has old-style _OP_DEFS" %
74 b8812691 Iustin Pop
                  lu_name)
75 b8812691 Iustin Pop
      # this needs to remain a list!
76 b8812691 Iustin Pop
      defined_params = [v[0] for v in lu._OP_PARAMS]
77 b8812691 Iustin Pop
      for row in lu._OP_PARAMS:
78 b8812691 Iustin Pop
        # this relies on there being at least one element
79 b8812691 Iustin Pop
        param_name = row[0]
80 b8812691 Iustin Pop
        self.failIf(len(row) != 3, "LU '%s' parameter %s has invalid length" %
81 b8812691 Iustin Pop
                    (lu_name, param_name))
82 b8812691 Iustin Pop
        self.failIf(defined_params.count(param_name) > 1, "LU '%s' parameter"
83 b8812691 Iustin Pop
                    " '%s' is defined multiple times" % (lu_name, param_name))
84 b8812691 Iustin Pop
85 b8812691 Iustin Pop
  def testParamsDefined(self):
86 b8812691 Iustin Pop
    for op in sorted(mcpu.Processor.DISPATCH_TABLE):
87 b8812691 Iustin Pop
      lu = mcpu.Processor.DISPATCH_TABLE[op]
88 b8812691 Iustin Pop
      lu_name = lu.__name__
89 b8812691 Iustin Pop
      # TODO: this doesn't deal with recursive slots definitions
90 b8812691 Iustin Pop
      all_params = set(op.__slots__)
91 b8812691 Iustin Pop
      defined_params = set(v[0] for v in lu._OP_PARAMS)
92 b8812691 Iustin Pop
      missing = all_params.difference(defined_params)
93 b8812691 Iustin Pop
      self.failIf(missing, "Undeclared parameter types for LU '%s': %s" %
94 b8812691 Iustin Pop
                  (lu_name, utils.CommaJoin(missing)))
95 b8812691 Iustin Pop
      extra = defined_params.difference(all_params)
96 b8812691 Iustin Pop
      self.failIf(extra, "Extra parameter types for LU '%s': %s" %
97 b8812691 Iustin Pop
                  (lu_name, utils.CommaJoin(extra)))
98 b8812691 Iustin Pop
99 b8812691 Iustin Pop
100 bd5f214b Apollon Oikonomopoulos
class TestIAllocatorChecks(testutils.GanetiTestCase):
101 bd5f214b Apollon Oikonomopoulos
  def testFunction(self):
102 bd5f214b Apollon Oikonomopoulos
    class TestLU(object):
103 bd5f214b Apollon Oikonomopoulos
      def __init__(self, opcode):
104 bd5f214b Apollon Oikonomopoulos
        self.cfg = mocks.FakeConfig()
105 bd5f214b Apollon Oikonomopoulos
        self.op = opcode
106 bd5f214b Apollon Oikonomopoulos
107 bd5f214b Apollon Oikonomopoulos
    class TestOpcode(opcodes.OpCode):
108 bd5f214b Apollon Oikonomopoulos
      OP_ID = "OP_TEST"
109 bd5f214b Apollon Oikonomopoulos
      __slots__ = ["iallocator", "node"]
110 bd5f214b Apollon Oikonomopoulos
111 bd5f214b Apollon Oikonomopoulos
    default_iallocator = mocks.FakeConfig().GetDefaultIAllocator()
112 bd5f214b Apollon Oikonomopoulos
    other_iallocator = default_iallocator + "_not"
113 bd5f214b Apollon Oikonomopoulos
114 bd5f214b Apollon Oikonomopoulos
    op = TestOpcode()
115 bd5f214b Apollon Oikonomopoulos
    lu = TestLU(op)
116 bd5f214b Apollon Oikonomopoulos
117 bd5f214b Apollon Oikonomopoulos
    c_i = lambda: cmdlib._CheckIAllocatorOrNode(lu, "iallocator", "node")
118 bd5f214b Apollon Oikonomopoulos
119 bd5f214b Apollon Oikonomopoulos
    # Neither node nor iallocator given
120 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
121 bd5f214b Apollon Oikonomopoulos
    op.node = None
122 bd5f214b Apollon Oikonomopoulos
    c_i()
123 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, default_iallocator)
124 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
125 bd5f214b Apollon Oikonomopoulos
126 bd5f214b Apollon Oikonomopoulos
    # Both, iallocator and node given
127 bd5f214b Apollon Oikonomopoulos
    op.iallocator = "test"
128 bd5f214b Apollon Oikonomopoulos
    op.node = "test"
129 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
130 bd5f214b Apollon Oikonomopoulos
131 bd5f214b Apollon Oikonomopoulos
    # Only iallocator given
132 bd5f214b Apollon Oikonomopoulos
    op.iallocator = other_iallocator
133 bd5f214b Apollon Oikonomopoulos
    op.node = None
134 bd5f214b Apollon Oikonomopoulos
    c_i()
135 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, other_iallocator)
136 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
137 bd5f214b Apollon Oikonomopoulos
138 bd5f214b Apollon Oikonomopoulos
    # Only node given
139 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
140 bd5f214b Apollon Oikonomopoulos
    op.node = "node"
141 bd5f214b Apollon Oikonomopoulos
    c_i()
142 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, None)
143 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, "node")
144 bd5f214b Apollon Oikonomopoulos
145 bd5f214b Apollon Oikonomopoulos
    # No node, iallocator or default iallocator
146 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
147 bd5f214b Apollon Oikonomopoulos
    op.node = None
148 bd5f214b Apollon Oikonomopoulos
    lu.cfg.GetDefaultIAllocator = lambda: None
149 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
150 bd5f214b Apollon Oikonomopoulos
151 bd5f214b Apollon Oikonomopoulos
152 e58f87a9 Michael Hanselmann
class TestLUTestJobqueue(unittest.TestCase):
153 e58f87a9 Michael Hanselmann
  def test(self):
154 e58f87a9 Michael Hanselmann
    self.assert_(cmdlib.LUTestJobqueue._CLIENT_CONNECT_TIMEOUT <
155 e58f87a9 Michael Hanselmann
                 (luxi.WFJC_TIMEOUT * 0.75),
156 e58f87a9 Michael Hanselmann
                 msg=("Client timeout too high, might not notice bugs"
157 e58f87a9 Michael Hanselmann
                      " in WaitForJobChange"))
158 e58f87a9 Michael Hanselmann
159 e58f87a9 Michael Hanselmann
160 83f72637 Michael Hanselmann
class TestLUQuery(unittest.TestCase):
161 83f72637 Michael Hanselmann
  def test(self):
162 83f72637 Michael Hanselmann
    self.assertEqual(sorted(cmdlib._QUERY_IMPL.keys()),
163 83f72637 Michael Hanselmann
                     sorted(constants.QR_OP_QUERY))
164 83f72637 Michael Hanselmann
165 83f72637 Michael Hanselmann
    assert constants.QR_NODE in constants.QR_OP_QUERY
166 83f72637 Michael Hanselmann
    assert constants.QR_INSTANCE in constants.QR_OP_QUERY
167 83f72637 Michael Hanselmann
168 83f72637 Michael Hanselmann
    for i in constants.QR_OP_QUERY:
169 83f72637 Michael Hanselmann
      self.assert_(cmdlib._GetQueryImplementation(i))
170 83f72637 Michael Hanselmann
171 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation, "")
172 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation,
173 83f72637 Michael Hanselmann
                      "xyz")
174 83f72637 Michael Hanselmann
175 83f72637 Michael Hanselmann
176 b98bf262 Michael Hanselmann
if __name__ == "__main__":
177 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()