Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ aa1d552d

History | View | Annotate | Download (16.1 kB)

1 f89d59b9 Iustin Pop
#!/usr/bin/python -u
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 f7e6f3c8 Iustin Pop
# Copyright (C) 2007, 2008, 2009, 2010, 2011 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 30131294 Adeodato Simo
import qa_group
38 cec9845c Michael Hanselmann
import qa_instance
39 cec9845c Michael Hanselmann
import qa_node
40 8947cf2b Michael Hanselmann
import qa_os
41 a47f574c Oleksiy Mishchenko
import qa_rapi
42 d74c2ca1 Michael Hanselmann
import qa_tags
43 1672a0d1 Michael Hanselmann
import qa_utils
44 a8083063 Iustin Pop
45 725ec2f1 René Nussbaumer
from ganeti import utils
46 2a7c3583 Michael Hanselmann
from ganeti import rapi
47 f3fd2c9d Adeodato Simo
from ganeti import constants
48 2a7c3583 Michael Hanselmann
49 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=W0611
50 725ec2f1 René Nussbaumer
51 a8083063 Iustin Pop
52 7d88f255 Iustin Pop
def _FormatHeader(line, end=72):
53 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
54 f89d59b9 Iustin Pop

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

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

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

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

101 7d88f255 Iustin Pop
  """
102 7d88f255 Iustin Pop
  if qa_config.TestEnabled(testnames):
103 7d88f255 Iustin Pop
    RunTest(fn, *args)
104 7d88f255 Iustin Pop
  else:
105 7d88f255 Iustin Pop
    tstart = datetime.datetime.now()
106 7d88f255 Iustin Pop
    desc = _DescriptionOf(fn)
107 7d88f255 Iustin Pop
    print _FormatHeader("%s skipping %s, test(s) %s disabled" %
108 7d88f255 Iustin Pop
                        (tstart, desc, testnames))
109 7d88f255 Iustin Pop
110 7d88f255 Iustin Pop
111 b1ffe1eb Michael Hanselmann
def RunEnvTests():
112 b1ffe1eb Michael Hanselmann
  """Run several environment tests.
113 a8083063 Iustin Pop

114 a8083063 Iustin Pop
  """
115 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
116 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
117 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
118 a8083063 Iustin Pop
119 94508060 Michael Hanselmann
120 725ec2f1 René Nussbaumer
def SetupCluster(rapi_user, rapi_secret):
121 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
122 a8083063 Iustin Pop

123 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
124 725ec2f1 René Nussbaumer
  @param rapi_secret: Login secret for RAPI
125 725ec2f1 René Nussbaumer

126 b1ffe1eb Michael Hanselmann
  """
127 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
128 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
129 288d6440 Michael Hanselmann
130 288d6440 Michael Hanselmann
  # Test on empty cluster
131 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
132 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
133 288d6440 Michael Hanselmann
134 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
135 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
136 8e671b7c Iustin Pop
    # consider the nodes are already there
137 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
138 8201b996 Iustin Pop
139 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
140 cd04f8c2 Michael Hanselmann
141 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
142 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
143 8201b996 Iustin Pop
144 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
145 288d6440 Michael Hanselmann
146 2214cf14 Michael Hanselmann
  # Test listing fields
147 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
148 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
149 2214cf14 Michael Hanselmann
150 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
151 b1ffe1eb Michael Hanselmann
152 b1ffe1eb Michael Hanselmann
153 b1ffe1eb Michael Hanselmann
def RunClusterTests():
154 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
155 180bdd1f Michael Hanselmann

