ganeti-qa.py 14.8 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

Iustin Pop's avatar
Iustin Pop committed
26
27
28
# pylint: disable-msg=C0103
# 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

Iustin Pop's avatar
Iustin Pop committed
49
import ganeti.rapi.client # pylint: disable-msg=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
57
58
59
60
61
  """Fill a line up to the end column.

  """
  line = "---- " + line + " "
  line += "-" * (end-len(line))
  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
73
74
75
76
  return desc.rstrip(".")

def RunTest(fn, *args):
  """Runs a test after printing a header.

  """
Iustin Pop's avatar
Iustin Pop committed
77

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

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

Iustin Pop's avatar
Iustin Pop committed
82
83
84
85
86
87
88
89
90
91
  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
92
93


Iustin Pop's avatar
Iustin Pop committed
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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
110
111
def RunEnvTests():
  """Run several environment tests.
Iustin Pop's avatar
Iustin Pop committed
112
113

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

118

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

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

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

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

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

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

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

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

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

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


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

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

176

Michael Hanselmann's avatar
Michael Hanselmann committed
177
178
def RunOsTests():
  """Runs all tests related to gnt-os.
Michael Hanselmann's avatar
Michael Hanselmann committed
179

Michael Hanselmann's avatar
Michael Hanselmann committed
180
  """
Iustin Pop's avatar
Iustin Pop committed
181
182
183
184
185
186
187
188
189
190
191
  for fn in [
    qa_os.TestOsList,
    qa_os.TestOsDiagnose,
    qa_os.TestOsValid,
    qa_os.TestOsInvalid,
    qa_os.TestOsPartiallyValid,
    qa_os.TestOsModifyValid,
    qa_os.TestOsModifyInvalid,
    qa_os.TestOsStates,
    ]:
    RunTestIf("os", fn)
Michael Hanselmann's avatar
Michael Hanselmann committed
192
193
194
195
196
197


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

  """
Iustin Pop's avatar
Iustin Pop committed
198
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
199
200
  RunTestIf(["instance-shutdown", "instance-console", "rapi"],
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
Iustin Pop's avatar
Iustin Pop committed
201
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
Iustin Pop's avatar
Iustin Pop committed
202

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

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

Iustin Pop's avatar
Iustin Pop committed
207
208
209
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
  RunTestIf(["instance-modify", "rapi"],
            qa_rapi.TestRapiInstanceModify, instance)
210

Iustin Pop's avatar
Iustin Pop committed
211
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
212
213
  RunTestIf(["instance-console", "rapi"],
            qa_rapi.TestRapiInstanceConsole, instance)
214

Iustin Pop's avatar
Iustin Pop committed
215
216
  RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance)
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
217
218
  RunTestIf(["instance-reinstall", "rapi"],
            qa_rapi.TestRapiInstanceReinstall, instance)
Iustin Pop's avatar
Iustin Pop committed
219
  RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance)
Iustin Pop's avatar
Iustin Pop committed
220

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

223
  if qa_config.TestEnabled('instance-rename'):
224
    rename_source = instance["name"]
225
    rename_target = qa_config.get("rename", None)
226
227
228
    RunTest(qa_instance.TestInstanceShutdown, instance)
    # perform instance rename to the same name
    RunTest(qa_instance.TestInstanceRename, rename_source, rename_source)
229
230
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
              rename_source, rename_source)
231
232
    if rename_target is not None:
      # perform instance rename to a different name, if we have one configured
233
234
      RunTest(qa_instance.TestInstanceRename, rename_source, rename_target)
      RunTest(qa_instance.TestInstanceRename, rename_target, rename_source)
235
236
237
238
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
                rename_source, rename_target)
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
                rename_target, rename_source)
239
    RunTest(qa_instance.TestInstanceStartup, instance)
240

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

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

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

247
248
249
  # Lists instances, too
  RunTestIf("node-list", qa_node.TestNodeList)

250
251
252
253
254

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

  """
Iustin Pop's avatar
Iustin Pop committed
255
256
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
  RunTestIf("node-storage", qa_node.TestNodeStorage)
257
  RunTestIf("node-oob", qa_node.TestOutOfBand)
258

259

260
261
262
263
def RunGroupListTests():
  """Run tests for listing node groups.

  """
264
265
  RunTestIf("group-list", qa_group.TestGroupList)
  RunTestIf("group-list", qa_group.TestGroupListFields)
266
267


268
269
270
271
272
def RunGroupRwTests():
  """Run tests for adding/removing/renaming groups.

  """
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
273
274
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
  RunTestIf("group-rwops", qa_group.TestGroupModify)
275
  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
276

277

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

281
282
283
284
  @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
285
286
  """
  if qa_config.TestEnabled('instance-export'):
287
288
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)

Michael Hanselmann's avatar
Michael Hanselmann committed
289
290
291
292
293
294
295
296
    expnode = qa_config.AcquireNode(exclude=pnode)
    try:
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)

      RunTest(qa_instance.TestBackupList, expnode)

      if qa_config.TestEnabled('instance-import'):
        newinst = qa_config.AcquireInstance()
Michael Hanselmann's avatar
Michael Hanselmann committed
297
        try:
Michael Hanselmann's avatar
Michael Hanselmann committed
298
299
300
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
                  expnode, name)
          RunTest(qa_instance.TestInstanceRemove, newinst)
Michael Hanselmann's avatar
Michael Hanselmann committed
301
        finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
302
303
304
          qa_config.ReleaseInstance(newinst)
    finally:
      qa_config.ReleaseNode(expnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
305

Iustin Pop's avatar
Iustin Pop committed
306
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
307
308
    newinst = qa_config.AcquireInstance()
    try:
309
310
311
312
313
      if snode is None:
        excl = [pnode]
      else:
        excl = [pnode, snode]
      tnode = qa_config.AcquireNode(exclude=excl)
314
315
      try:
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
316
                pnode, snode, tnode)
