Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ a07ae57f

History | View | Annotate | Download (33 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 5fdf8491 Bernardo Dal Seno
import copy
30 c68d1f43 Michael Hanselmann
import datetime
31 c68d1f43 Michael Hanselmann
import optparse
32 5fdf8491 Bernardo Dal Seno
import sys
33 a8083063 Iustin Pop
34 d5a9b556 Petr Pudlak
import colors
35 cec9845c Michael Hanselmann
import qa_cluster
36 cec9845c Michael Hanselmann
import qa_config
37 cec9845c Michael Hanselmann
import qa_daemon
38 cec9845c Michael Hanselmann
import qa_env
39 83180411 Bernardo Dal Seno
import qa_error
40 30131294 Adeodato Simo
import qa_group
41 cec9845c Michael Hanselmann
import qa_instance
42 02911a56 Petr Pudlak
import qa_iptables
43 a5877534 Michele Tartara
import qa_monitoring
44 ea7693c1 Helga Velroyen
import qa_network
45 cec9845c Michael Hanselmann
import qa_node
46 8947cf2b Michael Hanselmann
import qa_os
47 09470dd8 Michael Hanselmann
import qa_job
48 a47f574c Oleksiy Mishchenko
import qa_rapi
49 d74c2ca1 Michael Hanselmann
import qa_tags
50 1672a0d1 Michael Hanselmann
import qa_utils
51 a8083063 Iustin Pop
52 725ec2f1 René Nussbaumer
from ganeti import utils
53 8ad0da1e Iustin Pop
from ganeti import rapi # pylint: disable=W0611
54 f3fd2c9d Adeodato Simo
from ganeti import constants
55 a02dbfca Petr Pudlak
from ganeti import netutils
56 2a7c3583 Michael Hanselmann
57 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=W0611
58 fc3f75dd Iustin Pop
from ganeti.rapi.client import UsesRapiClient
59 725ec2f1 René Nussbaumer
60 a8083063 Iustin Pop
61 d5a9b556 Petr Pudlak
def _FormatHeader(line, end=72, mark="-", color=None):
62 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
63 f89d59b9 Iustin Pop

64 f89d59b9 Iustin Pop
  """
65 d5a9b556 Petr Pudlak
  line = (mark * 4) + " " + line + " "
66 21bf2e2e Andrea Spadaccini
  line += "-" * (end - len(line))
67 f89d59b9 Iustin Pop
  line = line.rstrip()
68 2129c5ff Petr Pudlak
  line = colors.colorize(line, color=color)
69 f89d59b9 Iustin Pop
  return line
70 f89d59b9 Iustin Pop
71 f89d59b9 Iustin Pop
72 7d88f255 Iustin Pop
def _DescriptionOf(fn):
73 7d88f255 Iustin Pop
  """Computes the description of an item.
74 a8083063 Iustin Pop

75 a8083063 Iustin Pop
  """
76 cec9845c Michael Hanselmann
  if fn.__doc__:
77 cec9845c Michael Hanselmann
    desc = fn.__doc__.splitlines()[0].strip()
78 c5c8d092 Petr Pudlak
    desc = desc.rstrip(".")
79 c5c8d092 Petr Pudlak
    if fn.__name__:
80 c5c8d092 Petr Pudlak
      desc = "[" + fn.__name__ + "] " + desc
81 a8083063 Iustin Pop
  else:
82 f89d59b9 Iustin Pop
    desc = "%r" % fn
83 a8083063 Iustin Pop
84 c5c8d092 Petr Pudlak
  return desc
85 7d88f255 Iustin Pop
86 2932dc44 Michael Hanselmann
87 741c6d91 Michael Hanselmann
def RunTest(fn, *args, **kwargs):
88 7d88f255 Iustin Pop
  """Runs a test after printing a header.
89 7d88f255 Iustin Pop

90 7d88f255 Iustin Pop
  """
91 a8083063 Iustin Pop
92 f89d59b9 Iustin Pop
  tstart = datetime.datetime.now()
93 a8083063 Iustin Pop
94 7d88f255 Iustin Pop
  desc = _DescriptionOf(fn)
95 7d88f255 Iustin Pop
96 f89d59b9 Iustin Pop
  print
97 d5a9b556 Petr Pudlak
  print _FormatHeader("%s start %s" % (tstart, desc),
98 d5a9b556 Petr Pudlak
                      color=colors.YELLOW, mark="<")
99 f89d59b9 Iustin Pop
100 f89d59b9 Iustin Pop
  try:
101 741c6d91 Michael Hanselmann
    retval = fn(*args, **kwargs)
102 d5a9b556 Petr Pudlak
    print _FormatHeader("PASSED %s" % (desc, ), color=colors.GREEN)
103 f89d59b9 Iustin Pop
    return retval
104 d5a9b556 Petr Pudlak
  except Exception, e:
105 d5a9b556 Petr Pudlak
    print _FormatHeader("FAILED %s: %s" % (desc, e), color=colors.RED)
106 d5a9b556 Petr Pudlak
    raise
107 f89d59b9 Iustin Pop
  finally:
108 f89d59b9 Iustin Pop
    tstop = datetime.datetime.now()
109 f89d59b9 Iustin Pop
    tdelta = tstop - tstart
110 d5a9b556 Petr Pudlak
    print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc),
111 d5a9b556 Petr Pudlak
                        color=colors.MAGENTA, mark=">")
112 a8083063 Iustin Pop
113 a8083063 Iustin Pop
114 741c6d91 Michael Hanselmann
def RunTestIf(testnames, fn, *args, **kwargs):
115 7d88f255 Iustin Pop
  """Runs a test conditionally.
116 7d88f255 Iustin Pop

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

120 7d88f255 Iustin Pop
  """
121 7d88f255 Iustin Pop
  if qa_config.TestEnabled(testnames):
122 741c6d91 Michael Hanselmann
    RunTest(fn, *args, **kwargs)
123 7d88f255 Iustin Pop
  else:
124 7d88f255 Iustin Pop
    tstart = datetime.datetime.now()
125 7d88f255 Iustin Pop
    desc = _DescriptionOf(fn)
126 c072e788 Michael Hanselmann
    # TODO: Formatting test names when non-string names are involved
127 7d88f255 Iustin Pop
    print _FormatHeader("%s skipping %s, test(s) %s disabled" %
128 d5a9b556 Petr Pudlak
                        (tstart, desc, testnames),
129 d5a9b556 Petr Pudlak
                        color=colors.BLUE, mark="*")
130 7d88f255 Iustin Pop
131 7d88f255 Iustin Pop
132 6c005975 Petr Pudlak
def RunTestBlock(fn, *args, **kwargs):
133 6c005975 Petr Pudlak
  """Runs a block of tests after printing a header.
134 6c005975 Petr Pudlak

135 6c005975 Petr Pudlak
  """
136 6c005975 Petr Pudlak
  tstart = datetime.datetime.now()
137 6c005975 Petr Pudlak
138 6c005975 Petr Pudlak
  desc = _DescriptionOf(fn)
139 6c005975 Petr Pudlak
140 6c005975 Petr Pudlak
  print
141 6c005975 Petr Pudlak
  print _FormatHeader("BLOCK %s start %s" % (tstart, desc),
142 6c005975 Petr Pudlak
                      color=[colors.YELLOW, colors.BOLD], mark="v")
143 6c005975 Petr Pudlak
144 6c005975 Petr Pudlak
  try:
145 6c005975 Petr Pudlak
    return fn(*args, **kwargs)
146 6c005975 Petr Pudlak
  except Exception, e:
147 6c005975 Petr Pudlak
    print _FormatHeader("BLOCK FAILED %s: %s" % (desc, e),
148 6c005975 Petr Pudlak
                        color=[colors.RED, colors.BOLD])
149 6c005975 Petr Pudlak
    raise
150 6c005975 Petr Pudlak
  finally:
151 6c005975 Petr Pudlak
    tstop = datetime.datetime.now()
152 6c005975 Petr Pudlak
    tdelta = tstop - tstart
153 6c005975 Petr Pudlak
    print _FormatHeader("BLOCK %s time=%s %s" % (tstop, tdelta, desc),
154 6c005975 Petr Pudlak
                        color=[colors.MAGENTA, colors.BOLD], mark="^")
155 6c005975 Petr Pudlak
156 6c005975 Petr Pudlak
157 b1ffe1eb Michael Hanselmann
def RunEnvTests():
158 b1ffe1eb Michael Hanselmann
  """Run several environment tests.
159 a8083063 Iustin Pop

160 a8083063 Iustin Pop
  """
161 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
162 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
163 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
164 a8083063 Iustin Pop
165 94508060 Michael Hanselmann
166 35ff270b Bernardo Dal Seno
def SetupCluster(rapi_user):
167 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
168 a8083063 Iustin Pop

169 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
170 35ff270b Bernardo Dal Seno
  @return: Login secret for RAPI
171 725ec2f1 René Nussbaumer

172 b1ffe1eb Michael Hanselmann
  """
173 35ff270b Bernardo Dal Seno
  rapi_secret = utils.GenerateSecret()
174 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
175 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
176 6a0f22e1 Bernardo Dal Seno
  if not qa_config.TestEnabled("create-cluster"):
177 6a0f22e1 Bernardo Dal Seno
    # If the cluster is already in place, we assume that exclusive-storage is
178 6a0f22e1 Bernardo Dal Seno
    # already set according to the configuration
179 6a0f22e1 Bernardo Dal Seno
    qa_config.SetExclusiveStorage(qa_config.get("exclusive-storage", False))
180 35ff270b Bernardo Dal Seno
    if qa_rapi.Enabled():
181 35ff270b Bernardo Dal Seno
      # To support RAPI on an existing cluster we have to find out the secret
182 fcd2359a Hrvoje Ribicic
      rapi_secret = qa_rapi.LookupRapiSecret(rapi_user)
183 288d6440 Michael Hanselmann
184 ec7b6d63 Petr Pudlak
  qa_group.ConfigureGroups()
185 ec7b6d63 Petr Pudlak
186 288d6440 Michael Hanselmann
  # Test on empty cluster
187 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
188 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
189 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
190 288d6440 Michael Hanselmann
191 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
192 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
193 8e671b7c Iustin Pop
    # consider the nodes are already there
194 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
195 8201b996 Iustin Pop
196 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
197 66cb789f Hrvoje Ribicic
  RunTestIf("test-jobqueue", qa_job.TestJobCancellation)
198 cd04f8c2 Michael Hanselmann
199 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
200 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
201 8201b996 Iustin Pop
202 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
203 288d6440 Michael Hanselmann
204 2214cf14 Michael Hanselmann
  # Test listing fields
205 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
206 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
207 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobListFields)
208 0fdf247d Michael Hanselmann
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
209 2214cf14 Michael Hanselmann
210 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
211 b1ffe1eb Michael Hanselmann
212 35ff270b Bernardo Dal Seno
  return rapi_secret
