Statistics
| Branch: | Tag: | Revision:

root / test / py / qa.qa_config_unittest.py @ 47aa6ec9

History | View | Annotate | Download (9.8 kB)

1 a0c3e726 Michael Hanselmann
#!/usr/bin/python
2 a0c3e726 Michael Hanselmann
#
3 a0c3e726 Michael Hanselmann
4 8a96c5a6 Michael Hanselmann
# Copyright (C) 2012, 2013 Google Inc.
5 a0c3e726 Michael Hanselmann
#
6 a0c3e726 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 a0c3e726 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 a0c3e726 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 a0c3e726 Michael Hanselmann
# (at your option) any later version.
10 a0c3e726 Michael Hanselmann
#
11 a0c3e726 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 a0c3e726 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a0c3e726 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a0c3e726 Michael Hanselmann
# General Public License for more details.
15 a0c3e726 Michael Hanselmann
#
16 a0c3e726 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 a0c3e726 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 a0c3e726 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a0c3e726 Michael Hanselmann
# 02110-1301, USA.
20 a0c3e726 Michael Hanselmann
21 a0c3e726 Michael Hanselmann
22 a0c3e726 Michael Hanselmann
"""Script for testing qa.qa_config"""
23 a0c3e726 Michael Hanselmann
24 a0c3e726 Michael Hanselmann
import unittest
25 8a96c5a6 Michael Hanselmann
import tempfile
26 8a96c5a6 Michael Hanselmann
import shutil
27 8a96c5a6 Michael Hanselmann
import os
28 6a654276 Michael Hanselmann
import operator
29 8a96c5a6 Michael Hanselmann
30 8a96c5a6 Michael Hanselmann
from ganeti import utils
31 8a96c5a6 Michael Hanselmann
from ganeti import serializer
32 8a96c5a6 Michael Hanselmann
from ganeti import constants
33 8a96c5a6 Michael Hanselmann
from ganeti import compat
34 a0c3e726 Michael Hanselmann
35 a0c3e726 Michael Hanselmann
from qa import qa_config
36 8a96c5a6 Michael Hanselmann
from qa import qa_error
37 a0c3e726 Michael Hanselmann
38 a0c3e726 Michael Hanselmann
import testutils
39 a0c3e726 Michael Hanselmann
40 a0c3e726 Michael Hanselmann
41 a0c3e726 Michael Hanselmann
class TestTestEnabled(unittest.TestCase):
42 a0c3e726 Michael Hanselmann
  def testSimple(self):
43 a0c3e726 Michael Hanselmann
    for name in ["test", ["foobar"], ["a", "b"]]:
44 a0c3e726 Michael Hanselmann
      self.assertTrue(qa_config.TestEnabled(name, _cfg={}))
45 a0c3e726 Michael Hanselmann
46 a0c3e726 Michael Hanselmann
    for default in [False, True]:
47 a0c3e726 Michael Hanselmann
      self.assertFalse(qa_config.TestEnabled("foo", _cfg={
48 a0c3e726 Michael Hanselmann
        "tests": {
49 a0c3e726 Michael Hanselmann
          "default": default,
50 a0c3e726 Michael Hanselmann
          "foo": False,
51 a0c3e726 Michael Hanselmann
          },
52 a0c3e726 Michael Hanselmann
        }))
53 a0c3e726 Michael Hanselmann
54 a0c3e726 Michael Hanselmann
      self.assertTrue(qa_config.TestEnabled("bar", _cfg={
55 a0c3e726 Michael Hanselmann
        "tests": {
56 a0c3e726 Michael Hanselmann
          "default": default,
57 a0c3e726 Michael Hanselmann
          "bar": True,
58 a0c3e726 Michael Hanselmann
          },
59 a0c3e726 Michael Hanselmann
        }))
60 a0c3e726 Michael Hanselmann
61 a0c3e726 Michael Hanselmann
  def testEitherWithDefault(self):
62 a0c3e726 Michael Hanselmann
    names = qa_config.Either("one")
63 a0c3e726 Michael Hanselmann
64 a0c3e726 Michael Hanselmann
    self.assertTrue(qa_config.TestEnabled(names, _cfg={
65 a0c3e726 Michael Hanselmann
      "tests": {
66 a0c3e726 Michael Hanselmann
        "default": True,
67 a0c3e726 Michael Hanselmann
        },
68 a0c3e726 Michael Hanselmann
      }))