156 b1ffe1eb Michael Hanselmann
  """
157 7d88f255 Iustin Pop
  for test, fn in [
158 92cb4940 Andrea Spadaccini
    ("create-cluster", qa_cluster.TestClusterInitDisk),
159 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
160 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
161 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
162 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
163 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
164 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
165 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
166 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
167 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
168 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
169 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
170 7d88f255 Iustin Pop
    ("cluster-copyfile", qa_cluster.TestClusterCopyfile),
171 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
172 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
173 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
174 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
175 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
176 69df9d2b Iustin Pop
    ("cluster-oob", qa_cluster.TestClusterOob),
177 7d88f255 Iustin Pop
    ("rapi", qa_rapi.TestVersion),
178 7d88f255 Iustin Pop
    ("rapi", qa_rapi.TestEmptyCluster),
179 4fab7cab Michael Hanselmann
    ("rapi", qa_rapi.TestRapiQuery),
180 7d88f255 Iustin Pop
    ]:
181 7d88f255 Iustin Pop
    RunTestIf(test, fn)
182 8947cf2b Michael Hanselmann
183 6d4a1656 Michael Hanselmann
184 65a884ef Iustin Pop
def RunRepairDiskSizes():
185 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
186 65a884ef Iustin Pop

187 65a884ef Iustin Pop
  """
188 65a884ef Iustin Pop
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)
189 65a884ef Iustin Pop
190 65a884ef Iustin Pop
191 b1ffe1eb Michael Hanselmann
def RunOsTests():
192 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
193 5d640672 Michael Hanselmann

194 b1ffe1eb Michael Hanselmann
  """
195 2932dc44 Michael Hanselmann
  if qa_config.TestEnabled("rapi"):
196 2932dc44 Michael Hanselmann
    rapi_getos = qa_rapi.GetOperatingSystems
197 2932dc44 Michael Hanselmann
  else:
198 2932dc44 Michael Hanselmann
    rapi_getos = None
199 2932dc44 Michael Hanselmann
200 7d88f255 Iustin Pop
  for fn in [
201 7d88f255 Iustin Pop
    qa_os.TestOsList,
202 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
203 2932dc44 Michael Hanselmann
    ]:
204 2932dc44 Michael Hanselmann
    RunTestIf("os", fn)
205 2932dc44 Michael Hanselmann
206 2932dc44 Michael Hanselmann
  for fn in [
207 7d88f255 Iustin Pop
    qa_os.TestOsValid,
208 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
209 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
210 2932dc44 Michael Hanselmann
    ]:
211 2932dc44 Michael Hanselmann
    RunTestIf("os", fn, rapi_getos)
212 2932dc44 Michael Hanselmann
213 2932dc44 Michael Hanselmann
  for fn in [
214 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
215 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
216 074e139f Michael Hanselmann
    qa_os.TestOsStatesNonExisting,
217 7d88f255 Iustin Pop
    ]:
218 7d88f255 Iustin Pop
    RunTestIf("os", fn)
219 b1ffe1eb Michael Hanselmann
220 b1ffe1eb Michael Hanselmann
221 b1ffe1eb Michael Hanselmann
def RunCommonInstanceTests(instance):
222 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
223 b1ffe1eb Michael Hanselmann

224 b1ffe1eb Michael Hanselmann
  """
225 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
226 b82d4c5e Michael Hanselmann
  RunTestIf(["instance-shutdown", "instance-console", "rapi"],
227 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
228 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
229 a8083063 Iustin Pop
230 a7418448 Michael Hanselmann
  # Test shutdown/start via RAPI
231 a7418448 Michael Hanselmann
  RunTestIf(["instance-shutdown", "rapi"],
232 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceShutdown, instance)
233 a7418448 Michael Hanselmann
  RunTestIf(["instance-shutdown", "rapi"],
234 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceStartup, instance)
235 a7418448 Michael Hanselmann
236 7d88f255 Iustin Pop
  RunTestIf("instance-list", qa_instance.TestInstanceList)
237 283f9d4c Michael Hanselmann
238 7d88f255 Iustin Pop
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
239 e9e35aaa Michael Hanselmann
240 7d88f255 Iustin Pop
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
241 7d88f255 Iustin Pop
  RunTestIf(["instance-modify", "rapi"],
242 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceModify, instance)
243 c0f74c55 Iustin Pop
244 7d88f255 Iustin Pop
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
245 b82d4c5e Michael Hanselmann
  RunTestIf(["instance-console", "rapi"],
246 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiInstanceConsole, instance)
247 4379b1fa Michael Hanselmann
248 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceShutdown, instance)
249 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
250 0220d2cf Guido Trotter
  RunTestIf(["instance-reinstall", "rapi"],
251 0220d2cf Guido Trotter
            qa_rapi.TestRapiInstanceReinstall, instance)
