Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.cmdlib_unittest.py @ 6915fe26

History | View | Annotate | Download (13.4 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 64c7b383 Michael Hanselmann
import operator
31 6de7c41d Iustin Pop
32 83f72637 Michael Hanselmann
from ganeti import constants
33 b8812691 Iustin Pop
from ganeti import mcpu
34 6de7c41d Iustin Pop
from ganeti import cmdlib
35 b8812691 Iustin Pop
from ganeti import opcodes
36 6de7c41d Iustin Pop
from ganeti import errors
37 b8812691 Iustin Pop
from ganeti import utils
38 e58f87a9 Michael Hanselmann
from ganeti import luxi
39 65e183af Michael Hanselmann
from ganeti import ht
40 8ec505dd Adeodato Simo
from ganeti import objects
41 170b02b7 Michael Hanselmann
from ganeti import compat
42 170b02b7 Michael Hanselmann
from ganeti import rpc
43 6de7c41d Iustin Pop
44 25231ec5 Michael Hanselmann
import testutils
45 bd5f214b Apollon Oikonomopoulos
import mocks
46 25231ec5 Michael Hanselmann
47 6de7c41d Iustin Pop
48 b98bf262 Michael Hanselmann
class TestCertVerification(testutils.GanetiTestCase):
49 b98bf262 Michael Hanselmann
  def setUp(self):
50 b98bf262 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
51 b98bf262 Michael Hanselmann
52 b98bf262 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
53 b98bf262 Michael Hanselmann
54 b98bf262 Michael Hanselmann
  def tearDown(self):
55 b98bf262 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
56 b98bf262 Michael Hanselmann
57 b98bf262 Michael Hanselmann
  def testVerifyCertificate(self):
58 b98bf262 Michael Hanselmann
    cmdlib._VerifyCertificate(self._TestDataFilename("cert1.pem"))
59 b98bf262 Michael Hanselmann
60 b98bf262 Michael Hanselmann
    nonexist_filename = os.path.join(self.tmpdir, "does-not-exist")
61 b98bf262 Michael Hanselmann
62 b98bf262 Michael Hanselmann
    (errcode, msg) = cmdlib._VerifyCertificate(nonexist_filename)
63 bf93ae69 Adeodato Simo
    self.assertEqual(errcode, cmdlib.LUClusterVerifyConfig.ETYPE_ERROR)
64 b98bf262 Michael Hanselmann
65 b98bf262 Michael Hanselmann
    # Try to load non-certificate file
66 24d70417 Michael Hanselmann
    invalid_cert = self._TestDataFilename("bdev-net.txt")
67 b98bf262 Michael Hanselmann
    (errcode, msg) = cmdlib._VerifyCertificate(invalid_cert)
68 bf93ae69 Adeodato Simo
    self.assertEqual(errcode, cmdlib.LUClusterVerifyConfig.ETYPE_ERROR)
69 b98bf262 Michael Hanselmann
70 b98bf262 Michael Hanselmann
71 b8812691 Iustin Pop
class TestOpcodeParams(testutils.GanetiTestCase):
72 b8812691 Iustin Pop
  def testParamsStructures(self):
73 b8812691 Iustin Pop
    for op in sorted(mcpu.Processor.DISPATCH_TABLE):
74 b8812691 Iustin Pop
      lu = mcpu.Processor.DISPATCH_TABLE[op]
75 b8812691 Iustin Pop
      lu_name = lu.__name__
76 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_REQP"),
77 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_REQP" % lu_name))
78 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_DEFS"),
79 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_DEFS" % lu_name))
80 0bff0b12 Michael Hanselmann
      self.failIf(hasattr(lu, "_OP_PARAMS"),
81 0bff0b12 Michael Hanselmann
                  msg=("LU '%s' has old-style _OP_PARAMS" % lu_name))
82 b8812691 Iustin Pop
83 b8812691 Iustin Pop
84 bd5f214b Apollon Oikonomopoulos
class TestIAllocatorChecks(testutils.GanetiTestCase):
85 bd5f214b Apollon Oikonomopoulos
  def testFunction(self):
86 bd5f214b Apollon Oikonomopoulos
    class TestLU(object):
87 bd5f214b Apollon Oikonomopoulos
      def __init__(self, opcode):
88 bd5f214b Apollon Oikonomopoulos
        self.cfg = mocks.FakeConfig()
89 bd5f214b Apollon Oikonomopoulos
        self.op = opcode
90 bd5f214b Apollon Oikonomopoulos
91 ff0d18e6 Iustin Pop
    class OpTest(opcodes.OpCode):
92 ff0d18e6 Iustin Pop
       OP_PARAMS = [
93 197b323b Michael Hanselmann
        ("iallocator", None, ht.NoType, None),
94 197b323b Michael Hanselmann
        ("node", None, ht.NoType, None),
95 65e183af Michael Hanselmann
        ]
96 bd5f214b Apollon Oikonomopoulos
97 bd5f214b Apollon Oikonomopoulos
    default_iallocator = mocks.FakeConfig().GetDefaultIAllocator()
98 bd5f214b Apollon Oikonomopoulos
    other_iallocator = default_iallocator + "_not"
99 bd5f214b Apollon Oikonomopoulos
100 ff0d18e6 Iustin Pop
    op = OpTest()
101 bd5f214b Apollon Oikonomopoulos
    lu = TestLU(op)
102 bd5f214b Apollon Oikonomopoulos
103 bd5f214b Apollon Oikonomopoulos
    c_i = lambda: cmdlib._CheckIAllocatorOrNode(lu, "iallocator", "node")
104 bd5f214b Apollon Oikonomopoulos
105 bd5f214b Apollon Oikonomopoulos
    # Neither node nor iallocator given
106 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
107 bd5f214b Apollon Oikonomopoulos
    op.node = None
108 bd5f214b Apollon Oikonomopoulos
    c_i()
109 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, default_iallocator)
110 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
111 bd5f214b Apollon Oikonomopoulos
112 bd5f214b Apollon Oikonomopoulos
    # Both, iallocator and node given
