Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 33c730a2

History | View | Annotate | Download (24.4 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 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyIPolicy),
177 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyISpecs),
178 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
179 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
180 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
181 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
182 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
183 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
184 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
185 db41409c Michael Hanselmann
    (["cluster-copyfile", qa_config.NoVirtualCluster],
186 db41409c Michael Hanselmann
     qa_cluster.TestClusterCopyfile),
187 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
188 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
189 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
190 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
191 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
192 c0464536 Michael Hanselmann
    (["cluster-oob", qa_config.NoVirtualCluster],
193 c0464536 Michael Hanselmann
     qa_cluster.TestClusterOob),
194 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestVersion),
195 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
196 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
197 7d88f255 Iustin Pop
    ]:
198 7d88f255 Iustin Pop
    RunTestIf(test, fn)
199 8947cf2b Michael Hanselmann
200 6d4a1656 Michael Hanselmann
201 65a884ef Iustin Pop
def RunRepairDiskSizes():
202 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
203 65a884ef Iustin Pop

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

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

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

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

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

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

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

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

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

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

419 b1ffe1eb Michael Hanselmann
  """
420 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
421 301adaae Michael Hanselmann
  RunTestIf(["instance-failover", qa_rapi.Enabled],
422 c0a146a1 Michael Hanselmann
            qa_rapi.TestRapiInstanceFailover, instance)
423 b1ffe1eb Michael Hanselmann
424 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
425 301adaae Michael Hanselmann
  RunTestIf(["instance-migrate", qa_rapi.Enabled],
426 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
427 938bde86 Michael Hanselmann
428 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-replace-disks"):
429 c99200a3 Bernardo Dal Seno
    # We just need alternative secondary nodes, hence "- 1"
430 c99200a3 Bernardo Dal Seno
    othernodes = qa_config.AcquireManyNodes(len(inodes) - 1, exclude=inodes)
431 7910e7a5 Michael Hanselmann
    try:
432 301adaae Michael Hanselmann
      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceReplaceDisks, instance)
433 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
434 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
435 7910e7a5 Michael Hanselmann
    finally:
436 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(othernodes)
437 c99200a3 Bernardo Dal Seno
    del othernodes
438 7910e7a5 Michael Hanselmann
439 83180411 Bernardo Dal Seno
  if qa_config.TestEnabled("instance-recreate-disks"):
440 83180411 Bernardo Dal Seno
    try:
441 c99200a3 Bernardo Dal Seno
      acquirednodes = qa_config.AcquireManyNodes(len(inodes), exclude=inodes)
442 c99200a3 Bernardo Dal Seno
      othernodes = acquirednodes
443 83180411 Bernardo Dal Seno
    except qa_error.OutOfNodesError:
444 c99200a3 Bernardo Dal Seno
      if len(inodes) > 1:
445 c99200a3 Bernardo Dal Seno
        # If the cluster is not big enough, let's reuse some of the nodes, but
446 c99200a3 Bernardo Dal Seno
        # with different roles. In this way, we can test a DRBD instance even on
447 c99200a3 Bernardo Dal Seno
        # a 3-node cluster.
448 c99200a3 Bernardo Dal Seno
        acquirednodes = [qa_config.AcquireNode(exclude=inodes)]
449 c99200a3 Bernardo Dal Seno
        othernodes = acquirednodes + inodes[:-1]
450 c99200a3 Bernardo Dal Seno
      else:
451 c99200a3 Bernardo Dal Seno
        raise
452 83180411 Bernardo Dal Seno
    try:
453 83180411 Bernardo Dal Seno
      RunTest(qa_instance.TestRecreateDisks,
454 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
455 83180411 Bernardo Dal Seno
    finally:
456 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(acquirednodes)
457 83180411 Bernardo Dal Seno
458 c99200a3 Bernardo Dal Seno
  if len(inodes) >= 2:
459 c99200a3 Bernardo Dal Seno
    RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, inodes[0], inodes[1])
460 c99200a3 Bernardo Dal Seno
    RunTestIf("node-failover", qa_node.TestNodeFailover, inodes[0], inodes[1])
461 b1ffe1eb Michael Hanselmann
462 b1ffe1eb Michael Hanselmann
463 50ef6a41 Bernardo Dal Seno
def RunExclusiveStorageTests():
464 50ef6a41 Bernardo Dal Seno
  """Test exclusive storage."""
465 50ef6a41 Bernardo Dal Seno
  if not qa_config.TestEnabled("cluster-exclusive-storage"):
466 50ef6a41 Bernardo Dal Seno
    return
467 50ef6a41 Bernardo Dal Seno
468 50ef6a41 Bernardo Dal Seno
  node = qa_config.AcquireNode()
469 50ef6a41 Bernardo Dal Seno
  try:
470 e8b919a1 Bernardo Dal Seno
    old_es = qa_cluster.TestSetExclStorCluster(False)
471 250a9404 Bernardo Dal Seno
    qa_node.TestExclStorSingleNode(node)
472 e8b919a1 Bernardo Dal Seno
473 e8b919a1 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(True)
474 21e2734f Bernardo Dal Seno
    qa_cluster.TestExclStorSharedPv(node)
475 21e2734f Bernardo Dal Seno
476 50ef6a41 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-plain-disk"):
477 50ef6a41 Bernardo Dal Seno
      # Make sure that the cluster doesn't have any pre-existing problem
478 50ef6a41 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
479 a77e3d33 Michael Hanselmann
480 a77e3d33 Michael Hanselmann
      # Create and allocate instances
481 c99200a3 Bernardo Dal Seno
      instance1 = qa_instance.TestInstanceAddWithPlainDisk([node])
482 a77e3d33 Michael Hanselmann
      try:
483 a77e3d33 Michael Hanselmann
        instance2 = qa_instance.TestInstanceAddWithPlainDisk([node])
484 a77e3d33 Michael Hanselmann
        try:
485 a77e3d33 Michael Hanselmann
          # cluster-verify checks that disks are allocated correctly
486 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify()
487 a77e3d33 Michael Hanselmann
488 a77e3d33 Michael Hanselmann
          # Remove instances
489 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance2)
490 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance1)
491 a77e3d33 Michael Hanselmann
        finally:
492 6f88e076 Michael Hanselmann
          instance2.Release()
493 a77e3d33 Michael Hanselmann
      finally:
494 6f88e076 Michael Hanselmann
        instance1.Release()
495 a77e3d33 Michael Hanselmann
496 efd58d99 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-drbd-disk"):
497 efd58d99 Bernardo Dal Seno
      snode = qa_config.AcquireNode()
498 efd58d99 Bernardo Dal Seno
      try:
499 efd58d99 Bernardo Dal Seno
        qa_cluster.TestSetExclStorCluster(False)
500 c99200a3 Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([node, snode])
501 a77e3d33 Michael Hanselmann
        try:
502 a77e3d33 Michael Hanselmann
          qa_cluster.TestSetExclStorCluster(True)
503 a77e3d33 Michael Hanselmann
          exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
504 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
505 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance)
506 a77e3d33 Michael Hanselmann
        finally:
507 6f88e076 Michael Hanselmann
          instance.Release()
508 efd58d99 Bernardo Dal Seno
      finally:
509 565cb4bf Michael Hanselmann
        snode.Release()
510 50ef6a41 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(old_es)
511 50ef6a41 Bernardo Dal Seno
  finally:
512 565cb4bf Michael Hanselmann
    node.Release()
513 50ef6a41 Bernardo Dal Seno
514 50ef6a41 Bernardo Dal Seno
515 ab4832d1 Bernardo Dal Seno
def _BuildSpecDict(par, mn, st, mx):
516 ab4832d1 Bernardo Dal Seno
  return {par: {"min": mn, "std": st, "max": mx}}
517 ab4832d1 Bernardo Dal Seno
518 ab4832d1 Bernardo Dal Seno
519 ab4832d1 Bernardo Dal Seno
def TestIPolicyPlainInstance():
520 ab4832d1 Bernardo Dal Seno
  """Test instance policy interaction with instances"""
521 ab4832d1 Bernardo Dal Seno
  params = ["mem-size", "cpu-count", "disk-count", "disk-size", "nic-count"]
522 ab4832d1 Bernardo Dal Seno
  if not qa_config.IsTemplateSupported(constants.DT_PLAIN):
523 ab4832d1 Bernardo Dal Seno
    print "Template %s not supported" % constants.DT_PLAIN
524 ab4832d1 Bernardo Dal Seno
    return
525 ab4832d1 Bernardo Dal Seno
526 ab4832d1 Bernardo Dal Seno
  # This test assumes that the group policy is empty
527 ab4832d1 Bernardo Dal Seno
  (_, old_specs) = qa_cluster.TestClusterSetISpecs({})
528 ab4832d1 Bernardo Dal Seno
  node = qa_config.AcquireNode()
529 ab4832d1 Bernardo Dal Seno
  try:
530 fa84c8a4 Bernardo Dal Seno
    # Log of policy changes, list of tuples: (change, policy_violated)
531 fa84c8a4 Bernardo Dal Seno
    history = []
532 ab4832d1 Bernardo Dal Seno
    instance = qa_instance.TestInstanceAddWithPlainDisk([node])
533 ab4832d1 Bernardo Dal Seno
    try:
534 ab4832d1 Bernardo Dal Seno
      policyerror = [constants.CV_EINSTANCEPOLICY]
535 ab4832d1 Bernardo Dal Seno
      for par in params:
536 ab4832d1 Bernardo Dal Seno
        qa_cluster.AssertClusterVerify()
537 46d21495 Bernardo Dal Seno
        (iminval, imaxval) = qa_instance.GetInstanceSpec(instance.name, par)
538 ab4832d1 Bernardo Dal Seno
        # Some specs must be multiple of 4
539 ab4832d1 Bernardo Dal Seno
        new_spec = _BuildSpecDict(par, imaxval + 4, imaxval + 4, imaxval + 4)
540 fa84c8a4 Bernardo Dal Seno
        history.append((new_spec, True))
541 ab4832d1 Bernardo Dal Seno
        qa_cluster.TestClusterSetISpecs(new_spec)
542 ab4832d1 Bernardo Dal Seno
        qa_cluster.AssertClusterVerify(warnings=policyerror)
543 ab4832d1 Bernardo Dal Seno
        if iminval > 0:
544 ab4832d1 Bernardo Dal Seno
          # Some specs must be multiple of 4
545 ab4832d1 Bernardo Dal Seno
          if iminval >= 4:
546 ab4832d1 Bernardo Dal Seno
            upper = iminval - 4
547 ab4832d1 Bernardo Dal Seno
          else:
548 ab4832d1 Bernardo Dal Seno
            upper = iminval - 1
549 ab4832d1 Bernardo Dal Seno
          new_spec = _BuildSpecDict(par, 0, upper, upper)
550 fa84c8a4 Bernardo Dal Seno
          history.append((new_spec, True))
551 ab4832d1 Bernardo Dal Seno
          qa_cluster.TestClusterSetISpecs(new_spec)
552 ab4832d1 Bernardo Dal Seno
          qa_cluster.AssertClusterVerify(warnings=policyerror)
553 ab4832d1 Bernardo Dal Seno
        qa_cluster.TestClusterSetISpecs(old_specs)
554 fa84c8a4 Bernardo Dal Seno
        history.append((old_specs, False))
555 ab4832d1 Bernardo Dal Seno
      qa_instance.TestInstanceRemove(instance)
556 ab4832d1 Bernardo Dal Seno
    finally:
557 46d21495 Bernardo Dal Seno
      instance.Release()
558 fa84c8a4 Bernardo Dal Seno
559 fa84c8a4 Bernardo Dal Seno
    # Now we replay the same policy changes, and we expect that the instance
560 fa84c8a4 Bernardo Dal Seno
    # cannot be created for the cases where we had a policy violation above
561 fa84c8a4 Bernardo Dal Seno
    for (change, failed) in history:
562 fa84c8a4 Bernardo Dal Seno
      qa_cluster.TestClusterSetISpecs(change)
563 fa84c8a4 Bernardo Dal Seno
      if failed:
564 fa84c8a4 Bernardo Dal Seno
        qa_instance.TestInstanceAddWithPlainDisk([node], fail=True)
565 fa84c8a4 Bernardo Dal Seno
      # Instance creation with no policy violation has been tested already
566 ab4832d1 Bernardo Dal Seno
  finally:
567 46d21495 Bernardo Dal Seno
    node.Release()
568 ab4832d1 Bernardo Dal Seno
569 ab4832d1 Bernardo Dal Seno
570 deadfa13 Bernardo Dal Seno
def RunInstanceTests():
571 deadfa13 Bernardo Dal Seno
  """Create and exercise instances."""
572 deadfa13 Bernardo Dal Seno
  instance_tests = [
573 deadfa13 Bernardo Dal Seno
    ("instance-add-plain-disk", constants.DT_PLAIN,
574 deadfa13 Bernardo Dal Seno
     qa_instance.TestInstanceAddWithPlainDisk, 1),
575 deadfa13 Bernardo Dal Seno
    ("instance-add-drbd-disk", constants.DT_DRBD8,
576 deadfa13 Bernardo Dal Seno
     qa_instance.TestInstanceAddWithDrbdDisk, 2),
577 59c75517 Michael Hanselmann
    ("instance-add-diskless", constants.DT_DISKLESS,
578 59c75517 Michael Hanselmann
     qa_instance.TestInstanceAddDiskless, 1),
579 deadfa13 Bernardo Dal Seno
  ]
580 deadfa13 Bernardo Dal Seno
581 deadfa13 Bernardo Dal Seno
  for (test_name, templ, create_fun, num_nodes) in instance_tests:
582 deadfa13 Bernardo Dal Seno
    if (qa_config.TestEnabled(test_name) and
583 deadfa13 Bernardo Dal Seno
        qa_config.IsTemplateSupported(templ)):
584 deadfa13 Bernardo Dal Seno
      inodes = qa_config.AcquireManyNodes(num_nodes)
585 deadfa13 Bernardo Dal Seno
      try:
586 deadfa13 Bernardo Dal Seno
        instance = RunTest(create_fun, inodes)
587 a77e3d33 Michael Hanselmann
        try:
588 a77e3d33 Michael Hanselmann
          RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
589 a77e3d33 Michael Hanselmann
          RunDaemonTests(instance)
590 a77e3d33 Michael Hanselmann
          for node in inodes:
591 a77e3d33 Michael Hanselmann
            RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
592 a77e3d33 Michael Hanselmann
          if len(inodes) > 1:
593 a77e3d33 Michael Hanselmann
            RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
594 a77e3d33 Michael Hanselmann
                      constants.INITIAL_NODE_GROUP_NAME,
595 aecba21e Michael Hanselmann
                      inodes[0].primary, inodes[1].primary)
596 a77e3d33 Michael Hanselmann
          if qa_config.TestEnabled("instance-convert-disk"):
597 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
598 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceConvertDiskToPlain,
599 a77e3d33 Michael Hanselmann
                    instance, inodes)
600 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceStartup, instance)
601 a77e3d33 Michael Hanselmann
          RunCommonInstanceTests(instance)
602 a77e3d33 Michael Hanselmann
          RunGroupListTests()
603 a77e3d33 Michael Hanselmann
          RunExportImportTests(instance, inodes)
604 a77e3d33 Michael Hanselmann
          RunHardwareFailureTests(instance, inodes)
605 a77e3d33 Michael Hanselmann
          RunRepairDiskSizes()
606 a77e3d33 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
607 a77e3d33 Michael Hanselmann
        finally:
608 6f88e076 Michael Hanselmann
          instance.Release()
609 deadfa13 Bernardo Dal Seno
        del instance
610 deadfa13 Bernardo Dal Seno
      finally:
611 deadfa13 Bernardo Dal Seno
        qa_config.ReleaseManyNodes(inodes)
612 deadfa13 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
613 b1ffe1eb Michael Hanselmann
614 b1ffe1eb Michael Hanselmann
615 f7e6f3c8 Iustin Pop
def RunQa():
616 f7e6f3c8 Iustin Pop
  """Main QA body.