252 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceStartup, instance)
253 a8083063 Iustin Pop
254 7d88f255 Iustin Pop
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
255 8a4e8898 Michael Hanselmann
256 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-rename"):
257 e5c2accd Guido Trotter
    rename_source = instance["name"]
258 7fb50870 Michael Hanselmann
    rename_target = qa_config.get("rename", None)
259 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceShutdown, instance)
260 46747143 Guido Trotter
    # perform instance rename to the same name
261 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceRename, rename_source, rename_source)
262 930e77d1 Michael Hanselmann
    RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
263 930e77d1 Michael Hanselmann
              rename_source, rename_source)
264 46747143 Guido Trotter
    if rename_target is not None:
265 46747143 Guido Trotter
      # perform instance rename to a different name, if we have one configured
266 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_source, rename_target)
267 e5c2accd Guido Trotter
      RunTest(qa_instance.TestInstanceRename, rename_target, rename_source)
268 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
269 930e77d1 Michael Hanselmann
                rename_source, rename_target)
270 930e77d1 Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceRename,
271 930e77d1 Michael Hanselmann
                rename_target, rename_source)
272 46747143 Guido Trotter
    RunTest(qa_instance.TestInstanceStartup, instance)
273 18337ca9 Iustin Pop
274 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
275 d74c2ca1 Michael Hanselmann
276 1ef6e776 Michael Hanselmann
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
277 d74c2ca1 Michael Hanselmann
278 7d88f255 Iustin Pop
  RunTestIf("rapi", qa_rapi.TestInstance, instance)
279 729c4377 Iustin Pop
280 288d6440 Michael Hanselmann
  # Lists instances, too
281 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
282 288d6440 Michael Hanselmann
283 729c4377 Iustin Pop
284 729c4377 Iustin Pop
def RunCommonNodeTests():
285 729c4377 Iustin Pop
  """Run a few common node tests.
286 729c4377 Iustin Pop

287 729c4377 Iustin Pop
  """
288 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
289 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
290 a1de4b18 René Nussbaumer
  RunTestIf("node-oob", qa_node.TestOutOfBand)
291 8e1db003 Michael Hanselmann
292 8d8d650c Michael Hanselmann
293 30131294 Adeodato Simo
def RunGroupListTests():
294 30131294 Adeodato Simo
  """Run tests for listing node groups.
295 30131294 Adeodato Simo

296 30131294 Adeodato Simo
  """
297 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
298 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
299 30131294 Adeodato Simo
300 30131294 Adeodato Simo
301 66787da5 Adeodato Simo
def RunGroupRwTests():
302 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
303 66787da5 Adeodato Simo

304 66787da5 Adeodato Simo
  """
305 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
306 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
307 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
308 b9e478fe Michael Hanselmann
  RunTestIf(["group-rwops", "rapi"], qa_rapi.TestRapiNodeGroups)
309 fe508a9d Michael Hanselmann
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
310 fe508a9d Michael Hanselmann
            qa_group.GetDefaultGroup())
311 4b10fb65 Adeodato Simo
312 66787da5 Adeodato Simo
313 638a7266 Iustin Pop
def RunExportImportTests(instance, pnode, snode):
314 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
315 a8083063 Iustin Pop

316 638a7266 Iustin Pop
  @param pnode: current primary node of the instance
317 638a7266 Iustin Pop
  @param snode: current secondary node of the instance, if any,
318 638a7266 Iustin Pop
      otherwise None
319 638a7266 Iustin Pop

320 b1ffe1eb Michael Hanselmann
  """
321 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-export"):
322 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
323 bc696589 Michael Hanselmann
324 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
325 b1ffe1eb Michael Hanselmann
    try:
326 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
327 b1ffe1eb Michael Hanselmann
328 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
329 b1ffe1eb Michael Hanselmann
330 d0c8c01d Iustin Pop
      if qa_config.TestEnabled("instance-import"):
331 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
332 5d640672 Michael Hanselmann
        try:
333 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
334 b1ffe1eb Michael Hanselmann
                  expnode, name)
335 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
336 5d640672 Michael Hanselmann
        finally:
337 b1ffe1eb Michael Hanselmann
          qa_config.ReleaseInstance(newinst)
338 b1ffe1eb Michael Hanselmann
    finally:
339 b1ffe1eb Michael Hanselmann
      qa_config.ReleaseNode(expnode)
340 5d640672 Michael Hanselmann
341 7d88f255 Iustin Pop
  if qa_config.TestEnabled(["rapi", "inter-cluster-instance-move"]):
342 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
343 5d831182 Michael Hanselmann
    try:
344 638a7266 Iustin Pop
      if snode is None:
345 638a7266 Iustin Pop
        excl = [pnode]
346 638a7266 Iustin Pop
      else:
347 638a7266 Iustin Pop
        excl = [pnode, snode]
348 638a7266 Iustin Pop
      tnode = qa_config.AcquireNode(exclude=excl)
349 5d831182 Michael Hanselmann
      try:
350 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
351 638a7266 Iustin Pop
                pnode, snode, tnode)
352 5d831182 Michael Hanselmann
      finally:
353 638a7266 Iustin Pop
        qa_config.ReleaseNode(tnode)
354 5d831182 Michael Hanselmann
    finally:
355 5d831182 Michael Hanselmann
      qa_config.ReleaseInstance(newinst)
356 5d831182 Michael Hanselmann
357 283f9d4c Michael Hanselmann
358 b998270c Iustin Pop
def RunDaemonTests(instance):
359 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
360 9df6d173 Michael Hanselmann

361 b1ffe1eb Michael Hanselmann
  """
362 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
363 e9e35aaa Michael Hanselmann
364 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
365 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
366 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
367 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
368 e9e35aaa Michael Hanselmann
369 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
370 8201b996 Iustin Pop
371 9df6d173 Michael Hanselmann
372 b1ffe1eb Michael Hanselmann
def RunHardwareFailureTests(instance, pnode, snode):
373 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
374 a8083063 Iustin Pop

375 b1ffe1eb Michael Hanselmann
  """
376 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
377 c0a146a1 Michael Hanselmann
  RunTestIf(["instance-failover", "rapi"],
378 c0a146a1 Michael Hanselmann
            qa_rapi.TestRapiInstanceFailover, instance)
379 b1ffe1eb Michael Hanselmann
380 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
381 7d88f255 Iustin Pop
  RunTestIf(["instance-migrate", "rapi"],
382 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
383 938bde86 Michael Hanselmann
384 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-replace-disks"):
385 76f59a32 Michael Hanselmann
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
386 7910e7a5 Michael Hanselmann
    try:
387 539d65ba Michael Hanselmann
      RunTestIf("rapi", qa_rapi.TestRapiInstanceReplaceDisks, instance)
388 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
389 7910e7a5 Michael Hanselmann
              instance, pnode, snode, othernode)
390 7910e7a5 Michael Hanselmann
    finally:
391 7910e7a5 Michael Hanselmann
      qa_config.ReleaseNode(othernode)
392 7910e7a5 Michael Hanselmann
393 7d88f255 Iustin Pop
  RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, pnode, snode)
394 b1ffe1eb Michael Hanselmann
395 7d88f255 Iustin Pop
  RunTestIf("node-failover", qa_node.TestNodeFailover, pnode, snode)
396 b1ffe1eb Michael Hanselmann
397 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure", qa_instance.TestInstanceMasterDiskFailure,
398 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
399 7d88f255 Iustin Pop
  RunTestIf("instance-disk-failure",
400 7d88f255 Iustin Pop
            qa_instance.TestInstanceSecondaryDiskFailure, instance,
401 7d88f255 Iustin Pop
            pnode, snode)
