ganeti-qa.py 16.1 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
  RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance)
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
250
251
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceReinstall, instance)
Iustin Pop's avatar
Iustin Pop committed
252
  RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance)
Iustin Pop's avatar
Iustin Pop committed
253

Iustin Pop's avatar
Iustin Pop committed
254
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
255

Iustin Pop's avatar
Iustin Pop committed
256
  if qa_config.TestEnabled("instance-rename"):
257
    rename_source = instance["name"]
258
    rename_target = qa_config.get("rename", None)
259
260
261
    RunTest(qa_instance.TestInstanceShutdown, instance)
    # perform instance rename to the same name
    RunTest(qa_instance.TestInstanceRename, rename_source, rename_source)
262
263
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
              rename_source, rename_source)
264
265
    if rename_target is not None:
      # perform instance rename to a different name, if we have one configured
266
267
      RunTest(qa_instance.TestInstanceRename, rename_source, rename_target)
      RunTest(qa_instance.TestInstanceRename, rename_target, rename_source)
268
269
270
271
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
                rename_source, rename_target)
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
                rename_target, rename_source)
272
    RunTest(qa_instance.TestInstanceStartup, instance)
273

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

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

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

280
281
282
  # Lists instances, too
  RunTestIf("node-list", qa_node.TestNodeList)

283
284
285
286
287

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

  """
Iustin Pop's avatar
Iustin Pop committed
288
289
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
  RunTestIf("node-storage", qa_node.TestNodeStorage)
290
  RunTestIf("node-oob", qa_node.TestOutOfBand)
291

292

293
294
295
296
def RunGroupListTests():
  """Run tests for listing node groups.

  """
297
298
  RunTestIf("group-list", qa_group.TestGroupList)
  RunTestIf("group-list", qa_group.TestGroupListFields)
299
300


301
302
303
304
305
def RunGroupRwTests():
  """Run tests for adding/removing/renaming groups.

  """
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
306
307
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
  RunTestIf("group-rwops", qa_group.TestGroupModify)
308
  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
309
310
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
            qa_group.GetDefaultGroup())
311

312

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

316
317
318
319
  @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
320
  """
Iustin Pop's avatar
Iustin Pop committed
321
  if qa_config.TestEnabled("instance-export"):
322
323
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)

Michael Hanselmann's avatar
Michael Hanselmann committed
324
325
326
327
328
329
    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
330
      if qa_config.TestEnabled("instance-import"):
Michael Hanselmann's avatar
Michael Hanselmann committed
331
        newinst = qa_config.AcquireInstance()
Michael Hanselmann's avatar
Michael Hanselmann committed
332
        try:
Michael Hanselmann's avatar
Michael Hanselmann committed
333
334
335
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
                  expnode, name)
          RunTest(qa_instance.TestInstanceRemove, newinst)
Michael Hanselmann's avatar
Michael Hanselmann committed
336
        finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
337
338
339
          qa_config.ReleaseInstance(newinst)
    finally:
      qa_config.ReleaseNode(expnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
340

Iustin Pop's avatar
Iustin Pop committed
341
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
342
343
    newinst = qa_config.AcquireInstance()
    try:
344
345
346
347
348
      if snode is None:
        excl = [pnode]
      else:
        excl = [pnode, snode]
      tnode = qa_config.AcquireNode(exclude=excl)
349
350
      try:
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
351
                pnode, snode, tnode)
352
      finally:
353
        qa_config.ReleaseNode(tnode)
354
355
356
    finally:
      qa_config.ReleaseInstance(newinst)

Michael Hanselmann's avatar
Michael Hanselmann committed
357

358
def RunDaemonTests(instance):
Michael Hanselmann's avatar
Michael Hanselmann committed
359
  """Test the ganeti-watcher script.
360

Michael Hanselmann's avatar
Michael Hanselmann committed
361
  """
362
  RunTest(qa_daemon.TestPauseWatcher)
363

Iustin Pop's avatar
Iustin Pop committed
364
  RunTestIf("instance-automatic-restart",
365
            qa_daemon.TestInstanceAutomaticRestart, instance)
Iustin Pop's avatar
Iustin Pop committed
366
  RunTestIf("instance-consecutive-failures",
367
            qa_daemon.TestInstanceConsecutiveFailures, instance)
368

369
370
  RunTest(qa_daemon.TestResumeWatcher)

371

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

