ganeti-qa.py 16.2 KB
Newer Older
Iustin Pop's avatar
Iustin Pop committed
1
#!/usr/bin/python -u
Iustin Pop's avatar
Iustin Pop committed
2
3
#

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


22
"""Script for doing QA on Ganeti.
23
24

"""
Iustin Pop's avatar
Iustin Pop committed
25

26
# pylint: disable=C0103
Iustin Pop's avatar
Iustin Pop committed
27
28
# due to invalid name

Iustin Pop's avatar
Iustin Pop committed
29
import sys
30
31
import datetime
import optparse
Iustin Pop's avatar
Iustin Pop committed
32

33
34
35
36
import qa_cluster
import qa_config
import qa_daemon
import qa_env
37
import qa_group
38
39
import qa_instance
import qa_node
40
import qa_os
Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
41
import qa_rapi
Michael Hanselmann's avatar
Michael Hanselmann committed
42
import qa_tags
43
import qa_utils
Iustin Pop's avatar
Iustin Pop committed
44

45
from ganeti import utils
46
from ganeti import rapi
47
from ganeti import constants
48

49
import ganeti.rapi.client # pylint: disable=W0611
50

Iustin Pop's avatar
Iustin Pop committed
51

Iustin Pop's avatar
Iustin Pop committed
52
def _FormatHeader(line, end=72):
Iustin Pop's avatar
Iustin Pop committed
53
54
55
56
  """Fill a line up to the end column.

  """
  line = "---- " + line + " "
Andrea Spadaccini's avatar
Andrea Spadaccini committed
57
  line += "-" * (end - len(line))
Iustin Pop's avatar
Iustin Pop committed
58
59
60
61
  line = line.rstrip()
  return line


Iustin Pop's avatar
Iustin Pop committed
62
63
def _DescriptionOf(fn):
  """Computes the description of an item.
Iustin Pop's avatar
Iustin Pop committed
64
65

  """
66
67
  if fn.__doc__:
    desc = fn.__doc__.splitlines()[0].strip()
Iustin Pop's avatar
Iustin Pop committed
68
  else:
Iustin Pop's avatar
Iustin Pop committed
69
    desc = "%r" % fn
Iustin Pop's avatar
Iustin Pop committed
70

Iustin Pop's avatar
Iustin Pop committed
71
72
  return desc.rstrip(".")

73

Iustin Pop's avatar
Iustin Pop committed
74
75
76
77
def RunTest(fn, *args):
  """Runs a test after printing a header.

  """
Iustin Pop's avatar
Iustin Pop committed
78

Iustin Pop's avatar
Iustin Pop committed
79
  tstart = datetime.datetime.now()
Iustin Pop's avatar
Iustin Pop committed
80

Iustin Pop's avatar
Iustin Pop committed
81
82
  desc = _DescriptionOf(fn)

Iustin Pop's avatar
Iustin Pop committed
83
84
85
86
87
88
89
90
91
92
  print
  print _FormatHeader("%s start %s" % (tstart, desc))

  try:
    retval = fn(*args)
    return retval
  finally:
    tstop = datetime.datetime.now()
    tdelta = tstop - tstart
    print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc))
Iustin Pop's avatar
Iustin Pop committed
93
94


Iustin Pop's avatar
Iustin Pop committed
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
def RunTestIf(testnames, fn, *args):
  """Runs a test conditionally.

  @param testnames: either a single test name in the configuration
      file, or a list of testnames (which will be AND-ed together)

  """
  if qa_config.TestEnabled(testnames):
    RunTest(fn, *args)
  else:
    tstart = datetime.datetime.now()
    desc = _DescriptionOf(fn)
    print _FormatHeader("%s skipping %s, test(s) %s disabled" %
                        (tstart, desc, testnames))


Michael Hanselmann's avatar
Michael Hanselmann committed
111
112
def RunEnvTests():
  """Run several environment tests.
Iustin Pop's avatar
Iustin Pop committed
113
114

  """