402 b1ffe1eb Michael Hanselmann
403 b1ffe1eb Michael Hanselmann
404 f7e6f3c8 Iustin Pop
def RunQa():
405 f7e6f3c8 Iustin Pop
  """Main QA body.
406 b1ffe1eb Michael Hanselmann

407 b1ffe1eb Michael Hanselmann
  """
408 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
409 725ec2f1 René Nussbaumer
  rapi_secret = utils.GenerateSecret()
410 725ec2f1 René Nussbaumer
411 b1ffe1eb Michael Hanselmann
  RunEnvTests()
412 725ec2f1 René Nussbaumer
  SetupCluster(rapi_user, rapi_secret)
413 2771835c Michael Hanselmann
414 2771835c Michael Hanselmann
  # Load RAPI certificate
415 76917d97 Iustin Pop
  qa_rapi.Setup(rapi_user, rapi_secret)
416 2771835c Michael Hanselmann
417 b1ffe1eb Michael Hanselmann
  RunClusterTests()
418 b1ffe1eb Michael Hanselmann
  RunOsTests()
419 4b62db14 Michael Hanselmann
420 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
421 d74c2ca1 Michael Hanselmann
422 729c4377 Iustin Pop
  RunCommonNodeTests()
423 30131294 Adeodato Simo
  RunGroupListTests()
424 66787da5 Adeodato Simo
  RunGroupRwTests()
425 729c4377 Iustin Pop
426 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
427 d0cb68cb Michael Hanselmann
  try:
428 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
429 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
430 5a85b99e Michael Hanselmann
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
431 d0cb68cb Michael Hanselmann
  finally:
432 d0cb68cb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
433 102b115b Michael Hanselmann
434 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
435 b1ffe1eb Michael Hanselmann
  try:
436 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
437 d74c2ca1 Michael Hanselmann
438 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
439 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
440 a47f574c Oleksiy Mishchenko
441 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
442 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
443 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
444 924e95f9 Michael Hanselmann
                                  use_client)
445 924e95f9 Michael Hanselmann
          RunCommonInstanceTests(rapi_instance)
446 924e95f9 Michael Hanselmann
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
447 924e95f9 Michael Hanselmann
          del rapi_instance
448 8cb70e56 Michael Hanselmann
449 65a884ef Iustin Pop
    if qa_config.TestEnabled("instance-add-plain-disk"):
450 b1ffe1eb Michael Hanselmann
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
451 b1ffe1eb Michael Hanselmann
      RunCommonInstanceTests(instance)
452 30131294 Adeodato Simo
      RunGroupListTests()
453 24fed61e René Nussbaumer
      RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
454 638a7266 Iustin Pop
      RunExportImportTests(instance, pnode, None)
455 b998270c Iustin Pop
      RunDaemonTests(instance)
456 65a884ef Iustin Pop
      RunRepairDiskSizes()
457 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestInstanceRemove, instance)
458 b1ffe1eb Michael Hanselmann
      del instance
459 9df6d173 Michael Hanselmann
460 7d7609a3 Michael Hanselmann
    multinode_tests = [
461 d0c8c01d Iustin Pop
      ("instance-add-drbd-disk",
462 7d7609a3 Michael Hanselmann
       qa_instance.TestInstanceAddWithDrbdDisk),
463 7d7609a3 Michael Hanselmann
    ]
464 7d7609a3 Michael Hanselmann
465 7d7609a3 Michael Hanselmann
    for name, func in multinode_tests:
466 7d7609a3 Michael Hanselmann
      if qa_config.TestEnabled(name):
467 7d7609a3 Michael Hanselmann
        snode = qa_config.AcquireNode(exclude=pnode)
468 7d7609a3 Michael Hanselmann
        try:
469 7d7609a3 Michael Hanselmann
          instance = RunTest(func, pnode, snode)
470 7d7609a3 Michael Hanselmann
          RunCommonInstanceTests(instance)
471 30131294 Adeodato Simo
          RunGroupListTests()