213 35ff270b Bernardo Dal Seno
214 b1ffe1eb Michael Hanselmann
215 b1ffe1eb Michael Hanselmann
def RunClusterTests():
216 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
217 180bdd1f Michael Hanselmann

218 b1ffe1eb Michael Hanselmann
  """
219 7d88f255 Iustin Pop
  for test, fn in [
220 92cb4940 Andrea Spadaccini
    ("create-cluster", qa_cluster.TestClusterInitDisk),
221 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
222 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
223 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
224 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
225 1e7acc3b Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
226 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyIPolicy),
227 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyISpecs),
228 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
229 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
230 2dae8d64 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifyDiskTemplates),
231 b24b52d9 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifyFileStorageDir),
232 b24b52d9 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifySharedFileStorageDir),
233 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
234 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
235 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
236 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
237 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
238 db41409c Michael Hanselmann
    (["cluster-copyfile", qa_config.NoVirtualCluster],
239 db41409c Michael Hanselmann
     qa_cluster.TestClusterCopyfile),
240 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
241 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
242 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
243 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
244 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
245 c0464536 Michael Hanselmann
    (["cluster-oob", qa_config.NoVirtualCluster],
246 c0464536 Michael Hanselmann
     qa_cluster.TestClusterOob),
247 f985ecbd Jose A. Lopes
    ("cluster-instance-communication", qa_cluster.TestInstanceCommunication),
248 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestVersion),
249 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
250 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
251 7d88f255 Iustin Pop
    ]:
252 7d88f255 Iustin Pop
    RunTestIf(test, fn)
253 8947cf2b Michael Hanselmann
254 6d4a1656 Michael Hanselmann
255 65a884ef Iustin Pop
def RunRepairDiskSizes():
256 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
257 65a884ef Iustin Pop

258 65a884ef Iustin Pop
  """
259 65a884ef Iustin Pop
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)
260 65a884ef Iustin Pop
261 65a884ef Iustin Pop
262 b1ffe1eb Michael Hanselmann
def RunOsTests():
263 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
264 5d640672 Michael Hanselmann

265 b1ffe1eb Michael Hanselmann
  """
266 c9cf3f1a Michael Hanselmann
  os_enabled = ["os", qa_config.NoVirtualCluster]
267 c9cf3f1a Michael Hanselmann
268 301adaae Michael Hanselmann
  if qa_config.TestEnabled(qa_rapi.Enabled):
269 2932dc44 Michael Hanselmann
    rapi_getos = qa_rapi.GetOperatingSystems
270 2932dc44 Michael Hanselmann
  else:
271 2932dc44 Michael Hanselmann
    rapi_getos = None
272 2932dc44 Michael Hanselmann
273 7d88f255 Iustin Pop
  for fn in [
274 7d88f255 Iustin Pop
    qa_os.TestOsList,
275 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
276 2932dc44 Michael Hanselmann
    ]:
277 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
278 2932dc44 Michael Hanselmann
279 2932dc44 Michael Hanselmann
  for fn in [
280 7d88f255 Iustin Pop
    qa_os.TestOsValid,
281 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
282 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
283 2932dc44 Michael Hanselmann
    ]:
284 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn, rapi_getos)
285 2932dc44 Michael Hanselmann
286 2932dc44 Michael Hanselmann
  for fn in [
287 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
288 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
289 074e139f Michael Hanselmann
    qa_os.TestOsStatesNonExisting,
290 7d88f255 Iustin Pop
    ]:
291 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
292 b1ffe1eb Michael Hanselmann
293 b1ffe1eb Michael Hanselmann
294 7af293d7 Thomas Thrainer
def RunCommonInstanceTests(instance, inst_nodes):
295 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
296 b1ffe1eb Michael Hanselmann

297 b1ffe1eb Michael Hanselmann
  """
298 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceShutdown, instance)
299 301adaae Michael Hanselmann
  RunTestIf(["instance-shutdown", "instance-console", qa_rapi.Enabled],
300 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiStoppedInstanceConsole, instance)
301 3016bc1f Michael Hanselmann
  RunTestIf(["instance-shutdown", "instance-modify"],
302 3016bc1f Michael Hanselmann
            qa_instance.TestInstanceStoppedModify, instance)
303 7d88f255 Iustin Pop
  RunTestIf("instance-shutdown", qa_instance.TestInstanceStartup, instance)
304 a8083063 Iustin Pop
305 a7418448 Michael Hanselmann
  # Test shutdown/start via RAPI
306 301adaae Michael Hanselmann
  RunTestIf(["instance-shutdown", qa_rapi.Enabled],
307 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceShutdown, instance)
308 301adaae Michael Hanselmann
  RunTestIf(["instance-shutdown", qa_rapi.Enabled],
309 a7418448 Michael Hanselmann
            qa_rapi.TestRapiInstanceStartup, instance)
310 a7418448 Michael Hanselmann
311 7d88f255 Iustin Pop
  RunTestIf("instance-list", qa_instance.TestInstanceList)
312 283f9d4c Michael Hanselmann
313 7d88f255 Iustin Pop
  RunTestIf("instance-info", qa_instance.TestInstanceInfo, instance)
314 e9e35aaa Michael Hanselmann
315 7d88f255 Iustin Pop
  RunTestIf("instance-modify", qa_instance.TestInstanceModify, instance)
