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() |