Statistics
| Branch: | Tag: | Revision:

root / test / py / qa.qa_config_unittest.py @ 560ef132

History | View | Annotate | Download (13.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 c072e788 Michael Hanselmann
  def testCallable(self):
146 c072e788 Michael Hanselmann
    self.assertTrue(qa_config.TestEnabled([lambda: True], _cfg={}))
147 c072e788 Michael Hanselmann
148 c072e788 Michael Hanselmann
    for value in [None, False, "", 0]:
149 c072e788 Michael Hanselmann
      self.assertFalse(qa_config.TestEnabled(lambda: value, _cfg={}))
150 c072e788 Michael Hanselmann
151 a0c3e726 Michael Hanselmann
152 8a96c5a6 Michael Hanselmann
class TestQaConfigLoad(unittest.TestCase):
153 8a96c5a6 Michael Hanselmann
  def setUp(self):
154 8a96c5a6 Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
155 8a96c5a6 Michael Hanselmann
156 8a96c5a6 Michael Hanselmann
  def tearDown(self):
157 8a96c5a6 Michael Hanselmann
    shutil.rmtree(self.tmpdir)
158 8a96c5a6 Michael Hanselmann
159 8a96c5a6 Michael Hanselmann
  def testLoadNonExistent(self):
160 8a96c5a6 Michael Hanselmann
    filename = utils.PathJoin(self.tmpdir, "does.not.exist")
161 8a96c5a6 Michael Hanselmann
    self.assertRaises(EnvironmentError, qa_config._QaConfig.Load, filename)
162 8a96c5a6 Michael Hanselmann
163 8a96c5a6 Michael Hanselmann
  @staticmethod
164 8a96c5a6 Michael Hanselmann
  def _WriteConfig(filename, data):
165 8a96c5a6 Michael Hanselmann
    utils.WriteFile(filename, data=serializer.DumpJson(data))
166 8a96c5a6 Michael Hanselmann
167 8a96c5a6 Michael Hanselmann
  def _CheckLoadError(self, filename, data, expected):
168 8a96c5a6 Michael Hanselmann
    self._WriteConfig(filename, data)
169 8a96c5a6 Michael Hanselmann
170 8a96c5a6 Michael Hanselmann
    try:
171 8a96c5a6 Michael Hanselmann
      qa_config._QaConfig.Load(filename)
172 8a96c5a6 Michael Hanselmann
    except qa_error.Error, err:
173 8a96c5a6 Michael Hanselmann
      self.assertTrue(str(err).startswith(expected))
174 8a96c5a6 Michael Hanselmann
    else:
175 8a96c5a6 Michael Hanselmann
      self.fail("Exception was not raised")
176 8a96c5a6 Michael Hanselmann
177 8a96c5a6 Michael Hanselmann
  def testFailsValidation(self):
178 8a96c5a6 Michael Hanselmann
    filename = utils.PathJoin(self.tmpdir, "qa.json")
179 8a96c5a6 Michael Hanselmann
    testconfig = {}
180 8a96c5a6 Michael Hanselmann
181 8a96c5a6 Michael Hanselmann
    check_fn = compat.partial(self._CheckLoadError, filename, testconfig)
182 8a96c5a6 Michael Hanselmann
183 47aa6ec9 Michael Hanselmann
    # No cluster name
184 47aa6ec9 Michael Hanselmann
    check_fn("Cluster name is required")
185 47aa6ec9 Michael Hanselmann
186 47aa6ec9 Michael Hanselmann
    testconfig["name"] = "cluster.example.com"
187 47aa6ec9 Michael Hanselmann
188 8a96c5a6 Michael Hanselmann
    # No nodes
189 8a96c5a6 Michael Hanselmann
    check_fn("Need at least one node")
190 8a96c5a6 Michael Hanselmann
191 8a96c5a6 Michael Hanselmann
    testconfig["nodes"] = [
192 8a96c5a6 Michael Hanselmann
      {
193 8a96c5a6 Michael Hanselmann
        "primary": "xen-test-0",
194 8a96c5a6 Michael Hanselmann
        "secondary": "192.0.2.1",
195 8a96c5a6 Michael Hanselmann
        },
196 8a96c5a6 Michael Hanselmann
      ]
197 8a96c5a6 Michael Hanselmann
198 8a96c5a6 Michael Hanselmann
    # No instances
199 8a96c5a6 Michael Hanselmann
    check_fn("Need at least one instance")
200 8a96c5a6 Michael Hanselmann
201 8a96c5a6 Michael Hanselmann
    testconfig["instances"] = [
202 8a96c5a6 Michael Hanselmann
      {
203 8a96c5a6 Michael Hanselmann
        "name": "xen-test-inst1",
204 8a96c5a6 Michael Hanselmann
        },
205 8a96c5a6 Michael Hanselmann
      ]
206 8a96c5a6 Michael Hanselmann
207 8a96c5a6 Michael Hanselmann
    # Missing "disk" and "disk-growth"
208 090128b6 Christos Stavrakakis
    check_fn("Config option 'disks'")
209 8a96c5a6 Michael Hanselmann
210 090128b6 Christos Stavrakakis
    testconfig["disks"] = []
211 8a96c5a6 Michael Hanselmann
212 8a96c5a6 Michael Hanselmann
    # Minimal accepted configuration
213 8a96c5a6 Michael Hanselmann
    self._WriteConfig(filename, testconfig)
214 8a96c5a6 Michael Hanselmann
    result = qa_config._QaConfig.Load(filename)
215 8a96c5a6 Michael Hanselmann
    self.assertTrue(result.get("nodes"))
216 8a96c5a6 Michael Hanselmann
217 8a96c5a6 Michael Hanselmann
    # Non-existent instance check script
218 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._INSTANCE_CHECK_KEY] = \
219 8a96c5a6 Michael Hanselmann
      utils.PathJoin(self.tmpdir, "instcheck")