113 bd5f214b Apollon Oikonomopoulos
    op.iallocator = "test"
114 bd5f214b Apollon Oikonomopoulos
    op.node = "test"
115 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
116 bd5f214b Apollon Oikonomopoulos
117 bd5f214b Apollon Oikonomopoulos
    # Only iallocator given
118 bd5f214b Apollon Oikonomopoulos
    op.iallocator = other_iallocator
119 bd5f214b Apollon Oikonomopoulos
    op.node = None
120 bd5f214b Apollon Oikonomopoulos
    c_i()
121 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, other_iallocator)
122 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, None)
123 bd5f214b Apollon Oikonomopoulos
124 bd5f214b Apollon Oikonomopoulos
    # Only node given
125 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
126 bd5f214b Apollon Oikonomopoulos
    op.node = "node"
127 bd5f214b Apollon Oikonomopoulos
    c_i()
128 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.iallocator, None)
129 bd5f214b Apollon Oikonomopoulos
    self.assertEqual(lu.op.node, "node")
130 bd5f214b Apollon Oikonomopoulos
131 bd5f214b Apollon Oikonomopoulos
    # No node, iallocator or default iallocator
132 bd5f214b Apollon Oikonomopoulos
    op.iallocator = None
133 bd5f214b Apollon Oikonomopoulos
    op.node = None
134 bd5f214b Apollon Oikonomopoulos
    lu.cfg.GetDefaultIAllocator = lambda: None
135 bd5f214b Apollon Oikonomopoulos
    self.assertRaises(errors.OpPrereqError, c_i)
136 bd5f214b Apollon Oikonomopoulos
137 bd5f214b Apollon Oikonomopoulos
138 b469eb4d Iustin Pop
class TestLUTestJqueue(unittest.TestCase):
139 e58f87a9 Michael Hanselmann
  def test(self):
