Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 96a12113

History | View | Annotate | Download (15.5 kB)

1 f89d59b9 Iustin Pop
#!/usr/bin/python -u
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 f7e6f3c8 Iustin Pop
# Copyright (C) 2007, 2008, 2009, 2010, 2011 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 3582eef6 Iustin Pop
# pylint: disable-msg=C0103
27 3582eef6 Iustin Pop
# due to invalid name
28 3582eef6 Iustin Pop
29 a8083063 Iustin Pop
import sys
30 c68d1f43 Michael Hanselmann
import datetime
31 c68d1f43 Michael Hanselmann
import optparse
32 a8083063 Iustin Pop
33 cec9845c Michael Hanselmann
import qa_cluster
34 cec9845c Michael Hanselmann
import qa_config
35 cec9845c Michael Hanselmann
import qa_daemon
36 cec9845c Michael Hanselmann
import qa_env
37 30131294 Adeodato Simo
import qa_group
38 cec9845c Michael Hanselmann
import qa_instance
39 cec9845c Michael Hanselmann
import qa_node
40 8947cf2b Michael Hanselmann
import qa_os
41 a47f574c Oleksiy Mishchenko
import qa_rapi
42 d74c2ca1 Michael Hanselmann
import qa_tags
43 1672a0d1 Michael Hanselmann
import qa_utils
44 a8083063 Iustin Pop
45 725ec2f1 René Nussbaumer
from ganeti import utils
46 2a7c3583 Michael Hanselmann
from ganeti import rapi
47 f3fd2c9d Adeodato Simo
from ganeti import constants
48 2a7c3583 Michael Hanselmann
49 3582eef6 Iustin Pop
import ganeti.rapi.client # pylint: disable-msg=W0611
50 725ec2f1 René Nussbaumer
51 a8083063 Iustin Pop
52 7d88f255 Iustin Pop
def _FormatHeader(line, end=72):
53 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
54 f89d59b9 Iustin Pop

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

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

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

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

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

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

123 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
124 725ec2f1 René Nussbaumer
  @param rapi_secret: Login secret for RAPI
125 725ec2f1 René Nussbaumer

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

156 b1ffe1eb Michael Hanselmann
  """
157 7d88f255 Iustin Pop
  for test, fn in [
158 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
159 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
160 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
161 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
162 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
163 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
164 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
165 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
166 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
167 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
168 7d88f255 Iustin Pop
    ("cluster-copyfile", qa_cluster.TestClusterCopyfile),
169 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
170 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
171 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
172 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
173 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
174 69df9d2b Iustin Pop
    ("cluster-oob", qa_cluster.TestClusterOob),
175 7d88f255 Iustin Pop
    ("rapi", qa_rapi.TestVersion),
176 7d88f255 Iustin Pop
    ("rapi", qa_rapi.TestEmptyCluster),
177 4fab7cab Michael Hanselmann
    ("rapi", qa_rapi.TestRapiQuery),
178 7d88f255 Iustin Pop
    ]:
179 7d88f255 Iustin Pop
    RunTestIf(test, fn)
180 8947cf2b Michael Hanselmann
181 6d4a1656 Michael Hanselmann
182 65a884ef Iustin Pop
def RunRepairDiskSizes():
183 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
184 65a884ef Iustin Pop

185 65a884ef Iustin Pop
  """
186 65a884ef Iustin Pop
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)
187 65a884ef Iustin Pop
188 65a884ef Iustin Pop
189 b1ffe1eb Michael Hanselmann
def RunOsTests():
190 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
191 5d640672 Michael Hanselmann