316 301adaae Michael Hanselmann
  RunTestIf(["instance-modify", qa_rapi.Enabled],
317 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceModify, instance)
318 c0f74c55 Iustin Pop
319 7d88f255 Iustin Pop
  RunTestIf("instance-console", qa_instance.TestInstanceConsole, instance)
320 301adaae Michael Hanselmann
  RunTestIf(["instance-console", qa_rapi.Enabled],
321 b82d4c5e Michael Hanselmann
            qa_rapi.TestRapiInstanceConsole, instance)
322 4379b1fa Michael Hanselmann
323 090128b6 Christos Stavrakakis
  RunTestIf("instance-device-names", qa_instance.TestInstanceDeviceNames,
324 090128b6 Christos Stavrakakis
            instance)
325 1be35bef Michael Hanselmann
  DOWN_TESTS = qa_config.Either([
326 1be35bef Michael Hanselmann
    "instance-reinstall",
327 1be35bef Michael Hanselmann
    "instance-rename",
328 1be35bef Michael Hanselmann
    "instance-grow-disk",
329 1be35bef Michael Hanselmann
    ])
330 1be35bef Michael Hanselmann
331 4c1a464b Iustin Pop
  # shutdown instance for any 'down' tests
332 4c1a464b Iustin Pop
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceShutdown, instance)
333 4c1a464b Iustin Pop
334 4c1a464b Iustin Pop
  # now run the 'down' state tests
335 7d88f255 Iustin Pop
  RunTestIf("instance-reinstall", qa_instance.TestInstanceReinstall, instance)
336 301adaae Michael Hanselmann
  RunTestIf(["instance-reinstall", qa_rapi.Enabled],
337 0220d2cf Guido Trotter
            qa_rapi.TestRapiInstanceReinstall, instance)
338 8a4e8898 Michael Hanselmann
339 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-rename"):
340 69bc7a38 Michael Hanselmann
    tgt_instance = qa_config.AcquireInstance()
341 69bc7a38 Michael Hanselmann
    try:
342 b5f33afa Michael Hanselmann
      rename_source = instance.name
343 b5f33afa Michael Hanselmann
      rename_target = tgt_instance.name
344 69bc7a38 Michael Hanselmann
      # perform instance rename to the same name
345 4c1a464b Iustin Pop
      RunTest(qa_instance.TestInstanceRenameAndBack,
346 69bc7a38 Michael Hanselmann
              rename_source, rename_source)
347 301adaae Michael Hanselmann
      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceRenameAndBack,
348 69bc7a38 Michael Hanselmann
                rename_source, rename_source)
349 69bc7a38 Michael Hanselmann
      if rename_target is not None:
350 69bc7a38 Michael Hanselmann
        # perform instance rename to a different name, if we have one configured
351 69bc7a38 Michael Hanselmann
        RunTest(qa_instance.TestInstanceRenameAndBack,
352 930e77d1 Michael Hanselmann
                rename_source, rename_target)
353 301adaae Michael Hanselmann
        RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceRenameAndBack,
354 69bc7a38 Michael Hanselmann
                  rename_source, rename_target)
355 69bc7a38 Michael Hanselmann
    finally:
356 6f88e076 Michael Hanselmann
      tgt_instance.Release()
357 4c1a464b Iustin Pop
358 26a5056d Iustin Pop
  RunTestIf(["instance-grow-disk"], qa_instance.TestInstanceGrowDisk, instance)
359 26a5056d Iustin Pop
360 4c1a464b Iustin Pop
  # and now start the instance again
361 4c1a464b Iustin Pop
  RunTestIf(DOWN_TESTS, qa_instance.TestInstanceStartup, instance)
362 4c1a464b Iustin Pop
363 4c1a464b Iustin Pop
  RunTestIf("instance-reboot", qa_instance.TestInstanceReboot, instance)
364 18337ca9 Iustin Pop
365 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestInstanceTags, instance)
366 d74c2ca1 Michael Hanselmann
367 7af293d7 Thomas Thrainer
  if instance.disk_template == constants.DT_DRBD8:
368 7af293d7 Thomas Thrainer
    RunTestIf("cluster-verify",
369 7af293d7 Thomas Thrainer
              qa_cluster.TestClusterVerifyDisksBrokenDRBD, instance, inst_nodes)
370 1ef6e776 Michael Hanselmann
  RunTestIf("cluster-verify", qa_cluster.TestClusterVerify)
371 d74c2ca1 Michael Hanselmann
372 301adaae Michael Hanselmann
  RunTestIf(qa_rapi.Enabled, qa_rapi.TestInstance, instance)
373 729c4377 Iustin Pop
374 288d6440 Michael Hanselmann
  # Lists instances, too
375 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
376 288d6440 Michael Hanselmann
377 09470dd8 Michael Hanselmann
  # Some jobs have been run, let's test listing them
378 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
379 09470dd8 Michael Hanselmann
380 729c4377 Iustin Pop
381 729c4377 Iustin Pop
def RunCommonNodeTests():
382 729c4377 Iustin Pop
  """Run a few common node tests.
383 729c4377 Iustin Pop

384 729c4377 Iustin Pop
  """
385 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
386 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
387 c0464536 Michael Hanselmann
  RunTestIf(["node-oob", qa_config.NoVirtualCluster], qa_node.TestOutOfBand)
388 8e1db003 Michael Hanselmann
389 8d8d650c Michael Hanselmann
390 30131294 Adeodato Simo
def RunGroupListTests():
391 30131294 Adeodato Simo
  """Run tests for listing node groups.
392 30131294 Adeodato Simo

393 30131294 Adeodato Simo
  """
394 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
395 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
396 30131294 Adeodato Simo
397 30131294 Adeodato Simo
398 ea7693c1 Helga Velroyen
def RunNetworkTests():
399 ea7693c1 Helga Velroyen
  """Run tests for network management.
400 ea7693c1 Helga Velroyen

401 ea7693c1 Helga Velroyen
  """
402 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkAddRemove)
403 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkConnect)
404 a4c589d2 Hrvoje Ribicic
  RunTestIf(["network", "tags"], qa_network.TestNetworkTags)
405 ea7693c1 Helga Velroyen
406 ea7693c1 Helga Velroyen
407 66787da5 Adeodato Simo
def RunGroupRwTests():
408 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
409 66787da5 Adeodato Simo

410 66787da5 Adeodato Simo
  """
411 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
412 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
413 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
414 301adaae Michael Hanselmann
  RunTestIf(["group-rwops", qa_rapi.Enabled], qa_rapi.TestRapiNodeGroups)
415 fe508a9d Michael Hanselmann
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
416 fe508a9d Michael Hanselmann
            qa_group.GetDefaultGroup())
417 4b10fb65 Adeodato Simo
418 66787da5 Adeodato Simo
419 c99200a3 Bernardo Dal Seno
def RunExportImportTests(instance, inodes):
420 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
421 a8083063 Iustin Pop

422 c99200a3 Bernardo Dal Seno
  @type inodes: list of nodes
423 c99200a3 Bernardo Dal Seno
  @param inodes: current nodes of the instance
424 638a7266 Iustin Pop

425 b1ffe1eb Michael Hanselmann
  """
426 301c3bbb Guido Trotter
  # FIXME: export explicitly bails out on file based storage. other non-lvm
427 301c3bbb Guido Trotter
  # based storage types are untested, though. Also note that import could still
428 301c3bbb Guido Trotter
  # work, but is deeply embedded into the "export" case.
429 301c3bbb Guido Trotter
  if (qa_config.TestEnabled("instance-export") and
430 a09639d1 Santi Raffa
      instance.disk_template not in constants.DTS_FILEBASED):
431 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
432 bc696589 Michael Hanselmann
433 c99200a3 Bernardo Dal Seno
    pnode = inodes[0]
434 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
435 b1ffe1eb Michael Hanselmann
    try:
436 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
437 b1ffe1eb Michael Hanselmann
438 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
439 b1ffe1eb Michael Hanselmann
440 d0c8c01d Iustin Pop
      if qa_config.TestEnabled("instance-import"):
441 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
442 5d640672 Michael Hanselmann
        try:
