Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ f3fd2c9d

History | View | Annotate | Download (14.2 kB)

1 f89d59b9 Iustin Pop
#!/usr/bin/python -u
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 e1df06f2 Iustin Pop
# Copyright (C) 2007, 2008, 2009, 2010 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 cec9845c Michael Hanselmann
"""Script for doing QA on Ganeti.
23 94508060 Michael Hanselmann

24 94508060 Michael Hanselmann
"""
25 a8083063 Iustin Pop
26 a8083063 Iustin Pop
import sys
27 c68d1f43 Michael Hanselmann
import datetime
28 c68d1f43 Michael Hanselmann
import optparse
29 a8083063 Iustin Pop
30 cec9845c Michael Hanselmann
import qa_cluster
31 cec9845c Michael Hanselmann
import qa_config
32 cec9845c Michael Hanselmann
import qa_daemon
33 cec9845c Michael Hanselmann
import qa_env
34 30131294 Adeodato Simo
import qa_group
35 cec9845c Michael Hanselmann
import qa_instance
36 cec9845c Michael Hanselmann
import qa_node
37 8947cf2b Michael Hanselmann
import qa_os
38 a47f574c Oleksiy Mishchenko
import qa_rapi
39 d74c2ca1 Michael Hanselmann
import qa_tags
40 1672a0d1 Michael Hanselmann
import qa_utils
41 a8083063 Iustin Pop
42 725ec2f1 René Nussbaumer
from ganeti import utils
43 2a7c3583 Michael Hanselmann
from ganeti import rapi
44 f3fd2c9d Adeodato Simo
from ganeti import constants
45 2a7c3583 Michael Hanselmann
46 2a7c3583 Michael Hanselmann
import ganeti.rapi.client
47 725ec2f1 René Nussbaumer
48 a8083063 Iustin Pop
49 7d88f255 Iustin Pop
def _FormatHeader(line, end=72):
50 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
51 f89d59b9 Iustin Pop

52 f89d59b9 Iustin Pop
  """
53 f89d59b9 Iustin Pop
  line = "---- " + line + " "
54 f89d59b9 Iustin Pop
  line += "-" * (end-len(line))
55 f89d59b9 Iustin Pop
  line = line.rstrip()
56 f89d59b9 Iustin Pop
  return line
57 f89d59b9 Iustin Pop
58 f89d59b9 Iustin Pop
59 7d88f255 Iustin Pop
def _DescriptionOf(fn):
60 7d88f255 Iustin Pop
  """Computes the description of an item.
61 a8083063 Iustin Pop

62 a8083063 Iustin Pop
  """
63 cec9845c Michael Hanselmann
  if fn.__doc__:
64 cec9845c Michael Hanselmann
    desc = fn.__doc__.splitlines()[0].strip()
65 a8083063 Iustin Pop
  else:
66 f89d59b9 Iustin Pop
    desc = "%r" % fn
67 a8083063 Iustin Pop
68 7d88f255 Iustin Pop
  return desc.rstrip(".")
69 7d88f255 Iustin Pop
70 7d88f255 Iustin Pop
def RunTest(fn, *args):
71 7d88f255 Iustin Pop
  """Runs a test after printing a header.
72 7d88f255 Iustin Pop

73 7d88f255 Iustin Pop
  """
74 a8083063 Iustin Pop
75 f89d59b9 Iustin Pop
  tstart = datetime.datetime.now()
76 a8083063 Iustin Pop
77 7d88f255 Iustin Pop
  desc = _DescriptionOf(fn)
78 7d88f255 Iustin Pop
79 f89d59b9 Iustin Pop
  print
80 f89d59b9 Iustin Pop
  print _FormatHeader("%s start %s" % (tstart, desc))
81 f89d59b9 Iustin Pop
82 f89d59b9 Iustin Pop
  try:
83 f89d59b9 Iustin Pop
    retval = fn(*args)
84 f89d59b9 Iustin Pop
    return retval
85 f89d59b9 Iustin Pop
  finally:
86 f89d59b9 Iustin Pop
    tstop = datetime.datetime.now()
87 f89d59b9 Iustin Pop
    tdelta = tstop - tstart
88 f89d59b9 Iustin Pop
    print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc))
89 a8083063 Iustin Pop
90 a8083063 Iustin Pop
91 7d88f255 Iustin Pop
def RunTestIf(testnames, fn, *args):
92 7d88f255 Iustin Pop
  """Runs a test conditionally.