472 f3fd2c9d Adeodato Simo
          RunTest(qa_group.TestAssignNodesIncludingSplit,
473 f3fd2c9d Adeodato Simo
                  constants.INITIAL_NODE_GROUP_NAME,
474 f3fd2c9d Adeodato Simo
                  pnode["primary"], snode["primary"])
475 d0c8c01d Iustin Pop
          if qa_config.TestEnabled("instance-convert-disk"):
476 f9f0ce7f Guido Trotter
            RunTest(qa_instance.TestInstanceShutdown, instance)
477 7f69aabb Iustin Pop
            RunTest(qa_instance.TestInstanceConvertDisk, instance, snode)
478 f9f0ce7f Guido Trotter
            RunTest(qa_instance.TestInstanceStartup, instance)
479 638a7266 Iustin Pop
          RunExportImportTests(instance, pnode, snode)
480 7d7609a3 Michael Hanselmann
          RunHardwareFailureTests(instance, pnode, snode)
481 65a884ef Iustin Pop
          RunRepairDiskSizes()
482 7d7609a3 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
483 7d7609a3 Michael Hanselmann
          del instance
484 7d7609a3 Michael Hanselmann
        finally:
485 7d7609a3 Michael Hanselmann
          qa_config.ReleaseNode(snode)
486 a8083063 Iustin Pop
487 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
488 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
489 3b01286e Michael Hanselmann
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
490 3b01286e Michael Hanselmann
        expnode = qa_config.AcquireNode(exclude=pnode)
491 3b01286e Michael Hanselmann
        try:
492 3b01286e Michael Hanselmann
          if shutdown:
493 3b01286e Michael Hanselmann
            # Stop instance before exporting and removing it
494 3b01286e Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
495 3b01286e Michael Hanselmann
          RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
496 3b01286e Michael Hanselmann
          RunTest(qa_instance.TestBackupList, expnode)
497 3b01286e Michael Hanselmann
        finally:
498 3b01286e Michael Hanselmann
          qa_config.ReleaseNode(expnode)
499 3b01286e Michael Hanselmann
        del expnode
500 3b01286e Michael Hanselmann
        del instance
501 8d8d650c Michael Hanselmann
502 a8083063 Iustin Pop
  finally:
503 b1ffe1eb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
504 a8083063 Iustin Pop
505 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
506 a8083063 Iustin Pop
507 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
508 a8083063 Iustin Pop
509 cec9845c Michael Hanselmann
510 f7e6f3c8 Iustin Pop
@rapi.client.UsesRapiClient
511 f7e6f3c8 Iustin Pop
def main():
512 f7e6f3c8 Iustin Pop
  """Main program.
513 f7e6f3c8 Iustin Pop

514 f7e6f3c8 Iustin Pop
  """
515 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
516 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
517 f7e6f3c8 Iustin Pop
      action="store_true",
518 f7e6f3c8 Iustin Pop
      help="Really execute the tests")
519 f7e6f3c8 Iustin Pop
  (qa_config.options, args) = parser.parse_args()
520 f7e6f3c8 Iustin Pop
521 f7e6f3c8 Iustin Pop
  if len(args) == 1:
522 f7e6f3c8 Iustin Pop
    (config_file, ) = args
523 f7e6f3c8 Iustin Pop
  else:
524 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
525 f7e6f3c8 Iustin Pop
526 f7e6f3c8 Iustin Pop
  if not qa_config.options.yes_do_it:
527 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
528 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
529 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
530 f7e6f3c8 Iustin Pop
    sys.exit(1)
531 f7e6f3c8 Iustin Pop
532 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
533 f7e6f3c8 Iustin Pop
534 f7e6f3c8 Iustin Pop
  qa_utils.StartMultiplexer(qa_config.GetMasterNode()["primary"])
535 f7e6f3c8 Iustin Pop
  try:
536 f7e6f3c8 Iustin Pop
    RunQa()
537 f7e6f3c8 Iustin Pop
  finally:
538 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
539 f7e6f3c8 Iustin Pop
540 d0c8c01d Iustin Pop
if __name__ == "__main__":
541 cec9845c Michael Hanselmann
  main()