Iustin Pop's avatar
Iustin Pop committed
115
116
117
  RunTestIf("env", qa_env.TestSshConnection)
  RunTestIf("env", qa_env.TestIcmpPing)
  RunTestIf("env", qa_env.TestGanetiCommands)
Iustin Pop's avatar
Iustin Pop committed
118

119

120
def SetupCluster(rapi_user, rapi_secret):
Michael Hanselmann's avatar
Michael Hanselmann committed
121
  """Initializes the cluster.
Iustin Pop's avatar
Iustin Pop committed
122

123
124
125
  @param rapi_user: Login user for RAPI
  @param rapi_secret: Login secret for RAPI

Michael Hanselmann's avatar
Michael Hanselmann committed
126
  """
Iustin Pop's avatar
Iustin Pop committed
127
128
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
            rapi_user, rapi_secret)
129
130
131
132
133

  # Test on empty cluster
  RunTestIf("node-list", qa_node.TestNodeList)
  RunTestIf("instance-list", qa_instance.TestInstanceList)

Iustin Pop's avatar
Iustin Pop committed
134
135
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
  if not qa_config.TestEnabled("create-cluster"):
136
137
    # consider the nodes are already there
    qa_node.MarkNodeAddedAll()
138

Iustin Pop's avatar
Iustin Pop committed
139
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
140

141
142
143
  # enable the watcher (unconditionally)
  RunTest(qa_daemon.TestResumeWatcher)

144
145
  RunTestIf("node-list", qa_node.TestNodeList)

146
147
148
149
  # Test listing fields
  RunTestIf("node-list", qa_node.TestNodeListFields)
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)

Iustin Pop's avatar
Iustin Pop committed
150
  RunTestIf("node-info", qa_node.TestNodeInfo)
Michael Hanselmann's avatar
Michael Hanselmann committed
151
152
153
154


def RunClusterTests():
  """Runs tests related to gnt-cluster.
155

Michael Hanselmann's avatar
Michael Hanselmann committed
156
  """
Iustin Pop's avatar
Iustin Pop committed
157
  for test, fn in [
158
    ("create-cluster", qa_cluster.TestClusterInitDisk),
Iustin Pop's avatar
Iustin Pop committed
159
160
161
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
    ("cluster-verify", qa_cluster.TestClusterVerify),
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
162
    # TODO: add more cluster modify tests
Iustin Pop's avatar
Iustin Pop committed
163
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
164
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
Iustin Pop's avatar
Iustin Pop committed
165
166
167
168
    ("cluster-rename", qa_cluster.TestClusterRename),
    ("cluster-info", qa_cluster.TestClusterVersion),
    ("cluster-info", qa_cluster.TestClusterInfo),
    ("cluster-info", qa_cluster.TestClusterGetmaster),
Iustin Pop's avatar
Iustin Pop committed
169
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
Iustin Pop's avatar
Iustin Pop committed
170
171
172
173
    ("cluster-copyfile", qa_cluster.TestClusterCopyfile),
    ("cluster-command", qa_cluster.TestClusterCommand),
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
174
175
    ("cluster-master-failover",
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
Iustin Pop's avatar
Iustin Pop committed
176
    ("cluster-oob", qa_cluster.TestClusterOob),
Iustin Pop's avatar
Iustin Pop committed
177
178
    ("rapi", qa_rapi.TestVersion),
    ("rapi", qa_rapi.TestEmptyCluster),
179
    ("rapi", qa_rapi.TestRapiQuery),
Iustin Pop's avatar
Iustin Pop committed
180
181
    ]:
    RunTestIf(test, fn)
182

183

184
185
186
187
188
189
190
def RunRepairDiskSizes():
  """Run the repair disk-sizes test.

  """
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)


Michael Hanselmann's avatar
Michael Hanselmann committed
191
192
def RunOsTests():
  """Runs all tests related to gnt-os.
Michael Hanselmann's avatar
Michael Hanselmann committed
193

Michael Hanselmann's avatar
Michael Hanselmann committed
194
  """