192 b1ffe1eb Michael Hanselmann
  """
193 2932dc44 Michael Hanselmann
  if qa_config.TestEnabled("rapi"):
194 2932dc44 Michael Hanselmann
    rapi_getos = qa_rapi.GetOperatingSystems
195 2932dc44 Michael Hanselmann
  else:
196 2932dc44 Michael Hanselmann
    rapi_getos = None
197 2932dc44 Michael Hanselmann
198 7d88f255 Iustin Pop
  for fn in [
199 7d88f255 Iustin Pop
    qa_os.TestOsList,
200 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
201 2932dc44 Michael Hanselmann
    ]:
202 2932dc44 Michael Hanselmann
    RunTestIf("os", fn)
203 2932dc44 Michael Hanselmann
204 2932dc44 Michael Hanselmann
  for fn in [
205 7d88f255 Iustin Pop
    qa_os.TestOsValid,
206 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
207 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
208 2932dc44 Michael Hanselmann
    ]:
209 2932dc44 Michael Hanselmann
    RunTestIf("os", fn, rapi_getos)
210 2932dc44 Michael Hanselmann
211 2932dc44 Michael Hanselmann
  for fn in [
212 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
213 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
214 074e139f Michael Hanselmann
    qa_os.TestOsStatesNonExisting,
215 7d88f255 Iustin Pop
    ]:
216 7d88f255 Iustin Pop
    RunTestIf("os", fn)
217 b1ffe1eb Michael Hanselmann
218 b1ffe1eb Michael Hanselmann
219 b1ffe1eb Michael Hanselmann
def RunCommonInstanceTests(instance):
220 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
221 b1ffe1eb Michael Hanselmann

222 b1ffe1eb Michael Hanselmann
  """
223 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
224 b82d4c5e Michael Hanselmann
  RunTestIf(["instance-shutdown", "instance-console", "rapi"],
225 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
226 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
227 a8083063 Iustin Pop
228 7d88f255 Iustin Pop
  RunTestIf("instance-list", qa_instance.TestInstanceList)
229 283f9d4c Michael Hanselmann
230 7d88f255 Iustin Pop
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
231 e9e35aaa Michael Hanselmann
232 7d88f255 Iustin Pop
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
233 7d88f255 Iustin Pop
  RunTestIf(["instance-modify", "rapi"],
234 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceModify, instance)
235 c0f74c55 Iustin Pop
236 7d88f255 Iustin Pop
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
237 b82d4c5e Michael Hanselmann
  RunTestIf(["instance-console", "rapi"],
238 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiInstanceConsole, instance)
239 4379b1fa Michael Hanselmann
240 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance)
241 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
242 0220d2cf Guido Trotter
  RunTestIf(["instance-reinstall", "rapi"],
243 0220d2cf Guido Trotter
            qa_rapi.TestRapiInstanceReinstall, instance)
244 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance)
245 a8083063 Iustin Pop
246 7d88f255 Iustin Pop
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
247 8a4e8898 Michael Hanselmann
248 18337ca9 Iustin Pop
  if qa_config.TestEnabled('instance-rename'):
249 e5c2accd Guido Trotter
    rename_source = instance["name"]
250 7fb50870 Michael Hanselmann
    rename_target = qa_config.get("rename", None)
251 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceShutdown, instance)
252 46747143 Guido Trotter
    # perform instance rename to the same name
253 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceRename, rename_source, rename_source)
254 930e77d1 Michael Hanselmann
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
255 930e77d1 Michael Hanselmann
              rename_source, rename_source)
256 46747143 Guido Trotter
    if rename_target is not None:
257 46747143 Guido Trotter
      # perform instance rename to a different name, if we have one configured
258 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_source, rename_target)
259 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_target, rename_source)
260 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
261 930e77d1 Michael Hanselmann
                rename_source, rename_target)
262 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
263 930e77d1 Michael Hanselmann
                rename_target, rename_source)
264 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceStartup, instance)
265 18337ca9 Iustin Pop
266 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
267 d74c2ca1 Michael Hanselmann
268 1ef6e776 Michael Hanselmann
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
269 d74c2ca1 Michael Hanselmann
270 7d88f255 Iustin Pop
  RunTestIf("rapi", qa_rapi.TestInstance, instance)
271 729c4377 Iustin Pop
272 288d6440 Michael Hanselmann
  # Lists instances, too
273 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
274 288d6440 Michael Hanselmann
275 729c4377 Iustin Pop
276 729c4377 Iustin Pop
def RunCommonNodeTests():
277 729c4377 Iustin Pop
  """Run a few common node tests.
278 729c4377 Iustin Pop

279 729c4377 Iustin Pop
  """
280 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
281 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
282 a1de4b18 René Nussbaumer
  RunTestIf("node-oob", qa_node.TestOutOfBand)
283 8e1db003 Michael Hanselmann
284 8d8d650c Michael Hanselmann
285 30131294 Adeodato Simo
def RunGroupListTests():
286 30131294 Adeodato Simo
  """Run tests for listing node groups.
287 30131294 Adeodato Simo

288 30131294 Adeodato Simo
  """
