Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 301adaae

History | View | Annotate | Download (21.9 kB)

1 f89d59b9 Iustin Pop
#!/usr/bin/python -u
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 50ef6a41 Bernardo Dal Seno
# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 cec9845c Michael Hanselmann
"""Script for doing QA on Ganeti.
23 94508060 Michael Hanselmann

24 94508060 Michael Hanselmann
"""
25 a8083063 Iustin Pop
26 b459a848 Andrea Spadaccini
# pylint: disable=C0103
27 3582eef6 Iustin Pop
# due to invalid name
28 3582eef6 Iustin Pop
29 a8083063 Iustin Pop
import sys
30 c68d1f43 Michael Hanselmann
import datetime
31 c68d1f43 Michael Hanselmann
import optparse
32 a8083063 Iustin Pop
33 cec9845c Michael Hanselmann
import qa_cluster
34 cec9845c Michael Hanselmann
import qa_config
35 cec9845c Michael Hanselmann
import qa_daemon
36 cec9845c Michael Hanselmann
import qa_env
37 83180411 Bernardo Dal Seno
import qa_error
38 30131294 Adeodato Simo
import qa_group
39 cec9845c Michael Hanselmann
import qa_instance
40 ea7693c1 Helga Velroyen
import qa_network
41 cec9845c Michael Hanselmann
import qa_node
42 8947cf2b Michael Hanselmann
import qa_os
43 09470dd8 Michael Hanselmann
import qa_job
44 a47f574c Oleksiy Mishchenko
import qa_rapi
45 d74c2ca1 Michael Hanselmann
import qa_tags
46 1672a0d1 Michael Hanselmann
import qa_utils
47 a8083063 Iustin Pop
48 725ec2f1 René Nussbaumer
from ganeti import utils
49 8ad0da1e Iustin Pop
from ganeti import rapi # pylint: disable=W0611
50 f3fd2c9d Adeodato Simo
from ganeti import constants
51 2a7c3583 Michael Hanselmann
52 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=W0611
53 fc3f75dd Iustin Pop
from ganeti.rapi.client import UsesRapiClient
54 725ec2f1 René Nussbaumer
55 a8083063 Iustin Pop
56 7d88f255 Iustin Pop
def _FormatHeader(line, end=72):
57 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
58 f89d59b9 Iustin Pop

59 f89d59b9 Iustin Pop
  """
60 f89d59b9 Iustin Pop
  line = "---- " + line + " "
61 21bf2e2e Andrea Spadaccini
  line += "-" * (end - len(line))
62 f89d59b9 Iustin Pop
  line = line.rstrip()
63 f89d59b9 Iustin Pop
  return line
64 f89d59b9 Iustin Pop
65 f89d59b9 Iustin Pop
66 7d88f255 Iustin Pop
def _DescriptionOf(fn):
67 7d88f255 Iustin Pop
  """Computes the description of an item.
68 a8083063 Iustin Pop

69 a8083063 Iustin Pop
  """
70 cec9845c Michael Hanselmann
  if fn.__doc__:
71 cec9845c Michael Hanselmann
    desc = fn.__doc__.splitlines()[0].strip()
72 a8083063 Iustin Pop
  else:
73 f89d59b9 Iustin Pop
    desc = "%r" % fn
74 a8083063 Iustin Pop
75 7d88f255 Iustin Pop
  return desc.rstrip(".")
76 7d88f255 Iustin Pop
77 2932dc44 Michael Hanselmann
78 741c6d91 Michael Hanselmann
def RunTest(fn, *args, **kwargs):
79 7d88f255 Iustin Pop
  """Runs a test after printing a header.
80 7d88f255 Iustin Pop

81 7d88f255 Iustin Pop
  """
82 a8083063 Iustin Pop
83 f89d59b9 Iustin Pop
  tstart = datetime.datetime.now()
84 a8083063 Iustin Pop
85 7d88f255 Iustin Pop
  desc = _DescriptionOf(fn)
86 7d88f255 Iustin Pop
87 f89d59b9 Iustin Pop
  print
88 f89d59b9 Iustin Pop
  print _FormatHeader("%s start %s" % (tstart, desc))
89 f89d59b9 Iustin Pop
90 f89d59b9 Iustin Pop
  try:
91 741c6d91 Michael Hanselmann
    retval = fn(*args, **kwargs)
92 f89d59b9 Iustin Pop
    return retval
93 f89d59b9 Iustin Pop
  finally:
94 f89d59b9 Iustin Pop
    tstop = datetime.datetime.now()
95 f89d59b9 Iustin Pop
    tdelta = tstop - tstart
96 f89d59b9 Iustin Pop
    print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc))
97 a8083063 Iustin Pop
98 a8083063 Iustin Pop
99 741c6d91 Michael Hanselmann
def RunTestIf(testnames, fn, *args, **kwargs):
100 7d88f255 Iustin Pop
  """Runs a test conditionally.
101 7d88f255 Iustin Pop

