Statistics
| Branch: | Tag: | Revision:

root / test / py / qa.qa_config_unittest.py @ 651cc3e2

History | View | Annotate | Download (13.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 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 8a96c5a6 Michael Hanselmann
    check_fn("Config options 'disk' and 'disk-growth' ")
209 8a96c5a6 Michael Hanselmann
210 8a96c5a6 Michael Hanselmann
    testconfig["disk"] = []
211 8a96c5a6 Michael Hanselmann
    testconfig["disk-growth"] = testconfig["disk"]
212 8a96c5a6 Michael Hanselmann
213 8a96c5a6 Michael Hanselmann
    # Minimal accepted configuration
214 8a96c5a6 Michael Hanselmann
    self._WriteConfig(filename, testconfig)
215 8a96c5a6 Michael Hanselmann
    result = qa_config._QaConfig.Load(filename)
216 8a96c5a6 Michael Hanselmann
    self.assertTrue(result.get("nodes"))
217 8a96c5a6 Michael Hanselmann
218 8a96c5a6 Michael Hanselmann
    # Non-existent instance check script
219 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._INSTANCE_CHECK_KEY] = \
220 8a96c5a6 Michael Hanselmann
      utils.PathJoin(self.tmpdir, "instcheck")
221 8a96c5a6 Michael Hanselmann
    check_fn("Can't find instance check script")
222 8a96c5a6 Michael Hanselmann
    del testconfig[qa_config._INSTANCE_CHECK_KEY]
223 8a96c5a6 Michael Hanselmann
224 8a96c5a6 Michael Hanselmann
    # No enabled hypervisor
225 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = None
226 8a96c5a6 Michael Hanselmann
    check_fn("No hypervisor is enabled")
227 8a96c5a6 Michael Hanselmann
228 8a96c5a6 Michael Hanselmann
    # Unknown hypervisor
229 8a96c5a6 Michael Hanselmann
    testconfig[qa_config._ENABLED_HV_KEY] = ["#unknownhv#"]
230 8a96c5a6 Michael Hanselmann
    check_fn("Unknown hypervisor(s) enabled:")
231 76fda900 Michael Hanselmann
    del testconfig[qa_config._ENABLED_HV_KEY]
232 76fda900 Michael Hanselmann
233 76fda900 Michael Hanselmann
    # Invalid path for virtual cluster base directory
234 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_MASTER_KEY] = "value"
235 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_BASEDIR_KEY] = "./not//normalized/"
236 76fda900 Michael Hanselmann
    check_fn("Path given in option 'vcluster-basedir' must be")
237 76fda900 Michael Hanselmann
238 76fda900 Michael Hanselmann
    # Inconsistent virtual cluster settings
239 76fda900 Michael Hanselmann
    testconfig.pop(qa_config._VCLUSTER_MASTER_KEY)
240 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_BASEDIR_KEY] = "/tmp"
241 76fda900 Michael Hanselmann
    check_fn("All or none of the")
242 76fda900 Michael Hanselmann
243 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_MASTER_KEY] = "master.example.com"
244 76fda900 Michael Hanselmann
    testconfig.pop(qa_config._VCLUSTER_BASEDIR_KEY)
245 76fda900 Michael Hanselmann
    check_fn("All or none of the")
246 76fda900 Michael Hanselmann
247 76fda900 Michael Hanselmann
    # Accepted virtual cluster settings
248 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_MASTER_KEY] = "master.example.com"
249 76fda900 Michael Hanselmann
    testconfig[qa_config._VCLUSTER_BASEDIR_KEY] = "/tmp"
250 76fda900 Michael Hanselmann
251 76fda900 Michael Hanselmann
    self._WriteConfig(filename, testconfig)
252 76fda900 Michael Hanselmann
    result = qa_config._QaConfig.Load(filename)
253 76fda900 Michael Hanselmann
    self.assertEqual(result.GetVclusterSettings(),
254 76fda900 Michael Hanselmann
                     ("master.example.com", "/tmp"))
255 8a96c5a6 Michael Hanselmann
256 8a96c5a6 Michael Hanselmann
257 8a96c5a6 Michael Hanselmann
class TestQaConfigWithSampleConfig(unittest.TestCase):
258 8a96c5a6 Michael Hanselmann
  """Tests using C{qa-sample.json}.
259 8a96c5a6 Michael Hanselmann

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

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

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