69 a0c3e726 Michael Hanselmann
70 a0c3e726 Michael Hanselmann
    self.assertFalse(qa_config.TestEnabled(names, _cfg={
71 a0c3e726 Michael Hanselmann
      "tests": {
72 a0c3e726 Michael Hanselmann
        "default": False,
73 a0c3e726 Michael Hanselmann
        },
74 a0c3e726 Michael Hanselmann
      }))
75 a0c3e726 Michael Hanselmann
76 a0c3e726 Michael Hanselmann
  def testEither(self):
77 a0c3e726 Michael Hanselmann
    names = [qa_config.Either(["one", "two"]),
78 a0c3e726 Michael Hanselmann
             qa_config.Either("foo"),
79 a0c3e726 Michael Hanselmann
             "hello",
80 a0c3e726 Michael Hanselmann
             ["bar", "baz"]]
81 a0c3e726 Michael Hanselmann
82 a0c3e726 Michael Hanselmann
    self.assertTrue(qa_config.TestEnabled(names, _cfg={
83 a0c3e726 Michael Hanselmann
      "tests": {
84 a0c3e726 Michael Hanselmann
        "default": True,
85 a0c3e726 Michael Hanselmann
        },
86 a0c3e726 Michael Hanselmann
      }))
87 a0c3e726 Michael Hanselmann
88 a0c3e726 Michael Hanselmann
    self.assertFalse(qa_config.TestEnabled(names, _cfg={
89 a0c3e726 Michael Hanselmann
      "tests": {
90 a0c3e726 Michael Hanselmann
        "default": False,
91 a0c3e726 Michael Hanselmann
        },
92 a0c3e726 Michael Hanselmann
      }))
93 a0c3e726 Michael Hanselmann
94 a0c3e726 Michael Hanselmann
    for name in ["foo", "bar", "baz", "hello"]:
95 a0c3e726 Michael Hanselmann
      self.assertFalse(qa_config.TestEnabled(names, _cfg={
96 a0c3e726 Michael Hanselmann
        "tests": {
97 a0c3e726 Michael Hanselmann
          "default": True,
98 a0c3e726 Michael Hanselmann
          name: False,
99 a0c3e726 Michael Hanselmann
          },
100 a0c3e726 Michael Hanselmann
        }))
101 a0c3e726 Michael Hanselmann
102 a0c3e726 Michael Hanselmann
    self.assertFalse(qa_config.TestEnabled(names, _cfg={
103 a0c3e726 Michael Hanselmann
      "tests": {
104 a0c3e726 Michael Hanselmann
        "default": True,
105 a0c3e726 Michael Hanselmann
        "one": False,
106 a0c3e726 Michael Hanselmann
        "two": False,
107 a0c3e726 Michael Hanselmann
        },
108 a0c3e726 Michael Hanselmann
      }))
109 a0c3e726 Michael Hanselmann
110 a0c3e726 Michael Hanselmann
    self.assertTrue(qa_config.TestEnabled(names, _cfg={
111 a0c3e726 Michael Hanselmann
      "tests": {
112 a0c3e726 Michael Hanselmann
        "default": True,
113 a0c3e726 Michael Hanselmann
        "one": False,
114 a0c3e726 Michael Hanselmann
        "two": True,
115 a0c3e726 Michael Hanselmann
        },
116 a0c3e726 Michael Hanselmann
      }))
117 a0c3e726 Michael Hanselmann
118 a0c3e726 Michael Hanselmann
    self.assertFalse(qa_config.TestEnabled(names, _cfg={
119 a0c3e726 Michael Hanselmann
      "tests": {
120 a0c3e726 Michael Hanselmann
        "default": True,
121 a0c3e726 Michael Hanselmann
        "one": True,
122 a0c3e726 Michael Hanselmann
        "two": True,
123 a0c3e726 Michael Hanselmann
        "foo": False,
124 a0c3e726 Michael Hanselmann
        },
125 a0c3e726 Michael Hanselmann
      }))
126 a0c3e726 Michael Hanselmann
127 a0c3e726 Michael Hanselmann
  def testEitherNestedWithAnd(self):
128 a0c3e726 Michael Hanselmann
    names = qa_config.Either([["one", "two"], "foo"])