102 7d88f255 Iustin Pop
  @param testnames: either a single test name in the configuration
103 7d88f255 Iustin Pop
      file, or a list of testnames (which will be AND-ed together)
104 7d88f255 Iustin Pop

105 7d88f255 Iustin Pop
  """
106 7d88f255 Iustin Pop
  if qa_config.TestEnabled(testnames):
107 741c6d91 Michael Hanselmann
    RunTest(fn, *args, **kwargs)
108 7d88f255 Iustin Pop
  else:
109 7d88f255 Iustin Pop
    tstart = datetime.datetime.now()
110 7d88f255 Iustin Pop
    desc = _DescriptionOf(fn)
111 c072e788 Michael Hanselmann
    # TODO: Formatting test names when non-string names are involved
112 7d88f255 Iustin Pop
    print _FormatHeader("%s skipping %s, test(s) %s disabled" %
113 7d88f255 Iustin Pop
                        (tstart, desc, testnames))
114 7d88f255 Iustin Pop
115 7d88f255 Iustin Pop
116 b1ffe1eb Michael Hanselmann
def RunEnvTests():
117 b1ffe1eb Michael Hanselmann
  """Run several environment tests.
118 a8083063 Iustin Pop

119 a8083063 Iustin Pop
  """
120 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
121 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
122 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
123 a8083063 Iustin Pop
124 94508060 Michael Hanselmann
125 725ec2f1 René Nussbaumer
def SetupCluster(rapi_user, rapi_secret):
126 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
127 a8083063 Iustin Pop

128 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
129 725ec2f1 René Nussbaumer
  @param rapi_secret: Login secret for RAPI
130 725ec2f1 René Nussbaumer

131 b1ffe1eb Michael Hanselmann
  """
132 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
133 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
134 6a0f22e1 Bernardo Dal Seno
  if not qa_config.TestEnabled("create-cluster"):
135 6a0f22e1 Bernardo Dal Seno
    # If the cluster is already in place, we assume that exclusive-storage is
136 6a0f22e1 Bernardo Dal Seno
    # already set according to the configuration
137 6a0f22e1 Bernardo Dal Seno
    qa_config.SetExclusiveStorage(qa_config.get("exclusive-storage", False))
138 288d6440 Michael Hanselmann
139 288d6440 Michael Hanselmann
  # Test on empty cluster
140 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
141 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
142 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
143 288d6440 Michael Hanselmann
144 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
145 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
146 8e671b7c Iustin Pop
    # consider the nodes are already there
147 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
148 8201b996 Iustin Pop
149 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
150 cd04f8c2 Michael Hanselmann
151 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
152 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
153 8201b996 Iustin Pop
154 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
155 288d6440 Michael Hanselmann
156 2214cf14 Michael Hanselmann
  # Test listing fields
157 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
158 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
159 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobListFields)
160 0fdf247d Michael Hanselmann
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
161 2214cf14 Michael Hanselmann
162 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
163 b1ffe1eb Michael Hanselmann
164 b1ffe1eb Michael Hanselmann
165 b1ffe1eb Michael Hanselmann
def RunClusterTests():
166 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
167 180bdd1f Michael Hanselmann

168 b1ffe1eb Michael Hanselmann
  """
169 7d88f255 Iustin Pop
  for test, fn in [
170 92cb4940 Andrea Spadaccini
    ("create-cluster", qa_cluster.TestClusterInitDisk),
171 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
172 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
173 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
174 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
175 1e7acc3b Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
176 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
177 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
178 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
179 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
180 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
181 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
182 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
183 db41409c Michael Hanselmann
    (["cluster-copyfile", qa_config.NoVirtualCluster],
184 db41409c Michael Hanselmann
     qa_cluster.TestClusterCopyfile),
185 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
186 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
187 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
188 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
189 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
190 c0464536 Michael Hanselmann
    (["cluster-oob", qa_config.NoVirtualCluster],
191 c0464536 Michael Hanselmann
     qa_cluster.TestClusterOob),
192 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestVersion),
193 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
194 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
195 7d88f255 Iustin Pop
    ]:
196 7d88f255 Iustin Pop
    RunTestIf(test, fn)
197 8947cf2b Michael Hanselmann
198 6d4a1656 Michael Hanselmann
199 65a884ef Iustin Pop
def RunRepairDiskSizes():
200 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
201 65a884ef Iustin Pop

202 65a884ef Iustin Pop
  """
203 65a884ef Iustin Pop
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)
204 65a884ef Iustin Pop
205 65a884ef Iustin Pop
206 b1ffe1eb Michael Hanselmann
def RunOsTests():
207 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
208 5d640672 Michael Hanselmann