195
196
197
198
199
  if qa_config.TestEnabled("rapi"):
    rapi_getos = qa_rapi.GetOperatingSystems
  else:
    rapi_getos = None

Iustin Pop's avatar
Iustin Pop committed
200
201
202
  for fn in [
    qa_os.TestOsList,
    qa_os.TestOsDiagnose,
203
204
205
206
    ]:
    RunTestIf("os", fn)

  for fn in [
Iustin Pop's avatar
Iustin Pop committed
207
208
209
    qa_os.TestOsValid,
    qa_os.TestOsInvalid,
    qa_os.TestOsPartiallyValid,
210
211
212
213
    ]:
    RunTestIf("os", fn, rapi_getos)

  for fn in [
Iustin Pop's avatar
Iustin Pop committed
214
215
    qa_os.TestOsModifyValid,
    qa_os.TestOsModifyInvalid,
216
    qa_os.TestOsStatesNonExisting,
Iustin Pop's avatar
Iustin Pop committed
217
218
    ]:
    RunTestIf("os", fn)
Michael Hanselmann's avatar
Michael Hanselmann committed
219
220
221
222
223
224


def RunCommonInstanceTests(instance):
  """Runs a few tests that are common to all disk types.

  """
Iustin Pop's avatar
Iustin Pop committed
225
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
226
227
  RunTestIf(["instance-shutdown", "instance-console", "rapi"],
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
Iustin Pop's avatar
Iustin Pop committed
228
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
Iustin Pop's avatar
Iustin Pop committed
229

230
231
232
233
234
235
  # Test shutdown/start via RAPI
  RunTestIf(["instance-shutdown", "rapi"],
            qa_rapi.TestRapiInstanceShutdown, instance)
  RunTestIf(["instance-shutdown", "rapi"],
            qa_rapi.TestRapiInstanceStartup, instance)

Iustin Pop's avatar
Iustin Pop committed
236
  RunTestIf("instance-list", qa_instance.TestInstanceList)
Michael Hanselmann's avatar
Michael Hanselmann committed
237

Iustin Pop's avatar
Iustin Pop committed
238
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
239

Iustin Pop's avatar
Iustin Pop committed
240
241
242
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
  RunTestIf(["instance-modify", "rapi"],
            qa_rapi.TestRapiInstanceModify, instance)
243

Iustin Pop's avatar
Iustin Pop committed
244
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
245
246
  RunTestIf(["instance-console", "rapi"],
            qa_rapi.TestRapiInstanceConsole, instance)
247

Iustin Pop's avatar
Iustin Pop committed
248
249
250
251
252
  DOWN_TESTS = ["instance-reinstall", "instance-rename"]
  # shutdown instance for any 'down' tests
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceShutdown, instance)

  # now run the 'down' state tests
Iustin Pop's avatar
Iustin Pop committed
253
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
254
255
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceReinstall, instance)
Iustin Pop's avatar
Iustin Pop committed
256
257
258
259
  # RAPI reinstall will leave the instance up by default, so we have
  # to stop it again
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceShutdown, instance)
260

Iustin Pop's avatar
Iustin Pop committed
261
  if qa_config.TestEnabled("instance-rename"):
262
    rename_source = instance["name"]
263
    rename_target = qa_config.get("rename", None)
264
    # perform instance rename to the same name
Iustin Pop's avatar
Iustin Pop committed
265
266
267
    RunTest(qa_instance.TestInstanceRenameAndBack,
            rename_source, rename_source)
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRenameAndBack,
268
              rename_source, rename_source)
269
270
    if rename_target is not None:
      # perform instance rename to a different name, if we have one configured
Iustin Pop's avatar
Iustin Pop committed
271
272
273
      RunTest(qa_instance.TestInstanceRenameAndBack,
              rename_source, rename_target)
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRenameAndBack,
274
                rename_source, rename_target)
Iustin Pop's avatar
Iustin Pop committed
275
276
277
278
279

  # and now start the instance again
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceStartup, instance)

  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