129 a0c3e726 Michael Hanselmann
130 a0c3e726 Michael Hanselmann
    self.assertTrue(qa_config.TestEnabled(names, _cfg={
131 a0c3e726 Michael Hanselmann
      "tests": {
132 a0c3e726 Michael Hanselmann
        "default": True,
133 a0c3e726 Michael Hanselmann
        },
134 a0c3e726 Michael Hanselmann
      }))
135 a0c3e726 Michael Hanselmann
136 a0c3e726 Michael Hanselmann
    for name in ["one", "two"]:
137 a0c3e726 Michael Hanselmann
      self.assertFalse(qa_config.TestEnabled(names, _cfg={
138 a0c3e726 Michael Hanselmann
        "tests": {
139 a0c3e726 Michael Hanselmann
          "default": True,
140 a0c3e726 Michael Hanselmann
          "foo": False,
141 a0c3e726 Michael Hanselmann
          name: False,
142 a0c3e726 Michael Hanselmann
          },
143 a0c3e726 Michael Hanselmann
        }))
144 a0c3e726 Michael Hanselmann
145 a0c3e726 Michael Hanselmann
146 8a96c5a6 Michael Hanselmann
class TestQaConfigLoad(unittest.TestCase):
147 8a96c5a6 Michael Hanselmann
  def setUp(self):
148 8a96c5a6 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
149 8a96c5a6 Michael Hanselmann
150 8a96c5a6 Michael Hanselmann
  def tearDown(self):
151 8a96c5a6 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
152 8a96c5a6 Michael Hanselmann
153 8a96c5a6 Michael Hanselmann
  def testLoadNonExistent(self):
154 8a96c5a6 Michael Hanselmann
    filename = utils.PathJoin(self.tmpdir, "does.not.exist")
155 8a96c5a6 Michael Hanselmann
    self.assertRaises(EnvironmentError, qa_config._QaConfig.Load, filename)
156 8a96c5a6 Michael Hanselmann
157 8a96c5a6 Michael Hanselmann
  @staticmethod
158 8a96c5a6 Michael Hanselmann
  def _WriteConfig(filename, data):
159 8a96c5a6 Michael Hanselmann
    utils.WriteFile(filename, data=serializer.DumpJson(data))
160 8a96c5a6 Michael Hanselmann
161 8a96c5a6 Michael Hanselmann
  def _CheckLoadError(self, filename, data, expected):
162 8a96c5a6 Michael Hanselmann
    self._WriteConfig(filename, data)
163 8a96c5a6 Michael Hanselmann
164 8a96c5a6 Michael Hanselmann
    try:
165 8a96c5a6 Michael Hanselmann
      qa_config._QaConfig.Load(filename)
166 8a96c5a6 Michael Hanselmann
    except qa_error.Error, err:
167 8a96c5a6 Michael Hanselmann
      self.assertTrue(str(err).startswith(expected))
168 8a96c5a6 Michael Hanselmann
    else:
169 8a96c5a6 Michael Hanselmann
      self.fail("Exception was not raised")
170 8a96c5a6 Michael Hanselmann
171 8a96c5a6 Michael Hanselmann
  def testFailsValidation(self):
172 8a96c5a6 Michael Hanselmann
    filename = utils.PathJoin(self.tmpdir, "qa.json")
173 8a96c5a6 Michael Hanselmann
    testconfig = {}
174 8a96c5a6 Michael Hanselmann
175 8a96c5a6 Michael Hanselmann
    check_fn = compat.partial(self._CheckLoadError, filename, testconfig)
176 8a96c5a6 Michael Hanselmann
177 47aa6ec9 Michael Hanselmann
    # No cluster name
178 47aa6ec9 Michael Hanselmann
    check_fn("Cluster name is required")
179 47aa6ec9 Michael Hanselmann
180 47aa6ec9 Michael Hanselmann
    testconfig["name"] = "cluster.example.com"
181 47aa6ec9 Michael Hanselmann
182 8a96c5a6 Michael Hanselmann
    # No nodes
183 8a96c5a6 Michael Hanselmann
    check_fn("Need at least one node")
184 8a96c5a6 Michael Hanselmann
185 8a96c5a6 Michael Hanselmann
    testconfig["nodes"] = [
186 8a96c5a6 Michael Hanselmann
      {
187 8a96c5a6 Michael Hanselmann
        "primary": "xen-test-0",
188 8a96c5a6 Michael Hanselmann
        "secondary": "192.0.2.1",
189 8a96c5a6 Michael Hanselmann
        },
190 8a96c5a6 Michael Hanselmann
      ]