209 b1ffe1eb Michael Hanselmann
  """
210 c9cf3f1a Michael Hanselmann
  os_enabled = ["os", qa_config.NoVirtualCluster]
211 c9cf3f1a Michael Hanselmann
212 301adaae Michael Hanselmann
  if qa_config.TestEnabled(qa_rapi.Enabled):
213 2932dc44 Michael Hanselmann
    rapi_getos = qa_rapi.GetOperatingSystems
214 2932dc44 Michael Hanselmann
  else:
215 2932dc44 Michael Hanselmann
    rapi_getos = None
216 2932dc44 Michael Hanselmann
217 7d88f255 Iustin Pop
  for fn in [
218 7d88f255 Iustin Pop
    qa_os.TestOsList,
219 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
220 2932dc44 Michael Hanselmann
    ]:
221 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
222 2932dc44 Michael Hanselmann
223 2932dc44 Michael Hanselmann
  for fn in [
224 7d88f255 Iustin Pop
    qa_os.TestOsValid,
225 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
226 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
227 2932dc44 Michael Hanselmann
    ]:
228 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn, rapi_getos)
229 2932dc44 Michael Hanselmann
230 2932dc44 Michael Hanselmann
  for fn in [
231 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
232 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
233 074e139f Michael Hanselmann
    qa_os.TestOsStatesNonExisting,
234 7d88f255 Iustin Pop
    ]:
235 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
236 b1ffe1eb Michael Hanselmann
237 b1ffe1eb Michael Hanselmann
238 b1ffe1eb Michael Hanselmann
def RunCommonInstanceTests(instance):
239 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
240 b1ffe1eb Michael Hanselmann

241 b1ffe1eb Michael Hanselmann
  """
242 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
243 301adaae Michael Hanselmann
  RunTestIf(["instance-shutdown", "instance-console", qa_rapi.Enabled],
244 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
245 3016bc1f Michael Hanselmann
  RunTestIf(["instance-shutdown", "instance-modify"],
246 3016bc1f Michael Hanselmann
            qa_instance.TestInstanceStoppedModify, instance)
247 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
248 a8083063 Iustin Pop
249 a7418448 Michael Hanselmann
  # Test shutdown/start via RAPI
250 301adaae Michael Hanselmann
  RunTestIf(["instance-shutdown", qa_rapi.Enabled],
251 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceShutdown, instance)
252 301adaae Michael Hanselmann
  RunTestIf(["instance-shutdown", qa_rapi.Enabled],
253 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceStartup, instance)
254 a7418448 Michael Hanselmann
255 7d88f255 Iustin Pop
  RunTestIf("instance-list", qa_instance.TestInstanceList)
256 283f9d4c Michael Hanselmann
257 7d88f255 Iustin Pop
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
258 e9e35aaa Michael Hanselmann
259 7d88f255 Iustin Pop
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
260 301adaae Michael Hanselmann
  RunTestIf(["instance-modify", qa_rapi.Enabled],
261 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceModify, instance)
262 c0f74c55 Iustin Pop
263 7d88f255 Iustin Pop
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
264 301adaae Michael Hanselmann
  RunTestIf(["instance-console", qa_rapi.Enabled],
265 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiInstanceConsole, instance)
266 4379b1fa Michael Hanselmann
267 1be35bef Michael Hanselmann
  DOWN_TESTS = qa_config.Either([
268 1be35bef Michael Hanselmann
    "instance-reinstall",
269 1be35bef Michael Hanselmann
    "instance-rename",
270 1be35bef Michael Hanselmann
    "instance-grow-disk",
271 1be35bef Michael Hanselmann
    ])
272 1be35bef Michael Hanselmann
273 4c1a464b Iustin Pop
  # shutdown instance for any 'down' tests
274 4c1a464b Iustin Pop
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceShutdown, instance)
275 4c1a464b Iustin Pop
276 4c1a464b Iustin Pop
  # now run the 'down' state tests
277 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
278 301adaae Michael Hanselmann
  RunTestIf(["instance-reinstall", qa_rapi.Enabled],
279 0220d2cf Guido Trotter
            qa_rapi.TestRapiInstanceReinstall, instance)
280 8a4e8898 Michael Hanselmann
281 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-rename"):
282 69bc7a38 Michael Hanselmann
    tgt_instance = qa_config.AcquireInstance()
283 69bc7a38 Michael Hanselmann
    try:
284 b5f33afa Michael Hanselmann
      rename_source = instance.name
285 b5f33afa Michael Hanselmann
      rename_target = tgt_instance.name
286 69bc7a38 Michael Hanselmann
      # perform instance rename to the same name
287 4c1a464b Iustin Pop
      RunTest(qa_instance.TestInstanceRenameAndBack,
288 69bc7a38 Michael Hanselmann
              rename_source, rename_source)
289 301adaae Michael Hanselmann
      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceRenameAndBack,
290 69bc7a38 Michael Hanselmann
                rename_source, rename_source)
291 69bc7a38 Michael Hanselmann
      if rename_target is not None:
292 69bc7a38 Michael Hanselmann
        # perform instance rename to a different name, if we have one configured
293 69bc7a38 Michael Hanselmann
        RunTest(qa_instance.TestInstanceRenameAndBack,
294 930e77d1 Michael Hanselmann
                rename_source, rename_target)