93 7d88f255 Iustin Pop

94 7d88f255 Iustin Pop
  @param testnames: either a single test name in the configuration
95 7d88f255 Iustin Pop
      file, or a list of testnames (which will be AND-ed together)
96 7d88f255 Iustin Pop

97 7d88f255 Iustin Pop
  """
98 7d88f255 Iustin Pop
  if qa_config.TestEnabled(testnames):
99 7d88f255 Iustin Pop
    RunTest(fn, *args)
100 7d88f255 Iustin Pop
  else:
101 7d88f255 Iustin Pop
    tstart = datetime.datetime.now()
102 7d88f255 Iustin Pop
    desc = _DescriptionOf(fn)
103 7d88f255 Iustin Pop
    print _FormatHeader("%s skipping %s, test(s) %s disabled" %
104 7d88f255 Iustin Pop
                        (tstart, desc, testnames))
105 7d88f255 Iustin Pop
106 7d88f255 Iustin Pop
107 b1ffe1eb Michael Hanselmann
def RunEnvTests():
108 b1ffe1eb Michael Hanselmann
  """Run several environment tests.
109 a8083063 Iustin Pop

110 a8083063 Iustin Pop
  """
111 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
112 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
113 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
114 a8083063 Iustin Pop
115 94508060 Michael Hanselmann
116 725ec2f1 René Nussbaumer
def SetupCluster(rapi_user, rapi_secret):
117 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
118 a8083063 Iustin Pop

119 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
120 725ec2f1 René Nussbaumer
  @param rapi_secret: Login secret for RAPI
121 725ec2f1 René Nussbaumer

122 b1ffe1eb Michael Hanselmann
  """
123 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
124 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
125 288d6440 Michael Hanselmann
126 288d6440 Michael Hanselmann
  # Test on empty cluster
127 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
128 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
129 288d6440 Michael Hanselmann
130 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
131 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
132 8e671b7c Iustin Pop
    # consider the nodes are already there
133 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
134 8201b996 Iustin Pop
135 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
136 cd04f8c2 Michael Hanselmann
137 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
138 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
139 8201b996 Iustin Pop
140 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
141 288d6440 Michael Hanselmann
142 2214cf14 Michael Hanselmann
  # Test listing fields
143 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
144 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
145 2214cf14 Michael Hanselmann
146 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
147 b1ffe1eb Michael Hanselmann
148 b1ffe1eb Michael Hanselmann
149 b1ffe1eb Michael Hanselmann
def RunClusterTests():
150 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
151 180bdd1f Michael Hanselmann

152 b1ffe1eb Michael Hanselmann
  """
153 7d88f255 Iustin Pop
  for test, fn in [
154 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
155 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
156 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
157 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
158 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
159 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
160 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
161 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
162 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
163 7d88f255 Iustin Pop
    ("cluster-copyfile", qa_cluster.TestClusterCopyfile),
164 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
165 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
166 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
167 7d88f255 Iustin Pop
    ("rapi", qa_rapi.TestVersion),
168 7d88f255 Iustin Pop
    ("rapi", qa_rapi.TestEmptyCluster),
169 7d88f255 Iustin Pop
    ]:
170 7d88f255 Iustin Pop
    RunTestIf(test, fn)
171 8947cf2b Michael Hanselmann
172 6d4a1656 Michael Hanselmann
173 b1ffe1eb Michael Hanselmann
def RunOsTests():
174 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
175 5d640672 Michael Hanselmann

176 b1ffe1eb Michael Hanselmann
  """