617 b1ffe1eb Michael Hanselmann

618 b1ffe1eb Michael Hanselmann
  """
619 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
620 725ec2f1 René Nussbaumer
  rapi_secret = utils.GenerateSecret()
621 725ec2f1 René Nussbaumer
622 b1ffe1eb Michael Hanselmann
  RunEnvTests()
623 725ec2f1 René Nussbaumer
  SetupCluster(rapi_user, rapi_secret)
624 2771835c Michael Hanselmann
625 2771835c Michael Hanselmann
  # Load RAPI certificate
626 76917d97 Iustin Pop
  qa_rapi.Setup(rapi_user, rapi_secret)
627 2771835c Michael Hanselmann
628 b1ffe1eb Michael Hanselmann
  RunClusterTests()
629 b1ffe1eb Michael Hanselmann
  RunOsTests()
630 4b62db14 Michael Hanselmann
631 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
632 d74c2ca1 Michael Hanselmann
633 729c4377 Iustin Pop
  RunCommonNodeTests()
634 30131294 Adeodato Simo
  RunGroupListTests()
635 66787da5 Adeodato Simo
  RunGroupRwTests()
636 ea7693c1 Helga Velroyen
  RunNetworkTests()
637 729c4377 Iustin Pop
638 6f058bf2 Bernardo Dal Seno
  # The master shouldn't be readded or put offline; "delay" needs a non-master
639 6f058bf2 Bernardo Dal Seno
  # node to test
640 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
641 d0cb68cb Michael Hanselmann
  try:
642 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
643 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
644 5a85b99e Michael Hanselmann
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
645 d0cb68cb Michael Hanselmann
  finally:
646 565cb4bf Michael Hanselmann
    pnode.Release()
647 102b115b Michael Hanselmann
648 a36f690c Bernardo Dal Seno
  # Make sure the cluster is clean before running instance tests
649 a36f690c Bernardo Dal Seno
  qa_cluster.AssertClusterVerify()
650 a36f690c Bernardo Dal Seno
651 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
652 b1ffe1eb Michael Hanselmann
  try:
653 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
654 d74c2ca1 Michael Hanselmann
655 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
656 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
657 a47f574c Oleksiy Mishchenko
658 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
659 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
660 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
661 924e95f9 Michael Hanselmann
                                  use_client)
662 a77e3d33 Michael Hanselmann
          try:
663 a77e3d33 Michael Hanselmann
            if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
664 a77e3d33 Michael Hanselmann
              RunCommonInstanceTests(rapi_instance)
665 a77e3d33 Michael Hanselmann
            RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
666 a77e3d33 Michael Hanselmann
          finally:
667 6f88e076 Michael Hanselmann
            rapi_instance.Release()
668 924e95f9 Michael Hanselmann
          del rapi_instance
669 8cb70e56 Michael Hanselmann
670 6f058bf2 Bernardo Dal Seno
  finally:
671 565cb4bf Michael Hanselmann
    pnode.Release()
672 6f058bf2 Bernardo Dal Seno
673 deadfa13 Bernardo Dal Seno
  config_list = [
674 deadfa13 Bernardo Dal Seno
    ("default-instance-tests", lambda: None, lambda _: None),
675 deadfa13 Bernardo Dal Seno
    ("exclusive-storage-instance-tests",
676 deadfa13 Bernardo Dal Seno
     lambda: qa_cluster.TestSetExclStorCluster(True),
677 deadfa13 Bernardo Dal Seno
     qa_cluster.TestSetExclStorCluster),
678 27eba428 Bernardo Dal Seno
  ]
679 deadfa13 Bernardo Dal Seno
  for (conf_name, setup_conf_f, restore_conf_f) in config_list:
680 deadfa13 Bernardo Dal Seno
    if qa_config.TestEnabled(conf_name):
681 deadfa13 Bernardo Dal Seno
      oldconf = setup_conf_f()
682 deadfa13 Bernardo Dal Seno
      RunInstanceTests()
683 deadfa13 Bernardo Dal Seno
      restore_conf_f(oldconf)
684 c7e54e1d Agata Murawska
685 6f058bf2 Bernardo Dal Seno
  pnode = qa_config.AcquireNode()
686 6f058bf2 Bernardo Dal Seno
  try:
687 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
688 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
689 c99200a3 Bernardo Dal Seno
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, [pnode])
690 7d7609a3 Michael Hanselmann
        try:
691 a77e3d33 Michael Hanselmann
          expnode = qa_config.AcquireNode(exclude=pnode)
692 a77e3d33 Michael Hanselmann
          try:
693 a77e3d33 Michael Hanselmann
            if shutdown:
694 a77e3d33 Michael Hanselmann
              # Stop instance before exporting and removing it
695 a77e3d33 Michael Hanselmann
              RunTest(qa_instance.TestInstanceShutdown, instance)
696 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
697 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestBackupList, expnode)
698 a77e3d33 Michael Hanselmann
          finally:
699 565cb4bf Michael Hanselmann
            expnode.Release()
700 7d7609a3 Michael Hanselmann
        finally:
701 6f88e076 Michael Hanselmann
          instance.Release()
702 3b01286e Michael Hanselmann
        del expnode
703 3b01286e Michael Hanselmann
        del instance
704 a36f690c Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
705 a8083063 Iustin Pop
706 6f058bf2 Bernardo Dal Seno
  finally:
707 565cb4bf Michael Hanselmann
    pnode.Release()
708 6f058bf2 Bernardo Dal Seno
709 50ef6a41 Bernardo Dal Seno
  RunExclusiveStorageTests()
710 ab4832d1 Bernardo Dal Seno
  RunTestIf(["cluster-instance-policy", "instance-add-plain-disk"],
711 ab4832d1 Bernardo Dal Seno
            TestIPolicyPlainInstance)
712 50ef6a41 Bernardo Dal Seno
713 6f058bf2 Bernardo Dal Seno
  # Test removing instance with offline drbd secondary
714 04b5f222 Michael Hanselmann
  if qa_config.TestEnabled(["instance-remove-drbd-offline",
715 04b5f222 Michael Hanselmann
                            "instance-add-drbd-disk"]):
716 6f058bf2 Bernardo Dal Seno
    # Make sure the master is not put offline
717 6f058bf2 Bernardo Dal Seno
    snode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
718 6f058bf2 Bernardo Dal Seno
    try:
719 6f058bf2 Bernardo Dal Seno
      pnode = qa_config.AcquireNode(exclude=snode)
720 c7e54e1d Agata Murawska
      try:
721 a36f690c Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([pnode, snode])
722 f006f110 Bernardo Dal Seno
        set_offline = lambda node: qa_node.MakeNodeOffline(node, "yes")
723 f006f110 Bernardo Dal Seno
        set_online = lambda node: qa_node.MakeNodeOffline(node, "no")
724 f006f110 Bernardo Dal Seno
        RunTest(qa_instance.TestRemoveInstanceOfflineNode, instance, snode,
725 f006f110 Bernardo Dal Seno
                set_offline, set_online)
726 c7e54e1d Agata Murawska
      finally:
727 565cb4bf Michael Hanselmann
        pnode.Release()
728 6f058bf2 Bernardo Dal Seno
    finally:
729 565cb4bf Michael Hanselmann
      snode.Release()
730 f006f110 Bernardo Dal Seno
    qa_cluster.AssertClusterVerify()
731 a8083063 Iustin Pop
732 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
733 a8083063 Iustin Pop
734 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
735 a8083063 Iustin Pop
736 cec9845c Michael Hanselmann
737 fc3f75dd Iustin Pop
@UsesRapiClient
738 f7e6f3c8 Iustin Pop
def main():
739 f7e6f3c8 Iustin Pop
  """Main program.
740 f7e6f3c8 Iustin Pop

741 f7e6f3c8 Iustin Pop
  """
742 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
743 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
744 5ae4945a Iustin Pop
                    action="store_true",
745 5ae4945a Iustin Pop
                    help="Really execute the tests")
746 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
747 f7e6f3c8 Iustin Pop
748 f7e6f3c8 Iustin Pop
  if len(args) == 1:
749 f7e6f3c8 Iustin Pop
    (config_file, ) = args
750 f7e6f3c8 Iustin Pop
  else:
751 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
752 f7e6f3c8 Iustin Pop
753 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
754 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
755 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
756 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
757 f7e6f3c8 Iustin Pop
    sys.exit(1)
758 f7e6f3c8 Iustin Pop
759 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
760 f7e6f3c8 Iustin Pop
761 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
762 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
763 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
764 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
765 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
766 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
767 f7e6f3c8 Iustin Pop
  try:
768 f7e6f3c8 Iustin Pop
    RunQa()
769 f7e6f3c8 Iustin Pop
  finally:
770 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
771 f7e6f3c8 Iustin Pop
772 d0c8c01d Iustin Pop
if __name__ == "__main__":
773 cec9845c Michael Hanselmann
  main()