295 301adaae Michael Hanselmann
        RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceRenameAndBack,
296 69bc7a38 Michael Hanselmann
                  rename_source, rename_target)
297 69bc7a38 Michael Hanselmann
    finally:
298 6f88e076 Michael Hanselmann
      tgt_instance.Release()
299 4c1a464b Iustin Pop
300 26a5056d Iustin Pop
  RunTestIf(["instance-grow-disk"], qa_instance.TestInstanceGrowDisk, instance)
301 26a5056d Iustin Pop
302 4c1a464b Iustin Pop
  # and now start the instance again
303 4c1a464b Iustin Pop
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceStartup, instance)
304 4c1a464b Iustin Pop
305 4c1a464b Iustin Pop
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
306 18337ca9 Iustin Pop
307 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
308 d74c2ca1 Michael Hanselmann
309 1ef6e776 Michael Hanselmann
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
310 d74c2ca1 Michael Hanselmann
311 301adaae Michael Hanselmann
  RunTestIf(qa_rapi.Enabled, qa_rapi.TestInstance, instance)
312 729c4377 Iustin Pop
313 288d6440 Michael Hanselmann
  # Lists instances, too
314 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
315 288d6440 Michael Hanselmann
316 09470dd8 Michael Hanselmann
  # Some jobs have been run, let's test listing them
317 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
318 09470dd8 Michael Hanselmann
319 729c4377 Iustin Pop
320 729c4377 Iustin Pop
def RunCommonNodeTests():
321 729c4377 Iustin Pop
  """Run a few common node tests.
322 729c4377 Iustin Pop

323 729c4377 Iustin Pop
  """
324 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
325 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
326 c0464536 Michael Hanselmann
  RunTestIf(["node-oob", qa_config.NoVirtualCluster], qa_node.TestOutOfBand)
327 8e1db003 Michael Hanselmann
328 8d8d650c Michael Hanselmann
329 30131294 Adeodato Simo
def RunGroupListTests():
330 30131294 Adeodato Simo
  """Run tests for listing node groups.
331 30131294 Adeodato Simo

332 30131294 Adeodato Simo
  """
333 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
334 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
335 30131294 Adeodato Simo
336 30131294 Adeodato Simo
337 ea7693c1 Helga Velroyen
def RunNetworkTests():
338 ea7693c1 Helga Velroyen
  """Run tests for network management.
339 ea7693c1 Helga Velroyen

340 ea7693c1 Helga Velroyen
  """
341 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkAddRemove)
342 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkConnect)
343 ea7693c1 Helga Velroyen
344 ea7693c1 Helga Velroyen
345 66787da5 Adeodato Simo
def RunGroupRwTests():
346 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
347 66787da5 Adeodato Simo

348 66787da5 Adeodato Simo
  """
349 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
350 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
351 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
352 301adaae Michael Hanselmann
  RunTestIf(["group-rwops", qa_rapi.Enabled], qa_rapi.TestRapiNodeGroups)
353 fe508a9d Michael Hanselmann
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
354 fe508a9d Michael Hanselmann
            qa_group.GetDefaultGroup())
355 4b10fb65 Adeodato Simo
356 66787da5 Adeodato Simo
357 c99200a3 Bernardo Dal Seno
def RunExportImportTests(instance, inodes):
358 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
359 a8083063 Iustin Pop

360 c99200a3 Bernardo Dal Seno
  @type inodes: list of nodes
361 c99200a3 Bernardo Dal Seno
  @param inodes: current nodes of the instance
362 638a7266 Iustin Pop

363 b1ffe1eb Michael Hanselmann
  """
364 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-export"):
365 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
366 bc696589 Michael Hanselmann
367 c99200a3 Bernardo Dal Seno
    pnode = inodes[0]
368 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
369 b1ffe1eb Michael Hanselmann
    try:
370 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
371 b1ffe1eb Michael Hanselmann
372 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
373 b1ffe1eb Michael Hanselmann
374 d0c8c01d Iustin Pop
      if qa_config.TestEnabled("instance-import"):
375 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
376 5d640672 Michael Hanselmann
        try:
377 5fa0375e Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, newinst, pnode,
378 b1ffe1eb Michael Hanselmann
                  expnode, name)
379 51131cad Michael Hanselmann
          # Check if starting the instance works
380 51131cad Michael Hanselmann
          RunTest(qa_instance.TestInstanceStartup, newinst)
381 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
382 5d640672 Michael Hanselmann
        finally:
383 6f88e076 Michael Hanselmann
          newinst.Release()
384 b1ffe1eb Michael Hanselmann
    finally:
385 565cb4bf Michael Hanselmann
      expnode.Release()
386 5d640672 Michael Hanselmann
387 301adaae Michael Hanselmann
  if qa_config.TestEnabled([qa_rapi.Enabled, "inter-cluster-instance-move"]):
388 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
389 5d831182 Michael Hanselmann
    try:
390 c99200a3 Bernardo Dal Seno
      tnode = qa_config.AcquireNode(exclude=inodes)
391 5d831182 Michael Hanselmann
      try:
392 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
393 c99200a3 Bernardo Dal Seno
                inodes, tnode)
394 5d831182 Michael Hanselmann
      finally:
395 565cb4bf Michael Hanselmann
        tnode.Release()
396 5d831182 Michael Hanselmann
    finally:
397 6f88e076 Michael Hanselmann
      newinst.Release()
398 5d831182 Michael Hanselmann
399 283f9d4c Michael Hanselmann
400 b998270c Iustin Pop
def RunDaemonTests(instance):
401 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
402 9df6d173 Michael Hanselmann

403 b1ffe1eb Michael Hanselmann
  """
404 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
405 e9e35aaa Michael Hanselmann
406 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
407 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
408 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
409 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
410 e9e35aaa Michael Hanselmann
411 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
412 8201b996 Iustin Pop
413 9df6d173 Michael Hanselmann
414 c99200a3 Bernardo Dal Seno
def RunHardwareFailureTests(instance, inodes):
415 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
416 a8083063 Iustin Pop

417 b1ffe1eb Michael Hanselmann
  """
418 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
419 301adaae Michael Hanselmann
  RunTestIf(["instance-failover", qa_rapi.Enabled],
420 c0a146a1 Michael Hanselmann
            qa_rapi.TestRapiInstanceFailover, instance)
421 b1ffe1eb Michael Hanselmann
422 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
423 301adaae Michael Hanselmann
  RunTestIf(["instance-migrate", qa_rapi.Enabled],
424 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
425 938bde86 Michael Hanselmann
426 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-replace-disks"):
427 c99200a3 Bernardo Dal Seno
    # We just need alternative secondary nodes, hence "- 1"
428 c99200a3 Bernardo Dal Seno
    othernodes = qa_config.AcquireManyNodes(len(inodes) - 1, exclude=inodes)
429 7910e7a5 Michael Hanselmann
    try:
430 301adaae Michael Hanselmann
      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceReplaceDisks, instance)
431 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
432 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
433 7910e7a5 Michael Hanselmann
    finally:
434 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(othernodes)
435 c99200a3 Bernardo Dal Seno
    del othernodes
436 7910e7a5 Michael Hanselmann
437 83180411 Bernardo Dal Seno
  if qa_config.TestEnabled("instance-recreate-disks"):
438 83180411 Bernardo Dal Seno
    try:
439 c99200a3 Bernardo Dal Seno
      acquirednodes = qa_config.AcquireManyNodes(len(inodes), exclude=inodes)
440 c99200a3 Bernardo Dal Seno
      othernodes = acquirednodes
441 83180411 Bernardo Dal Seno
    except qa_error.OutOfNodesError:
442 c99200a3 Bernardo Dal Seno
      if len(inodes) > 1:
443 c99200a3 Bernardo Dal Seno
        # If the cluster is not big enough, let's reuse some of the nodes, but
444 c99200a3 Bernardo Dal Seno
        # with different roles. In this way, we can test a DRBD instance even on
445 c99200a3 Bernardo Dal Seno
        # a 3-node cluster.
446 c99200a3 Bernardo Dal Seno
        acquirednodes = [qa_config.AcquireNode(exclude=inodes)]
447 c99200a3 Bernardo Dal Seno
        othernodes = acquirednodes + inodes[:-1]
448 c99200a3 Bernardo Dal Seno
      else:
449 c99200a3 Bernardo Dal Seno
        raise
450 83180411 Bernardo Dal Seno
    try:
451 83180411 Bernardo Dal Seno
      RunTest(qa_instance.TestRecreateDisks,
452 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
453 83180411 Bernardo Dal Seno
    finally:
454 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(acquirednodes)
455 83180411 Bernardo Dal Seno
456 c99200a3 Bernardo Dal Seno
  if len(inodes) >= 2:
457 c99200a3 Bernardo Dal Seno
    RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, inodes[0], inodes[1])
458 c99200a3 Bernardo Dal Seno
    RunTestIf("node-failover", qa_node.TestNodeFailover, inodes[0], inodes[1])
459 b1ffe1eb Michael Hanselmann
460 b1ffe1eb Michael Hanselmann
461 50ef6a41 Bernardo Dal Seno
def RunExclusiveStorageTests():
462 50ef6a41 Bernardo Dal Seno
  """Test exclusive storage."""
463 50ef6a41 Bernardo Dal Seno
  if not qa_config.TestEnabled("cluster-exclusive-storage"):
464 50ef6a41 Bernardo Dal Seno
    return
465 50ef6a41 Bernardo Dal Seno
466 50ef6a41 Bernardo Dal Seno
  node = qa_config.AcquireNode()
467 50ef6a41 Bernardo Dal Seno
  try:
468 e8b919a1 Bernardo Dal Seno
    old_es = qa_cluster.TestSetExclStorCluster(False)