140 b469eb4d Iustin Pop
    self.assert_(cmdlib.LUTestJqueue._CLIENT_CONNECT_TIMEOUT <
141 e58f87a9 Michael Hanselmann
                 (luxi.WFJC_TIMEOUT * 0.75),
142 e58f87a9 Michael Hanselmann
                 msg=("Client timeout too high, might not notice bugs"
143 e58f87a9 Michael Hanselmann
                      " in WaitForJobChange"))
144 e58f87a9 Michael Hanselmann
145 e58f87a9 Michael Hanselmann
146 83f72637 Michael Hanselmann
class TestLUQuery(unittest.TestCase):
147 83f72637 Michael Hanselmann
  def test(self):
148 83f72637 Michael Hanselmann
    self.assertEqual(sorted(cmdlib._QUERY_IMPL.keys()),
149 abd66bf8 Michael Hanselmann
                     sorted(constants.QR_VIA_OP))
150 83f72637 Michael Hanselmann
151 abd66bf8 Michael Hanselmann
    assert constants.QR_NODE in constants.QR_VIA_OP
152 abd66bf8 Michael Hanselmann
    assert constants.QR_INSTANCE in constants.QR_VIA_OP
153 83f72637 Michael Hanselmann
154 abd66bf8 Michael Hanselmann
    for i in constants.QR_VIA_OP:
155 83f72637 Michael Hanselmann
      self.assert_(cmdlib._GetQueryImplementation(i))
156 83f72637 Michael Hanselmann
157 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation, "")
158 83f72637 Michael Hanselmann
    self.assertRaises(errors.OpPrereqError, cmdlib._GetQueryImplementation,
159 83f72637 Michael Hanselmann
                      "xyz")
160 83f72637 Michael Hanselmann
161 83f72637 Michael Hanselmann
162 934704ae Iustin Pop
class TestLUGroupAssignNodes(unittest.TestCase):
163 8ec505dd Adeodato Simo
164 8ec505dd Adeodato Simo
  def testCheckAssignmentForSplitInstances(self):
165 8ec505dd Adeodato Simo
    node_data = dict((name, objects.Node(name=name, group=group))
166 8ec505dd Adeodato Simo
                     for (name, group) in [("n1a", "g1"), ("n1b", "g1"),
167 8ec505dd Adeodato Simo
                                           ("n2a", "g2"), ("n2b", "g2"),
168 8ec505dd Adeodato Simo
                                           ("n3a", "g3"), ("n3b", "g3"),
169 8ec505dd Adeodato Simo
                                           ("n3c", "g3"),
170 8ec505dd Adeodato Simo
                                           ])
171 8ec505dd Adeodato Simo
172 8ec505dd Adeodato Simo
    def Instance(name, pnode, snode):
173 8ec505dd Adeodato Simo
      if snode is None:
174 8ec505dd Adeodato Simo
        disks = []
175 8ec505dd Adeodato Simo
        disk_template = constants.DT_DISKLESS
176 8ec505dd Adeodato Simo
      else:
177 8ec505dd Adeodato Simo
        disks = [objects.Disk(dev_type=constants.LD_DRBD8,
178 8ec505dd Adeodato Simo
                              logical_id=[pnode, snode, 1, 17, 17])]
179 8ec505dd Adeodato Simo
        disk_template = constants.DT_DRBD8
180 8ec505dd Adeodato Simo
181 8ec505dd Adeodato Simo
      return objects.Instance(name=name, primary_node=pnode, disks=disks,
182 8ec505dd Adeodato Simo
                              disk_template=disk_template)
183 8ec505dd Adeodato Simo
184 8ec505dd Adeodato Simo
    instance_data = dict((name, Instance(name, pnode, snode))
185 8ec505dd Adeodato Simo
                         for name, pnode, snode in [("inst1a", "n1a", "n1b"),
186 8ec505dd Adeodato Simo
                                                    ("inst1b", "n1b", "n1a"),
187 8ec505dd Adeodato Simo
                                                    ("inst2a", "n2a", "n2b"),
188 8ec505dd Adeodato Simo
                                                    ("inst3a", "n3a", None),
189 8ec505dd Adeodato Simo
                                                    ("inst3b", "n3b", "n1b"),
190 8ec505dd Adeodato Simo
                                                    ("inst3c", "n3b", "n2b"),
191 8ec505dd Adeodato Simo
                                                    ])