220 8a96c5a6 Michael Hanselmann
    check_fn("Can't find instance check script")
221 8a96c5a6 Michael Hanselmann
    del testconfig[qa_config._INSTANCE_CHECK_KEY]
222 8a96c5a6 Michael Hanselmann
223 8a96c5a6 Michael Hanselmann
    # No enabled hypervisor
224 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = None
225 8a96c5a6 Michael Hanselmann
    check_fn("No hypervisor is enabled")
226 8a96c5a6 Michael Hanselmann
227 8a96c5a6 Michael Hanselmann
    # Unknown hypervisor
228 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = ["#unknownhv#"]
229 8a96c5a6 Michael Hanselmann
    check_fn("Unknown hypervisor(s) enabled:")
230 76fda900 Michael Hanselmann
    del testconfig[qa_config._ENABLED_HV_KEY]
231 76fda900 Michael Hanselmann
232 76fda900 Michael Hanselmann
    # Invalid path for virtual cluster base directory
233 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_MASTER_KEY] = "value"
234 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_BASEDIR_KEY] = "./not//normalized/"
235 76fda900 Michael Hanselmann
    check_fn("Path given in option 'vcluster-basedir' must be")
236 76fda900 Michael Hanselmann
237 76fda900 Michael Hanselmann
    # Inconsistent virtual cluster settings
238 76fda900 Michael Hanselmann
    testconfig.pop(qa_config._VCLUSTER_MASTER_KEY)
239 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_BASEDIR_KEY] = "/tmp"
240 76fda900 Michael Hanselmann
    check_fn("All or none of the")
241 76fda900 Michael Hanselmann
242 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_MASTER_KEY] = "master.example.com"
243 76fda900 Michael Hanselmann
    testconfig.pop(qa_config._VCLUSTER_BASEDIR_KEY)
244 76fda900 Michael Hanselmann
    check_fn("All or none of the")
245 76fda900 Michael Hanselmann
246 76fda900 Michael Hanselmann
    # Accepted virtual cluster settings
247 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_MASTER_KEY] = "master.example.com"
248 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_BASEDIR_KEY] = "/tmp"
249 76fda900 Michael Hanselmann
250 76fda900 Michael Hanselmann
    self._WriteConfig(filename, testconfig)
251 76fda900 Michael Hanselmann
    result = qa_config._QaConfig.Load(filename)
252 76fda900 Michael Hanselmann
    self.assertEqual(result.GetVclusterSettings(),
253 76fda900 Michael Hanselmann
                     ("master.example.com", "/tmp"))
