Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ e2ea8de1

History | View | Annotate | Download (15.9 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 b459a848 Andrea Spadaccini
# pylint: disable=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 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=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 21bf2e2e Andrea Spadaccini
  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 a7418448 Michael Hanselmann
  # Test shutdown/start via RAPI
229 a7418448 Michael Hanselmann
  RunTestIf(["instance-shutdown", "rapi"],
230 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceShutdown, instance)
231 a7418448 Michael Hanselmann
  RunTestIf(["instance-shutdown", "rapi"],
232 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceStartup, instance)
233 a7418448 Michael Hanselmann
234 7d88f255 Iustin Pop
  RunTestIf("instance-list", qa_instance.TestInstanceList)
235 283f9d4c Michael Hanselmann
236 7d88f255 Iustin Pop
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
237 e9e35aaa Michael Hanselmann
238 7d88f255 Iustin Pop
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
239 7d88f255 Iustin Pop
  RunTestIf(["instance-modify", "rapi"],
240 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceModify, instance)
241 c0f74c55 Iustin Pop
242 7d88f255 Iustin Pop
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
243 b82d4c5e Michael Hanselmann
  RunTestIf(["instance-console", "rapi"],
244 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiInstanceConsole, instance)
245 4379b1fa Michael Hanselmann
246 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance)
247 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
248 0220d2cf Guido Trotter
  RunTestIf(["instance-reinstall", "rapi"],
249 0220d2cf Guido Trotter
            qa_rapi.TestRapiInstanceReinstall, instance)
250 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance)
251 a8083063 Iustin Pop
252 7d88f255 Iustin Pop
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
253 8a4e8898 Michael Hanselmann
254 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-rename"):
255 e5c2accd Guido Trotter
    rename_source = instance["name"]
256 7fb50870 Michael Hanselmann
    rename_target = qa_config.get("rename", None)
257 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceShutdown, instance)
258 46747143 Guido Trotter
    # perform instance rename to the same name
259 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceRename, rename_source, rename_source)
260 930e77d1 Michael Hanselmann
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
261 930e77d1 Michael Hanselmann
              rename_source, rename_source)
262 46747143 Guido Trotter
    if rename_target is not None:
263 46747143 Guido Trotter
      # perform instance rename to a different name, if we have one configured
264 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_source, rename_target)
265 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_target, rename_source)
266 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
267 930e77d1 Michael Hanselmann
                rename_source, rename_target)
268 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
269 930e77d1 Michael Hanselmann
                rename_target, rename_source)
270 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceStartup, instance)
271 18337ca9 Iustin Pop
272 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
273 d74c2ca1 Michael Hanselmann
274 1ef6e776 Michael Hanselmann
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
275 d74c2ca1 Michael Hanselmann
276 7d88f255 Iustin Pop
  RunTestIf("rapi", qa_rapi.TestInstance, instance)
277 729c4377 Iustin Pop
278 288d6440 Michael Hanselmann
  # Lists instances, too
279 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
280 288d6440 Michael Hanselmann
281 729c4377 Iustin Pop
282 729c4377 Iustin Pop
def RunCommonNodeTests():
283 729c4377 Iustin Pop
  """Run a few common node tests.
284 729c4377 Iustin Pop

285 729c4377 Iustin Pop
  """
286 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
287 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
288 a1de4b18 René Nussbaumer
  RunTestIf("node-oob", qa_node.TestOutOfBand)
289 8e1db003 Michael Hanselmann
290 8d8d650c Michael Hanselmann
291 30131294 Adeodato Simo
def RunGroupListTests():
292 30131294 Adeodato Simo
  """Run tests for listing node groups.
293 30131294 Adeodato Simo

294 30131294 Adeodato Simo
  """
295 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
296 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
297 30131294 Adeodato Simo
298 30131294 Adeodato Simo
299 66787da5 Adeodato Simo
def RunGroupRwTests():
300 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
301 66787da5 Adeodato Simo

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

314 638a7266 Iustin Pop
  @param pnode: current primary node of the instance
315 638a7266 Iustin Pop
  @param snode: current secondary node of the instance, if any,
316 638a7266 Iustin Pop
      otherwise None
317 638a7266 Iustin Pop

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

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

373 b1ffe1eb Michael Hanselmann
  """
374 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
375 c0a146a1 Michael Hanselmann
  RunTestIf(["instance-failover", "rapi"],
376 c0a146a1 Michael Hanselmann
            qa_rapi.TestRapiInstanceFailover, instance)
377 b1ffe1eb Michael Hanselmann
378 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
379 7d88f255 Iustin Pop
  RunTestIf(["instance-migrate", "rapi"],
380 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
381 938bde86 Michael Hanselmann
382 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-replace-disks"):
383 76f59a32 Michael Hanselmann
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
384 7910e7a5 Michael Hanselmann
    try:
385 539d65ba Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance)
386 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
387 7910e7a5 Michael Hanselmann
              instance, pnode, snode, othernode)
388 7910e7a5 Michael Hanselmann
    finally:
389 7910e7a5 Michael Hanselmann
      qa_config.ReleaseNode(othernode)
390 7910e7a5 Michael Hanselmann
391 7d88f255 Iustin Pop
  RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, pnode, snode)
392 b1ffe1eb Michael Hanselmann
393 7d88f255 Iustin Pop
  RunTestIf("node-failover", qa_node.TestNodeFailover, pnode, snode)
394 b1ffe1eb Michael Hanselmann
395 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
396 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
397 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure",
398 7d88f255 Iustin Pop
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
399 7d88f255 Iustin Pop
            pnode, snode)
400 b1ffe1eb Michael Hanselmann
401 b1ffe1eb Michael Hanselmann
402 f7e6f3c8 Iustin Pop
def RunQa():
403 f7e6f3c8 Iustin Pop
  """Main QA body.
404 b1ffe1eb Michael Hanselmann

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

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