ganeti-qa.py 18.6 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_error
38
import qa_group
39
40
import qa_instance
import qa_node
41
import qa_os
42
import qa_job
Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
43
import qa_rapi
Michael Hanselmann's avatar
Michael Hanselmann committed
44
import qa_tags
45
import qa_utils
Iustin Pop's avatar
Iustin Pop committed
46

47
from ganeti import utils
48
from ganeti import rapi
49
from ganeti import constants
50

51
import ganeti.rapi.client # pylint: disable=W0611
52

Iustin Pop's avatar
Iustin Pop committed
53

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

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


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

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

Iustin Pop's avatar
Iustin Pop committed
73
74
  return desc.rstrip(".")

75

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

  """
Iustin Pop's avatar
Iustin Pop committed
80

Iustin Pop's avatar
Iustin Pop committed
81
  tstart = datetime.datetime.now()
Iustin Pop's avatar
Iustin Pop committed
82

Iustin Pop's avatar
Iustin Pop committed
83
84
  desc = _DescriptionOf(fn)

Iustin Pop's avatar
Iustin Pop committed
85
86
87
88
  print
  print _FormatHeader("%s start %s" % (tstart, desc))

  try:
89
    retval = fn(*args, **kwargs)
Iustin Pop's avatar
Iustin Pop committed
90
91
92
93
94
    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
95
96


97
def RunTestIf(testnames, fn, *args, **kwargs):
Iustin Pop's avatar
Iustin Pop committed
98
99
100
101
102
103
104
  """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):
105
    RunTest(fn, *args, **kwargs)
Iustin Pop's avatar
Iustin Pop committed
106
107
108
109
110
111
112
  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
113
114
def RunEnvTests():
  """Run several environment tests.
Iustin Pop's avatar
Iustin Pop committed
115
116

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

121

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

125
126
127
  @param rapi_user: Login user for RAPI
  @param rapi_secret: Login secret for RAPI

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

  # Test on empty cluster
  RunTestIf("node-list", qa_node.TestNodeList)
  RunTestIf("instance-list", qa_instance.TestInstanceList)
135
  RunTestIf("job-list", qa_job.TestJobList)
136

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

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

144
145
146
  # enable the watcher (unconditionally)
  RunTest(qa_daemon.TestResumeWatcher)

147
148
  RunTestIf("node-list", qa_node.TestNodeList)

149
150
151
  # Test listing fields
  RunTestIf("node-list", qa_node.TestNodeListFields)
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
152
  RunTestIf("job-list", qa_job.TestJobListFields)
153
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
154

Iustin Pop's avatar
Iustin Pop committed
155
  RunTestIf("node-info", qa_node.TestNodeInfo)
Michael Hanselmann's avatar
Michael Hanselmann committed
156
157
158
159


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

Michael Hanselmann's avatar
Michael Hanselmann committed
161
  """
