Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ a02dbfca

History | View | Annotate | Download (33.1 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 35ff270b Bernardo Dal Seno
from ganeti import pathutils
57 2a7c3583 Michael Hanselmann
58 35ff270b Bernardo Dal Seno
from ganeti.http.auth import ParsePasswordFile
59 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=W0611
60 fc3f75dd Iustin Pop
from ganeti.rapi.client import UsesRapiClient
61 725ec2f1 René Nussbaumer
62 a8083063 Iustin Pop
63 d5a9b556 Petr Pudlak
def _FormatHeader(line, end=72, mark="-", color=None):
64 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
65 f89d59b9 Iustin Pop

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

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

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

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

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

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

162 a8083063 Iustin Pop
  """
163 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
164 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
165 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
166 a8083063 Iustin Pop
167 94508060 Michael Hanselmann
168 35ff270b Bernardo Dal Seno
def _LookupRapiSecret(rapi_user):
169 35ff270b Bernardo Dal Seno
  """Find the RAPI secret for the given user.
170 35ff270b Bernardo Dal Seno

171 35ff270b Bernardo Dal Seno
  @param rapi_user: Login user
172 35ff270b Bernardo Dal Seno
  @return: Login secret for the user
173 35ff270b Bernardo Dal Seno

174 35ff270b Bernardo Dal Seno
  """
175 35ff270b Bernardo Dal Seno
  CTEXT = "{CLEARTEXT}"
176 35ff270b Bernardo Dal Seno
  master = qa_config.GetMasterNode()
177 35ff270b Bernardo Dal Seno
  cmd = ["cat", qa_utils.MakeNodePath(master, pathutils.RAPI_USERS_FILE)]
178 35ff270b Bernardo Dal Seno
  file_content = qa_utils.GetCommandOutput(master.primary,
179 35ff270b Bernardo Dal Seno
                                           utils.ShellQuoteArgs(cmd))
180 35ff270b Bernardo Dal Seno
  users = ParsePasswordFile(file_content)
181 35ff270b Bernardo Dal Seno
  entry = users.get(rapi_user)
182 35ff270b Bernardo Dal Seno
  if not entry:
183 35ff270b Bernardo Dal Seno
    raise qa_error.Error("User %s not found in RAPI users file" % rapi_user)
184 35ff270b Bernardo Dal Seno
  secret = entry.password
185 35ff270b Bernardo Dal Seno
  if secret.upper().startswith(CTEXT):
186 35ff270b Bernardo Dal Seno
    secret = secret[len(CTEXT):]
187 35ff270b Bernardo Dal Seno
  elif secret.startswith("{"):
188 35ff270b Bernardo Dal Seno
    raise qa_error.Error("Unsupported password schema for RAPI user %s:"
189 35ff270b Bernardo Dal Seno
                         " not a clear text password" % rapi_user)
190 35ff270b Bernardo Dal Seno
  return secret
191 35ff270b Bernardo Dal Seno
192 35ff270b Bernardo Dal Seno
193 35ff270b Bernardo Dal Seno
def SetupCluster(rapi_user):
194 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
195 a8083063 Iustin Pop

196 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
197 35ff270b Bernardo Dal Seno
  @return: Login secret for RAPI
198 725ec2f1 René Nussbaumer

199 b1ffe1eb Michael Hanselmann
  """
200 35ff270b Bernardo Dal Seno
  rapi_secret = utils.GenerateSecret()
201 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
202 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
203 6a0f22e1 Bernardo Dal Seno
  if not qa_config.TestEnabled("create-cluster"):
204 6a0f22e1 Bernardo Dal Seno
    # If the cluster is already in place, we assume that exclusive-storage is
205 6a0f22e1 Bernardo Dal Seno
    # already set according to the configuration
206 6a0f22e1 Bernardo Dal Seno
    qa_config.SetExclusiveStorage(qa_config.get("exclusive-storage", False))
207 35ff270b Bernardo Dal Seno
    if qa_rapi.Enabled():
208 35ff270b Bernardo Dal Seno
      # To support RAPI on an existing cluster we have to find out the secret
209 35ff270b Bernardo Dal Seno
      rapi_secret = _LookupRapiSecret(rapi_user)
210 288d6440 Michael Hanselmann
211 ec7b6d63 Petr Pudlak
  qa_group.ConfigureGroups()
212 ec7b6d63 Petr Pudlak
213 288d6440 Michael Hanselmann
  # Test on empty cluster
214 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
215 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
216 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
217 288d6440 Michael Hanselmann
218 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
219 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
220 8e671b7c Iustin Pop
    # consider the nodes are already there
221 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
222 8201b996 Iustin Pop
223 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
224 cd04f8c2 Michael Hanselmann
225 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
226 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
227 8201b996 Iustin Pop
228 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
229 288d6440 Michael Hanselmann
230 2214cf14 Michael Hanselmann
  # Test listing fields
231 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
232 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
233 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobListFields)
234 0fdf247d Michael Hanselmann
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
235 2214cf14 Michael Hanselmann
236 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
237 b1ffe1eb Michael Hanselmann
238 35ff270b Bernardo Dal Seno
  return rapi_secret