254 8a96c5a6 Michael Hanselmann
255 8a96c5a6 Michael Hanselmann
256 8a96c5a6 Michael Hanselmann
class TestQaConfigWithSampleConfig(unittest.TestCase):
257 8a96c5a6 Michael Hanselmann
  """Tests using C{qa-sample.json}.
258 8a96c5a6 Michael Hanselmann

259 8a96c5a6 Michael Hanselmann
  This test case serves two purposes:
260 8a96c5a6 Michael Hanselmann

261 8a96c5a6 Michael Hanselmann
    - Ensure shipped C{qa-sample.json} file is considered a valid QA
262 8a96c5a6 Michael Hanselmann
      configuration
263 8a96c5a6 Michael Hanselmann
    - Test some functions of L{qa_config._QaConfig} without having to
264 8a96c5a6 Michael Hanselmann
      mock a whole configuration file
265 8a96c5a6 Michael Hanselmann

266 8a96c5a6 Michael Hanselmann
  """
267 8a96c5a6 Michael Hanselmann
  def setUp(self):
268 8a96c5a6 Michael Hanselmann
    filename = "%s/qa/qa-sample.json" % testutils.GetSourceDir()
269 8a96c5a6 Michael Hanselmann
270 8a96c5a6 Michael Hanselmann
    self.config = qa_config._QaConfig.Load(filename)
271 8a96c5a6 Michael Hanselmann
272 8a96c5a6 Michael Hanselmann
  def testGetEnabledHypervisors(self):
273 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config.GetEnabledHypervisors(),
274 8a96c5a6 Michael Hanselmann
                     [constants.DEFAULT_ENABLED_HYPERVISOR])
275 8a96c5a6 Michael Hanselmann
276 8a96c5a6 Michael Hanselmann
  def testGetDefaultHypervisor(self):
277 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config.GetDefaultHypervisor(),
278 8a96c5a6 Michael Hanselmann
                     constants.DEFAULT_ENABLED_HYPERVISOR)
279 8a96c5a6 Michael Hanselmann
280 8a96c5a6 Michael Hanselmann
  def testGetInstanceCheckScript(self):
281 8a96c5a6 Michael Hanselmann
    self.assertTrue(self.config.GetInstanceCheckScript() is None)
282 8a96c5a6 Michael Hanselmann
283 8a96c5a6 Michael Hanselmann
  def testGetAndGetItem(self):
284 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config["nodes"], self.config.get("nodes"))
285 8a96c5a6 Michael Hanselmann
286 8a96c5a6 Michael Hanselmann
  def testGetMasterNode(self):
287 8a96c5a6 Michael Hanselmann
    self.assertEqual(self.config.GetMasterNode(), self.config["nodes"][0])
288 8a96c5a6 Michael Hanselmann
289 76fda900 Michael Hanselmann
  def testGetVclusterSettings(self):
290 76fda900 Michael Hanselmann
    # Shipped default settings should be to not use a virtual cluster
291 76fda900 Michael Hanselmann
    self.assertEqual(self.config.GetVclusterSettings(), (None, None))
292 76fda900 Michael Hanselmann
293 76fda900 Michael Hanselmann
    self.assertFalse(qa_config.UseVirtualCluster(_cfg=self.config))
294 76fda900 Michael Hanselmann
295 8a96c5a6 Michael Hanselmann
296 a08e181f Michael Hanselmann
class TestQaConfig(unittest.TestCase):
297 a08e181f Michael Hanselmann
  def setUp(self):
298 a08e181f Michael Hanselmann
    filename = \
299 a08e181f Michael Hanselmann
      testutils.TestDataFilename("qa-minimal-nodes-instances-only.json")
300 a08e181f Michael Hanselmann
301 a08e181f Michael Hanselmann
    self.config = qa_config._QaConfig.Load(filename)
302 a08e181f Michael Hanselmann
303 a08e181f Michael Hanselmann
  def testExclusiveStorage(self):
304 a08e181f Michael Hanselmann
    self.assertRaises(AssertionError, self.config.GetExclusiveStorage)
305 a08e181f Michael Hanselmann
306 a08e181f Michael Hanselmann
    for value in [False, True, 0, 1, 30804, ""]:
307 a08e181f Michael Hanselmann
      self.config.SetExclusiveStorage(value)
308 a08e181f Michael Hanselmann
      self.assertEqual(self.config.GetExclusiveStorage(), bool(value))
309 a08e181f Michael Hanselmann
310 02cff8aa Bernardo Dal Seno
  def testIsTemplateSupported(self):