280

Iustin Pop's avatar
Iustin Pop committed
281
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
Michael Hanselmann's avatar
Michael Hanselmann committed
282

Michael Hanselmann's avatar
Michael Hanselmann committed
283
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
Michael Hanselmann's avatar
Michael Hanselmann committed
284

Iustin Pop's avatar
Iustin Pop committed
285
  RunTestIf("rapi", qa_rapi.TestInstance, instance)
286

287
288
289
  # Lists instances, too
  RunTestIf("node-list", qa_node.TestNodeList)

290
291
292
293
294

def RunCommonNodeTests():
  """Run a few common node tests.

  """
Iustin Pop's avatar
Iustin Pop committed
295
296
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
  RunTestIf("node-storage", qa_node.TestNodeStorage)
297
  RunTestIf("node-oob", qa_node.TestOutOfBand)
298

299

300
301
302
303
def RunGroupListTests():
  """Run tests for listing node groups.

  """
304
305
  RunTestIf("group-list", qa_group.TestGroupList)
  RunTestIf("group-list", qa_group.TestGroupListFields)
306
307


308
309
310
311
312
def RunGroupRwTests():
  """Run tests for adding/removing/renaming groups.

  """
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
313
314
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
  RunTestIf("group-rwops", qa_group.TestGroupModify)
315
  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
316
317
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
            qa_group.GetDefaultGroup())
318

319

320
def RunExportImportTests(instance, pnode, snode):
Michael Hanselmann's avatar
Michael Hanselmann committed
321
  """Tries to export and import the instance.
Iustin Pop's avatar
Iustin Pop committed
322

323
324
325
326
  @param pnode: current primary node of the instance
  @param snode: current secondary node of the instance, if any,
      otherwise None

Michael Hanselmann's avatar
Michael Hanselmann committed
327
  """
Iustin Pop's avatar
Iustin Pop committed
328
  if qa_config.TestEnabled("instance-export"):
329
330
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)

Michael Hanselmann's avatar
Michael Hanselmann committed
331
332
333
334
335
336
    expnode = qa_config.AcquireNode(exclude=pnode)
    try:
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)

      RunTest(qa_instance.TestBackupList, expnode)

Iustin Pop's avatar
Iustin Pop committed
337
      if qa_config.TestEnabled("instance-import"):
Michael Hanselmann's avatar
Michael Hanselmann committed
338
        newinst = qa_config.AcquireInstance()
Michael Hanselmann's avatar
Michael Hanselmann committed
339
        try:
Michael Hanselmann's avatar
Michael Hanselmann committed
340
341
342
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
                  expnode, name)
          RunTest(qa_instance.TestInstanceRemove, newinst)
Michael Hanselmann's avatar
Michael Hanselmann committed
343
        finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
344
345
346
          qa_config.ReleaseInstance(newinst)
    finally:
      qa_config.ReleaseNode(expnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
347

Iustin Pop's avatar
Iustin Pop committed
348
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
349
350
    newinst = qa_config.AcquireInstance()
    try:
351
352
353
354
355
      if snode is None:
        excl = [pnode]
      else:
        excl = [pnode, snode]
      tnode = qa_config.AcquireNode(exclude=excl)
356
357
      try:
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
358
                pnode, snode, tnode)
359
      finally:
360
        qa_config.ReleaseNode(tnode)
361
362
363
    finally:
      qa_config.ReleaseInstance(newinst)

Michael Hanselmann's avatar
Michael Hanselmann committed
364

365
def RunDaemonTests(instance):
Michael Hanselmann's avatar
Michael Hanselmann committed
366
  """Test the ganeti-watcher script.
367

Michael Hanselmann's avatar
Michael Hanselmann committed
368
  """
369
  RunTest(qa_daemon.TestPauseWatcher)
370

Iustin Pop's avatar
Iustin Pop committed
371
  RunTestIf("instance-automatic-restart",
372
            qa_daemon.TestInstanceAutomaticRestart, instance)