Iustin Pop's avatar
Iustin Pop committed
162
  for test, fn in [
163
    ("create-cluster", qa_cluster.TestClusterInitDisk),
Iustin Pop's avatar
Iustin Pop committed
164
165
166
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
    ("cluster-verify", qa_cluster.TestClusterVerify),
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
167
    # TODO: add more cluster modify tests
168
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
Iustin Pop's avatar
Iustin Pop committed
169
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
170
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
Iustin Pop's avatar
Iustin Pop committed
171
172
173
174
    ("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
175
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
Iustin Pop's avatar
Iustin Pop committed
176
177
178
179
    ("cluster-copyfile", qa_cluster.TestClusterCopyfile),
    ("cluster-command", qa_cluster.TestClusterCommand),
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
180
181
    ("cluster-master-failover",
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
Iustin Pop's avatar
Iustin Pop committed
182
    ("cluster-oob", qa_cluster.TestClusterOob),
Iustin Pop's avatar
Iustin Pop committed
183
184
    ("rapi", qa_rapi.TestVersion),
    ("rapi", qa_rapi.TestEmptyCluster),
185
    ("rapi", qa_rapi.TestRapiQuery),
Iustin Pop's avatar
Iustin Pop committed
186
187
    ]:
    RunTestIf(test, fn)
188

189

190
191
192
193
194
195
196
def RunRepairDiskSizes():
  """Run the repair disk-sizes test.

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


Michael Hanselmann's avatar
Michael Hanselmann committed
197
198
def RunOsTests():
  """Runs all tests related to gnt-os.
Michael Hanselmann's avatar
Michael Hanselmann committed
199

Michael Hanselmann's avatar
Michael Hanselmann committed
200
  """
201
202
203
204
205
  if qa_config.TestEnabled("rapi"):
    rapi_getos = qa_rapi.GetOperatingSystems
  else:
    rapi_getos = None

Iustin Pop's avatar
Iustin Pop committed
206
207
208
  for fn in [
    qa_os.TestOsList,
    qa_os.TestOsDiagnose,
209
210
211
212
    ]:
    RunTestIf("os", fn)

  for fn in [
Iustin Pop's avatar
Iustin Pop committed
213
214
215
    qa_os.TestOsValid,
    qa_os.TestOsInvalid,
    qa_os.TestOsPartiallyValid,
216
217
218
219
    ]:
    RunTestIf("os", fn, rapi_getos)

  for fn in [
Iustin Pop's avatar
Iustin Pop committed
220
221
    qa_os.TestOsModifyValid,
    qa_os.TestOsModifyInvalid,
222
    qa_os.TestOsStatesNonExisting,
Iustin Pop's avatar
Iustin Pop committed
223
224
    ]:
    RunTestIf("os", fn)
Michael Hanselmann's avatar
Michael Hanselmann committed
225
226
227
228
229
230


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

  """
Iustin Pop's avatar
Iustin Pop committed
231
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
232
233
  RunTestIf(["instance-shutdown", "instance-console", "rapi"],
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
234
235
  RunTestIf(["instance-shutdown", "instance-modify"],
            qa_instance.TestInstanceStoppedModify, instance)
Iustin Pop's avatar
Iustin Pop committed
236
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
Iustin Pop's avatar
Iustin Pop committed
237

238
239
240
241
242
243
  # 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
244
  RunTestIf("instance-list", qa_instance.TestInstanceList)
Michael Hanselmann's avatar
Michael Hanselmann committed
245

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

Iustin Pop's avatar
Iustin Pop committed
248
249
250
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
  RunTestIf(["instance-modify", "rapi"],
            qa_rapi.TestRapiInstanceModify, instance)
251

Iustin Pop's avatar
Iustin Pop committed
252
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
253
254
  RunTestIf(["instance-console", "rapi"],
            qa_rapi.TestRapiInstanceConsole, instance)
255

256
257
258
259
260
261
  DOWN_TESTS = qa_config.Either([
    "instance-reinstall",
    "instance-rename",
    "instance-grow-disk",
    ])

Iustin Pop's avatar
Iustin Pop committed
262
263
264
265
  # 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
266
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
267
268
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceReinstall, instance)
269

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

Iustin Pop's avatar
Iustin Pop committed
285
286
  RunTestIf(["instance-grow-disk"], qa_instance.TestInstanceGrowDisk, instance)

Iustin Pop's avatar
Iustin Pop committed
287
288
289
290
  # and now start the instance again
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceStartup, instance)

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

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

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

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

298
299
300
  # Lists instances, too
  RunTestIf("node-list", qa_node.TestNodeList)

301
302
303
  # Some jobs have been run, let's test listing them
  RunTestIf("job-list", qa_job.TestJobList)

304
305
306
307
308

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

  """
Iustin Pop's avatar
Iustin Pop committed
309
310
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
  RunTestIf("node-storage", qa_node.TestNodeStorage)
311
  RunTestIf("node-oob", qa_node.TestOutOfBand)
312

313

314
315
316
317
def RunGroupListTests():
  """Run tests for listing node groups.

  """
318
319
  RunTestIf("group-list", qa_group.TestGroupList)
  RunTestIf("group-list", qa_group.TestGroupListFields)
320
321


322
323
324
325
326
def RunGroupRwTests():
  """Run tests for adding/removing/renaming groups.

  """
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
327
328
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
  RunTestIf("group-rwops", qa_group.TestGroupModify)
329
  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
330
331
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
            qa_group.GetDefaultGroup())
332

333

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

337
338
339
340
  @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
341
  """
Iustin Pop's avatar
Iustin Pop committed
342
  if qa_config.TestEnabled("instance-export"):
343
344
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)

Michael Hanselmann's avatar
Michael Hanselmann committed
345
346
347
348
349
350
    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
351
      if qa_config.TestEnabled("instance-import"):
Michael Hanselmann's avatar
Michael Hanselmann committed
352
        newinst = qa_config.AcquireInstance()
Michael Hanselmann's avatar
Michael Hanselmann committed
353
        try:
354
          RunTest(qa_instance.TestInstanceImport, newinst, pnode,
Michael Hanselmann's avatar
Michael Hanselmann committed
355
                  expnode, name)