311 02cff8aa Bernardo Dal Seno
    enabled_dts = self.config.GetEnabledDiskTemplates()
312 02cff8aa Bernardo Dal Seno
    for e_s in [False, True]:
313 02cff8aa Bernardo Dal Seno
      self.config.SetExclusiveStorage(e_s)
314 a08e181f Michael Hanselmann
      for template in constants.DISK_TEMPLATES:
315 02cff8aa Bernardo Dal Seno
        if (template not in enabled_dts or
316 02cff8aa Bernardo Dal Seno
            e_s and template not in constants.DTS_EXCL_STORAGE):
317 a08e181f Michael Hanselmann
          self.assertFalse(self.config.IsTemplateSupported(template))
318 a08e181f Michael Hanselmann
        else:
319 a08e181f Michael Hanselmann
          self.assertTrue(self.config.IsTemplateSupported(template))
320 a08e181f Michael Hanselmann
321 6a654276 Michael Hanselmann
  def testInstanceConversion(self):
322 6a654276 Michael Hanselmann
    self.assertTrue(isinstance(self.config["instances"][0],
323 6a654276 Michael Hanselmann
                               qa_config._QaInstance))
324 6a654276 Michael Hanselmann
325 dbdb0594 Michael Hanselmann
  def testNodeConversion(self):
326 dbdb0594 Michael Hanselmann
    self.assertTrue(isinstance(self.config["nodes"][0],
327 dbdb0594 Michael Hanselmann
                               qa_config._QaNode))
328 dbdb0594 Michael Hanselmann
329 6a654276 Michael Hanselmann
  def testAcquireAndReleaseInstance(self):
330 6a654276 Michael Hanselmann
    self.assertFalse(compat.any(map(operator.attrgetter("used"),
331 6a654276 Michael Hanselmann
                                    self.config["instances"])))
332 6a654276 Michael Hanselmann
333 6a654276 Michael Hanselmann
    inst = qa_config.AcquireInstance(_cfg=self.config)
334 6a654276 Michael Hanselmann
    self.assertTrue(inst.used)
335 6a654276 Michael Hanselmann
    self.assertTrue(inst.disk_template is None)
336 6a654276 Michael Hanselmann
337 6f88e076 Michael Hanselmann
    inst.Release()
338 6a654276 Michael Hanselmann
339 6a654276 Michael Hanselmann
    self.assertFalse(inst.used)
340 6a654276 Michael Hanselmann
    self.assertTrue(inst.disk_template is None)
341 6a654276 Michael Hanselmann
342 6a654276 Michael Hanselmann
    self.assertFalse(compat.any(map(operator.attrgetter("used"),
343 6a654276 Michael Hanselmann
                                    self.config["instances"])))
344 6a654276 Michael Hanselmann
345 6a654276 Michael Hanselmann
  def testAcquireInstanceTooMany(self):
346 6a654276 Michael Hanselmann
    # Acquire all instances
347 6a654276 Michael Hanselmann
    for _ in range(len(self.config["instances"])):
348 6a654276 Michael Hanselmann
      inst = qa_config.AcquireInstance(_cfg=self.config)
349 6a654276 Michael Hanselmann
      self.assertTrue(inst.used)
350 6a654276 Michael Hanselmann
      self.assertTrue(inst.disk_template is None)
351 6a654276 Michael Hanselmann
352 6a654276 Michael Hanselmann
    # The next acquisition must fail
353 6a654276 Michael Hanselmann
    self.assertRaises(qa_error.OutOfInstancesError,
354 6a654276 Michael Hanselmann
                      qa_config.AcquireInstance, _cfg=self.config)
355 6a654276 Michael Hanselmann
356 dbdb0594 Michael Hanselmann
  def testAcquireNodeNoneAdded(self):
357 dbdb0594 Michael Hanselmann
    self.assertFalse(compat.any(map(operator.attrgetter("added"),
358 dbdb0594 Michael Hanselmann
                                    self.config["nodes"])))
359 dbdb0594 Michael Hanselmann
360 dbdb0594 Michael Hanselmann
    # First call must return master node
361 dbdb0594 Michael Hanselmann
    node = qa_config.AcquireNode(_cfg=self.config)
362 dbdb0594 Michael Hanselmann
    self.assertEqual(node, self.config.GetMasterNode())
363 dbdb0594 Michael Hanselmann
364 dbdb0594 Michael Hanselmann
    # Next call with exclusion list fails
