Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 1fa6fcba

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

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

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

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

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

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

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

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

365 c99200a3 Bernardo Dal Seno
  @type inodes: list of nodes
366 c99200a3 Bernardo Dal Seno
  @param inodes: current nodes of the instance
367 638a7266 Iustin Pop

368 b1ffe1eb Michael Hanselmann
  """
369 301c3bbb Guido Trotter
  # FIXME: export explicitly bails out on file based storage. other non-lvm
370 301c3bbb Guido Trotter
  # based storage types are untested, though. Also note that import could still
371 301c3bbb Guido Trotter
  # work, but is deeply embedded into the "export" case.
372 301c3bbb Guido Trotter
  if (qa_config.TestEnabled("instance-export") and
373 301c3bbb Guido Trotter
      instance.disk_template != constants.DT_FILE):
374 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
375 bc696589 Michael Hanselmann
376 c99200a3 Bernardo Dal Seno
    pnode = inodes[0]
377 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
378 b1ffe1eb Michael Hanselmann
    try:
379 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
380 b1ffe1eb Michael Hanselmann
381 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
382 b1ffe1eb Michael Hanselmann
383 d0c8c01d Iustin Pop
      if qa_config.TestEnabled("instance-import"):
384 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
385 5d640672 Michael Hanselmann
        try:
386 5fa0375e Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, newinst, pnode,
387 b1ffe1eb Michael Hanselmann
                  expnode, name)
388 51131cad Michael Hanselmann
          # Check if starting the instance works
389 51131cad Michael Hanselmann
          RunTest(qa_instance.TestInstanceStartup, newinst)
390 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
391 5d640672 Michael Hanselmann
        finally:
392 6f88e076 Michael Hanselmann
          newinst.Release()
393 b1ffe1eb Michael Hanselmann
    finally:
394 565cb4bf Michael Hanselmann
      expnode.Release()
395 5d640672 Michael Hanselmann
396 34ddd63a Guido Trotter
  # FIXME: inter-cluster-instance-move crashes on file based instances :/
397 34ddd63a Guido Trotter
  # See Issue 414.
398 34ddd63a Guido Trotter
  if (qa_config.TestEnabled([qa_rapi.Enabled, "inter-cluster-instance-move"])
399 34ddd63a Guido Trotter
      and instance.disk_template != constants.DT_FILE):
400 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
401 5d831182 Michael Hanselmann
    try:
402 c99200a3 Bernardo Dal Seno
      tnode = qa_config.AcquireNode(exclude=inodes)
403 5d831182 Michael Hanselmann
      try:
404 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
405 c99200a3 Bernardo Dal Seno
                inodes, tnode)
406 5d831182 Michael Hanselmann
      finally:
407 565cb4bf Michael Hanselmann
        tnode.Release()
408 5d831182 Michael Hanselmann
    finally:
409 6f88e076 Michael Hanselmann
      newinst.Release()
410 5d831182 Michael Hanselmann
411 283f9d4c Michael Hanselmann
412 b998270c Iustin Pop
def RunDaemonTests(instance):
413 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
414 9df6d173 Michael Hanselmann

415 b1ffe1eb Michael Hanselmann
  """
416 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
417 e9e35aaa Michael Hanselmann
418 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
419 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
420 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
421 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
422 e9e35aaa Michael Hanselmann
423 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
424 8201b996 Iustin Pop
425 9df6d173 Michael Hanselmann
426 c99200a3 Bernardo Dal Seno
def RunHardwareFailureTests(instance, inodes):
427 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
428 a8083063 Iustin Pop

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

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

763 f7e6f3c8 Iustin Pop
  """
764 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
765 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
766 5ae4945a Iustin Pop
                    action="store_true",
767 5ae4945a Iustin Pop
                    help="Really execute the tests")
768 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
769 f7e6f3c8 Iustin Pop
770 f7e6f3c8 Iustin Pop
  if len(args) == 1:
771 f7e6f3c8 Iustin Pop
    (config_file, ) = args
772 f7e6f3c8 Iustin Pop
  else:
773 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
774 f7e6f3c8 Iustin Pop
775 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
776 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
777 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
778 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
779 f7e6f3c8 Iustin Pop
    sys.exit(1)
780 f7e6f3c8 Iustin Pop
781 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
782 f7e6f3c8 Iustin Pop
783 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
784 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
785 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
786 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
787 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
788 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
789 f7e6f3c8 Iustin Pop
  try:
790 f7e6f3c8 Iustin Pop
    RunQa()
791 f7e6f3c8 Iustin Pop
  finally:
792 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
793 f7e6f3c8 Iustin Pop
794 d0c8c01d Iustin Pop
if __name__ == "__main__":
795 cec9845c Michael Hanselmann
  main()