177 7d88f255 Iustin Pop
  for fn in [
178 7d88f255 Iustin Pop
    qa_os.TestOsList,
179 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
180 7d88f255 Iustin Pop
    qa_os.TestOsValid,
181 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
182 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
183 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
184 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
185 7d88f255 Iustin Pop
    qa_os.TestOsStates,
186 7d88f255 Iustin Pop
    ]:
187 7d88f255 Iustin Pop
    RunTestIf("os", fn)
188 b1ffe1eb Michael Hanselmann
189 b1ffe1eb Michael Hanselmann
190 b1ffe1eb Michael Hanselmann
def RunCommonInstanceTests(instance):
191 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
192 b1ffe1eb Michael Hanselmann

193 b1ffe1eb Michael Hanselmann
  """
194 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
195 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
196 a8083063 Iustin Pop
197 7d88f255 Iustin Pop
  RunTestIf("instance-list", qa_instance.TestInstanceList)
198 283f9d4c Michael Hanselmann
199 7d88f255 Iustin Pop
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
200 e9e35aaa Michael Hanselmann
201 7d88f255 Iustin Pop
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
202 7d88f255 Iustin Pop
  RunTestIf(["instance-modify", "rapi"],
203 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceModify, instance)
204 c0f74c55 Iustin Pop
205 7d88f255 Iustin Pop
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
206 4379b1fa Michael Hanselmann
207 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance)
208 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
209 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance)
210 a8083063 Iustin Pop
211 7d88f255 Iustin Pop
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
212 8a4e8898 Michael Hanselmann
213 18337ca9 Iustin Pop
  if qa_config.TestEnabled('instance-rename'):
214 e5c2accd Guido Trotter
    rename_source = instance["name"]
215 7fb50870 Michael Hanselmann
    rename_target = qa_config.get("rename", None)
216 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceShutdown, instance)
217 46747143 Guido Trotter
    # perform instance rename to the same name
218 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceRename, rename_source, rename_source)
219 930e77d1 Michael Hanselmann
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
220 930e77d1 Michael Hanselmann
              rename_source, rename_source)
221 46747143 Guido Trotter
    if rename_target is not None:
222 46747143 Guido Trotter
      # perform instance rename to a different name, if we have one configured
223 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_source, rename_target)
224 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_target, rename_source)
225 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
226 930e77d1 Michael Hanselmann
                rename_source, rename_target)
227 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
228 930e77d1 Michael Hanselmann
                rename_target, rename_source)
229 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceStartup, instance)
230 18337ca9 Iustin Pop
231 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
232 d74c2ca1 Michael Hanselmann
233 1ef6e776 Michael Hanselmann
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
234 d74c2ca1 Michael Hanselmann
235 7d88f255 Iustin Pop
  RunTestIf("rapi", qa_rapi.TestInstance, instance)
236 729c4377 Iustin Pop
237 288d6440 Michael Hanselmann
  # Lists instances, too
238 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
239 288d6440 Michael Hanselmann
240 729c4377 Iustin Pop
241 729c4377 Iustin Pop
def RunCommonNodeTests():
242 729c4377 Iustin Pop
  """Run a few common node tests.
243 729c4377 Iustin Pop

244 729c4377 Iustin Pop
  """
245 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
246 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
247 a1de4b18 René Nussbaumer
  RunTestIf("node-oob", qa_node.TestOutOfBand)
248 8e1db003 Michael Hanselmann
249 8d8d650c Michael Hanselmann
250 30131294 Adeodato Simo
def RunGroupListTests():
251 30131294 Adeodato Simo
  """Run tests for listing node groups.
252 30131294 Adeodato Simo

253 30131294 Adeodato Simo
  """
254 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
255 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
256 30131294 Adeodato Simo
257 30131294 Adeodato Simo
258 66787da5 Adeodato Simo
def RunGroupRwTests():
259 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
260 66787da5 Adeodato Simo

261 66787da5 Adeodato Simo
  """
262 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
263 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
264 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
265 4b10fb65 Adeodato Simo
  RunTestIf("rapi", qa_rapi.TestRapiNodeGroups)