443 5fa0375e Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, newinst, pnode,
444 b1ffe1eb Michael Hanselmann
                  expnode, name)
445 51131cad Michael Hanselmann
          # Check if starting the instance works
446 51131cad Michael Hanselmann
          RunTest(qa_instance.TestInstanceStartup, newinst)
447 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
448 5d640672 Michael Hanselmann
        finally:
449 6f88e076 Michael Hanselmann
          newinst.Release()
450 b1ffe1eb Michael Hanselmann
    finally:
451 565cb4bf Michael Hanselmann
      expnode.Release()
452 5d640672 Michael Hanselmann
453 34ddd63a Guido Trotter
  # FIXME: inter-cluster-instance-move crashes on file based instances :/
454 34ddd63a Guido Trotter
  # See Issue 414.
455 34ddd63a Guido Trotter
  if (qa_config.TestEnabled([qa_rapi.Enabled, "inter-cluster-instance-move"])
456 a09639d1 Santi Raffa
      and (instance.disk_template not in constants.DTS_FILEBASED)):
457 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
458 5d831182 Michael Hanselmann
    try:
459 c99200a3 Bernardo Dal Seno
      tnode = qa_config.AcquireNode(exclude=inodes)
460 5d831182 Michael Hanselmann
      try:
461 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
462 c99200a3 Bernardo Dal Seno
                inodes, tnode)
463 5d831182 Michael Hanselmann
      finally:
464 565cb4bf Michael Hanselmann
        tnode.Release()
465 5d831182 Michael Hanselmann
    finally:
466 6f88e076 Michael Hanselmann
      newinst.Release()
467 5d831182 Michael Hanselmann
468 283f9d4c Michael Hanselmann
469 b998270c Iustin Pop
def RunDaemonTests(instance):
470 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
471 9df6d173 Michael Hanselmann

472 b1ffe1eb Michael Hanselmann
  """
473 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
474 e9e35aaa Michael Hanselmann
475 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
476 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
477 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
478 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
479 e9e35aaa Michael Hanselmann
480 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
481 8201b996 Iustin Pop
482 9df6d173 Michael Hanselmann
483 c99200a3 Bernardo Dal Seno
def RunHardwareFailureTests(instance, inodes):
484 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
485 a8083063 Iustin Pop

486 b1ffe1eb Michael Hanselmann
  """
487 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
488 301adaae Michael Hanselmann
  RunTestIf(["instance-failover", qa_rapi.Enabled],
489 c0a146a1 Michael Hanselmann
            qa_rapi.TestRapiInstanceFailover, instance)
490 b1ffe1eb Michael Hanselmann
491 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
492 301adaae Michael Hanselmann
  RunTestIf(["instance-migrate", qa_rapi.Enabled],
493 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
494 938bde86 Michael Hanselmann
495 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-replace-disks"):
496 c99200a3 Bernardo Dal Seno
    # We just need alternative secondary nodes, hence "- 1"
497 c99200a3 Bernardo Dal Seno
    othernodes = qa_config.AcquireManyNodes(len(inodes) - 1, exclude=inodes)
498 7910e7a5 Michael Hanselmann
    try:
499 301adaae Michael Hanselmann
      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceReplaceDisks, instance)
500 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
501 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
502 7910e7a5 Michael Hanselmann
    finally:
503 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(othernodes)
504 c99200a3 Bernardo Dal Seno
    del othernodes
505 7910e7a5 Michael Hanselmann
506 83180411 Bernardo Dal Seno
  if qa_config.TestEnabled("instance-recreate-disks"):
507 83180411 Bernardo Dal Seno
    try:
508 c99200a3 Bernardo Dal Seno
      acquirednodes = qa_config.AcquireManyNodes(len(inodes), exclude=inodes)
509 c99200a3 Bernardo Dal Seno
      othernodes = acquirednodes
510 83180411 Bernardo Dal Seno
    except qa_error.OutOfNodesError:
511 c99200a3 Bernardo Dal Seno
      if len(inodes) > 1:
512 c99200a3 Bernardo Dal Seno
        # If the cluster is not big enough, let's reuse some of the nodes, but
513 c99200a3 Bernardo Dal Seno
        # with different roles. In this way, we can test a DRBD instance even on
514 c99200a3 Bernardo Dal Seno
        # a 3-node cluster.
515 c99200a3 Bernardo Dal Seno
        acquirednodes = [qa_config.AcquireNode(exclude=inodes)]
516 c99200a3 Bernardo Dal Seno
        othernodes = acquirednodes + inodes[:-1]
517 c99200a3 Bernardo Dal Seno
      else:
518 c99200a3 Bernardo Dal Seno
        raise
519 83180411 Bernardo Dal Seno
    try:
520 83180411 Bernardo Dal Seno
      RunTest(qa_instance.TestRecreateDisks,
521 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
522 83180411 Bernardo Dal Seno
    finally:
523 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(acquirednodes)
524 83180411 Bernardo Dal Seno
525 c99200a3 Bernardo Dal Seno
  if len(inodes) >= 2:
526 c99200a3 Bernardo Dal Seno
    RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, inodes[0], inodes[1])
527 c99200a3 Bernardo Dal Seno
    RunTestIf("node-failover", qa_node.TestNodeFailover, inodes[0], inodes[1])
528 52e9bef0 Thomas Thrainer
    RunTestIf("node-migrate", qa_node.TestNodeMigrate, inodes[0], inodes[1])
529 b1ffe1eb Michael Hanselmann
530 b1ffe1eb Michael Hanselmann
531 50ef6a41 Bernardo Dal Seno
def RunExclusiveStorageTests():
532 50ef6a41 Bernardo Dal Seno
  """Test exclusive storage."""
533 50ef6a41 Bernardo Dal Seno
  if not qa_config.TestEnabled("cluster-exclusive-storage"):
534 50ef6a41 Bernardo Dal Seno
    return
535 50ef6a41 Bernardo Dal Seno
536 50ef6a41 Bernardo Dal Seno
  node = qa_config.AcquireNode()
537 50ef6a41 Bernardo Dal Seno
  try:
538 e8b919a1 Bernardo Dal Seno
    old_es = qa_cluster.TestSetExclStorCluster(False)
539 250a9404 Bernardo Dal Seno
    qa_node.TestExclStorSingleNode(node)
540 e8b919a1 Bernardo Dal Seno
541 e8b919a1 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(True)
542 21e2734f Bernardo Dal Seno
    qa_cluster.TestExclStorSharedPv(node)
543 21e2734f Bernardo Dal Seno
544 50ef6a41 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-plain-disk"):
545 50ef6a41 Bernardo Dal Seno
      # Make sure that the cluster doesn't have any pre-existing problem
546 50ef6a41 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
547 a77e3d33 Michael Hanselmann
548 a77e3d33 Michael Hanselmann
      # Create and allocate instances
549 c99200a3 Bernardo Dal Seno
      instance1 = qa_instance.TestInstanceAddWithPlainDisk([node])
550 a77e3d33 Michael Hanselmann
      try:
551 a77e3d33 Michael Hanselmann
        instance2 = qa_instance.TestInstanceAddWithPlainDisk([node])
552 a77e3d33 Michael Hanselmann
        try:
553 a77e3d33 Michael Hanselmann
          # cluster-verify checks that disks are allocated correctly
554 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify()
555 a77e3d33 Michael Hanselmann
556 a77e3d33 Michael Hanselmann
          # Remove instances
557 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance2)
558 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance1)
559 a77e3d33 Michael Hanselmann
        finally:
560 6f88e076 Michael Hanselmann
          instance2.Release()
561 a77e3d33 Michael Hanselmann
      finally:
562 6f88e076 Michael Hanselmann
        instance1.Release()
563 a77e3d33 Michael Hanselmann
564 efd58d99 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-drbd-disk"):
565 efd58d99 Bernardo Dal Seno
      snode = qa_config.AcquireNode()
566 efd58d99 Bernardo Dal Seno
      try:
567 efd58d99 Bernardo Dal Seno
        qa_cluster.TestSetExclStorCluster(False)
568 c99200a3 Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([node, snode])
569 a77e3d33 Michael Hanselmann
        try:
570 a77e3d33 Michael Hanselmann
          qa_cluster.TestSetExclStorCluster(True)
571 a77e3d33 Michael Hanselmann
          exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
572 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
573 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance)
574 a77e3d33 Michael Hanselmann
        finally:
575 6f88e076 Michael Hanselmann
          instance.Release()
576 efd58d99 Bernardo Dal Seno
      finally:
577 565cb4bf Michael Hanselmann
        snode.Release()
578 50ef6a41 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(old_es)
579 50ef6a41 Bernardo Dal Seno
  finally:
580 565cb4bf Michael Hanselmann
    node.Release()
581 50ef6a41 Bernardo Dal Seno
582 50ef6a41 Bernardo Dal Seno
583 02911a56 Petr Pudlak
def RunCustomSshPortTests():
584 02911a56 Petr Pudlak
  """Test accessing nodes with custom SSH ports.
585 02911a56 Petr Pudlak

586 02911a56 Petr Pudlak
  This requires removing nodes, adding them to a new group, and then undoing
587 02911a56 Petr Pudlak
  the change.
588 02911a56 Petr Pudlak
  """
589 02911a56 Petr Pudlak
  if not qa_config.TestEnabled("group-custom-ssh-port"):
590 02911a56 Petr Pudlak
    return
591 02911a56 Petr Pudlak
592 a02dbfca Petr Pudlak
  std_port = netutils.GetDaemonPort(constants.SSH)
593 02911a56 Petr Pudlak
  port = 211
594 02911a56 Petr Pudlak
  master = qa_config.GetMasterNode()
595 02911a56 Petr Pudlak
  with qa_config.AcquireManyNodesCtx(1, exclude=master) as nodes:
596 a02dbfca Petr Pudlak
    # Checks if the node(s) could be contacted through IPv6.
597 a02dbfca Petr Pudlak
    # If yes, better skip the whole test.
598 a02dbfca Petr Pudlak
599 a02dbfca Petr Pudlak
    for node in nodes:
600 a02dbfca Petr Pudlak
      if qa_utils.UsesIPv6Connection(node.primary, std_port):
601 a02dbfca Petr Pudlak
        print ("Node %s is likely to be reached using IPv6,"
602 a02dbfca Petr Pudlak
               "skipping the test" % (node.primary, ))
603 a02dbfca Petr Pudlak
        return
604 a02dbfca Petr Pudlak
605 02911a56 Petr Pudlak
    for node in nodes:
606 02911a56 Petr Pudlak
      qa_node.NodeRemove(node)
607 02911a56 Petr Pudlak
    with qa_iptables.RulesContext(nodes) as r:
608 02911a56 Petr Pudlak
      with qa_group.NewGroupCtx() as group:
609 02911a56 Petr Pudlak
        qa_group.ModifyGroupSshPort(r, group, nodes, port)
610 02911a56 Petr Pudlak
611 02911a56 Petr Pudlak
        for node in nodes:
612 02911a56 Petr Pudlak
          qa_node.NodeAdd(node, group=group)
613 02911a56 Petr Pudlak
614 02911a56 Petr Pudlak
        # Make sure that the cluster doesn't have any pre-existing problem
615 02911a56 Petr Pudlak
        qa_cluster.AssertClusterVerify()
616 02911a56 Petr Pudlak
617 02911a56 Petr Pudlak
        # Create and allocate instances
618 02911a56 Petr Pudlak
        instance1 = qa_instance.TestInstanceAddWithPlainDisk(nodes)
619 02911a56 Petr Pudlak
        try:
620 02911a56 Petr Pudlak
          instance2 = qa_instance.TestInstanceAddWithPlainDisk(nodes)
621 02911a56 Petr Pudlak
          try:
622 02911a56 Petr Pudlak
            # cluster-verify checks that disks are allocated correctly
623 02911a56 Petr Pudlak
            qa_cluster.AssertClusterVerify()
624 02911a56 Petr Pudlak
625 02911a56 Petr Pudlak
            # Remove instances
626 02911a56 Petr Pudlak
            qa_instance.TestInstanceRemove(instance2)
627 02911a56 Petr Pudlak
            qa_instance.TestInstanceRemove(instance1)
628 02911a56 Petr Pudlak
          finally:
629 02911a56 Petr Pudlak
            instance2.Release()
630 02911a56 Petr Pudlak
        finally:
631 02911a56 Petr Pudlak
          instance1.Release()
632 02911a56 Petr Pudlak
633 02911a56 Petr Pudlak
        for node in nodes:
634 02911a56 Petr Pudlak
          qa_node.NodeRemove(node)
635 02911a56 Petr Pudlak
636 02911a56 Petr Pudlak
    for node in nodes:
637 02911a56 Petr Pudlak
      qa_node.NodeAdd(node)
638 02911a56 Petr Pudlak
639 02911a56 Petr Pudlak
    qa_cluster.AssertClusterVerify()
640 02911a56 Petr Pudlak
641 02911a56 Petr Pudlak
642 ab4832d1 Bernardo Dal Seno
def _BuildSpecDict(par, mn, st, mx):
643 ec996117 Bernardo Dal Seno
  return {
644 7c8ae421 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [{
645 7c8ae421 Bernardo Dal Seno
      constants.ISPECS_MIN: {par: mn},
646 7c8ae421 Bernardo Dal Seno
      constants.ISPECS_MAX: {par: mx},
647 7c8ae421 Bernardo Dal Seno
      }],
648 7c8ae421 Bernardo Dal Seno
    constants.ISPECS_STD: {par: st},
649 ec996117 Bernardo Dal Seno
    }
650 ab4832d1 Bernardo Dal Seno
651 ab4832d1 Bernardo Dal Seno
652 5fdf8491 Bernardo Dal Seno
def _BuildDoubleSpecDict(index, par, mn, st, mx):
653 5fdf8491 Bernardo Dal Seno
  new_spec = {
654 5fdf8491 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [{}, {}],
655 5fdf8491 Bernardo Dal Seno
    }
656 5fdf8491 Bernardo Dal Seno
  if st is not None:
657 5fdf8491 Bernardo Dal Seno
    new_spec[constants.ISPECS_STD] = {par: st}
658 5fdf8491 Bernardo Dal Seno
  new_spec[constants.ISPECS_MINMAX][index] = {
659 5fdf8491 Bernardo Dal Seno
    constants.ISPECS_MIN: {par: mn},
660 5fdf8491 Bernardo Dal Seno
    constants.ISPECS_MAX: {par: mx},
661 5fdf8491 Bernardo Dal Seno
    }
662 5fdf8491 Bernardo Dal Seno
  return new_spec
663 5fdf8491 Bernardo Dal Seno
664 5fdf8491 Bernardo Dal Seno
665 ab4832d1 Bernardo Dal Seno
def TestIPolicyPlainInstance():
666 ab4832d1 Bernardo Dal Seno
  """Test instance policy interaction with instances"""
667 cb178a1e Bernardo Dal Seno
  params = ["memory-size", "cpu-count", "disk-count", "disk-size", "nic-count"]
668 ab4832d1 Bernardo Dal Seno
  if not qa_config.IsTemplateSupported(constants.DT_PLAIN):
669 ab4832d1 Bernardo Dal Seno
    print "Template %s not supported" % constants.DT_PLAIN
670 ab4832d1 Bernardo Dal Seno
    return
671 ab4832d1 Bernardo Dal Seno
672 ab4832d1 Bernardo Dal Seno
  # This test assumes that the group policy is empty
673 ec996117 Bernardo Dal Seno
  (_, old_specs) = qa_cluster.TestClusterSetISpecs()
674 7c8ae421 Bernardo Dal Seno
  # We also assume to have only one min/max bound
675 7c8ae421 Bernardo Dal Seno
  assert len(old_specs[constants.ISPECS_MINMAX]) == 1
676 ab4832d1 Bernardo Dal Seno
  node = qa_config.AcquireNode()
677 ab4832d1 Bernardo Dal Seno
  try:
678 ec996117 Bernardo Dal Seno
    # Log of policy changes, list of tuples:
679 ec996117 Bernardo Dal Seno
    # (full_change, incremental_change, policy_violated)
680 fa84c8a4 Bernardo Dal Seno
    history = []
681 ab4832d1 Bernardo Dal Seno
    instance = qa_instance.TestInstanceAddWithPlainDisk([node])
682 ab4832d1 Bernardo Dal Seno
    try:
683 ab4832d1 Bernardo Dal Seno
      policyerror = [constants.CV_EINSTANCEPOLICY]
684 ab4832d1 Bernardo Dal Seno
      for par in params:
685 46d21495 Bernardo Dal Seno
        (iminval, imaxval) = qa_instance.GetInstanceSpec(instance.name, par)
686 ab4832d1 Bernardo Dal Seno
        # Some specs must be multiple of 4
687 ab4832d1 Bernardo Dal Seno
        new_spec = _BuildSpecDict(par, imaxval + 4, imaxval + 4, imaxval + 4)
688 ec996117 Bernardo Dal Seno
        history.append((None, new_spec, True))
689 ab4832d1 Bernardo Dal Seno
        if iminval > 0:
690 ab4832d1 Bernardo Dal Seno
          # Some specs must be multiple of 4
691 ab4832d1 Bernardo Dal Seno
          if iminval >= 4:
692 ab4832d1 Bernardo Dal Seno
            upper = iminval - 4
693 ab4832d1 Bernardo Dal Seno
          else:
694 ab4832d1 Bernardo Dal Seno
            upper = iminval - 1
695 ab4832d1 Bernardo Dal Seno
          new_spec = _BuildSpecDict(par, 0, upper, upper)
696 ec996117 Bernardo Dal Seno
          history.append((None, new_spec, True))
697 ec996117 Bernardo Dal Seno
        history.append((old_specs, None, False))
698 5fdf8491 Bernardo Dal Seno
699 5fdf8491 Bernardo Dal Seno
      # Test with two instance specs
700 5fdf8491 Bernardo Dal Seno
      double_specs = copy.deepcopy(old_specs)
701 5fdf8491 Bernardo Dal Seno
      double_specs[constants.ISPECS_MINMAX] = \
702 5fdf8491 Bernardo Dal Seno
          double_specs[constants.ISPECS_MINMAX] * 2
703 5fdf8491 Bernardo Dal Seno
      (par1, par2) = params[0:2]
704 5fdf8491 Bernardo Dal Seno
      (_, imaxval1) = qa_instance.GetInstanceSpec(instance.name, par1)
705 5fdf8491 Bernardo Dal Seno
      (_, imaxval2) = qa_instance.GetInstanceSpec(instance.name, par2)
706 5fdf8491 Bernardo Dal Seno
      old_minmax = old_specs[constants.ISPECS_MINMAX][0]
707 5fdf8491 Bernardo Dal Seno
      history.extend([
708 5fdf8491 Bernardo Dal Seno
        (double_specs, None, False),
709 5fdf8491 Bernardo Dal Seno
        # The first min/max limit is being violated
710 5fdf8491 Bernardo Dal Seno
        (None,
711 5fdf8491 Bernardo Dal Seno
         _BuildDoubleSpecDict(0, par1, imaxval1 + 4, imaxval1 + 4,
712 5fdf8491 Bernardo Dal Seno
                              imaxval1 + 4),
713 5fdf8491 Bernardo Dal Seno
         False),
714 5fdf8491 Bernardo Dal Seno
        # Both min/max limits are being violated
715 5fdf8491 Bernardo Dal Seno
        (None,
716 5fdf8491 Bernardo Dal Seno
         _BuildDoubleSpecDict(1, par2, imaxval2 + 4, None, imaxval2 + 4),
717 5fdf8491 Bernardo Dal Seno
         True),
718 5fdf8491 Bernardo Dal Seno
        # The second min/max limit is being violated
719 5fdf8491 Bernardo Dal Seno
        (None,
720 5fdf8491 Bernardo Dal Seno
         _BuildDoubleSpecDict(0, par1,
721 5fdf8491 Bernardo Dal Seno
                              old_minmax[constants.ISPECS_MIN][par1],
722 5fdf8491 Bernardo Dal Seno
                              old_specs[constants.ISPECS_STD][par1],
723 5fdf8491 Bernardo Dal Seno
                              old_minmax[constants.ISPECS_MAX][par1]),
724 5fdf8491 Bernardo Dal Seno
         False),
725 5fdf8491 Bernardo Dal Seno
        (old_specs, None, False),
726 5fdf8491 Bernardo Dal Seno
        ])
727 5fdf8491 Bernardo Dal Seno
728 5fdf8491 Bernardo Dal Seno
      # Apply the changes, and check policy violations after each change
729 5fdf8491 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
730 5fdf8491 Bernardo Dal Seno
      for (new_specs, diff_specs, failed) in history:
731 5fdf8491 Bernardo Dal Seno
        qa_cluster.TestClusterSetISpecs(new_specs=new_specs,
732 5fdf8491 Bernardo Dal Seno
                                        diff_specs=diff_specs)
733 5fdf8491 Bernardo Dal Seno
        if failed:
734 5fdf8491 Bernardo Dal Seno
          qa_cluster.AssertClusterVerify(warnings=policyerror)
735 5fdf8491 Bernardo Dal Seno
        else:
736 5fdf8491 Bernardo Dal Seno
          qa_cluster.AssertClusterVerify()
737 5fdf8491 Bernardo Dal Seno
738 ab4832d1 Bernardo Dal Seno
      qa_instance.TestInstanceRemove(instance)
739 ab4832d1 Bernardo Dal Seno
    finally:
740 46d21495 Bernardo Dal Seno
      instance.Release()
741 fa84c8a4 Bernardo Dal Seno
742 fa84c8a4 Bernardo Dal Seno
    # Now we replay the same policy changes, and we expect that the instance
743 fa84c8a4 Bernardo Dal Seno
    # cannot be created for the cases where we had a policy violation above
744 ec996117 Bernardo Dal Seno
    for (new_specs, diff_specs, failed) in history:
745 ec996117 Bernardo Dal Seno
      qa_cluster.TestClusterSetISpecs(new_specs=new_specs,
746 ec996117 Bernardo Dal Seno
                                      diff_specs=diff_specs)
747 fa84c8a4 Bernardo Dal Seno
      if failed:
748 fa84c8a4 Bernardo Dal Seno
        qa_instance.TestInstanceAddWithPlainDisk([node], fail=True)
749 fa84c8a4 Bernardo Dal Seno
      # Instance creation with no policy violation has been tested already
750 ab4832d1 Bernardo Dal Seno
  finally:
751 46d21495 Bernardo Dal Seno
    node.Release()
752 ab4832d1 Bernardo Dal Seno
753 ab4832d1 Bernardo Dal Seno
754 98bdd169 Bernardo Dal Seno
def IsExclusiveStorageInstanceTestEnabled():
755 98bdd169 Bernardo Dal Seno
  test_name = "exclusive-storage-instance-tests"
756 98bdd169 Bernardo Dal Seno
  if qa_config.TestEnabled(test_name):
757 98bdd169 Bernardo Dal Seno
    vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
758 98bdd169 Bernardo Dal Seno
    vgscmd = utils.ShellQuoteArgs([
759 98bdd169 Bernardo Dal Seno
      "vgs", "--noheadings", "-o", "pv_count", vgname,
760 98bdd169 Bernardo Dal Seno
      ])
761 98bdd169 Bernardo Dal Seno
    nodes = qa_config.GetConfig()["nodes"]
762 98bdd169 Bernardo Dal Seno
    for node in nodes:
763 98bdd169 Bernardo Dal Seno
      try:
764 98bdd169 Bernardo Dal Seno
        pvnum = int(qa_utils.GetCommandOutput(node.primary, vgscmd))
765 98bdd169 Bernardo Dal Seno
      except Exception, e:
766 98bdd169 Bernardo Dal Seno
        msg = ("Cannot get the number of PVs on %s, needed by '%s': %s" %
767 98bdd169 Bernardo Dal Seno
               (node.primary, test_name, e))
768 98bdd169 Bernardo Dal Seno
        raise qa_error.Error(msg)