239 35ff270b Bernardo Dal Seno
240 b1ffe1eb Michael Hanselmann
241 b1ffe1eb Michael Hanselmann
def RunClusterTests():
242 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
243 180bdd1f Michael Hanselmann

244 b1ffe1eb Michael Hanselmann
  """
245 7d88f255 Iustin Pop
  for test, fn in [
246 92cb4940 Andrea Spadaccini
    ("create-cluster", qa_cluster.TestClusterInitDisk),
247 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
248 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
249 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
250 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
251 1e7acc3b Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
252 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyIPolicy),
253 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyISpecs),
254 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
255 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
256 2dae8d64 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifyDiskTemplates),
257 b24b52d9 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifyFileStorageDir),
258 b24b52d9 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifySharedFileStorageDir),
259 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
260 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
261 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
262 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
263 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
264 db41409c Michael Hanselmann
    (["cluster-copyfile", qa_config.NoVirtualCluster],
265 db41409c Michael Hanselmann
     qa_cluster.TestClusterCopyfile),
266 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
267 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
268 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
269 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
270 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
271 c0464536 Michael Hanselmann
    (["cluster-oob", qa_config.NoVirtualCluster],
272 c0464536 Michael Hanselmann
     qa_cluster.TestClusterOob),
273 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestVersion),
274 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
275 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
276 7d88f255 Iustin Pop
    ]:
277 7d88f255 Iustin Pop
    RunTestIf(test, fn)
278 8947cf2b Michael Hanselmann
279 6d4a1656 Michael Hanselmann
280 65a884ef Iustin Pop
def RunRepairDiskSizes():
281 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
282 65a884ef Iustin Pop

283 65a884ef Iustin Pop
  """
284 65a884ef Iustin Pop
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)
285 65a884ef Iustin Pop
286 65a884ef Iustin Pop
287 b1ffe1eb Michael Hanselmann
def RunOsTests():
288 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
289 5d640672 Michael Hanselmann

290 b1ffe1eb Michael Hanselmann
  """
291 c9cf3f1a Michael Hanselmann
  os_enabled = ["os", qa_config.NoVirtualCluster]
292 c9cf3f1a Michael Hanselmann
293 301adaae Michael Hanselmann
  if qa_config.TestEnabled(qa_rapi.Enabled):
294 2932dc44 Michael Hanselmann
    rapi_getos = qa_rapi.GetOperatingSystems
295 2932dc44 Michael Hanselmann
  else:
296 2932dc44 Michael Hanselmann
    rapi_getos = None
297 2932dc44 Michael Hanselmann
298 7d88f255 Iustin Pop
  for fn in [
299 7d88f255 Iustin Pop
    qa_os.TestOsList,
300 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
301 2932dc44 Michael Hanselmann
    ]:
302 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
303 2932dc44 Michael Hanselmann
304 2932dc44 Michael Hanselmann
  for fn in [
305 7d88f255 Iustin Pop
    qa_os.TestOsValid,
306 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
307 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
308 2932dc44 Michael Hanselmann
    ]:
309 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn, rapi_getos)
310 2932dc44 Michael Hanselmann
311 2932dc44 Michael Hanselmann
  for fn in [
312 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
313 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
314 074e139f Michael Hanselmann
    qa_os.TestOsStatesNonExisting,
315 7d88f255 Iustin Pop
    ]:
316 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
317 b1ffe1eb Michael Hanselmann
318 b1ffe1eb Michael Hanselmann
319 7af293d7 Thomas Thrainer
def RunCommonInstanceTests(instance, inst_nodes):
320 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
321 b1ffe1eb Michael Hanselmann

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

409 729c4377 Iustin Pop
  """
410 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
411 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
412 c0464536 Michael Hanselmann
  RunTestIf(["node-oob", qa_config.NoVirtualCluster], qa_node.TestOutOfBand)
413 8e1db003 Michael Hanselmann
414 8d8d650c Michael Hanselmann
415 30131294 Adeodato Simo
def RunGroupListTests():
416 30131294 Adeodato Simo
  """Run tests for listing node groups.
417 30131294 Adeodato Simo

418 30131294 Adeodato Simo
  """