356
357
          # Check if starting the instance works
          RunTest(qa_instance.TestInstanceStartup, newinst)
Michael Hanselmann's avatar
Michael Hanselmann committed
358
          RunTest(qa_instance.TestInstanceRemove, newinst)
Michael Hanselmann's avatar
Michael Hanselmann committed
359
        finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
360
361
362
          qa_config.ReleaseInstance(newinst)
    finally:
      qa_config.ReleaseNode(expnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
363

Iustin Pop's avatar
Iustin Pop committed
364
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
365
366
    newinst = qa_config.AcquireInstance()
    try:
367
368
369
370
371
      if snode is None:
        excl = [pnode]
      else:
        excl = [pnode, snode]
      tnode = qa_config.AcquireNode(exclude=excl)
372
373
      try:
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
374
                pnode, snode, tnode)
375
      finally:
376
        qa_config.ReleaseNode(tnode)
377
378
379
    finally:
      qa_config.ReleaseInstance(newinst)

Michael Hanselmann's avatar
Michael Hanselmann committed
380

381
def RunDaemonTests(instance):
Michael Hanselmann's avatar
Michael Hanselmann committed
382
  """Test the ganeti-watcher script.
383

Michael Hanselmann's avatar
Michael Hanselmann committed
384
  """
385
  RunTest(qa_daemon.TestPauseWatcher)
386

Iustin Pop's avatar
Iustin Pop committed
387
  RunTestIf("instance-automatic-restart",
388
            qa_daemon.TestInstanceAutomaticRestart, instance)
Iustin Pop's avatar
Iustin Pop committed
389
  RunTestIf("instance-consecutive-failures",
390
            qa_daemon.TestInstanceConsecutiveFailures, instance)
391

392
393
  RunTest(qa_daemon.TestResumeWatcher)

394

395
396
397
398
399
400
401
402
403
404
405
406
407
def RunSingleHomedHardwareFailureTests(instance, pnode):
  """Test hardware failure recovery for single-homed instances.

  """
  if qa_config.TestEnabled("instance-recreate-disks"):
    othernode = qa_config.AcquireNode(exclude=[pnode])
    try:
      RunTest(qa_instance.TestRecreateDisks,
              instance, pnode, None, [othernode])
    finally:
      qa_config.ReleaseNode(othernode)


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

Michael Hanselmann's avatar
Michael Hanselmann committed
411
  """
Iustin Pop's avatar
Iustin Pop committed
412
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
413
414
  RunTestIf(["instance-failover", "rapi"],
            qa_rapi.TestRapiInstanceFailover, instance)
Michael Hanselmann's avatar
Michael Hanselmann committed
415

Iustin Pop's avatar
Iustin Pop committed
416
417
418
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
  RunTestIf(["instance-migrate", "rapi"],
            qa_rapi.TestRapiInstanceMigrate, instance)
419

Iustin Pop's avatar
Iustin Pop committed
420
  if qa_config.TestEnabled("instance-replace-disks"):
421
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
422
    try:
423
      RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance)
424
425
426
427
428
      RunTest(qa_instance.TestReplaceDisks,
              instance, pnode, snode, othernode)
    finally:
      qa_config.ReleaseNode(othernode)

429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
  if qa_config.TestEnabled("instance-recreate-disks"):
    othernode1 = qa_config.AcquireNode(exclude=[pnode, snode])
    try:
      othernode2 = qa_config.AcquireNode(exclude=[pnode, snode, othernode1])
    except qa_error.OutOfNodesError:
      # Let's reuse one of the nodes if the cluster is not big enough
      othernode2 = pnode
    try:
      RunTest(qa_instance.TestRecreateDisks,
              instance, pnode, snode, [othernode1, othernode2])
    finally:
      qa_config.ReleaseNode(othernode1)
      if othernode2 != pnode:
        qa_config.ReleaseNode(othernode2)

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

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

Iustin Pop's avatar
Iustin Pop committed
448
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
Michael Hanselmann's avatar
Michael Hanselmann committed
449
            instance, pnode, snode)
Iustin Pop's avatar
Iustin Pop committed
450
451
452
  RunTestIf("instance-disk-failure",
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
            pnode, snode)
Michael Hanselmann's avatar
Michael Hanselmann committed
453
454


455
456
def RunQa():
  """Main QA body.