769 98bdd169 Bernardo Dal Seno
      if pvnum < 2:
770 98bdd169 Bernardo Dal Seno
        raise qa_error.Error("Node %s has not enough PVs (%s) to run '%s'" %
771 98bdd169 Bernardo Dal Seno
                             (node.primary, pvnum, test_name))
772 98bdd169 Bernardo Dal Seno
    res = True
773 98bdd169 Bernardo Dal Seno
  else:
774 98bdd169 Bernardo Dal Seno
    res = False
775 98bdd169 Bernardo Dal Seno
  return res
776 98bdd169 Bernardo Dal Seno
777 98bdd169 Bernardo Dal Seno
778 deadfa13 Bernardo Dal Seno
def RunInstanceTests():
779 deadfa13 Bernardo Dal Seno
  """Create and exercise instances."""
780 37889387 Klaus Aehlig
781 37889387 Klaus Aehlig
  for (test_name, templ, create_fun, num_nodes) in \
782 37889387 Klaus Aehlig
      qa_instance.available_instance_tests:
783 deadfa13 Bernardo Dal Seno
    if (qa_config.TestEnabled(test_name) and
784 deadfa13 Bernardo Dal Seno
        qa_config.IsTemplateSupported(templ)):
785 deadfa13 Bernardo Dal Seno
      inodes = qa_config.AcquireManyNodes(num_nodes)
786 deadfa13 Bernardo Dal Seno
      try:
787 deadfa13 Bernardo Dal Seno
        instance = RunTest(create_fun, inodes)
788 a77e3d33 Michael Hanselmann
        try:
789 24c530df Jose A. Lopes
          RunTestIf("instance-user-down", qa_instance.TestInstanceUserDown,
790 24c530df Jose A. Lopes
                    instance, qa_config.GetMasterNode())
791 e81d80bd Jose A. Lopes
          RunTestIf("instance-communication",
792 e81d80bd Jose A. Lopes
                    qa_instance.TestInstanceCommunication,
793 e81d80bd Jose A. Lopes
                    instance,
794 e81d80bd Jose A. Lopes
                    qa_config.GetMasterNode())
795 a77e3d33 Michael Hanselmann
          RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
796 a77e3d33 Michael Hanselmann
          RunDaemonTests(instance)
797 a77e3d33 Michael Hanselmann
          for node in inodes:
798 a77e3d33 Michael Hanselmann
            RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
799 a77e3d33 Michael Hanselmann
          if len(inodes) > 1:
800 a77e3d33 Michael Hanselmann
            RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
801 a77e3d33 Michael Hanselmann
                      constants.INITIAL_NODE_GROUP_NAME,
802 aecba21e Michael Hanselmann
                      inodes[0].primary, inodes[1].primary)
803 a77e3d33 Michael Hanselmann
          if qa_config.TestEnabled("instance-convert-disk"):
804 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
805 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceConvertDiskToPlain,
806 a77e3d33 Michael Hanselmann
                    instance, inodes)
807 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceStartup, instance)
808 a365b47f Bernardo Dal Seno
          RunTestIf("instance-modify-disks",
809 a365b47f Bernardo Dal Seno
                    qa_instance.TestInstanceModifyDisks, instance)
810 7af293d7 Thomas Thrainer
          RunCommonInstanceTests(instance, inodes)
811 d0a44ec0 Klaus Aehlig
          if qa_config.TestEnabled("instance-modify-primary"):
812 d0a44ec0 Klaus Aehlig
            othernode = qa_config.AcquireNode()
813 d0a44ec0 Klaus Aehlig
            RunTest(qa_instance.TestInstanceModifyPrimaryAndBack,
814 d0a44ec0 Klaus Aehlig
                    instance, inodes[0], othernode)
815 d0a44ec0 Klaus Aehlig
            othernode.Release()
816 a77e3d33 Michael Hanselmann
          RunGroupListTests()
817 a77e3d33 Michael Hanselmann
          RunExportImportTests(instance, inodes)
818 a77e3d33 Michael Hanselmann
          RunHardwareFailureTests(instance, inodes)
819 a77e3d33 Michael Hanselmann
          RunRepairDiskSizes()
820 a77e3d33 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
821 a77e3d33 Michael Hanselmann
        finally:
822 6f88e076 Michael Hanselmann
          instance.Release()
823 deadfa13 Bernardo Dal Seno
        del instance
824 deadfa13 Bernardo Dal Seno
      finally:
825 deadfa13 Bernardo Dal Seno
        qa_config.ReleaseManyNodes(inodes)
826 deadfa13 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
827 b1ffe1eb Michael Hanselmann
828 b1ffe1eb Michael Hanselmann
829 a5877534 Michele Tartara
def RunMonitoringTests():
830 a5877534 Michele Tartara
  if qa_config.TestEnabled("mon-collector"):
831 a5877534 Michele Tartara
    RunTest(qa_monitoring.TestInstStatusCollector)
832 a5877534 Michele Tartara
833 a5877534 Michele Tartara
834 f7e6f3c8 Iustin Pop
def RunQa():
835 f7e6f3c8 Iustin Pop
  """Main QA body.
836 b1ffe1eb Michael Hanselmann

837 b1ffe1eb Michael Hanselmann
  """
838 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
839 725ec2f1 René Nussbaumer
840 6c005975 Petr Pudlak
  RunTestBlock(RunEnvTests)
841 35ff270b Bernardo Dal Seno
  rapi_secret = SetupCluster(rapi_user)
842 2771835c Michael Hanselmann
843 0fe54825 Bernardo Dal Seno
  if qa_rapi.Enabled():
844 0fe54825 Bernardo Dal Seno
    # Load RAPI certificate
845 0fe54825 Bernardo Dal Seno
    qa_rapi.Setup(rapi_user, rapi_secret)
846 2771835c Michael Hanselmann
847 6c005975 Petr Pudlak
  RunTestBlock(RunClusterTests)
848 6c005975 Petr Pudlak
  RunTestBlock(RunOsTests)
849 4b62db14 Michael Hanselmann
850 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
851 d74c2ca1 Michael Hanselmann
852 6c005975 Petr Pudlak
  RunTestBlock(RunCommonNodeTests)
853 6c005975 Petr Pudlak
  RunTestBlock(RunGroupListTests)
854 6c005975 Petr Pudlak
  RunTestBlock(RunGroupRwTests)
855 6c005975 Petr Pudlak
  RunTestBlock(RunNetworkTests)
856 729c4377 Iustin Pop
857 6f058bf2 Bernardo Dal Seno
  # The master shouldn't be readded or put offline; "delay" needs a non-master
858 6f058bf2 Bernardo Dal Seno
  # node to test
859 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
860 d0cb68cb Michael Hanselmann
  try:
861 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
862 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
863 5a85b99e Michael Hanselmann
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
864 d0cb68cb Michael Hanselmann
  finally:
865 565cb4bf Michael Hanselmann
    pnode.Release()
866 102b115b Michael Hanselmann
867 a36f690c Bernardo Dal Seno
  # Make sure the cluster is clean before running instance tests
868 a36f690c Bernardo Dal Seno
  qa_cluster.AssertClusterVerify()
869 a36f690c Bernardo Dal Seno
870 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
871 b1ffe1eb Michael Hanselmann
  try:
872 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
873 d74c2ca1 Michael Hanselmann
874 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
875 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
876 a47f574c Oleksiy Mishchenko
877 bab4f56a Helga Velroyen
      if (qa_config.TestEnabled("instance-add-plain-disk")
878 bab4f56a Helga Velroyen
          and qa_config.IsTemplateSupported(constants.DT_PLAIN)):
879 2ee9171a Hrvoje Ribicic
        # Normal instance allocation via RAPI
880 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
881 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
882 924e95f9 Michael Hanselmann
                                  use_client)
883 a77e3d33 Michael Hanselmann
          try:
884 a77e3d33 Michael Hanselmann
            if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
885 7af293d7 Thomas Thrainer
              RunCommonInstanceTests(rapi_instance, [pnode])
886 a77e3d33 Michael Hanselmann
            RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