192 8ec505dd Adeodato Simo
193 8ec505dd Adeodato Simo
    # Test first with the existing state.
194 8ec505dd Adeodato Simo
    (new, prev) = \
195 934704ae Iustin Pop
      cmdlib.LUGroupAssignNodes.CheckAssignmentForSplitInstances([],
196 8ec505dd Adeodato Simo
                                                                 node_data,
197 8ec505dd Adeodato Simo
                                                                 instance_data)
198 8ec505dd Adeodato Simo
199 8ec505dd Adeodato Simo
    self.assertEqual([], new)
200 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst3b", "inst3c"]), set(prev))
201 8ec505dd Adeodato Simo
202 8ec505dd Adeodato Simo
    # And now some changes.
203 8ec505dd Adeodato Simo
    (new, prev) = \
204 934704ae Iustin Pop
      cmdlib.LUGroupAssignNodes.CheckAssignmentForSplitInstances([("n1b",
205 8ec505dd Adeodato Simo
                                                                   "g3")],
206 8ec505dd Adeodato Simo
                                                                 node_data,
207 8ec505dd Adeodato Simo
                                                                 instance_data)
208 8ec505dd Adeodato Simo
209 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst1a", "inst1b"]), set(new))
210 8ec505dd Adeodato Simo
    self.assertEqual(set(["inst3c"]), set(prev))
211 8ec505dd Adeodato Simo
212 8ec505dd Adeodato Simo
213 64c7b383 Michael Hanselmann
class TestClusterVerifySsh(unittest.TestCase):
214 64c7b383 Michael Hanselmann
  def testMultipleGroups(self):
215 64c7b383 Michael Hanselmann
    fn = cmdlib.LUClusterVerifyGroup._SelectSshCheckNodes
216 64c7b383 Michael Hanselmann
    mygroupnodes = [
217 64c7b383 Michael Hanselmann
      objects.Node(name="node20", group="my", offline=False),
218 64c7b383 Michael Hanselmann
      objects.Node(name="node21", group="my", offline=False),
219 64c7b383 Michael Hanselmann
      objects.Node(name="node22", group="my", offline=False),
220 64c7b383 Michael Hanselmann
      objects.Node(name="node23", group="my", offline=False),
221 64c7b383 Michael Hanselmann
      objects.Node(name="node24", group="my", offline=False),
222 64c7b383 Michael Hanselmann
      objects.Node(name="node25", group="my", offline=False),
223 64c7b383 Michael Hanselmann
      objects.Node(name="node26", group="my", offline=True),
224 64c7b383 Michael Hanselmann
      ]
225 64c7b383 Michael Hanselmann
    nodes = [
226 64c7b383 Michael Hanselmann
      objects.Node(name="node1", group="g1", offline=True),
227 64c7b383 Michael Hanselmann
      objects.Node(name="node2", group="g1", offline=False),
228 64c7b383 Michael Hanselmann
      objects.Node(name="node3", group="g1", offline=False),
229 64c7b383 Michael Hanselmann
      objects.Node(name="node4", group="g1", offline=True),
230 64c7b383 Michael Hanselmann
      objects.Node(name="node5", group="g1", offline=False),
231 64c7b383 Michael Hanselmann
      objects.Node(name="node10", group="xyz", offline=False),
232 64c7b383 Michael Hanselmann
      objects.Node(name="node11", group="xyz", offline=False),
233 64c7b383 Michael Hanselmann
      objects.Node(name="node40", group="alloff", offline=True),
234 64c7b383 Michael Hanselmann
      objects.Node(name="node41", group="alloff", offline=True),
235 64c7b383 Michael Hanselmann
      objects.Node(name="node50", group="aaa", offline=False),
236 64c7b383 Michael Hanselmann
      ] + mygroupnodes