317
      finally:
318
        qa_config.ReleaseNode(tnode)
319
320
321
    finally:
      qa_config.ReleaseInstance(newinst)

Michael Hanselmann's avatar
Michael Hanselmann committed
322

323
def RunDaemonTests(instance):
Michael Hanselmann's avatar
Michael Hanselmann committed
324
  """Test the ganeti-watcher script.
325

Michael Hanselmann's avatar
Michael Hanselmann committed
326
  """
327
  RunTest(qa_daemon.TestPauseWatcher)
328

Iustin Pop's avatar
Iustin Pop committed
329
  RunTestIf("instance-automatic-restart",
330
            qa_daemon.TestInstanceAutomaticRestart, instance)
Iustin Pop's avatar
Iustin Pop committed
331
  RunTestIf("instance-consecutive-failures",
332
            qa_daemon.TestInstanceConsecutiveFailures, instance)
333

334
335
  RunTest(qa_daemon.TestResumeWatcher)

336

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

Michael Hanselmann's avatar
Michael Hanselmann committed
340
  """
Iustin Pop's avatar
Iustin Pop committed
341
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
Michael Hanselmann's avatar
Michael Hanselmann committed
342

Iustin Pop's avatar
Iustin Pop committed
343
344
345
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
  RunTestIf(["instance-migrate", "rapi"],
            qa_rapi.TestRapiInstanceMigrate, instance)
346

347
  if qa_config.TestEnabled('instance-replace-disks'):
348
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
349
350
351
352
353
354
    try:
      RunTest(qa_instance.TestReplaceDisks,
              instance, pnode, snode, othernode)
    finally:
      qa_config.ReleaseNode(othernode)

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

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

Iustin Pop's avatar
Iustin Pop committed
359
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
Michael Hanselmann's avatar
Michael Hanselmann committed
360
            instance, pnode, snode)
Iustin Pop's avatar
Iustin Pop committed
361
362
363
  RunTestIf("instance-disk-failure",
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
            pnode, snode)
Michael Hanselmann's avatar
Michael Hanselmann committed
364
365


366
367
def RunQa():
  """Main QA body.
Michael Hanselmann's avatar
Michael Hanselmann committed
368
369

  """
370
371
372
  rapi_user = "ganeti-qa"
  rapi_secret = utils.GenerateSecret()

Michael Hanselmann's avatar
Michael Hanselmann committed
373
  RunEnvTests()
374
  SetupCluster(rapi_user, rapi_secret)
Michael Hanselmann's avatar
Michael Hanselmann committed
375
376

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

Michael Hanselmann's avatar
Michael Hanselmann committed
379
380
  RunClusterTests()
  RunOsTests()
381

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

384
  RunCommonNodeTests()
385
  RunGroupListTests()
386
  RunGroupRwTests()
387

388
389
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
  try:
Iustin Pop's avatar
Iustin Pop committed
390
391
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
392
393
  finally:
    qa_config.ReleaseNode(pnode)
394

Michael Hanselmann's avatar
Michael Hanselmann committed
395
396
  pnode = qa_config.AcquireNode()
  try:
Iustin Pop's avatar
Iustin Pop committed
397
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
Michael Hanselmann's avatar
Michael Hanselmann committed
398

Oleksiy Mishchenko's avatar
Oleksiy Mishchenko committed
399
400
401
    if qa_rapi.Enabled():
      RunTest(qa_rapi.TestNode, pnode)

402
      if qa_config.TestEnabled("instance-add-plain-disk"):
403
404
405
406
407
408
        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
409

Michael Hanselmann's avatar
Michael Hanselmann committed
410
411
412
    if qa_config.TestEnabled('instance-add-plain-disk'):
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
      RunCommonInstanceTests(instance)
413
      RunGroupListTests()
414
      RunExportImportTests(instance, pnode, None)
415
      RunDaemonTests(instance)
Michael Hanselmann's avatar
Michael Hanselmann committed
416
417
      RunTest(qa_instance.TestInstanceRemove, instance)
      del instance
418

419
420
421
422
423
424
425
426
427
428
429
    multinode_tests = [
      ('instance-add-drbd-disk',
       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)
430
          RunGroupListTests()
431
432
433
          RunTest(qa_group.TestAssignNodesIncludingSplit,
                  constants.INITIAL_NODE_GROUP_NAME,
                  pnode["primary"], snode["primary"])
434
          if qa_config.TestEnabled('instance-convert-disk'):
435
            RunTest(qa_instance.TestInstanceShutdown, instance)
436
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
437
            RunTest(qa_instance.TestInstanceStartup, instance)
438
          RunExportImportTests(instance, pnode, snode)
439
440
441
442
443
          RunHardwareFailureTests(instance, pnode, snode)
          RunTest(qa_instance.TestInstanceRemove, instance)
          del instance
        finally:
          qa_config.ReleaseNode(snode)
Iustin Pop's avatar
Iustin Pop committed
444

Iustin Pop's avatar
Iustin Pop committed
445
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
446
447
448
449
450
451
452
453
454
455
456
457
458
      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
459

Iustin Pop's avatar
Iustin Pop committed
460
  finally:
Michael Hanselmann's avatar
Michael Hanselmann committed
461
    qa_config.ReleaseNode(pnode)
Iustin Pop's avatar
Iustin Pop committed
462

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

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

467

468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
@rapi.client.UsesRapiClient
def main():
  """Main program.

  """
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
  parser.add_option('--yes-do-it', dest='yes_do_it',
      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()

498
499
if __name__ == '__main__':
  main()