469 250a9404 Bernardo Dal Seno
    qa_node.TestExclStorSingleNode(node)
470 e8b919a1 Bernardo Dal Seno
471 e8b919a1 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(True)
472 21e2734f Bernardo Dal Seno
    qa_cluster.TestExclStorSharedPv(node)
473 21e2734f Bernardo Dal Seno
474 50ef6a41 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-plain-disk"):
475 50ef6a41 Bernardo Dal Seno
      # Make sure that the cluster doesn't have any pre-existing problem
476 50ef6a41 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
477 a77e3d33 Michael Hanselmann
478 a77e3d33 Michael Hanselmann
      # Create and allocate instances
479 c99200a3 Bernardo Dal Seno
      instance1 = qa_instance.TestInstanceAddWithPlainDisk([node])
480 a77e3d33 Michael Hanselmann
      try:
481 a77e3d33 Michael Hanselmann
        instance2 = qa_instance.TestInstanceAddWithPlainDisk([node])
482 a77e3d33 Michael Hanselmann
        try:
483 a77e3d33 Michael Hanselmann
          # cluster-verify checks that disks are allocated correctly
484 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify()
485 a77e3d33 Michael Hanselmann
486 a77e3d33 Michael Hanselmann
          # Remove instances
487 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance2)
488 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance1)
489 a77e3d33 Michael Hanselmann
        finally:
490 6f88e076 Michael Hanselmann
          instance2.Release()
491 a77e3d33 Michael Hanselmann
      finally:
492 6f88e076 Michael Hanselmann
        instance1.Release()
493 a77e3d33 Michael Hanselmann
494 efd58d99 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-drbd-disk"):
495 efd58d99 Bernardo Dal Seno
      snode = qa_config.AcquireNode()
496 efd58d99 Bernardo Dal Seno
      try:
497 efd58d99 Bernardo Dal Seno
        qa_cluster.TestSetExclStorCluster(False)
498 c99200a3 Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([node, snode])
499 a77e3d33 Michael Hanselmann
        try:
500 a77e3d33 Michael Hanselmann
          qa_cluster.TestSetExclStorCluster(True)
501 a77e3d33 Michael Hanselmann
          exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
502 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
503 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance)
504 a77e3d33 Michael Hanselmann
        finally:
505 6f88e076 Michael Hanselmann
          instance.Release()
506 efd58d99 Bernardo Dal Seno
      finally:
507 565cb4bf Michael Hanselmann
        snode.Release()
508 50ef6a41 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(old_es)
509 50ef6a41 Bernardo Dal Seno
  finally:
510 565cb4bf Michael Hanselmann
    node.Release()
511 50ef6a41 Bernardo Dal Seno
512 50ef6a41 Bernardo Dal Seno
513 deadfa13 Bernardo Dal Seno
def RunInstanceTests():
514 deadfa13 Bernardo Dal Seno
  """Create and exercise instances."""
515 deadfa13 Bernardo Dal Seno
  instance_tests = [
516 deadfa13 Bernardo Dal Seno
    ("instance-add-plain-disk", constants.DT_PLAIN,
517 deadfa13 Bernardo Dal Seno
     qa_instance.TestInstanceAddWithPlainDisk, 1),
518 deadfa13 Bernardo Dal Seno
    ("instance-add-drbd-disk", constants.DT_DRBD8,
519 deadfa13 Bernardo Dal Seno
     qa_instance.TestInstanceAddWithDrbdDisk, 2),
520 deadfa13 Bernardo Dal Seno
  ]
521 deadfa13 Bernardo Dal Seno
522 deadfa13 Bernardo Dal Seno
  for (test_name, templ, create_fun, num_nodes) in instance_tests:
523 deadfa13 Bernardo Dal Seno
    if (qa_config.TestEnabled(test_name) and
524 deadfa13 Bernardo Dal Seno
        qa_config.IsTemplateSupported(templ)):
525 deadfa13 Bernardo Dal Seno
      inodes = qa_config.AcquireManyNodes(num_nodes)
526 deadfa13 Bernardo Dal Seno
      try:
527 deadfa13 Bernardo Dal Seno
        instance = RunTest(create_fun, inodes)
528 a77e3d33 Michael Hanselmann
        try:
529 a77e3d33 Michael Hanselmann
          RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
530 a77e3d33 Michael Hanselmann
          RunDaemonTests(instance)
531 a77e3d33 Michael Hanselmann
          for node in inodes:
532 a77e3d33 Michael Hanselmann
            RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
533 a77e3d33 Michael Hanselmann
          if len(inodes) > 1:
534 a77e3d33 Michael Hanselmann
            RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
535 a77e3d33 Michael Hanselmann
                      constants.INITIAL_NODE_GROUP_NAME,
536 aecba21e Michael Hanselmann
                      inodes[0].primary, inodes[1].primary)
537 a77e3d33 Michael Hanselmann
          if qa_config.TestEnabled("instance-convert-disk"):