191 8a96c5a6 Michael Hanselmann
192 8a96c5a6 Michael Hanselmann
    # No instances
193 8a96c5a6 Michael Hanselmann
    check_fn("Need at least one instance")
194 8a96c5a6 Michael Hanselmann
195 8a96c5a6 Michael Hanselmann
    testconfig["instances"] = [
196 8a96c5a6 Michael Hanselmann
      {
197 8a96c5a6 Michael Hanselmann
        "name": "xen-test-inst1",
198 8a96c5a6 Michael Hanselmann
        },
199 8a96c5a6 Michael Hanselmann
      ]
200 8a96c5a6 Michael Hanselmann
201 8a96c5a6 Michael Hanselmann
    # Missing "disk" and "disk-growth"
202 8a96c5a6 Michael Hanselmann
    check_fn("Config options 'disk' and 'disk-growth' ")
203 8a96c5a6 Michael Hanselmann
204 8a96c5a6 Michael Hanselmann
    testconfig["disk"] = []
205 8a96c5a6 Michael Hanselmann
    testconfig["disk-growth"] = testconfig["disk"]
206 8a96c5a6 Michael Hanselmann
207 8a96c5a6 Michael Hanselmann
    # Minimal accepted configuration
208 8a96c5a6 Michael Hanselmann
    self._WriteConfig(filename, testconfig)
209 8a96c5a6 Michael Hanselmann
    result = qa_config._QaConfig.Load(filename)
210 8a96c5a6 Michael Hanselmann
    self.assertTrue(result.get("nodes"))
211 8a96c5a6 Michael Hanselmann
212 8a96c5a6 Michael Hanselmann
    # Non-existent instance check script
213 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._INSTANCE_CHECK_KEY] = \
214 8a96c5a6 Michael Hanselmann
      utils.PathJoin(self.tmpdir, "instcheck")
215 8a96c5a6 Michael Hanselmann
    check_fn("Can't find instance check script")
216 8a96c5a6 Michael Hanselmann
    del testconfig[qa_config._INSTANCE_CHECK_KEY]
217 8a96c5a6 Michael Hanselmann
218 8a96c5a6 Michael Hanselmann
    # No enabled hypervisor
219 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = None
220 8a96c5a6 Michael Hanselmann
    check_fn("No hypervisor is enabled")
221 8a96c5a6 Michael Hanselmann
222 8a96c5a6 Michael Hanselmann
    # Unknown hypervisor
223 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = ["#unknownhv#"]
224 8a96c5a6 Michael Hanselmann
    check_fn("Unknown hypervisor(s) enabled:")
225 8a96c5a6 Michael Hanselmann
226 8a96c5a6 Michael Hanselmann
227 8a96c5a6 Michael Hanselmann
class TestQaConfigWithSampleConfig(unittest.TestCase):
228 8a96c5a6 Michael Hanselmann
  """Tests using C{qa-sample.json}.
229 8a96c5a6 Michael Hanselmann

230 8a96c5a6 Michael Hanselmann
  This test case serves two purposes:
231 8a96c5a6 Michael Hanselmann

232 8a96c5a6 Michael Hanselmann
    - Ensure shipped C{qa-sample.json} file is considered a valid QA
233 8a96c5a6 Michael Hanselmann
      configuration
234 8a96c5a6 Michael Hanselmann
    - Test some functions of L{qa_config._QaConfig} without having to
235 8a96c5a6 Michael Hanselmann
      mock a whole configuration file
236 8a96c5a6 Michael Hanselmann

237 8a96c5a6 Michael Hanselmann
  """
238 8a96c5a6 Michael Hanselmann
  def setUp(self):
239 8a96c5a6 Michael Hanselmann
    filename = "%s/qa/qa-sample.json" % testutils.GetSourceDir()
240 8a96c5a6 Michael Hanselmann
241 8a96c5a6 Michael Hanselmann
    self.config = qa_config._QaConfig.Load(filename)
242 8a96c5a6 Michael Hanselmann
243 8a96c5a6 Michael Hanselmann
  def testGetEnabledHypervisors(self):
244 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config.GetEnabledHypervisors(),
245 8a96c5a6 Michael Hanselmann
                     [constants.DEFAULT_ENABLED_HYPERVISOR])