Michael Hanselmann's avatar
Michael Hanselmann committed
457
458

  """
459
460
461
  rapi_user = "ganeti-qa"
  rapi_secret = utils.GenerateSecret()

Michael Hanselmann's avatar
Michael Hanselmann committed
462
  RunEnvTests()
463
  SetupCluster(rapi_user, rapi_secret)
Michael Hanselmann's avatar
Michael Hanselmann committed
464
465

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

Michael Hanselmann's avatar
Michael Hanselmann committed
468
469
  RunClusterTests()
  RunOsTests()
470

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

473
  RunCommonNodeTests()
474
  RunGroupListTests()
475
  RunGroupRwTests()
476

477
478
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
  try:
Iustin Pop's avatar
Iustin Pop committed
479
480
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
481
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
482
483
  finally:
    qa_config.ReleaseNode(pnode)
484

Michael Hanselmann's avatar
Michael Hanselmann committed
485
486
  pnode = qa_config.AcquireNode()
  try:
Iustin Pop's avatar
Iustin Pop committed
487
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
488

Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
489
490
491
    if qa_rapi.Enabled():
      RunTest(qa_rapi.TestNode, pnode)

492
      if qa_config.TestEnabled("instance-add-plain-disk"):
493
494
495
        for use_client in [True, False]:
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
                                  use_client)
496
497
          if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
            RunCommonInstanceTests(rapi_instance)
498
499
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
          del rapi_instance
500

501
    if qa_config.TestEnabled("instance-add-plain-disk"):
Michael Hanselmann's avatar
Michael Hanselmann committed
502
503
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
      RunCommonInstanceTests(instance)
504
      RunGroupListTests()
505
      RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
506
      RunExportImportTests(instance, pnode, None)
507
      RunDaemonTests(instance)
508
      RunRepairDiskSizes()
509
      RunSingleHomedHardwareFailureTests(instance, pnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
510
511
      RunTest(qa_instance.TestInstanceRemove, instance)
      del instance
512

513
    multinode_tests = [
Iustin Pop's avatar
Iustin Pop committed
514
      ("instance-add-drbd-disk",
515
516
517
518
519
520
521
522
       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)
523
524
          RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, pnode)
          RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, snode)
525
          RunCommonInstanceTests(instance)
526
          RunGroupListTests()
527
528
529
          RunTest(qa_group.TestAssignNodesIncludingSplit,
                  constants.INITIAL_NODE_GROUP_NAME,
                  pnode["primary"], snode["primary"])
Iustin Pop's avatar
Iustin Pop committed
530
          if qa_config.TestEnabled("instance-convert-disk"):
531
            RunTest(qa_instance.TestInstanceShutdown, instance)
532
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
533
            RunTest(qa_instance.TestInstanceStartup, instance)
534
          RunExportImportTests(instance, pnode, snode)
535
          RunHardwareFailureTests(instance, pnode, snode)
536
          RunRepairDiskSizes()
537
538
539
540
          RunTest(qa_instance.TestInstanceRemove, instance)
          del instance
        finally:
          qa_config.ReleaseNode(snode)
Iustin Pop's avatar
Iustin Pop committed
541

542
543
544
545
546
547
548
549
550
551
552
553
    # Test removing instance with offline drbd secondary
    if qa_config.TestEnabled("instance-remove-drbd-offline"):
      snode = qa_config.AcquireNode(exclude=pnode)
      instance = \
        qa_instance.TestInstanceAddWithDrbdDisk(pnode, snode)
      try:
        qa_node.MakeNodeOffline(snode, "yes")
        RunTest(qa_instance.TestInstanceRemove, instance)
      finally:
        qa_node.MakeNodeOffline(snode, "no")
        qa_config.ReleaseNode(snode)

Iustin Pop's avatar
Iustin Pop committed
554
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
555
556
557
558
559
560
561
562
563
564
565
566
567
      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
568

Iustin Pop's avatar
Iustin Pop committed
569
  finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
570
    qa_config.ReleaseNode(pnode)
Iustin Pop's avatar
Iustin Pop committed
571

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

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

576

577
578
579
580
581
582
@rapi.client.UsesRapiClient
def main():
  """Main program.

  """
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
Iustin Pop's avatar
Iustin Pop committed
583
  parser.add_option("--yes-do-it", dest="yes_do_it",
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
      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)

601
602
603
604
605
606
  primary = qa_config.GetMasterNode()["primary"]
  qa_utils.StartMultiplexer(primary)
  print ("SSH command for primary node: %s" %
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
  print ("SSH command for other nodes: %s" %
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
607
608
609
610
611
  try:
    RunQa()
  finally:
    qa_utils.CloseMultiplexers()

Iustin Pop's avatar
Iustin Pop committed
612
if __name__ == "__main__":
613
  main()