538 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
539 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceConvertDiskToPlain,
540 a77e3d33 Michael Hanselmann
                    instance, inodes)
541 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceStartup, instance)
542 a77e3d33 Michael Hanselmann
          RunCommonInstanceTests(instance)
543 a77e3d33 Michael Hanselmann
          RunGroupListTests()
544 a77e3d33 Michael Hanselmann
          RunExportImportTests(instance, inodes)
545 a77e3d33 Michael Hanselmann
          RunHardwareFailureTests(instance, inodes)
546 a77e3d33 Michael Hanselmann
          RunRepairDiskSizes()
547 a77e3d33 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
548 a77e3d33 Michael Hanselmann
        finally:
549 6f88e076 Michael Hanselmann
          instance.Release()
550 deadfa13 Bernardo Dal Seno
        del instance
551 deadfa13 Bernardo Dal Seno
      finally:
552 deadfa13 Bernardo Dal Seno
        qa_config.ReleaseManyNodes(inodes)
553 deadfa13 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
554 b1ffe1eb Michael Hanselmann
555 b1ffe1eb Michael Hanselmann
556 f7e6f3c8 Iustin Pop
def RunQa():
557 f7e6f3c8 Iustin Pop
  """Main QA body.
558 b1ffe1eb Michael Hanselmann

559 b1ffe1eb Michael Hanselmann
  """
560 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
561 725ec2f1 René Nussbaumer
  rapi_secret = utils.GenerateSecret()
562 725ec2f1 René Nussbaumer
563 b1ffe1eb Michael Hanselmann
  RunEnvTests()
564 725ec2f1 René Nussbaumer
  SetupCluster(rapi_user, rapi_secret)
565 2771835c Michael Hanselmann
566 2771835c Michael Hanselmann
  # Load RAPI certificate
567 76917d97 Iustin Pop
  qa_rapi.Setup(rapi_user, rapi_secret)
568 2771835c Michael Hanselmann
569 b1ffe1eb Michael Hanselmann
  RunClusterTests()
570 b1ffe1eb Michael Hanselmann
  RunOsTests()
571 4b62db14 Michael Hanselmann
572 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
573 d74c2ca1 Michael Hanselmann
574 729c4377 Iustin Pop
  RunCommonNodeTests()
575 30131294 Adeodato Simo
  RunGroupListTests()
576 66787da5 Adeodato Simo
  RunGroupRwTests()
577 ea7693c1 Helga Velroyen
  RunNetworkTests()
578 729c4377 Iustin Pop
579 6f058bf2 Bernardo Dal Seno
  # The master shouldn't be readded or put offline; "delay" needs a non-master
580 6f058bf2 Bernardo Dal Seno
  # node to test
581 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
582 d0cb68cb Michael Hanselmann
  try:
583 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
584 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
585 5a85b99e Michael Hanselmann
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
586 d0cb68cb Michael Hanselmann
  finally:
587 565cb4bf Michael Hanselmann
    pnode.Release()
588 102b115b Michael Hanselmann
589 a36f690c Bernardo Dal Seno
  # Make sure the cluster is clean before running instance tests
590 a36f690c Bernardo Dal Seno
  qa_cluster.AssertClusterVerify()
591 a36f690c Bernardo Dal Seno
592 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
593 b1ffe1eb Michael Hanselmann
  try:
594 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
595 d74c2ca1 Michael Hanselmann
596 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
597 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
598 a47f574c Oleksiy Mishchenko
599 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
600 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
601 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
602 924e95f9 Michael Hanselmann
                                  use_client)
603 a77e3d33 Michael Hanselmann
          try:
604 a77e3d33 Michael Hanselmann
            if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
605 a77e3d33 Michael Hanselmann
              RunCommonInstanceTests(rapi_instance)
606 a77e3d33 Michael Hanselmann
            RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
607 a77e3d33 Michael Hanselmann
          finally:
608 6f88e076 Michael Hanselmann
            rapi_instance.Release()
609 924e95f9 Michael Hanselmann
          del rapi_instance
610 8cb70e56 Michael Hanselmann
611 6f058bf2 Bernardo Dal Seno
  finally:
612 565cb4bf Michael Hanselmann
    pnode.Release()
613 6f058bf2 Bernardo Dal Seno
614 deadfa13 Bernardo Dal Seno
  config_list = [
615 deadfa13 Bernardo Dal Seno
    ("default-instance-tests", lambda: None, lambda _: None),
616 deadfa13 Bernardo Dal Seno
    ("exclusive-storage-instance-tests",
617 deadfa13 Bernardo Dal Seno
     lambda: qa_cluster.TestSetExclStorCluster(True),
618 deadfa13 Bernardo Dal Seno
     qa_cluster.TestSetExclStorCluster),
619 27eba428 Bernardo Dal Seno
  ]
620 deadfa13 Bernardo Dal Seno
  for (conf_name, setup_conf_f, restore_conf_f) in config_list:
621 deadfa13 Bernardo Dal Seno
    if qa_config.TestEnabled(conf_name):