887 a77e3d33 Michael Hanselmann
          finally:
888 6f88e076 Michael Hanselmann
            rapi_instance.Release()
889 924e95f9 Michael Hanselmann
          del rapi_instance
890 8cb70e56 Michael Hanselmann
891 2ee9171a Hrvoje Ribicic
        # Multi-instance allocation
892 2ee9171a Hrvoje Ribicic
        rapi_instance_one, rapi_instance_two = \
893 2ee9171a Hrvoje Ribicic
          RunTest(qa_rapi.TestRapiInstanceMultiAlloc, pnode)
894 2ee9171a Hrvoje Ribicic
895 2ee9171a Hrvoje Ribicic
        try:
896 2ee9171a Hrvoje Ribicic
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance_one, True)
897 2ee9171a Hrvoje Ribicic
          RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance_two, True)
898 2ee9171a Hrvoje Ribicic
        finally:
899 2ee9171a Hrvoje Ribicic
          rapi_instance_one.Release()
900 2ee9171a Hrvoje Ribicic
          rapi_instance_two.Release()
901 6f058bf2 Bernardo Dal Seno
  finally:
902 565cb4bf Michael Hanselmann
    pnode.Release()
903 6f058bf2 Bernardo Dal Seno
904 deadfa13 Bernardo Dal Seno
  config_list = [
905 deadfa13 Bernardo Dal Seno
    ("default-instance-tests", lambda: None, lambda _: None),
906 98bdd169 Bernardo Dal Seno
    (IsExclusiveStorageInstanceTestEnabled,
907 deadfa13 Bernardo Dal Seno
     lambda: qa_cluster.TestSetExclStorCluster(True),
908 deadfa13 Bernardo Dal Seno
     qa_cluster.TestSetExclStorCluster),
909 27eba428 Bernardo Dal Seno
  ]
910 deadfa13 Bernardo Dal Seno
  for (conf_name, setup_conf_f, restore_conf_f) in config_list:
911 deadfa13 Bernardo Dal Seno
    if qa_config.TestEnabled(conf_name):
912 deadfa13 Bernardo Dal Seno
      oldconf = setup_conf_f()
913 6c005975 Petr Pudlak
      RunTestBlock(RunInstanceTests)
914 deadfa13 Bernardo Dal Seno
      restore_conf_f(oldconf)
915 c7e54e1d Agata Murawska
916 6f058bf2 Bernardo Dal Seno
  pnode = qa_config.AcquireNode()
917 6f058bf2 Bernardo Dal Seno
  try:
918 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
919 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
920 c99200a3 Bernardo Dal Seno
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, [pnode])
921 7d7609a3 Michael Hanselmann
        try:
922 a77e3d33 Michael Hanselmann
          expnode = qa_config.AcquireNode(exclude=pnode)
923 a77e3d33 Michael Hanselmann
          try:
924 a77e3d33 Michael Hanselmann
            if shutdown:
925 a77e3d33 Michael Hanselmann
              # Stop instance before exporting and removing it
926 a77e3d33 Michael Hanselmann
              RunTest(qa_instance.TestInstanceShutdown, instance)
927 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
928 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestBackupList, expnode)
929 a77e3d33 Michael Hanselmann
          finally:
930 565cb4bf Michael Hanselmann
            expnode.Release()
931 7d7609a3 Michael Hanselmann
        finally:
932 6f88e076 Michael Hanselmann
          instance.Release()
933 3b01286e Michael Hanselmann
        del expnode
934 3b01286e Michael Hanselmann
        del instance
935 a36f690c Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
936 a8083063 Iustin Pop
937 6f058bf2 Bernardo Dal Seno
  finally:
938 565cb4bf Michael Hanselmann
    pnode.Release()
939 6f058bf2 Bernardo Dal Seno
940 94f06b98 Klaus Aehlig
  RunTestIf("cluster-upgrade", qa_cluster.TestUpgrade)
941 94f06b98 Klaus Aehlig
942 6c005975 Petr Pudlak
  RunTestBlock(RunExclusiveStorageTests)
943 ab4832d1 Bernardo Dal Seno
  RunTestIf(["cluster-instance-policy", "instance-add-plain-disk"],
944 ab4832d1 Bernardo Dal Seno
            TestIPolicyPlainInstance)
945 50ef6a41 Bernardo Dal Seno
946 6c005975 Petr Pudlak
  RunTestBlock(RunCustomSshPortTests)
947 02911a56 Petr Pudlak
948 2ef21e6e Bernardo Dal Seno
  RunTestIf(
949 2ef21e6e Bernardo Dal Seno
    "instance-add-restricted-by-disktemplates",
950 2ef21e6e Bernardo Dal Seno
    qa_instance.TestInstanceCreationRestrictedByDiskTemplates)
951 2ef21e6e Bernardo Dal Seno
952 6f058bf2 Bernardo Dal Seno
  # Test removing instance with offline drbd secondary
953 04b5f222 Michael Hanselmann
  if qa_config.TestEnabled(["instance-remove-drbd-offline",
954 04b5f222 Michael Hanselmann
                            "instance-add-drbd-disk"]):
955 6f058bf2 Bernardo Dal Seno
    # Make sure the master is not put offline
956 6f058bf2 Bernardo Dal Seno
    snode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
957 6f058bf2 Bernardo Dal Seno
    try:
958 6f058bf2 Bernardo Dal Seno
      pnode = qa_config.AcquireNode(exclude=snode)
959 c7e54e1d Agata Murawska
      try:
960 a36f690c Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([pnode, snode])
961 f006f110 Bernardo Dal Seno
        set_offline = lambda node: qa_node.MakeNodeOffline(node, "yes")
962 f006f110 Bernardo Dal Seno
        set_online = lambda node: qa_node.MakeNodeOffline(node, "no")
963 f006f110 Bernardo Dal Seno
        RunTest(qa_instance.TestRemoveInstanceOfflineNode, instance, snode,
964 f006f110 Bernardo Dal Seno
                set_offline, set_online)
965 c7e54e1d Agata Murawska
      finally:
966 565cb4bf Michael Hanselmann
        pnode.Release()
967 6f058bf2 Bernardo Dal Seno
    finally:
968 565cb4bf Michael Hanselmann
      snode.Release()
969 f006f110 Bernardo Dal Seno
    qa_cluster.AssertClusterVerify()
970 a8083063 Iustin Pop
971 6c005975 Petr Pudlak
  RunTestBlock(RunMonitoringTests)
972 a5877534 Michele Tartara
973 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
974 a8083063 Iustin Pop
975 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
976 a8083063 Iustin Pop
977 cec9845c Michael Hanselmann
978 fc3f75dd Iustin Pop
@UsesRapiClient
979 f7e6f3c8 Iustin Pop
def main():
980 f7e6f3c8 Iustin Pop
  """Main program.
981 f7e6f3c8 Iustin Pop

982 f7e6f3c8 Iustin Pop
  """
983 1490a90c Petr Pudlak
  colors.check_for_colors()
984 1490a90c Petr Pudlak
985 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
986 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
987 5ae4945a Iustin Pop
                    action="store_true",
988 5ae4945a Iustin Pop
                    help="Really execute the tests")
989 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
990 f7e6f3c8 Iustin Pop
991 f7e6f3c8 Iustin Pop
  if len(args) == 1:
992 f7e6f3c8 Iustin Pop
    (config_file, ) = args
993 f7e6f3c8 Iustin Pop
  else:
994 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
995 f7e6f3c8 Iustin Pop
996 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
997 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
998 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
999 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
1000 f7e6f3c8 Iustin Pop
    sys.exit(1)
1001 f7e6f3c8 Iustin Pop
1002 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
1003 f7e6f3c8 Iustin Pop
1004 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
1005 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
1006 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
1007 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
1008 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
1009 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
1010 f7e6f3c8 Iustin Pop
  try:
1011 f7e6f3c8 Iustin Pop
    RunQa()
1012 f7e6f3c8 Iustin Pop
  finally:
1013 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
1014 f7e6f3c8 Iustin Pop
1015 d0c8c01d Iustin Pop
if __name__ == "__main__":
1016 cec9845c Michael Hanselmann
  main()