Statistics
| Branch: | Tag: | Revision:

root / test / py / qa.qa_config_unittest.py @ dbdb0594

History | View | Annotate | Download (9.7 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 8a96c5a6 Michael Hanselmann
    # No nodes
178 8a96c5a6 Michael Hanselmann
    check_fn("Need at least one node")
179 8a96c5a6 Michael Hanselmann
180 8a96c5a6 Michael Hanselmann
    testconfig["nodes"] = [
181 8a96c5a6 Michael Hanselmann
      {
182 8a96c5a6 Michael Hanselmann
        "primary": "xen-test-0",
183 8a96c5a6 Michael Hanselmann
        "secondary": "192.0.2.1",
184 8a96c5a6 Michael Hanselmann
        },
185 8a96c5a6 Michael Hanselmann
      ]
186 8a96c5a6 Michael Hanselmann
187 8a96c5a6 Michael Hanselmann
    # No instances
188 8a96c5a6 Michael Hanselmann
    check_fn("Need at least one instance")
189 8a96c5a6 Michael Hanselmann
190 8a96c5a6 Michael Hanselmann
    testconfig["instances"] = [
191 8a96c5a6 Michael Hanselmann
      {
192 8a96c5a6 Michael Hanselmann
        "name": "xen-test-inst1",
193 8a96c5a6 Michael Hanselmann
        },
194 8a96c5a6 Michael Hanselmann
      ]
195 8a96c5a6 Michael Hanselmann
196 8a96c5a6 Michael Hanselmann
    # Missing "disk" and "disk-growth"
197 8a96c5a6 Michael Hanselmann
    check_fn("Config options 'disk' and 'disk-growth' ")
198 8a96c5a6 Michael Hanselmann
199 8a96c5a6 Michael Hanselmann
    testconfig["disk"] = []
200 8a96c5a6 Michael Hanselmann
    testconfig["disk-growth"] = testconfig["disk"]
201 8a96c5a6 Michael Hanselmann
202 8a96c5a6 Michael Hanselmann
    # Minimal accepted configuration
203 8a96c5a6 Michael Hanselmann
    self._WriteConfig(filename, testconfig)
204 8a96c5a6 Michael Hanselmann
    result = qa_config._QaConfig.Load(filename)
205 8a96c5a6 Michael Hanselmann
    self.assertTrue(result.get("nodes"))
206 8a96c5a6 Michael Hanselmann
207 8a96c5a6 Michael Hanselmann
    # Non-existent instance check script
208 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._INSTANCE_CHECK_KEY] = \
209 8a96c5a6 Michael Hanselmann
      utils.PathJoin(self.tmpdir, "instcheck")
210 8a96c5a6 Michael Hanselmann
    check_fn("Can't find instance check script")
211 8a96c5a6 Michael Hanselmann
    del testconfig[qa_config._INSTANCE_CHECK_KEY]
212 8a96c5a6 Michael Hanselmann
213 8a96c5a6 Michael Hanselmann
    # No enabled hypervisor
214 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = None
215 8a96c5a6 Michael Hanselmann
    check_fn("No hypervisor is enabled")
216 8a96c5a6 Michael Hanselmann
217 8a96c5a6 Michael Hanselmann
    # Unknown hypervisor
218 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = ["#unknownhv#"]
219 8a96c5a6 Michael Hanselmann
    check_fn("Unknown hypervisor(s) enabled:")
220 8a96c5a6 Michael Hanselmann
221 8a96c5a6 Michael Hanselmann
222 8a96c5a6 Michael Hanselmann
class TestQaConfigWithSampleConfig(unittest.TestCase):
223 8a96c5a6 Michael Hanselmann
  """Tests using C{qa-sample.json}.
224 8a96c5a6 Michael Hanselmann

225 8a96c5a6 Michael Hanselmann
  This test case serves two purposes:
226 8a96c5a6 Michael Hanselmann

227 8a96c5a6 Michael Hanselmann
    - Ensure shipped C{qa-sample.json} file is considered a valid QA
228 8a96c5a6 Michael Hanselmann
      configuration
229 8a96c5a6 Michael Hanselmann
    - Test some functions of L{qa_config._QaConfig} without having to
230 8a96c5a6 Michael Hanselmann
      mock a whole configuration file
231 8a96c5a6 Michael Hanselmann

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