365 dbdb0594 Michael Hanselmann
    self.assertRaises(qa_error.OutOfNodesError, qa_config.AcquireNode,
366 dbdb0594 Michael Hanselmann
                      exclude=[node], _cfg=self.config)
367 dbdb0594 Michael Hanselmann
368 dbdb0594 Michael Hanselmann
  def testAcquireNodeTooMany(self):
369 dbdb0594 Michael Hanselmann
    # Mark all nodes as marked (master excluded)
370 dbdb0594 Michael Hanselmann
    for node in self.config["nodes"]:
371 dbdb0594 Michael Hanselmann
      if node != self.config.GetMasterNode():
372 dbdb0594 Michael Hanselmann
        node.MarkAdded()
373 dbdb0594 Michael Hanselmann
374 dbdb0594 Michael Hanselmann
    nodecount = len(self.config["nodes"])
375 dbdb0594 Michael Hanselmann
376 dbdb0594 Michael Hanselmann
    self.assertTrue(nodecount > 1)
377 dbdb0594 Michael Hanselmann
378 dbdb0594 Michael Hanselmann
    acquired = []
379 dbdb0594 Michael Hanselmann
380 dbdb0594 Michael Hanselmann
    for _ in range(nodecount):
381 dbdb0594 Michael Hanselmann
      node = qa_config.AcquireNode(exclude=acquired, _cfg=self.config)
382 dbdb0594 Michael Hanselmann
      if node == self.config.GetMasterNode():
383 dbdb0594 Michael Hanselmann
        self.assertFalse(node.added)
384 dbdb0594 Michael Hanselmann
      else:
385 dbdb0594 Michael Hanselmann
        self.assertTrue(node.added)
386 dbdb0594 Michael Hanselmann
      self.assertEqual(node.use_count, 1)
387 dbdb0594 Michael Hanselmann
      acquired.append(node)
388 dbdb0594 Michael Hanselmann
389 dbdb0594 Michael Hanselmann
    self.assertRaises(qa_error.OutOfNodesError, qa_config.AcquireNode,
390 dbdb0594 Michael Hanselmann
                      exclude=acquired, _cfg=self.config)
391 dbdb0594 Michael Hanselmann
392 41be279f Michael Hanselmann
  def testAcquireNodeOrder(self):
393 41be279f Michael Hanselmann
    # Mark all nodes as marked (master excluded)
394 41be279f Michael Hanselmann
    for node in self.config["nodes"]:
395 41be279f Michael Hanselmann
      if node != self.config.GetMasterNode():
396 41be279f Michael Hanselmann
        node.MarkAdded()
397 41be279f Michael Hanselmann
398 41be279f Michael Hanselmann
    nodecount = len(self.config["nodes"])
399 41be279f Michael Hanselmann
400 41be279f Michael Hanselmann
    for iterations in [0, 1, 3, 100, 127, 7964]:
401 41be279f Michael Hanselmann
      acquired = []
402 41be279f Michael Hanselmann
403 41be279f Michael Hanselmann
      for i in range(iterations):
404 41be279f Michael Hanselmann
        node = qa_config.AcquireNode(_cfg=self.config)
405 41be279f Michael Hanselmann
        self.assertTrue(node.use_count > 0)
406 41be279f Michael Hanselmann
        self.assertEqual(node.use_count, (i / nodecount + 1))
407 41be279f Michael Hanselmann
        acquired.append((node.use_count, node.primary, node))
408 41be279f Michael Hanselmann
409 41be279f Michael Hanselmann
      # Check if returned nodes were in correct order
410 41be279f Michael Hanselmann
      key_fn = lambda (a, b, c): (a, utils.NiceSortKey(b), c)
411 41be279f Michael Hanselmann
      self.assertEqual(acquired, sorted(acquired, key=key_fn))
412 41be279f Michael Hanselmann
413 41be279f Michael Hanselmann
      # Release previously acquired nodes
414 41be279f Michael Hanselmann
      qa_config.ReleaseManyNodes(map(operator.itemgetter(2), acquired))
415 41be279f Michael Hanselmann
416 41be279f Michael Hanselmann
      # Check if nodes were actually released
417 41be279f Michael Hanselmann
      for node in self.config["nodes"]:
418 41be279f Michael Hanselmann
        self.assertEqual(node.use_count, 0)
