Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 82ce55fa

History | View | Annotate | Download (32.2 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 cd04f8c2 Michael Hanselmann
198 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
199 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
200 8201b996 Iustin Pop
201 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
202 288d6440 Michael Hanselmann
203 2214cf14 Michael Hanselmann
  # Test listing fields
204 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
205 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
206 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobListFields)
207 0fdf247d Michael Hanselmann
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
208 2214cf14 Michael Hanselmann
209 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
210 b1ffe1eb Michael Hanselmann
211 35ff270b Bernardo Dal Seno
  return rapi_secret
212 35ff270b Bernardo Dal Seno
213 b1ffe1eb Michael Hanselmann
214 b1ffe1eb Michael Hanselmann
def RunClusterTests():
215 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
216 180bdd1f Michael Hanselmann

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

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

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

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

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

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

399 ea7693c1 Helga Velroyen
  """
400 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkAddRemove)
401 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkConnect)
402 ea7693c1 Helga Velroyen
403 ea7693c1 Helga Velroyen
404 66787da5 Adeodato Simo
def RunGroupRwTests():
405 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
406 66787da5 Adeodato Simo

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

419 c99200a3 Bernardo Dal Seno
  @type inodes: list of nodes
420 c99200a3 Bernardo Dal Seno
  @param inodes: current nodes of the instance
421 638a7266 Iustin Pop

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

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

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

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

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

964 f7e6f3c8 Iustin Pop
  """
965 1490a90c Petr Pudlak
  colors.check_for_colors()
966 1490a90c Petr Pudlak
967 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
968 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
969 5ae4945a Iustin Pop
                    action="store_true",
970 5ae4945a Iustin Pop
                    help="Really execute the tests")
971 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
972 f7e6f3c8 Iustin Pop
973 f7e6f3c8 Iustin Pop
  if len(args) == 1:
974 f7e6f3c8 Iustin Pop
    (config_file, ) = args
975 f7e6f3c8 Iustin Pop
  else:
976 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
977 f7e6f3c8 Iustin Pop
978 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
979 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
980 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
981 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
982 f7e6f3c8 Iustin Pop
    sys.exit(1)
983 f7e6f3c8 Iustin Pop
984 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
985 f7e6f3c8 Iustin Pop
986 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
987 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
988 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
989 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
990 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
991 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
992 f7e6f3c8 Iustin Pop
  try:
993 f7e6f3c8 Iustin Pop
    RunQa()
994 f7e6f3c8 Iustin Pop
  finally:
995 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
996 f7e6f3c8 Iustin Pop
997 d0c8c01d Iustin Pop
if __name__ == "__main__":
998 cec9845c Michael Hanselmann
  main()