237 64c7b383 Michael Hanselmann
    assert not utils.FindDuplicates(map(operator.attrgetter("name"), nodes))
238 64c7b383 Michael Hanselmann
239 64c7b383 Michael Hanselmann
    (online, perhost) = fn(mygroupnodes, "my", nodes)
240 64c7b383 Michael Hanselmann
    self.assertEqual(online, ["node%s" % i for i in range(20, 26)])
241 64c7b383 Michael Hanselmann
    self.assertEqual(set(perhost.keys()), set(online))
242 64c7b383 Michael Hanselmann
243 64c7b383 Michael Hanselmann
    self.assertEqual(perhost, {
244 64c7b383 Michael Hanselmann
      "node20": ["node10", "node2", "node50"],
245 64c7b383 Michael Hanselmann
      "node21": ["node11", "node3", "node50"],
246 64c7b383 Michael Hanselmann
      "node22": ["node10", "node5", "node50"],
247 64c7b383 Michael Hanselmann
      "node23": ["node11", "node2", "node50"],
248 64c7b383 Michael Hanselmann
      "node24": ["node10", "node3", "node50"],
249 64c7b383 Michael Hanselmann
      "node25": ["node11", "node5", "node50"],
250 64c7b383 Michael Hanselmann
      })
251 64c7b383 Michael Hanselmann
252 64c7b383 Michael Hanselmann
  def testSingleGroup(self):
253 64c7b383 Michael Hanselmann
    fn = cmdlib.LUClusterVerifyGroup._SelectSshCheckNodes
254 64c7b383 Michael Hanselmann
    nodes = [
255 64c7b383 Michael Hanselmann
      objects.Node(name="node1", group="default", offline=True),
256 64c7b383 Michael Hanselmann
      objects.Node(name="node2", group="default", offline=False),
257 64c7b383 Michael Hanselmann
      objects.Node(name="node3", group="default", offline=False),
258 64c7b383 Michael Hanselmann
      objects.Node(name="node4", group="default", offline=True),
259 64c7b383 Michael Hanselmann
      ]
260 64c7b383 Michael Hanselmann
    assert not utils.FindDuplicates(map(operator.attrgetter("name"), nodes))
261 64c7b383 Michael Hanselmann
262 64c7b383 Michael Hanselmann
    (online, perhost) = fn(nodes, "default", nodes)
263 64c7b383 Michael Hanselmann
    self.assertEqual(online, ["node2", "node3"])
264 64c7b383 Michael Hanselmann
    self.assertEqual(set(perhost.keys()), set(online))
265 64c7b383 Michael Hanselmann
266 64c7b383 Michael Hanselmann
    self.assertEqual(perhost, {
267 64c7b383 Michael Hanselmann
      "node2": [],
268 64c7b383 Michael Hanselmann
      "node3": [],
269 64c7b383 Michael Hanselmann
      })
270 64c7b383 Michael Hanselmann
271 64c7b383 Michael Hanselmann
272 170b02b7 Michael Hanselmann
class TestClusterVerifyFiles(unittest.TestCase):
273 170b02b7 Michael Hanselmann
  @staticmethod
274 170b02b7 Michael Hanselmann
  def _FakeErrorIf(errors, cond, ecode, item, msg, *args, **kwargs):
275 eedf99b5 Andrea Spadaccini
    assert ((ecode == constants.CV_ENODEFILECHECK and
276 170b02b7 Michael Hanselmann
             ht.TNonEmptyString(item)) or
277 eedf99b5 Andrea Spadaccini
            (ecode == constants.CV_ECLUSTERFILECHECK and
278 170b02b7 Michael Hanselmann
             item is None))
279 170b02b7 Michael Hanselmann
280 170b02b7 Michael Hanselmann
    if args:
281 170b02b7 Michael Hanselmann
      msg = msg % args