289 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
290 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
291 30131294 Adeodato Simo
292 30131294 Adeodato Simo
293 66787da5 Adeodato Simo
def RunGroupRwTests():
294 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
295 66787da5 Adeodato Simo

296 66787da5 Adeodato Simo
  """
297 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
298 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
299 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
300 b9e478fe Michael Hanselmann
  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
301 fe508a9d Michael Hanselmann
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
302 fe508a9d Michael Hanselmann
            qa_group.GetDefaultGroup())
303 4b10fb65 Adeodato Simo
304 66787da5 Adeodato Simo
305 638a7266 Iustin Pop
def RunExportImportTests(instance, pnode, snode):
306 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
307 a8083063 Iustin Pop

308 638a7266 Iustin Pop
  @param pnode: current primary node of the instance
309 638a7266 Iustin Pop
  @param snode: current secondary node of the instance, if any,
310 638a7266 Iustin Pop
      otherwise None
311 638a7266 Iustin Pop

312 b1ffe1eb Michael Hanselmann
  """
313 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-export'):
314 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
315 bc696589 Michael Hanselmann
316 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
317 b1ffe1eb Michael Hanselmann
    try:
318 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
319 b1ffe1eb Michael Hanselmann
320 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
321 b1ffe1eb Michael Hanselmann
322 b1ffe1eb Michael Hanselmann
      if qa_config.TestEnabled('instance-import'):
323 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
324 5d640672 Michael Hanselmann
        try:
325 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
326 b1ffe1eb Michael Hanselmann
                  expnode, name)
327 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
328 5d640672 Michael Hanselmann
        finally:
329 b1ffe1eb Michael Hanselmann
          qa_config.ReleaseInstance(newinst)
330 b1ffe1eb Michael Hanselmann
    finally:
331 b1ffe1eb Michael Hanselmann
      qa_config.ReleaseNode(expnode)
332 5d640672 Michael Hanselmann
333 7d88f255 Iustin Pop
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
334 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
335 5d831182 Michael Hanselmann
    try:
336 638a7266 Iustin Pop
      if snode is None:
337 638a7266 Iustin Pop
        excl = [pnode]
338 638a7266 Iustin Pop
      else:
339 638a7266 Iustin Pop
        excl = [pnode, snode]
340 638a7266 Iustin Pop
      tnode = qa_config.AcquireNode(exclude=excl)
341 5d831182 Michael Hanselmann
      try:
342 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
343 638a7266 Iustin Pop
                pnode, snode, tnode)
344 5d831182 Michael Hanselmann
      finally:
345 638a7266 Iustin Pop
        qa_config.ReleaseNode(tnode)
346 5d831182 Michael Hanselmann
    finally:
347 5d831182 Michael Hanselmann
      qa_config.ReleaseInstance(newinst)
348 5d831182 Michael Hanselmann
349 283f9d4c Michael Hanselmann
350 b998270c Iustin Pop
def RunDaemonTests(instance):
351 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
352 9df6d173 Michael Hanselmann

353 b1ffe1eb Michael Hanselmann
  """
354 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
355 e9e35aaa Michael Hanselmann
356 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
357 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
358 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
359 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
360 e9e35aaa Michael Hanselmann
361 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
362 8201b996 Iustin Pop
363 9df6d173 Michael Hanselmann
364 b1ffe1eb Michael Hanselmann
def RunHardwareFailureTests(instance, pnode, snode):
365 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
366 a8083063 Iustin Pop

367 b1ffe1eb Michael Hanselmann
  """
368 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
369 b1ffe1eb Michael Hanselmann
370 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
371 7d88f255 Iustin Pop
  RunTestIf(["instance-migrate", "rapi"],
372 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
373 938bde86 Michael Hanselmann
374 7910e7a5 Michael Hanselmann
  if qa_config.TestEnabled('instance-replace-disks'):
375 76f59a32 Michael Hanselmann
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
376 7910e7a5 Michael Hanselmann
    try:
377 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
378 7910e7a5 Michael Hanselmann
              instance, pnode, snode, othernode)
379 7910e7a5 Michael Hanselmann
    finally:
380 7910e7a5 Michael Hanselmann
      qa_config.ReleaseNode(othernode)