Iustin Pop's avatar
Iustin Pop committed
373
  RunTestIf("instance-consecutive-failures",
374
            qa_daemon.TestInstanceConsecutiveFailures, instance)
375

376
377
  RunTest(qa_daemon.TestResumeWatcher)

378

Michael Hanselmann's avatar
Michael Hanselmann committed
379
380
def RunHardwareFailureTests(instance, pnode, snode):
  """Test cluster internal hardware failure recovery.
Iustin Pop's avatar
Iustin Pop committed
381

Michael Hanselmann's avatar
Michael Hanselmann committed
382
  """
Iustin Pop's avatar
Iustin Pop committed
383
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
384
385
  RunTestIf(["instance-failover", "rapi"],
            qa_rapi.TestRapiInstanceFailover, instance)
Michael Hanselmann's avatar
Michael Hanselmann committed
386

Iustin Pop's avatar
Iustin Pop committed
387
388
389
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
  RunTestIf(["instance-migrate", "rapi"],
            qa_rapi.TestRapiInstanceMigrate, instance)
390

Iustin Pop's avatar
Iustin Pop committed
391
  if qa_config.TestEnabled("instance-replace-disks"):
392
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
393
    try:
394
      RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance)
395
396
397
398
399
      RunTest(qa_instance.TestReplaceDisks,
              instance, pnode, snode, othernode)
    finally:
      qa_config.ReleaseNode(othernode)

Iustin Pop's avatar
Iustin Pop committed
400
  RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, pnode, snode)
Michael Hanselmann's avatar
Michael Hanselmann committed
401

Iustin Pop's avatar
Iustin Pop committed
402
  RunTestIf("node-failover", qa_node.TestNodeFailover, pnode, snode)
Michael Hanselmann's avatar
Michael Hanselmann committed
403

Iustin Pop's avatar
Iustin Pop committed
404
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
Michael Hanselmann's avatar
Michael Hanselmann committed
405
            instance, pnode, snode)
Iustin Pop's avatar
Iustin Pop committed
406
407
408
  RunTestIf("instance-disk-failure",
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
            pnode, snode)
Michael Hanselmann's avatar
Michael Hanselmann committed
409
410


411
412
def RunQa():
  """Main QA body.
Michael Hanselmann's avatar
Michael Hanselmann committed
413
414

  """
415
416
417
  rapi_user = "ganeti-qa"
  rapi_secret = utils.GenerateSecret()

Michael Hanselmann's avatar
Michael Hanselmann committed
418
  RunEnvTests()
419
  SetupCluster(rapi_user, rapi_secret)
Michael Hanselmann's avatar
Michael Hanselmann committed
420
421

  # Load RAPI certificate
422
  qa_rapi.Setup(rapi_user, rapi_secret)
Michael Hanselmann's avatar
Michael Hanselmann committed
423

Michael Hanselmann's avatar
Michael Hanselmann committed
424
425
  RunClusterTests()
  RunOsTests()
426

Iustin Pop's avatar
Iustin Pop committed
427
  RunTestIf("tags", qa_tags.TestClusterTags)
Michael Hanselmann's avatar
Michael Hanselmann committed
428

429
  RunCommonNodeTests()
430
  RunGroupListTests()
431
  RunGroupRwTests()
432

433
434
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
  try:
Iustin Pop's avatar
Iustin Pop committed
435
436
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
437
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
438
439
  finally:
    qa_config.ReleaseNode(pnode)
440

Michael Hanselmann's avatar
Michael Hanselmann committed
441
442
  pnode = qa_config.AcquireNode()
  try:
Iustin Pop's avatar
Iustin Pop committed
443
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
444

Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
445
446
447
    if qa_rapi.Enabled():
      RunTest(qa_rapi.TestNode, pnode)

448
      if qa_config.TestEnabled("instance-add-plain-disk"):
449
450
451
452
453
454
        for use_client in [True, False]:
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
                                  use_client)
          RunCommonInstanceTests(rapi_instance)
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
          del rapi_instance