622 deadfa13 Bernardo Dal Seno
      oldconf = setup_conf_f()
623 deadfa13 Bernardo Dal Seno
      RunInstanceTests()
624 deadfa13 Bernardo Dal Seno
      restore_conf_f(oldconf)
625 c7e54e1d Agata Murawska
626 6f058bf2 Bernardo Dal Seno
  pnode = qa_config.AcquireNode()
627 6f058bf2 Bernardo Dal Seno
  try:
628 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
629 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
630 c99200a3 Bernardo Dal Seno
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, [pnode])
631 7d7609a3 Michael Hanselmann
        try:
632 a77e3d33 Michael Hanselmann
          expnode = qa_config.AcquireNode(exclude=pnode)
633 a77e3d33 Michael Hanselmann
          try:
634 a77e3d33 Michael Hanselmann
            if shutdown:
635 a77e3d33 Michael Hanselmann
              # Stop instance before exporting and removing it
636 a77e3d33 Michael Hanselmann
              RunTest(qa_instance.TestInstanceShutdown, instance)
637 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
638 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestBackupList, expnode)
639 a77e3d33 Michael Hanselmann
          finally:
640 565cb4bf Michael Hanselmann
            expnode.Release()
641 7d7609a3 Michael Hanselmann
        finally:
642 6f88e076 Michael Hanselmann
          instance.Release()
643 3b01286e Michael Hanselmann
        del expnode
644 3b01286e Michael Hanselmann
        del instance
645 a36f690c Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
646 a8083063 Iustin Pop
647 6f058bf2 Bernardo Dal Seno
  finally:
648 565cb4bf Michael Hanselmann
    pnode.Release()
649 6f058bf2 Bernardo Dal Seno
650 50ef6a41 Bernardo Dal Seno
  RunExclusiveStorageTests()
651 50ef6a41 Bernardo Dal Seno
652 6f058bf2 Bernardo Dal Seno
  # Test removing instance with offline drbd secondary
653 6f058bf2 Bernardo Dal Seno
  if qa_config.TestEnabled("instance-remove-drbd-offline"):
654 6f058bf2 Bernardo Dal Seno
    # Make sure the master is not put offline
655 6f058bf2 Bernardo Dal Seno
    snode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
656 6f058bf2 Bernardo Dal Seno
    try:
657 6f058bf2 Bernardo Dal Seno
      pnode = qa_config.AcquireNode(exclude=snode)
658 c7e54e1d Agata Murawska
      try:
659 a36f690c Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([pnode, snode])
660 f006f110 Bernardo Dal Seno
        set_offline = lambda node: qa_node.MakeNodeOffline(node, "yes")
661 f006f110 Bernardo Dal Seno
        set_online = lambda node: qa_node.MakeNodeOffline(node, "no")
662 f006f110 Bernardo Dal Seno
        RunTest(qa_instance.TestRemoveInstanceOfflineNode, instance, snode,
663 f006f110 Bernardo Dal Seno
                set_offline, set_online)
664 c7e54e1d Agata Murawska
      finally:
665 565cb4bf Michael Hanselmann
        pnode.Release()
666 6f058bf2 Bernardo Dal Seno
    finally:
667 565cb4bf Michael Hanselmann
      snode.Release()
668 f006f110 Bernardo Dal Seno
    qa_cluster.AssertClusterVerify()
669 a8083063 Iustin Pop
670 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
671 a8083063 Iustin Pop
672 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
673 a8083063 Iustin Pop
674 cec9845c Michael Hanselmann
675 fc3f75dd Iustin Pop
@UsesRapiClient
676 f7e6f3c8 Iustin Pop
def main():
677 f7e6f3c8 Iustin Pop
  """Main program.
678 f7e6f3c8 Iustin Pop

679 f7e6f3c8 Iustin Pop
  """
680 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
681 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
682 5ae4945a Iustin Pop
                    action="store_true",
683 5ae4945a Iustin Pop
                    help="Really execute the tests")
684 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
685 f7e6f3c8 Iustin Pop
686 f7e6f3c8 Iustin Pop
  if len(args) == 1:
687 f7e6f3c8 Iustin Pop
    (config_file, ) = args
688 f7e6f3c8 Iustin Pop
  else:
689 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
690 f7e6f3c8 Iustin Pop
691 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
692 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
693 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
694 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
695 f7e6f3c8 Iustin Pop
    sys.exit(1)
696 f7e6f3c8 Iustin Pop
697 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
698 f7e6f3c8 Iustin Pop
699 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
700 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
701 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
702 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
703 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
704 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
705 f7e6f3c8 Iustin Pop
  try:
706 f7e6f3c8 Iustin Pop
    RunQa()
707 f7e6f3c8 Iustin Pop
  finally:
708 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
709 f7e6f3c8 Iustin Pop
710 d0c8c01d Iustin Pop
if __name__ == "__main__":
711 cec9845c Michael Hanselmann
  main()