246 8a96c5a6 Michael Hanselmann
247 8a96c5a6 Michael Hanselmann
  def testGetDefaultHypervisor(self):
248 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config.GetDefaultHypervisor(),
249 8a96c5a6 Michael Hanselmann
                     constants.DEFAULT_ENABLED_HYPERVISOR)
250 8a96c5a6 Michael Hanselmann
251 8a96c5a6 Michael Hanselmann
  def testGetInstanceCheckScript(self):
252 8a96c5a6 Michael Hanselmann
    self.assertTrue(self.config.GetInstanceCheckScript() is None)
253 8a96c5a6 Michael Hanselmann
254 8a96c5a6 Michael Hanselmann
  def testGetAndGetItem(self):
255 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config["nodes"], self.config.get("nodes"))
256 8a96c5a6 Michael Hanselmann
257 8a96c5a6 Michael Hanselmann
  def testGetMasterNode(self):
258 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config.GetMasterNode(), self.config["nodes"][0])
259 8a96c5a6 Michael Hanselmann
260 8a96c5a6 Michael Hanselmann
261 a08e181f Michael Hanselmann
class TestQaConfig(unittest.TestCase):
262 a08e181f Michael Hanselmann
  def setUp(self):
263 a08e181f Michael Hanselmann
    filename = \
264 a08e181f Michael Hanselmann
      testutils.TestDataFilename("qa-minimal-nodes-instances-only.json")
265 a08e181f Michael Hanselmann
266 a08e181f Michael Hanselmann
    self.config = qa_config._QaConfig.Load(filename)
267 a08e181f Michael Hanselmann
268 a08e181f Michael Hanselmann
  def testExclusiveStorage(self):
269 a08e181f Michael Hanselmann
    self.assertRaises(AssertionError, self.config.GetExclusiveStorage)
270 a08e181f Michael Hanselmann
271 a08e181f Michael Hanselmann
    for value in [False, True, 0, 1, 30804, ""]:
272 a08e181f Michael Hanselmann
      self.config.SetExclusiveStorage(value)
273 a08e181f Michael Hanselmann
      self.assertEqual(self.config.GetExclusiveStorage(), bool(value))
274 a08e181f Michael Hanselmann
275 a08e181f Michael Hanselmann
      for template in constants.DISK_TEMPLATES:
276 a08e181f Michael Hanselmann
        if value and template not in constants.DTS_EXCL_STORAGE:
277 a08e181f Michael Hanselmann
          self.assertFalse(self.config.IsTemplateSupported(template))
278 a08e181f Michael Hanselmann
        else:
279 a08e181f Michael Hanselmann
          self.assertTrue(self.config.IsTemplateSupported(template))
280 a08e181f Michael Hanselmann
281 6a654276 Michael Hanselmann
  def testInstanceConversion(self):
282 6a654276 Michael Hanselmann
    self.assertTrue(isinstance(self.config["instances"][0],
283 6a654276 Michael Hanselmann
                               qa_config._QaInstance))
284 6a654276 Michael Hanselmann
285 dbdb0594 Michael Hanselmann
  def testNodeConversion(self):
286 dbdb0594 Michael Hanselmann
    self.assertTrue(isinstance(self.config["nodes"][0],
287 dbdb0594 Michael Hanselmann
                               qa_config._QaNode))
288 dbdb0594 Michael Hanselmann
289 6a654276 Michael Hanselmann
  def testAcquireAndReleaseInstance(self):
290 6a654276 Michael Hanselmann
    self.assertFalse(compat.any(map(operator.attrgetter("used"),
291 6a654276 Michael Hanselmann
                                    self.config["instances"])))
292 6a654276 Michael Hanselmann
293 6a654276 Michael Hanselmann
    inst = qa_config.AcquireInstance(_cfg=self.config)
294 6a654276 Michael Hanselmann
    self.assertTrue(inst.used)
295 6a654276 Michael Hanselmann
    self.assertTrue(inst.disk_template is None)
296 6a654276 Michael Hanselmann
297 6f88e076 Michael Hanselmann
    inst.Release()
298 6a654276 Michael Hanselmann
299 6a654276 Michael Hanselmann
    self.assertFalse(inst.used)
300 6a654276 Michael Hanselmann
    self.assertTrue(inst.disk_template is None)
