Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cmdlib_unittest.py @ 26d3fd2f

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