419 41be279f Michael Hanselmann
        self.assertTrue(node.added or node == self.config.GetMasterNode())
420 41be279f Michael Hanselmann
421 a08e181f Michael Hanselmann
422 e80edd3b Michael Hanselmann
class TestRepresentation(unittest.TestCase):
423 e80edd3b Michael Hanselmann
  def _Check(self, target, part):
424 e80edd3b Michael Hanselmann
    self.assertTrue(part in repr(target).split())
425 e80edd3b Michael Hanselmann
426 e80edd3b Michael Hanselmann
  def testQaInstance(self):
427 e80edd3b Michael Hanselmann
    inst = qa_config._QaInstance("inst1.example.com", [])
428 e80edd3b Michael Hanselmann
    self._Check(inst, "name=inst1.example.com")
429 e80edd3b Michael Hanselmann
    self._Check(inst, "nicmac=[]")
430 e80edd3b Michael Hanselmann
431 e80edd3b Michael Hanselmann
    # Default values
432 e80edd3b Michael Hanselmann
    self._Check(inst, "disk_template=None")
433 e80edd3b Michael Hanselmann
    self._Check(inst, "used=None")
434 e80edd3b Michael Hanselmann
435 e80edd3b Michael Hanselmann
    # Use instance
436 e80edd3b Michael Hanselmann
    inst.Use()
437 e80edd3b Michael Hanselmann
    self._Check(inst, "used=True")
438 e80edd3b Michael Hanselmann
439 e80edd3b Michael Hanselmann
    # Disk template
440 e80edd3b Michael Hanselmann
    inst.SetDiskTemplate(constants.DT_DRBD8)
441 e80edd3b Michael Hanselmann
    self._Check(inst, "disk_template=%s" % constants.DT_DRBD8)
442 e80edd3b Michael Hanselmann
443 e80edd3b Michael Hanselmann
    # Release instance
444 e80edd3b Michael Hanselmann
    inst.Release()
445 e80edd3b Michael Hanselmann
    self._Check(inst, "used=False")
446 e80edd3b Michael Hanselmann
    self._Check(inst, "disk_template=None")
447 e80edd3b Michael Hanselmann
448 e80edd3b Michael Hanselmann
  def testQaNode(self):
449 e80edd3b Michael Hanselmann
    node = qa_config._QaNode("primary.example.com", "192.0.2.1")
450 e80edd3b Michael Hanselmann
    self._Check(node, "primary=primary.example.com")
451 e80edd3b Michael Hanselmann
    self._Check(node, "secondary=192.0.2.1")
452 e80edd3b Michael Hanselmann
    self._Check(node, "added=False")
453 e80edd3b Michael Hanselmann
    self._Check(node, "use_count=0")
454 e80edd3b Michael Hanselmann
455 e80edd3b Michael Hanselmann
    # Mark as added
456 e80edd3b Michael Hanselmann
    node.MarkAdded()
457 e80edd3b Michael Hanselmann
    self._Check(node, "added=True")
458 e80edd3b Michael Hanselmann
459 e80edd3b Michael Hanselmann
    # Use node
460 e80edd3b Michael Hanselmann
    for i in range(1, 5):
461 e80edd3b Michael Hanselmann
      node.Use()
462 e80edd3b Michael Hanselmann
      self._Check(node, "use_count=%s" % i)
463 e80edd3b Michael Hanselmann
464 e80edd3b Michael Hanselmann
    # Release node
465 e80edd3b Michael Hanselmann
    for i in reversed(range(1, 5)):
466 e80edd3b Michael Hanselmann
      node.Release()
467 e80edd3b Michael Hanselmann
      self._Check(node, "use_count=%s" % (i - 1))
468 e80edd3b Michael Hanselmann
469 e80edd3b Michael Hanselmann
    self._Check(node, "use_count=0")
470 e80edd3b Michael Hanselmann
471 e80edd3b Michael Hanselmann
    # Mark as added
472 e80edd3b Michael Hanselmann
    node.MarkRemoved()
473 e80edd3b Michael Hanselmann
    self._Check(node, "added=False")
474 e80edd3b Michael Hanselmann
475 e80edd3b Michael Hanselmann
476 a0c3e726 Michael Hanselmann
if __name__ == "__main__":
477 a0c3e726 Michael Hanselmann
  testutils.GanetiTestProgram()