266 4b10fb65 Adeodato Simo
267 66787da5 Adeodato Simo
268 638a7266 Iustin Pop
def RunExportImportTests(instance, pnode, snode):
269 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
270 a8083063 Iustin Pop

271 638a7266 Iustin Pop
  @param pnode: current primary node of the instance
272 638a7266 Iustin Pop
  @param snode: current secondary node of the instance, if any,
273 638a7266 Iustin Pop
      otherwise None
274 638a7266 Iustin Pop

275 b1ffe1eb Michael Hanselmann
  """
276 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-export'):
277 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
278 bc696589 Michael Hanselmann
279 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
280 b1ffe1eb Michael Hanselmann
    try:
281 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
282 b1ffe1eb Michael Hanselmann
283 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
284 b1ffe1eb Michael Hanselmann
285 b1ffe1eb Michael Hanselmann
      if qa_config.TestEnabled('instance-import'):
286 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
287 5d640672 Michael Hanselmann
        try:
288 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
289 b1ffe1eb Michael Hanselmann
                  expnode, name)
290 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
291 5d640672 Michael Hanselmann
        finally:
292 b1ffe1eb Michael Hanselmann
          qa_config.ReleaseInstance(newinst)
293 b1ffe1eb Michael Hanselmann
    finally:
294 b1ffe1eb Michael Hanselmann
      qa_config.ReleaseNode(expnode)
295 5d640672 Michael Hanselmann
296 7d88f255 Iustin Pop
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
297 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
298 5d831182 Michael Hanselmann
    try:
299 638a7266 Iustin Pop
      if snode is None:
300 638a7266 Iustin Pop
        excl = [pnode]
301 638a7266 Iustin Pop
      else:
302 638a7266 Iustin Pop
        excl = [pnode, snode]
303 638a7266 Iustin Pop
      tnode = qa_config.AcquireNode(exclude=excl)
304 5d831182 Michael Hanselmann
      try:
305 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
306 638a7266 Iustin Pop
                pnode, snode, tnode)
307 5d831182 Michael Hanselmann
      finally:
308 638a7266 Iustin Pop
        qa_config.ReleaseNode(tnode)
309 5d831182 Michael Hanselmann
    finally:
310 5d831182 Michael Hanselmann
      qa_config.ReleaseInstance(newinst)
311 5d831182 Michael Hanselmann
312 283f9d4c Michael Hanselmann
313 b1ffe1eb Michael Hanselmann
def RunDaemonTests(instance, pnode):
314 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
315 9df6d173 Michael Hanselmann

316 b1ffe1eb Michael Hanselmann
  """
317 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
318 e9e35aaa Michael Hanselmann
319 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
320 7d88f255 Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, pnode, instance)
321 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
322 7d88f255 Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, pnode, instance)
323 e9e35aaa Michael Hanselmann
324 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
325 8201b996 Iustin Pop
326 9df6d173 Michael Hanselmann
327 b1ffe1eb Michael Hanselmann
def RunHardwareFailureTests(instance, pnode, snode):
328 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
329 a8083063 Iustin Pop

330 b1ffe1eb Michael Hanselmann
  """
331 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
332 b1ffe1eb Michael Hanselmann
333 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
334 7d88f255 Iustin Pop
  RunTestIf(["instance-migrate", "rapi"],
335 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
336 938bde86 Michael Hanselmann
337 7910e7a5 Michael Hanselmann
  if qa_config.TestEnabled('instance-replace-disks'):
338 76f59a32 Michael Hanselmann
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
339 7910e7a5 Michael Hanselmann
    try:
340 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
341 7910e7a5 Michael Hanselmann
              instance, pnode, snode, othernode)
342 7910e7a5 Michael Hanselmann
    finally:
343 7910e7a5 Michael Hanselmann
      qa_config.ReleaseNode(othernode)
344 7910e7a5 Michael Hanselmann
345 7d88f255 Iustin Pop
  RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, pnode, snode)
346 b1ffe1eb Michael Hanselmann
347 7d88f255 Iustin Pop
  RunTestIf("node-failover", qa_node.TestNodeFailover, pnode, snode)
348 b1ffe1eb Michael Hanselmann
349 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
350 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
351 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure",
352 7d88f255 Iustin Pop
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
353 7d88f255 Iustin Pop
            pnode, snode)
354 b1ffe1eb Michael Hanselmann
355 b1ffe1eb Michael Hanselmann
356 2a7c3583 Michael Hanselmann
@rapi.client.UsesRapiClient
357 b1ffe1eb Michael Hanselmann
def main():
358 b1ffe1eb Michael Hanselmann
  """Main program.
