ganeti-qa.py 16.4 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, 2012 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
163
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
Iustin Pop's avatar
Iustin Pop committed
164
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
165
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
Iustin Pop's avatar
Iustin Pop committed
166
167
168
169
    ("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
170
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
Iustin Pop's avatar
Iustin Pop committed
171
172
173
174
    ("cluster-copyfile", qa_cluster.TestClusterCopyfile),
    ("cluster-command", qa_cluster.TestClusterCommand),
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
175
176
    ("cluster-master-failover",
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
Iustin Pop's avatar
Iustin Pop committed
177
    ("cluster-oob", qa_cluster.TestClusterOob),
Iustin Pop's avatar
Iustin Pop committed
178
179
    ("rapi", qa_rapi.TestVersion),
    ("rapi", qa_rapi.TestEmptyCluster),
180
    ("rapi", qa_rapi.TestRapiQuery),
Iustin Pop's avatar
Iustin Pop committed
181
182
    ]:
    RunTestIf(test, fn)
183

184

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

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


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

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

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

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

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


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

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

233
234
235
236
237
238
  # 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
239
  RunTestIf("instance-list", qa_instance.TestInstanceList)
Michael Hanselmann's avatar
Michael Hanselmann committed
240

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

Iustin Pop's avatar
Iustin Pop committed
243
244
245
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
  RunTestIf(["instance-modify", "rapi"],
            qa_rapi.TestRapiInstanceModify, instance)
246

Iustin Pop's avatar
Iustin Pop committed
247
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
248
249
  RunTestIf(["instance-console", "rapi"],
            qa_rapi.TestRapiInstanceConsole, instance)
250

Iustin Pop's avatar
Iustin Pop committed
251
252
253
254
255
  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
256
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
257
258
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceReinstall, instance)
Iustin Pop's avatar
Iustin Pop committed
259
260
261
262
  # RAPI reinstall will leave the instance up by default, so we have
  # to stop it again
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceShutdown, instance)
263

Iustin Pop's avatar
Iustin Pop committed
264
  if qa_config.TestEnabled("instance-rename"):
265
    rename_source = instance["name"]
266
    rename_target = qa_config.get("rename", None)
267
    # perform instance rename to the same name
Iustin Pop's avatar
Iustin Pop committed
268
269
270
    RunTest(qa_instance.TestInstanceRenameAndBack,
            rename_source, rename_source)
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRenameAndBack,
271
              rename_source, rename_source)
272
273
    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
274
275
276
      RunTest(qa_instance.TestInstanceRenameAndBack,
              rename_source, rename_target)
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRenameAndBack,
277
                rename_source, rename_target)
Iustin Pop's avatar
Iustin Pop committed
278
279
280
281
282

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

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

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

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

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

290
291
292
  # Lists instances, too
  RunTestIf("node-list", qa_node.TestNodeList)

293
294
295
296
297

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

  """
Iustin Pop's avatar
Iustin Pop committed
298
299
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
  RunTestIf("node-storage", qa_node.TestNodeStorage)
300
  RunTestIf("node-oob", qa_node.TestOutOfBand)
301

302

303
304
305
306
def RunGroupListTests():
  """Run tests for listing node groups.

  """
307
308
  RunTestIf("group-list", qa_group.TestGroupList)
  RunTestIf("group-list", qa_group.TestGroupListFields)
309
310


311
312
313
314
315
def RunGroupRwTests():
  """Run tests for adding/removing/renaming groups.

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

322

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

326
327
328
329
  @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
330
  """
Iustin Pop's avatar
Iustin Pop committed
331
  if qa_config.TestEnabled("instance-export"):
332
333
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)

Michael Hanselmann's avatar
Michael Hanselmann committed
334
335
336
337
338
339
    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
340
      if qa_config.TestEnabled("instance-import"):
Michael Hanselmann's avatar
Michael Hanselmann committed
341
        newinst = qa_config.AcquireInstance()
Michael Hanselmann's avatar
Michael Hanselmann committed
342
        try:
Michael Hanselmann's avatar
Michael Hanselmann committed
343
344
345
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
                  expnode, name)
          RunTest(qa_instance.TestInstanceRemove, newinst)
Michael Hanselmann's avatar
Michael Hanselmann committed
346
        finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
347
348
349
          qa_config.ReleaseInstance(newinst)
    finally:
      qa_config.ReleaseNode(expnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
350

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

Michael Hanselmann's avatar
Michael Hanselmann committed
367

368
def RunDaemonTests(instance):
Michael Hanselmann's avatar
Michael Hanselmann committed
369
  """Test the ganeti-watcher script.