Michael Hanselmann's avatar
Michael Hanselmann committed
375
  """
Iustin Pop's avatar
Iustin Pop committed
376
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
377
378
  RunTestIf(["instance-failover", "rapi"],
            qa_rapi.TestRapiInstanceFailover, instance)
Michael Hanselmann's avatar
Michael Hanselmann committed
379

Iustin Pop's avatar
Iustin Pop committed
380
381
382
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
  RunTestIf(["instance-migrate", "rapi"],
            qa_rapi.TestRapiInstanceMigrate, instance)
383

Iustin Pop's avatar
Iustin Pop committed
384
  if qa_config.TestEnabled("instance-replace-disks"):
385
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
386
    try:
387
      RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance)
388
389
390
391
392
      RunTest(qa_instance.TestReplaceDisks,
              instance, pnode, snode, othernode)
    finally:
      qa_config.ReleaseNode(othernode)

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

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

Iustin Pop's avatar
Iustin Pop committed
397
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
Michael Hanselmann's avatar
Michael Hanselmann committed
398
            instance, pnode, snode)
Iustin Pop's avatar
Iustin Pop committed
399
400
401
  RunTestIf("instance-disk-failure",
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
            pnode, snode)
Michael Hanselmann's avatar
Michael Hanselmann committed
402
403


404
405
def RunQa():
  """Main QA body.
Michael Hanselmann's avatar
Michael Hanselmann committed
406
407

  """
408
409
410
  rapi_user = "ganeti-qa"
  rapi_secret = utils.GenerateSecret()

Michael Hanselmann's avatar
Michael Hanselmann committed
411
  RunEnvTests()
412
  SetupCluster(rapi_user, rapi_secret)
Michael Hanselmann's avatar
Michael Hanselmann committed
413
414

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

Michael Hanselmann's avatar
Michael Hanselmann committed
417
418
  RunClusterTests()
  RunOsTests()
419

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

422
  RunCommonNodeTests()
423
  RunGroupListTests()
424
  RunGroupRwTests()
425

426
427
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
  try:
Iustin Pop's avatar
Iustin Pop committed
428
429
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
430
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
431
432
  finally:
    qa_config.ReleaseNode(pnode)
433

Michael Hanselmann's avatar
Michael Hanselmann committed
434
435
  pnode = qa_config.AcquireNode()
  try:
Iustin Pop's avatar
Iustin Pop committed
436
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
437

Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
438
439
440
    if qa_rapi.Enabled():
      RunTest(qa_rapi.TestNode, pnode)

441
      if qa_config.TestEnabled("instance-add-plain-disk"):
442
443
444
445
446
447
        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
448

449
    if qa_config.TestEnabled("instance-add-plain-disk"):
Michael Hanselmann's avatar
Michael Hanselmann committed
450
451
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
      RunCommonInstanceTests(instance)
452
      RunGroupListTests()
453
      RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
454
      RunExportImportTests(instance, pnode, None)
455
      RunDaemonTests(instance)
456
      RunRepairDiskSizes()
Michael Hanselmann's avatar
Michael Hanselmann committed
457
458
      RunTest(qa_instance.TestInstanceRemove, instance)
      del instance
459

460
    multinode_tests = [
Iustin Pop's avatar
Iustin Pop committed
461
      ("instance-add-drbd-disk",
462
463
464
465
466
467
468
469
470
       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)
471
          RunGroupListTests()
472
473
474
          RunTest(qa_group.TestAssignNodesIncludingSplit,
                  constants.INITIAL_NODE_GROUP_NAME,
                  pnode["primary"], snode["primary"])
Iustin Pop's avatar
Iustin Pop committed
475
          if qa_config.TestEnabled("instance-convert-disk"):
476
            RunTest(qa_instance.TestInstanceShutdown, instance)
477
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
478
            RunTest(qa_instance.TestInstanceStartup, instance)
479
          RunExportImportTests(instance, pnode, snode)
480
          RunHardwareFailureTests(instance, pnode, snode)
481
          RunRepairDiskSizes()
482
483
484
485
          RunTest(qa_instance.TestInstanceRemove, instance)
          del instance
        finally:
          qa_config.ReleaseNode(snode)
Iustin Pop's avatar
Iustin Pop committed
486

Iustin Pop's avatar
Iustin Pop committed
487
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
488
489
490
491
492
493
494
495
496
497
498
499
500
      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
501

Iustin Pop's avatar
Iustin Pop committed
502
  finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
503
    qa_config.ReleaseNode(pnode)
Iustin Pop's avatar
Iustin Pop committed
504

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

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

509

510
511
512
513
514
515
@rapi.client.UsesRapiClient
def main():
  """Main program.

  """
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
Iustin Pop's avatar
Iustin Pop committed
516
  parser.add_option("--yes-do-it", dest="yes_do_it",
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
      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
540
if __name__ == "__main__":
541
  main()