419 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
420 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
421 30131294 Adeodato Simo
422 30131294 Adeodato Simo
423 ea7693c1 Helga Velroyen
def RunNetworkTests():
424 ea7693c1 Helga Velroyen
  """Run tests for network management.
425 ea7693c1 Helga Velroyen

426 ea7693c1 Helga Velroyen
  """
427 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkAddRemove)
428 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkConnect)
429 ea7693c1 Helga Velroyen
430 ea7693c1 Helga Velroyen
431 66787da5 Adeodato Simo
def RunGroupRwTests():
432 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
433 66787da5 Adeodato Simo

434 66787da5 Adeodato Simo
  """
435 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
436 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
437 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
438 301adaae Michael Hanselmann
  RunTestIf(["group-rwops", qa_rapi.Enabled], qa_rapi.TestRapiNodeGroups)
439 fe508a9d Michael Hanselmann
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
440 fe508a9d Michael Hanselmann
            qa_group.GetDefaultGroup())
441 4b10fb65 Adeodato Simo
442 66787da5 Adeodato Simo
443 c99200a3 Bernardo Dal Seno
def RunExportImportTests(instance, inodes):
444 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
445 a8083063 Iustin Pop

446 c99200a3 Bernardo Dal Seno
  @type inodes: list of nodes
447 c99200a3 Bernardo Dal Seno
  @param inodes: current nodes of the instance
448 638a7266 Iustin Pop

449 b1ffe1eb Michael Hanselmann
  """
450 301c3bbb Guido Trotter
  # FIXME: export explicitly bails out on file based storage. other non-lvm
451 301c3bbb Guido Trotter
  # based storage types are untested, though. Also note that import could still
452 301c3bbb Guido Trotter
  # work, but is deeply embedded into the "export" case.
453 301c3bbb Guido Trotter
  if (qa_config.TestEnabled("instance-export") and
454 a09639d1 Santi Raffa
      instance.disk_template not in constants.DTS_FILEBASED):
455 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
456 bc696589 Michael Hanselmann
457 c99200a3 Bernardo Dal Seno
    pnode = inodes[0]
458 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
459 b1ffe1eb Michael Hanselmann
    try:
460 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
461 b1ffe1eb Michael Hanselmann
462 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
463 b1ffe1eb Michael Hanselmann
464 d0c8c01d Iustin Pop
      if qa_config.TestEnabled("instance-import"):
465 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
466 5d640672 Michael Hanselmann
        try:
467 5fa0375e Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, newinst, pnode,
468 b1ffe1eb Michael Hanselmann
                  expnode, name)
469 51131cad Michael Hanselmann
          # Check if starting the instance works
470 51131cad Michael Hanselmann
          RunTest(qa_instance.TestInstanceStartup, newinst)
471 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
472 5d640672 Michael Hanselmann
        finally:
473 6f88e076 Michael Hanselmann
          newinst.Release()
474 b1ffe1eb Michael Hanselmann
    finally:
475 565cb4bf Michael Hanselmann
      expnode.Release()
476 5d640672 Michael Hanselmann
477 34ddd63a Guido Trotter
  # FIXME: inter-cluster-instance-move crashes on file based instances :/
478 34ddd63a Guido Trotter
  # See Issue 414.
479 34ddd63a Guido Trotter
  if (qa_config.TestEnabled([qa_rapi.Enabled, "inter-cluster-instance-move"])
480 a09639d1 Santi Raffa
      and (instance.disk_template not in constants.DTS_FILEBASED)):
481 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
482 5d831182 Michael Hanselmann
    try:
483 c99200a3 Bernardo Dal Seno
      tnode = qa_config.AcquireNode(exclude=inodes)
484 5d831182 Michael Hanselmann
      try:
485 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
486 c99200a3 Bernardo Dal Seno
                inodes, tnode)
487 5d831182 Michael Hanselmann
      finally:
488 565cb4bf Michael Hanselmann
        tnode.Release()
489 5d831182 Michael Hanselmann
    finally:
490 6f88e076 Michael Hanselmann
      newinst.Release()
491 5d831182 Michael Hanselmann
492 283f9d4c Michael Hanselmann
493 b998270c Iustin Pop
def RunDaemonTests(instance):
494 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
495 9df6d173 Michael Hanselmann

496 b1ffe1eb Michael Hanselmann
  """
497 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
498 e9e35aaa Michael Hanselmann
499 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
500 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
501 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
502 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
503 e9e35aaa Michael Hanselmann
504 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
505 8201b996 Iustin Pop
506 9df6d173 Michael Hanselmann
507 c99200a3 Bernardo Dal Seno
def RunHardwareFailureTests(instance, inodes):
508 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
509 a8083063 Iustin Pop

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

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

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

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