301 6a654276 Michael Hanselmann
302 6a654276 Michael Hanselmann
    self.assertFalse(compat.any(map(operator.attrgetter("used"),
303 6a654276 Michael Hanselmann
                                    self.config["instances"])))
304 6a654276 Michael Hanselmann
305 6a654276 Michael Hanselmann
  def testAcquireInstanceTooMany(self):
306 6a654276 Michael Hanselmann
    # Acquire all instances
307 6a654276 Michael Hanselmann
    for _ in range(len(self.config["instances"])):
308 6a654276 Michael Hanselmann
      inst = qa_config.AcquireInstance(_cfg=self.config)
309 6a654276 Michael Hanselmann
      self.assertTrue(inst.used)
310 6a654276 Michael Hanselmann
      self.assertTrue(inst.disk_template is None)
311 6a654276 Michael Hanselmann
312 6a654276 Michael Hanselmann
    # The next acquisition must fail
313 6a654276 Michael Hanselmann
    self.assertRaises(qa_error.OutOfInstancesError,
314 6a654276 Michael Hanselmann
                      qa_config.AcquireInstance, _cfg=self.config)
315 6a654276 Michael Hanselmann
316 dbdb0594 Michael Hanselmann
  def testAcquireNodeNoneAdded(self):
317 dbdb0594 Michael Hanselmann
    self.assertFalse(compat.any(map(operator.attrgetter("added"),
318 dbdb0594 Michael Hanselmann
                                    self.config["nodes"])))
319 dbdb0594 Michael Hanselmann
320 dbdb0594 Michael Hanselmann
    # First call must return master node
321 dbdb0594 Michael Hanselmann
    node = qa_config.AcquireNode(_cfg=self.config)
322 dbdb0594 Michael Hanselmann
    self.assertEqual(node, self.config.GetMasterNode())
323 dbdb0594 Michael Hanselmann
324 dbdb0594 Michael Hanselmann
    # Next call with exclusion list fails
325 dbdb0594 Michael Hanselmann
    self.assertRaises(qa_error.OutOfNodesError, qa_config.AcquireNode,
326 dbdb0594 Michael Hanselmann
                      exclude=[node], _cfg=self.config)
327 dbdb0594 Michael Hanselmann
328 dbdb0594 Michael Hanselmann
  def testAcquireNodeTooMany(self):
329 dbdb0594 Michael Hanselmann
    # Mark all nodes as marked (master excluded)
330 dbdb0594 Michael Hanselmann
    for node in self.config["nodes"]:
331 dbdb0594 Michael Hanselmann
      if node != self.config.GetMasterNode():
332 dbdb0594 Michael Hanselmann
        node.MarkAdded()
333 dbdb0594 Michael Hanselmann
334 dbdb0594 Michael Hanselmann
    nodecount = len(self.config["nodes"])
335 dbdb0594 Michael Hanselmann
336 dbdb0594 Michael Hanselmann
    self.assertTrue(nodecount > 1)
337 dbdb0594 Michael Hanselmann
338 dbdb0594 Michael Hanselmann
    acquired = []
339 dbdb0594 Michael Hanselmann
340 dbdb0594 Michael Hanselmann
    for _ in range(nodecount):
341 dbdb0594 Michael Hanselmann
      node = qa_config.AcquireNode(exclude=acquired, _cfg=self.config)
342 dbdb0594 Michael Hanselmann
      if node == self.config.GetMasterNode():
343 dbdb0594 Michael Hanselmann
        self.assertFalse(node.added)
344 dbdb0594 Michael Hanselmann
      else:
345 dbdb0594 Michael Hanselmann
        self.assertTrue(node.added)
346 dbdb0594 Michael Hanselmann
      self.assertEqual(node.use_count, 1)
347 dbdb0594 Michael Hanselmann
      acquired.append(node)
348 dbdb0594 Michael Hanselmann
349 dbdb0594 Michael Hanselmann
    self.assertRaises(qa_error.OutOfNodesError, qa_config.AcquireNode,
350 dbdb0594 Michael Hanselmann
                      exclude=acquired, _cfg=self.config)
351 dbdb0594 Michael Hanselmann
352 a08e181f Michael Hanselmann
353 a0c3e726 Michael Hanselmann
if __name__ == "__main__":
354 a0c3e726 Michael Hanselmann
  testutils.GanetiTestProgram()