282 170b02b7 Michael Hanselmann
283 170b02b7 Michael Hanselmann
    if cond:
284 170b02b7 Michael Hanselmann
      errors.append((item, msg))
285 170b02b7 Michael Hanselmann
286 170b02b7 Michael Hanselmann
  _VerifyFiles = cmdlib.LUClusterVerifyGroup._VerifyFiles
287 170b02b7 Michael Hanselmann
288 170b02b7 Michael Hanselmann
  def test(self):
289 170b02b7 Michael Hanselmann
    errors = []
290 170b02b7 Michael Hanselmann
    master_name = "master.example.com"
291 170b02b7 Michael Hanselmann
    nodeinfo = [
292 170b02b7 Michael Hanselmann
      objects.Node(name=master_name, offline=False),
293 170b02b7 Michael Hanselmann
      objects.Node(name="node2.example.com", offline=False),
294 170b02b7 Michael Hanselmann
      objects.Node(name="node3.example.com", master_candidate=True),
295 170b02b7 Michael Hanselmann
      objects.Node(name="node4.example.com", offline=False),
296 170b02b7 Michael Hanselmann
      objects.Node(name="nodata.example.com"),
297 170b02b7 Michael Hanselmann
      objects.Node(name="offline.example.com", offline=True),
298 170b02b7 Michael Hanselmann
      ]
299 170b02b7 Michael Hanselmann
    cluster = objects.Cluster(modify_etc_hosts=True,
300 170b02b7 Michael Hanselmann
                              enabled_hypervisors=[constants.HT_XEN_HVM])
301 170b02b7 Michael Hanselmann
    files_all = set([
302 170b02b7 Michael Hanselmann
      constants.CLUSTER_DOMAIN_SECRET_FILE,
303 170b02b7 Michael Hanselmann
      constants.RAPI_CERT_FILE,
304 170b02b7 Michael Hanselmann
      ])
305 170b02b7 Michael Hanselmann
    files_all_opt = set([
306 170b02b7 Michael Hanselmann
      constants.RAPI_USERS_FILE,
307 170b02b7 Michael Hanselmann
      ])
308 170b02b7 Michael Hanselmann
    files_mc = set([
309 170b02b7 Michael Hanselmann
      constants.CLUSTER_CONF_FILE,
310 170b02b7 Michael Hanselmann
      ])
311 170b02b7 Michael Hanselmann
    files_vm = set()
312 170b02b7 Michael Hanselmann
    nvinfo = {
313 170b02b7 Michael Hanselmann
      master_name: rpc.RpcResult(data=(True, {
314 170b02b7 Michael Hanselmann
        constants.NV_FILELIST: {
315 170b02b7 Michael Hanselmann
          constants.CLUSTER_CONF_FILE: "82314f897f38b35f9dab2f7c6b1593e0",
316 170b02b7 Michael Hanselmann
          constants.RAPI_CERT_FILE: "babbce8f387bc082228e544a2146fee4",
317 170b02b7 Michael Hanselmann
          constants.CLUSTER_DOMAIN_SECRET_FILE: "cds-47b5b3f19202936bb4",
318 170b02b7 Michael Hanselmann
        }})),
319 170b02b7 Michael Hanselmann
      "node2.example.com": rpc.RpcResult(data=(True, {
320 170b02b7 Michael Hanselmann
        constants.NV_FILELIST: {
321 170b02b7 Michael Hanselmann
          constants.RAPI_CERT_FILE: "97f0356500e866387f4b84233848cc4a",
322 170b02b7 Michael Hanselmann
          }
323 170b02b7 Michael Hanselmann
        })),
324 170b02b7 Michael Hanselmann
      "node3.example.com": rpc.RpcResult(data=(True, {
325 170b02b7 Michael Hanselmann
        constants.NV_FILELIST: {
326 170b02b7 Michael Hanselmann
          constants.RAPI_CERT_FILE: "97f0356500e866387f4b84233848cc4a",
327 170b02b7 Michael Hanselmann
          constants.CLUSTER_DOMAIN_SECRET_FILE: "cds-47b5b3f19202936bb4",
328 170b02b7 Michael Hanselmann
          }
329 170b02b7 Michael Hanselmann
        })),
330 170b02b7 Michael Hanselmann
      "node4.example.com": rpc.RpcResult(data=(True, {
331 170b02b7 Michael Hanselmann
        constants.NV_FILELIST: {
332 170b02b7 Michael Hanselmann
          constants.RAPI_CERT_FILE: "97f0356500e866387f4b84233848cc4a",
333 170b02b7 Michael Hanselmann
          constants.CLUSTER_CONF_FILE: "conf-a6d4b13e407867f7a7b4f0f232a8f527",
334 170b02b7 Michael Hanselmann
          constants.CLUSTER_DOMAIN_SECRET_FILE: "cds-47b5b3f19202936bb4",
335 170b02b7 Michael Hanselmann
          constants.RAPI_USERS_FILE: "rapiusers-ea3271e8d810ef3",
336 170b02b7 Michael Hanselmann
          }
337 170b02b7 Michael Hanselmann
        })),
338 170b02b7 Michael Hanselmann
      "nodata.example.com": rpc.RpcResult(data=(True, {})),
339 170b02b7 Michael Hanselmann
      "offline.example.com": rpc.RpcResult(offline=True),
340 170b02b7 Michael Hanselmann
      }