370

Michael Hanselmann's avatar
Michael Hanselmann committed
371
  """
372
  RunTest(qa_daemon.TestPauseWatcher)
373

Iustin Pop's avatar
Iustin Pop committed
374
  RunTestIf("instance-automatic-restart",
375
            qa_daemon.TestInstanceAutomaticRestart, instance)
Iustin Pop's avatar
Iustin Pop committed
376
  RunTestIf("instance-consecutive-failures",
377
            qa_daemon.TestInstanceConsecutiveFailures, instance)
378

379
380
  RunTest(qa_daemon.TestResumeWatcher)

381

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

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

Iustin Pop's avatar
Iustin Pop committed
390
391
392
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
  RunTestIf(["instance-migrate", "rapi"],
            qa_rapi.TestRapiInstanceMigrate, instance)
393

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

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

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

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


414
415
def RunQa():
  """Main QA body.
Michael Hanselmann's avatar
Michael Hanselmann committed
416
417

  """
418
419
420
  rapi_user = "ganeti-qa"
  rapi_secret = utils.GenerateSecret()

Michael Hanselmann's avatar
Michael Hanselmann committed
421
  RunEnvTests()
422
  SetupCluster(rapi_user, rapi_secret)
Michael Hanselmann's avatar
Michael Hanselmann committed
423
424

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

Michael Hanselmann's avatar
Michael Hanselmann committed
427
428
  RunClusterTests()
  RunOsTests()
429

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

432
  RunCommonNodeTests()
433
  RunGroupListTests()
434
  RunGroupRwTests()
435

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

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

Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
448
449
450
    if qa_rapi.Enabled():
      RunTest(qa_rapi.TestNode, pnode)

451
      if qa_config.TestEnabled("instance-add-plain-disk"):
452
453
454
455
456
457
        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
458

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

470
    multinode_tests = [
Iustin Pop's avatar
Iustin Pop committed
471
      ("instance-add-drbd-disk",
472
473
474
475
476
477
478
479
480
       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)
481
          RunGroupListTests()
482
483
484
          RunTest(qa_group.TestAssignNodesIncludingSplit,
                  constants.INITIAL_NODE_GROUP_NAME,
                  pnode["primary"], snode["primary"])
Iustin Pop's avatar
Iustin Pop committed
485
          if qa_config.TestEnabled("instance-convert-disk"):
486
            RunTest(qa_instance.TestInstanceShutdown, instance)
487
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
488
            RunTest(qa_instance.TestInstanceStartup, instance)
489
          RunExportImportTests(instance, pnode, snode)
490
          RunHardwareFailureTests(instance, pnode, snode)
491
          RunRepairDiskSizes()
492
493
494
495
          RunTest(qa_instance.TestInstanceRemove, instance)
          del instance
        finally:
          qa_config.ReleaseNode(snode)
Iustin Pop's avatar
Iustin Pop committed
496

Iustin Pop's avatar
Iustin Pop committed
497
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
498
499
500
501
502
503
504
505
506
507
508
509
510
      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
511

Iustin Pop's avatar
Iustin Pop committed
512
  finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
513
    qa_config.ReleaseNode(pnode)
Iustin Pop's avatar
Iustin Pop committed
514

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

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

519

520
521
522
523
524
525
@rapi.client.UsesRapiClient
def main():
  """Main program.

  """
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
Iustin Pop's avatar
Iustin Pop committed
526
  parser.add_option("--yes-do-it", dest="yes_do_it",
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
      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
550
if __name__ == "__main__":
551
  main()