381 7910e7a5 Michael Hanselmann
382 7d88f255 Iustin Pop
  RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, pnode, snode)
383 b1ffe1eb Michael Hanselmann
384 7d88f255 Iustin Pop
  RunTestIf("node-failover", qa_node.TestNodeFailover, pnode, snode)
385 b1ffe1eb Michael Hanselmann
386 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
387 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
388 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure",
389 7d88f255 Iustin Pop
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
390 7d88f255 Iustin Pop
            pnode, snode)
391 b1ffe1eb Michael Hanselmann
392 b1ffe1eb Michael Hanselmann
393 f7e6f3c8 Iustin Pop
def RunQa():
394 f7e6f3c8 Iustin Pop
  """Main QA body.
395 b1ffe1eb Michael Hanselmann

396 b1ffe1eb Michael Hanselmann
  """
397 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
398 725ec2f1 René Nussbaumer
  rapi_secret = utils.GenerateSecret()
399 725ec2f1 René Nussbaumer
400 b1ffe1eb Michael Hanselmann
  RunEnvTests()
401 725ec2f1 René Nussbaumer
  SetupCluster(rapi_user, rapi_secret)
402 2771835c Michael Hanselmann
403 2771835c Michael Hanselmann
  # Load RAPI certificate
404 76917d97 Iustin Pop
  qa_rapi.Setup(rapi_user, rapi_secret)
405 2771835c Michael Hanselmann
406 b1ffe1eb Michael Hanselmann
  RunClusterTests()
407 b1ffe1eb Michael Hanselmann
  RunOsTests()
408 4b62db14 Michael Hanselmann
409 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
410 d74c2ca1 Michael Hanselmann
411 729c4377 Iustin Pop
  RunCommonNodeTests()
412 30131294 Adeodato Simo
  RunGroupListTests()
413 66787da5 Adeodato Simo
  RunGroupRwTests()
414 729c4377 Iustin Pop
415 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
416 d0cb68cb Michael Hanselmann
  try:
417 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
418 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
419 d0cb68cb Michael Hanselmann
  finally:
420 d0cb68cb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
421 102b115b Michael Hanselmann
422 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
423 b1ffe1eb Michael Hanselmann
  try:
424 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
425 d74c2ca1 Michael Hanselmann
426 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
427 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
428 a47f574c Oleksiy Mishchenko
429 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
430 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
431 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
432 924e95f9 Michael Hanselmann
                                  use_client)
433 924e95f9 Michael Hanselmann
          RunCommonInstanceTests(rapi_instance)
434 924e95f9 Michael Hanselmann
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
435 924e95f9 Michael Hanselmann
          del rapi_instance
436 8cb70e56 Michael Hanselmann
437 65a884ef Iustin Pop
    if qa_config.TestEnabled("instance-add-plain-disk"):
438 b1ffe1eb Michael Hanselmann
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
439 b1ffe1eb Michael Hanselmann
      RunCommonInstanceTests(instance)
440 30131294 Adeodato Simo
      RunGroupListTests()
441 24fed61e René Nussbaumer
      RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
442 638a7266 Iustin Pop
      RunExportImportTests(instance, pnode, None)
443 b998270c Iustin Pop
      RunDaemonTests(instance)
444 65a884ef Iustin Pop
      RunRepairDiskSizes()
445 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestInstanceRemove, instance)
446 b1ffe1eb Michael Hanselmann
      del instance
447 9df6d173 Michael Hanselmann
448 7d7609a3 Michael Hanselmann
    multinode_tests = [
449 7d7609a3 Michael Hanselmann
      ('instance-add-drbd-disk',
450 7d7609a3 Michael Hanselmann
       qa_instance.TestInstanceAddWithDrbdDisk),
451 7d7609a3 Michael Hanselmann
    ]
452 7d7609a3 Michael Hanselmann
453 7d7609a3 Michael Hanselmann
    for name, func in multinode_tests:
454 7d7609a3 Michael Hanselmann
      if qa_config.TestEnabled(name):
455 7d7609a3 Michael Hanselmann
        snode = qa_config.AcquireNode(exclude=pnode)
456 7d7609a3 Michael Hanselmann
        try:
457 7d7609a3 Michael Hanselmann
          instance = RunTest(func, pnode, snode)