341 170b02b7 Michael Hanselmann
    assert set(nvinfo.keys()) == set(map(operator.attrgetter("name"), nodeinfo))
342 170b02b7 Michael Hanselmann
343 170b02b7 Michael Hanselmann
    self._VerifyFiles(compat.partial(self._FakeErrorIf, errors), nodeinfo,
344 170b02b7 Michael Hanselmann
                      master_name, nvinfo,
345 170b02b7 Michael Hanselmann
                      (files_all, files_all_opt, files_mc, files_vm))
346 170b02b7 Michael Hanselmann
    self.assertEqual(sorted(errors), sorted([
347 170b02b7 Michael Hanselmann
      (None, ("File %s found with 2 different checksums (variant 1 on"
348 170b02b7 Michael Hanselmann
              " node2.example.com, node3.example.com, node4.example.com;"
349 170b02b7 Michael Hanselmann
              " variant 2 on master.example.com)" % constants.RAPI_CERT_FILE)),
350 170b02b7 Michael Hanselmann
      (None, ("File %s is missing from node(s) node2.example.com" %
351 170b02b7 Michael Hanselmann
              constants.CLUSTER_DOMAIN_SECRET_FILE)),
352 170b02b7 Michael Hanselmann
      (None, ("File %s should not exist on node(s) node4.example.com" %
353 170b02b7 Michael Hanselmann
              constants.CLUSTER_CONF_FILE)),
354 170b02b7 Michael Hanselmann
      (None, ("File %s is missing from node(s) node3.example.com" %
355 170b02b7 Michael Hanselmann
              constants.CLUSTER_CONF_FILE)),
356 170b02b7 Michael Hanselmann
      (None, ("File %s found with 2 different checksums (variant 1 on"
357 170b02b7 Michael Hanselmann
              " master.example.com; variant 2 on node4.example.com)" %
358 170b02b7 Michael Hanselmann
              constants.CLUSTER_CONF_FILE)),
359 170b02b7 Michael Hanselmann
      (None, ("File %s is optional, but it must exist on all or no nodes (not"
360 170b02b7 Michael Hanselmann
              " found on master.example.com, node2.example.com,"
361 170b02b7 Michael Hanselmann
              " node3.example.com)" % constants.RAPI_USERS_FILE)),
362 170b02b7 Michael Hanselmann
      ("nodata.example.com", "Node did not return file checksum data"),
363 170b02b7 Michael Hanselmann
      ]))
364 170b02b7 Michael Hanselmann
365 170b02b7 Michael Hanselmann
366 b98bf262 Michael Hanselmann
if __name__ == "__main__":
367 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()