455

456
    if qa_config.TestEnabled("instance-add-plain-disk"):
Michael Hanselmann's avatar
Michael Hanselmann committed
457
458
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
      RunCommonInstanceTests(instance)
459
      RunGroupListTests()
460
      RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
461
      RunExportImportTests(instance, pnode, None)
462
      RunDaemonTests(instance)
463
      RunRepairDiskSizes()
Michael Hanselmann's avatar
Michael Hanselmann committed
464
465
      RunTest(qa_instance.TestInstanceRemove, instance)
      del instance
466

467
    multinode_tests = [
Iustin Pop's avatar
Iustin Pop committed
468
      ("instance-add-drbd-disk",
469
470
471
472
473
474
475
476
477
       qa_instance.TestInstanceAddWithDrbdDisk),
    ]

    for name, func in multinode_tests:
      if qa_config.TestEnabled(name):
        snode = qa_config.AcquireNode(exclude=pnode)
        try:
          instance = RunTest(func, pnode, snode)
          RunCommonInstanceTests(instance)
478
          RunGroupListTests()
479
480
481
          RunTest(qa_group.TestAssignNodesIncludingSplit,
                  constants.INITIAL_NODE_GROUP_NAME,
                  pnode["primary"], snode["primary"])
Iustin Pop's avatar
Iustin Pop committed
482
          if qa_config.TestEnabled("instance-convert-disk"):
483
            RunTest(qa_instance.TestInstanceShutdown, instance)
484
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
485
            RunTest(qa_instance.TestInstanceStartup, instance)
486
          RunExportImportTests(instance, pnode, snode)
487
          RunHardwareFailureTests(instance, pnode, snode)
488
          RunRepairDiskSizes()
489
490
491
492
          RunTest(qa_instance.TestInstanceRemove, instance)
          del instance
        finally:
          qa_config.ReleaseNode(snode)
Iustin Pop's avatar
Iustin Pop committed
493

Iustin Pop's avatar
Iustin Pop committed
494
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
495
496
497
498
499
500
501
502
503
504
505
506
507
      for shutdown in [False, True]:
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
        expnode = qa_config.AcquireNode(exclude=pnode)
        try:
          if shutdown:
            # Stop instance before exporting and removing it
            RunTest(qa_instance.TestInstanceShutdown, instance)
          RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
          RunTest(qa_instance.TestBackupList, expnode)
        finally:
          qa_config.ReleaseNode(expnode)
        del expnode
        del instance
508

Iustin Pop's avatar
Iustin Pop committed
509
  finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
510
    qa_config.ReleaseNode(pnode)
Iustin Pop's avatar
Iustin Pop committed
511

Iustin Pop's avatar
Iustin Pop committed
512
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
Iustin Pop's avatar
Iustin Pop committed
513

Iustin Pop's avatar
Iustin Pop committed
514
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
Iustin Pop's avatar
Iustin Pop committed
515

516

517
518
519
520
521
522
@rapi.client.UsesRapiClient
def main():
  """Main program.

  """
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
Iustin Pop's avatar
Iustin Pop committed
523
  parser.add_option("--yes-do-it", dest="yes_do_it",
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
      action="store_true",
      help="Really execute the tests")
  (qa_config.options, args) = parser.parse_args()

  if len(args) == 1:
    (config_file, ) = args
  else:
    parser.error("Wrong number of arguments.")

  if not qa_config.options.yes_do_it:
    print ("Executing this script irreversibly destroys any Ganeti\n"
           "configuration on all nodes involved. If you really want\n"
           "to start testing, supply the --yes-do-it option.")
    sys.exit(1)

  qa_config.Load(config_file)

  qa_utils.StartMultiplexer(qa_config.GetMasterNode()["primary"])
  try:
    RunQa()
  finally:
    qa_utils.CloseMultiplexers()

Iustin Pop's avatar
Iustin Pop committed
547
if __name__ == "__main__":
548
  main()