458 7d7609a3 Michael Hanselmann
          RunCommonInstanceTests(instance)
459 30131294 Adeodato Simo
          RunGroupListTests()
460 f3fd2c9d Adeodato Simo
          RunTest(qa_group.TestAssignNodesIncludingSplit,
461 f3fd2c9d Adeodato Simo
                  constants.INITIAL_NODE_GROUP_NAME,
462 f3fd2c9d Adeodato Simo
                  pnode["primary"], snode["primary"])
463 7f69aabb Iustin Pop
          if qa_config.TestEnabled('instance-convert-disk'):
464 f9f0ce7f Guido Trotter
            RunTest(qa_instance.TestInstanceShutdown, instance)
465 7f69aabb Iustin Pop
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
466 f9f0ce7f Guido Trotter
            RunTest(qa_instance.TestInstanceStartup, instance)
467 638a7266 Iustin Pop
          RunExportImportTests(instance, pnode, snode)
468 7d7609a3 Michael Hanselmann
          RunHardwareFailureTests(instance, pnode, snode)
469 65a884ef Iustin Pop
          RunRepairDiskSizes()
470 7d7609a3 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
471 7d7609a3 Michael Hanselmann
          del instance
472 7d7609a3 Michael Hanselmann
        finally:
473 7d7609a3 Michael Hanselmann
          qa_config.ReleaseNode(snode)
474 a8083063 Iustin Pop
475 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
476 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
477 3b01286e Michael Hanselmann
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
478 3b01286e Michael Hanselmann
        expnode = qa_config.AcquireNode(exclude=pnode)
479 3b01286e Michael Hanselmann
        try:
480 3b01286e Michael Hanselmann
          if shutdown:
481 3b01286e Michael Hanselmann
            # Stop instance before exporting and removing it
482 3b01286e Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
483 3b01286e Michael Hanselmann
          RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
484 3b01286e Michael Hanselmann
          RunTest(qa_instance.TestBackupList, expnode)
485 3b01286e Michael Hanselmann
        finally:
486 3b01286e Michael Hanselmann
          qa_config.ReleaseNode(expnode)
487 3b01286e Michael Hanselmann
        del expnode
488 3b01286e Michael Hanselmann
        del instance
489 8d8d650c Michael Hanselmann
490 a8083063 Iustin Pop
  finally:
491 b1ffe1eb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
492 a8083063 Iustin Pop
493 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
494 a8083063 Iustin Pop
495 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
496 a8083063 Iustin Pop
497 cec9845c Michael Hanselmann
498 f7e6f3c8 Iustin Pop
@rapi.client.UsesRapiClient
499 f7e6f3c8 Iustin Pop
def main():
500 f7e6f3c8 Iustin Pop
  """Main program.
501 f7e6f3c8 Iustin Pop

502 f7e6f3c8 Iustin Pop
  """
503 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
504 f7e6f3c8 Iustin Pop
  parser.add_option('--yes-do-it', dest='yes_do_it',
505 f7e6f3c8 Iustin Pop
      action="store_true",
506 f7e6f3c8 Iustin Pop
      help="Really execute the tests")
507 f7e6f3c8 Iustin Pop
  (qa_config.options, args) = parser.parse_args()
508 f7e6f3c8 Iustin Pop
509 f7e6f3c8 Iustin Pop
  if len(args) == 1:
510 f7e6f3c8 Iustin Pop
    (config_file, ) = args
511 f7e6f3c8 Iustin Pop
  else:
512 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
513 f7e6f3c8 Iustin Pop
514 f7e6f3c8 Iustin Pop
  if not qa_config.options.yes_do_it:
515 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
516 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
517 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
518 f7e6f3c8 Iustin Pop
    sys.exit(1)
519 f7e6f3c8 Iustin Pop
520 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
521 f7e6f3c8 Iustin Pop
522 f7e6f3c8 Iustin Pop
  qa_utils.StartMultiplexer(qa_config.GetMasterNode()["primary"])
523 f7e6f3c8 Iustin Pop
  try:
524 f7e6f3c8 Iustin Pop
    RunQa()
525 f7e6f3c8 Iustin Pop
  finally:
526 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
527 f7e6f3c8 Iustin Pop
528 cec9845c Michael Hanselmann
if __name__ == '__main__':
529 cec9845c Michael Hanselmann
  main()