359 b1ffe1eb Michael Hanselmann

360 b1ffe1eb Michael Hanselmann
  """
361 a39ec11a Michael Hanselmann
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
362 b1ffe1eb Michael Hanselmann
  parser.add_option('--yes-do-it', dest='yes_do_it',
363 b1ffe1eb Michael Hanselmann
      action="store_true",
364 b1ffe1eb Michael Hanselmann
      help="Really execute the tests")
365 b1ffe1eb Michael Hanselmann
  (qa_config.options, args) = parser.parse_args()
366 5d640672 Michael Hanselmann
367 a39ec11a Michael Hanselmann
  if len(args) == 1:
368 a39ec11a Michael Hanselmann
    (config_file, ) = args
369 b1ffe1eb Michael Hanselmann
  else:
370 a39ec11a Michael Hanselmann
    parser.error("Wrong number of arguments.")
371 a8083063 Iustin Pop
372 b1ffe1eb Michael Hanselmann
  if not qa_config.options.yes_do_it:
373 b1ffe1eb Michael Hanselmann
    print ("Executing this script irreversibly destroys any Ganeti\n"
374 b1ffe1eb Michael Hanselmann
           "configuration on all nodes involved. If you really want\n"
375 b1ffe1eb Michael Hanselmann
           "to start testing, supply the --yes-do-it option.")
376 b1ffe1eb Michael Hanselmann
    sys.exit(1)
377 e9e35aaa Michael Hanselmann
378 b1ffe1eb Michael Hanselmann
  qa_config.Load(config_file)
379 a8083063 Iustin Pop
380 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
381 725ec2f1 René Nussbaumer
  rapi_secret = utils.GenerateSecret()
382 725ec2f1 René Nussbaumer
383 b1ffe1eb Michael Hanselmann
  RunEnvTests()
384 725ec2f1 René Nussbaumer
  SetupCluster(rapi_user, rapi_secret)
385 2771835c Michael Hanselmann
386 2771835c Michael Hanselmann
  # Load RAPI certificate
387 76917d97 Iustin Pop
  qa_rapi.Setup(rapi_user, rapi_secret)
388 2771835c Michael Hanselmann
389 b1ffe1eb Michael Hanselmann
  RunClusterTests()
390 b1ffe1eb Michael Hanselmann
  RunOsTests()
391 4b62db14 Michael Hanselmann
392 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
393 d74c2ca1 Michael Hanselmann
394 729c4377 Iustin Pop
  RunCommonNodeTests()
395 30131294 Adeodato Simo
  RunGroupListTests()
396 66787da5 Adeodato Simo
  RunGroupRwTests()
397 729c4377 Iustin Pop
398 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
399 d0cb68cb Michael Hanselmann
  try:
400 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
401 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
402 d0cb68cb Michael Hanselmann
  finally:
403 d0cb68cb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
404 102b115b Michael Hanselmann
405 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
406 b1ffe1eb Michael Hanselmann
  try:
407 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
408 d74c2ca1 Michael Hanselmann
409 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
410 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
411 a47f574c Oleksiy Mishchenko
412 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
413 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
414 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
415 924e95f9 Michael Hanselmann
                                  use_client)
416 924e95f9 Michael Hanselmann
          RunCommonInstanceTests(rapi_instance)
417 924e95f9 Michael Hanselmann
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
418 924e95f9 Michael Hanselmann
          del rapi_instance
419 8cb70e56 Michael Hanselmann
420 b1ffe1eb Michael Hanselmann
    if qa_config.TestEnabled('instance-add-plain-disk'):
421 b1ffe1eb Michael Hanselmann
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
422 b1ffe1eb Michael Hanselmann
      RunCommonInstanceTests(instance)
423 30131294 Adeodato Simo
      RunGroupListTests()
424 638a7266 Iustin Pop
      RunExportImportTests(instance, pnode, None)
425 b1ffe1eb Michael Hanselmann
      RunDaemonTests(instance, pnode)
426 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestInstanceRemove, instance)
427 b1ffe1eb Michael Hanselmann
      del instance
428 9df6d173 Michael Hanselmann
429 7d7609a3 Michael Hanselmann
    multinode_tests = [
430 7d7609a3 Michael Hanselmann
      ('instance-add-drbd-disk',
431 7d7609a3 Michael Hanselmann
       qa_instance.TestInstanceAddWithDrbdDisk),
432 7d7609a3 Michael Hanselmann
    ]
433 7d7609a3 Michael Hanselmann
434 7d7609a3 Michael Hanselmann
    for name, func in multinode_tests:
435 7d7609a3 Michael Hanselmann
      if qa_config.TestEnabled(name):
436 7d7609a3 Michael Hanselmann
        snode = qa_config.AcquireNode(exclude=pnode)
437 7d7609a3 Michael Hanselmann
        try:
438 7d7609a3 Michael Hanselmann
          instance = RunTest(func, pnode, snode)
439 7d7609a3 Michael Hanselmann
          RunCommonInstanceTests(instance)
440 30131294 Adeodato Simo
          RunGroupListTests()
441 f3fd2c9d Adeodato Simo
          RunTest(qa_group.TestAssignNodesIncludingSplit,
442 f3fd2c9d Adeodato Simo
                  constants.INITIAL_NODE_GROUP_NAME,
443 f3fd2c9d Adeodato Simo
                  pnode["primary"], snode["primary"])
444 7f69aabb Iustin Pop
          if qa_config.TestEnabled('instance-convert-disk'):
445 f9f0ce7f Guido Trotter
            RunTest(qa_instance.TestInstanceShutdown, instance)
446 7f69aabb Iustin Pop
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
447 f9f0ce7f Guido Trotter
            RunTest(qa_instance.TestInstanceStartup, instance)
448 638a7266 Iustin Pop
          RunExportImportTests(instance, pnode, snode)
449 7d7609a3 Michael Hanselmann
          RunHardwareFailureTests(instance, pnode, snode)
450 7d7609a3 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
451 7d7609a3 Michael Hanselmann
          del instance
452 7d7609a3 Michael Hanselmann
        finally:
453 7d7609a3 Michael Hanselmann
          qa_config.ReleaseNode(snode)
454 a8083063 Iustin Pop
455 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
456 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
457 3b01286e Michael Hanselmann
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
458 3b01286e Michael Hanselmann
        expnode = qa_config.AcquireNode(exclude=pnode)
459 3b01286e Michael Hanselmann
        try:
460 3b01286e Michael Hanselmann
          if shutdown:
461 3b01286e Michael Hanselmann
            # Stop instance before exporting and removing it
462 3b01286e Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
463 3b01286e Michael Hanselmann
          RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
464 3b01286e Michael Hanselmann
          RunTest(qa_instance.TestBackupList, expnode)
465 3b01286e Michael Hanselmann
        finally:
466 3b01286e Michael Hanselmann
          qa_config.ReleaseNode(expnode)
467 3b01286e Michael Hanselmann
        del expnode
468 3b01286e Michael Hanselmann
        del instance
469 8d8d650c Michael Hanselmann
470 a8083063 Iustin Pop
  finally:
471 b1ffe1eb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
472 a8083063 Iustin Pop
473 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
474 a8083063 Iustin Pop
475 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
476 a8083063 Iustin Pop
477 cec9845c Michael Hanselmann
478 cec9845c Michael Hanselmann
if __name__ == '__main__':
479 cec9845c Michael Hanselmann
  main()