Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 35ff270b

History | View | Annotate | Download (29.4 kB)

1 f89d59b9 Iustin Pop
#!/usr/bin/python -u
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 50ef6a41 Bernardo Dal Seno
# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Google Inc.
5 a8083063 Iustin Pop
#
6 a8083063 Iustin Pop
# This program is free software; you can redistribute it and/or modify
7 a8083063 Iustin Pop
# it under the terms of the GNU General Public License as published by
8 a8083063 Iustin Pop
# the Free Software Foundation; either version 2 of the License, or
9 a8083063 Iustin Pop
# (at your option) any later version.
10 a8083063 Iustin Pop
#
11 a8083063 Iustin Pop
# This program is distributed in the hope that it will be useful, but
12 a8083063 Iustin Pop
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 a8083063 Iustin Pop
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 a8083063 Iustin Pop
# General Public License for more details.
15 a8083063 Iustin Pop
#
16 a8083063 Iustin Pop
# You should have received a copy of the GNU General Public License
17 a8083063 Iustin Pop
# along with this program; if not, write to the Free Software
18 a8083063 Iustin Pop
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 a8083063 Iustin Pop
# 02110-1301, USA.
20 a8083063 Iustin Pop
21 a8083063 Iustin Pop
22 cec9845c Michael Hanselmann
"""Script for doing QA on Ganeti.
23 94508060 Michael Hanselmann

24 94508060 Michael Hanselmann
"""
25 a8083063 Iustin Pop
26 b459a848 Andrea Spadaccini
# pylint: disable=C0103
27 3582eef6 Iustin Pop
# due to invalid name
28 3582eef6 Iustin Pop
29 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 cec9845c Michael Hanselmann
import qa_cluster
35 cec9845c Michael Hanselmann
import qa_config
36 cec9845c Michael Hanselmann
import qa_daemon
37 cec9845c Michael Hanselmann
import qa_env
38 83180411 Bernardo Dal Seno
import qa_error
39 30131294 Adeodato Simo
import qa_group
40 cec9845c Michael Hanselmann
import qa_instance
41 ea7693c1 Helga Velroyen
import qa_network
42 cec9845c Michael Hanselmann
import qa_node
43 8947cf2b Michael Hanselmann
import qa_os
44 09470dd8 Michael Hanselmann
import qa_job
45 a47f574c Oleksiy Mishchenko
import qa_rapi
46 d74c2ca1 Michael Hanselmann
import qa_tags
47 1672a0d1 Michael Hanselmann
import qa_utils
48 a8083063 Iustin Pop
49 725ec2f1 René Nussbaumer
from ganeti import utils
50 8ad0da1e Iustin Pop
from ganeti import rapi # pylint: disable=W0611
51 f3fd2c9d Adeodato Simo
from ganeti import constants
52 35ff270b Bernardo Dal Seno
from ganeti import pathutils
53 2a7c3583 Michael Hanselmann
54 35ff270b Bernardo Dal Seno
from ganeti.http.auth import ParsePasswordFile
55 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=W0611
56 fc3f75dd Iustin Pop
from ganeti.rapi.client import UsesRapiClient
57 725ec2f1 René Nussbaumer
58 a8083063 Iustin Pop
59 7d88f255 Iustin Pop
def _FormatHeader(line, end=72):
60 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
61 f89d59b9 Iustin Pop

62 f89d59b9 Iustin Pop
  """
63 f89d59b9 Iustin Pop
  line = "---- " + line + " "
64 21bf2e2e Andrea Spadaccini
  line += "-" * (end - len(line))
65 f89d59b9 Iustin Pop
  line = line.rstrip()
66 f89d59b9 Iustin Pop
  return line
67 f89d59b9 Iustin Pop
68 f89d59b9 Iustin Pop
69 7d88f255 Iustin Pop
def _DescriptionOf(fn):
70 7d88f255 Iustin Pop
  """Computes the description of an item.
71 a8083063 Iustin Pop

72 a8083063 Iustin Pop
  """
73 cec9845c Michael Hanselmann
  if fn.__doc__:
74 cec9845c Michael Hanselmann
    desc = fn.__doc__.splitlines()[0].strip()
75 a8083063 Iustin Pop
  else:
76 f89d59b9 Iustin Pop
    desc = "%r" % fn
77 a8083063 Iustin Pop
78 7d88f255 Iustin Pop
  return desc.rstrip(".")
79 7d88f255 Iustin Pop
80 2932dc44 Michael Hanselmann
81 741c6d91 Michael Hanselmann
def RunTest(fn, *args, **kwargs):
82 7d88f255 Iustin Pop
  """Runs a test after printing a header.
83 7d88f255 Iustin Pop

84 7d88f255 Iustin Pop
  """
85 a8083063 Iustin Pop
86 f89d59b9 Iustin Pop
  tstart = datetime.datetime.now()
87 a8083063 Iustin Pop
88 7d88f255 Iustin Pop
  desc = _DescriptionOf(fn)
89 7d88f255 Iustin Pop
90 f89d59b9 Iustin Pop
  print
91 f89d59b9 Iustin Pop
  print _FormatHeader("%s start %s" % (tstart, desc))
92 f89d59b9 Iustin Pop
93 f89d59b9 Iustin Pop
  try:
94 741c6d91 Michael Hanselmann
    retval = fn(*args, **kwargs)
95 f89d59b9 Iustin Pop
    return retval
96 f89d59b9 Iustin Pop
  finally:
97 f89d59b9 Iustin Pop
    tstop = datetime.datetime.now()
98 f89d59b9 Iustin Pop
    tdelta = tstop - tstart
99 f89d59b9 Iustin Pop
    print _FormatHeader("%s time=%s %s" % (tstop, tdelta, desc))
100 a8083063 Iustin Pop
101 a8083063 Iustin Pop
102 741c6d91 Michael Hanselmann
def RunTestIf(testnames, fn, *args, **kwargs):
103 7d88f255 Iustin Pop
  """Runs a test conditionally.
104 7d88f255 Iustin Pop

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

108 7d88f255 Iustin Pop
  """
109 7d88f255 Iustin Pop
  if qa_config.TestEnabled(testnames):
110 741c6d91 Michael Hanselmann
    RunTest(fn, *args, **kwargs)
111 7d88f255 Iustin Pop
  else:
112 7d88f255 Iustin Pop
    tstart = datetime.datetime.now()
113 7d88f255 Iustin Pop
    desc = _DescriptionOf(fn)
114 c072e788 Michael Hanselmann
    # TODO: Formatting test names when non-string names are involved
115 7d88f255 Iustin Pop
    print _FormatHeader("%s skipping %s, test(s) %s disabled" %
116 7d88f255 Iustin Pop
                        (tstart, desc, testnames))
117 7d88f255 Iustin Pop
118 7d88f255 Iustin Pop
119 b1ffe1eb Michael Hanselmann
def RunEnvTests():
120 b1ffe1eb Michael Hanselmann
  """Run several environment tests.
121 a8083063 Iustin Pop

122 a8083063 Iustin Pop
  """
123 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
124 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
125 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
126 a8083063 Iustin Pop
127 94508060 Michael Hanselmann
128 35ff270b Bernardo Dal Seno
def _LookupRapiSecret(rapi_user):
129 35ff270b Bernardo Dal Seno
  """Find the RAPI secret for the given user.
130 35ff270b Bernardo Dal Seno

131 35ff270b Bernardo Dal Seno
  @param rapi_user: Login user
132 35ff270b Bernardo Dal Seno
  @return: Login secret for the user
133 35ff270b Bernardo Dal Seno

134 35ff270b Bernardo Dal Seno
  """
135 35ff270b Bernardo Dal Seno
  CTEXT = "{CLEARTEXT}"
136 35ff270b Bernardo Dal Seno
  master = qa_config.GetMasterNode()
137 35ff270b Bernardo Dal Seno
  cmd = ["cat", qa_utils.MakeNodePath(master, pathutils.RAPI_USERS_FILE)]
138 35ff270b Bernardo Dal Seno
  file_content = qa_utils.GetCommandOutput(master.primary,
139 35ff270b Bernardo Dal Seno
                                           utils.ShellQuoteArgs(cmd))
140 35ff270b Bernardo Dal Seno
  users = ParsePasswordFile(file_content)
141 35ff270b Bernardo Dal Seno
  entry = users.get(rapi_user)
142 35ff270b Bernardo Dal Seno
  if not entry:
143 35ff270b Bernardo Dal Seno
    raise qa_error.Error("User %s not found in RAPI users file" % rapi_user)
144 35ff270b Bernardo Dal Seno
  secret = entry.password
145 35ff270b Bernardo Dal Seno
  if secret.upper().startswith(CTEXT):
146 35ff270b Bernardo Dal Seno
    secret = secret[len(CTEXT):]
147 35ff270b Bernardo Dal Seno
  elif secret.startswith("{"):
148 35ff270b Bernardo Dal Seno
    raise qa_error.Error("Unsupported password schema for RAPI user %s:"
149 35ff270b Bernardo Dal Seno
                         " not a clear text password" % rapi_user)
150 35ff270b Bernardo Dal Seno
  return secret
151 35ff270b Bernardo Dal Seno
152 35ff270b Bernardo Dal Seno
153 35ff270b Bernardo Dal Seno
def SetupCluster(rapi_user):
154 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
155 a8083063 Iustin Pop

156 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
157 35ff270b Bernardo Dal Seno
  @return: Login secret for RAPI
158 725ec2f1 René Nussbaumer

159 b1ffe1eb Michael Hanselmann
  """
160 35ff270b Bernardo Dal Seno
  rapi_secret = utils.GenerateSecret()
161 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
162 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
163 6a0f22e1 Bernardo Dal Seno
  if not qa_config.TestEnabled("create-cluster"):
164 6a0f22e1 Bernardo Dal Seno
    # If the cluster is already in place, we assume that exclusive-storage is
165 6a0f22e1 Bernardo Dal Seno
    # already set according to the configuration
166 6a0f22e1 Bernardo Dal Seno
    qa_config.SetExclusiveStorage(qa_config.get("exclusive-storage", False))
167 35ff270b Bernardo Dal Seno
    if qa_rapi.Enabled():
168 35ff270b Bernardo Dal Seno
      # To support RAPI on an existing cluster we have to find out the secret
169 35ff270b Bernardo Dal Seno
      rapi_secret = _LookupRapiSecret(rapi_user)
170 288d6440 Michael Hanselmann
171 288d6440 Michael Hanselmann
  # Test on empty cluster
172 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
173 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
174 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
175 288d6440 Michael Hanselmann
176 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
177 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
178 8e671b7c Iustin Pop
    # consider the nodes are already there
179 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
180 8201b996 Iustin Pop
181 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
182 cd04f8c2 Michael Hanselmann
183 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
184 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
185 8201b996 Iustin Pop
186 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
187 288d6440 Michael Hanselmann
188 2214cf14 Michael Hanselmann
  # Test listing fields
189 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
190 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
191 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobListFields)
192 0fdf247d Michael Hanselmann
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
193 2214cf14 Michael Hanselmann
194 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
195 b1ffe1eb Michael Hanselmann
196 35ff270b Bernardo Dal Seno
  return rapi_secret
197 35ff270b Bernardo Dal Seno
198 b1ffe1eb Michael Hanselmann
199 b1ffe1eb Michael Hanselmann
def RunClusterTests():
200 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
201 180bdd1f Michael Hanselmann

202 b1ffe1eb Michael Hanselmann
  """
203 7d88f255 Iustin Pop
  for test, fn in [
204 92cb4940 Andrea Spadaccini
    ("create-cluster", qa_cluster.TestClusterInitDisk),
205 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
206 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
207 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
208 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
209 1e7acc3b Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
210 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyIPolicy),
211 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyISpecs),
212 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
213 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
214 2dae8d64 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifyDiskTemplates),
215 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
216 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
217 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
218 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
219 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
220 db41409c Michael Hanselmann
    (["cluster-copyfile", qa_config.NoVirtualCluster],
221 db41409c Michael Hanselmann
     qa_cluster.TestClusterCopyfile),
222 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
223 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
224 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
225 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
226 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
227 c0464536 Michael Hanselmann
    (["cluster-oob", qa_config.NoVirtualCluster],
228 c0464536 Michael Hanselmann
     qa_cluster.TestClusterOob),
229 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestVersion),
230 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
231 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
232 7d88f255 Iustin Pop
    ]:
233 7d88f255 Iustin Pop
    RunTestIf(test, fn)
234 8947cf2b Michael Hanselmann
235 6d4a1656 Michael Hanselmann
236 65a884ef Iustin Pop
def RunRepairDiskSizes():
237 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
238 65a884ef Iustin Pop

239 65a884ef Iustin Pop
  """
240 65a884ef Iustin Pop
  RunTestIf("cluster-repair-disk-sizes", qa_cluster.TestClusterRepairDiskSizes)
241 65a884ef Iustin Pop
242 65a884ef Iustin Pop
243 b1ffe1eb Michael Hanselmann
def RunOsTests():
244 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
245 5d640672 Michael Hanselmann

246 b1ffe1eb Michael Hanselmann
  """
247 c9cf3f1a Michael Hanselmann
  os_enabled = ["os", qa_config.NoVirtualCluster]
248 c9cf3f1a Michael Hanselmann
249 301adaae Michael Hanselmann
  if qa_config.TestEnabled(qa_rapi.Enabled):
250 2932dc44 Michael Hanselmann
    rapi_getos = qa_rapi.GetOperatingSystems
251 2932dc44 Michael Hanselmann
  else:
252 2932dc44 Michael Hanselmann
    rapi_getos = None
253 2932dc44 Michael Hanselmann
254 7d88f255 Iustin Pop
  for fn in [
255 7d88f255 Iustin Pop
    qa_os.TestOsList,
256 7d88f255 Iustin Pop
    qa_os.TestOsDiagnose,
257 2932dc44 Michael Hanselmann
    ]:
258 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
259 2932dc44 Michael Hanselmann
260 2932dc44 Michael Hanselmann
  for fn in [
261 7d88f255 Iustin Pop
    qa_os.TestOsValid,
262 7d88f255 Iustin Pop
    qa_os.TestOsInvalid,
263 7d88f255 Iustin Pop
    qa_os.TestOsPartiallyValid,
264 2932dc44 Michael Hanselmann
    ]:
265 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn, rapi_getos)
266 2932dc44 Michael Hanselmann
267 2932dc44 Michael Hanselmann
  for fn in [
268 7d88f255 Iustin Pop
    qa_os.TestOsModifyValid,
269 7d88f255 Iustin Pop
    qa_os.TestOsModifyInvalid,
270 074e139f Michael Hanselmann
    qa_os.TestOsStatesNonExisting,
271 7d88f255 Iustin Pop
    ]:
272 c9cf3f1a Michael Hanselmann
    RunTestIf(os_enabled, fn)
273 b1ffe1eb Michael Hanselmann
274 b1ffe1eb Michael Hanselmann
275 b1ffe1eb Michael Hanselmann
def RunCommonInstanceTests(instance):
276 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
277 b1ffe1eb Michael Hanselmann

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

362 729c4377 Iustin Pop
  """
363 7d88f255 Iustin Pop
  RunTestIf("node-volumes", qa_node.TestNodeVolumes)
364 7d88f255 Iustin Pop
  RunTestIf("node-storage", qa_node.TestNodeStorage)
365 c0464536 Michael Hanselmann
  RunTestIf(["node-oob", qa_config.NoVirtualCluster], qa_node.TestOutOfBand)
366 8e1db003 Michael Hanselmann
367 8d8d650c Michael Hanselmann
368 30131294 Adeodato Simo
def RunGroupListTests():
369 30131294 Adeodato Simo
  """Run tests for listing node groups.
370 30131294 Adeodato Simo

371 30131294 Adeodato Simo
  """
372 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupList)
373 7ab8b7d7 Adeodato Simo
  RunTestIf("group-list", qa_group.TestGroupListFields)
374 30131294 Adeodato Simo
375 30131294 Adeodato Simo
376 ea7693c1 Helga Velroyen
def RunNetworkTests():
377 ea7693c1 Helga Velroyen
  """Run tests for network management.
378 ea7693c1 Helga Velroyen

379 ea7693c1 Helga Velroyen
  """
380 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkAddRemove)
381 ea7693c1 Helga Velroyen
  RunTestIf("network", qa_network.TestNetworkConnect)
382 ea7693c1 Helga Velroyen
383 ea7693c1 Helga Velroyen
384 66787da5 Adeodato Simo
def RunGroupRwTests():
385 66787da5 Adeodato Simo
  """Run tests for adding/removing/renaming groups.
386 66787da5 Adeodato Simo

387 66787da5 Adeodato Simo
  """
388 66787da5 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddRemoveRename)
389 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupAddWithOptions)
390 4b10fb65 Adeodato Simo
  RunTestIf("group-rwops", qa_group.TestGroupModify)
391 301adaae Michael Hanselmann
  RunTestIf(["group-rwops", qa_rapi.Enabled], qa_rapi.TestRapiNodeGroups)
392 fe508a9d Michael Hanselmann
  RunTestIf(["group-rwops", "tags"], qa_tags.TestGroupTags,
393 fe508a9d Michael Hanselmann
            qa_group.GetDefaultGroup())
394 4b10fb65 Adeodato Simo
395 66787da5 Adeodato Simo
396 c99200a3 Bernardo Dal Seno
def RunExportImportTests(instance, inodes):
397 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
398 a8083063 Iustin Pop

399 c99200a3 Bernardo Dal Seno
  @type inodes: list of nodes
400 c99200a3 Bernardo Dal Seno
  @param inodes: current nodes of the instance
401 638a7266 Iustin Pop

402 b1ffe1eb Michael Hanselmann
  """
403 301c3bbb Guido Trotter
  # FIXME: export explicitly bails out on file based storage. other non-lvm
404 301c3bbb Guido Trotter
  # based storage types are untested, though. Also note that import could still
405 301c3bbb Guido Trotter
  # work, but is deeply embedded into the "export" case.
406 301c3bbb Guido Trotter
  if (qa_config.TestEnabled("instance-export") and
407 301c3bbb Guido Trotter
      instance.disk_template != constants.DT_FILE):
408 bc696589 Michael Hanselmann
    RunTest(qa_instance.TestInstanceExportNoTarget, instance)
409 bc696589 Michael Hanselmann
410 c99200a3 Bernardo Dal Seno
    pnode = inodes[0]
411 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
412 b1ffe1eb Michael Hanselmann
    try:
413 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
414 b1ffe1eb Michael Hanselmann
415 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
416 b1ffe1eb Michael Hanselmann
417 d0c8c01d Iustin Pop
      if qa_config.TestEnabled("instance-import"):
418 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
419 5d640672 Michael Hanselmann
        try:
420 5fa0375e Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, newinst, pnode,
421 b1ffe1eb Michael Hanselmann
                  expnode, name)
422 51131cad Michael Hanselmann
          # Check if starting the instance works
423 51131cad Michael Hanselmann
          RunTest(qa_instance.TestInstanceStartup, newinst)
424 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
425 5d640672 Michael Hanselmann
        finally:
426 6f88e076 Michael Hanselmann
          newinst.Release()
427 b1ffe1eb Michael Hanselmann
    finally:
428 565cb4bf Michael Hanselmann
      expnode.Release()
429 5d640672 Michael Hanselmann
430 34ddd63a Guido Trotter
  # FIXME: inter-cluster-instance-move crashes on file based instances :/
431 34ddd63a Guido Trotter
  # See Issue 414.
432 34ddd63a Guido Trotter
  if (qa_config.TestEnabled([qa_rapi.Enabled, "inter-cluster-instance-move"])
433 34ddd63a Guido Trotter
      and instance.disk_template != constants.DT_FILE):
434 5d831182 Michael Hanselmann
    newinst = qa_config.AcquireInstance()
435 5d831182 Michael Hanselmann
    try:
436 c99200a3 Bernardo Dal Seno
      tnode = qa_config.AcquireNode(exclude=inodes)
437 5d831182 Michael Hanselmann
      try:
438 5d831182 Michael Hanselmann
        RunTest(qa_rapi.TestInterClusterInstanceMove, instance, newinst,
439 c99200a3 Bernardo Dal Seno
                inodes, tnode)
440 5d831182 Michael Hanselmann
      finally:
441 565cb4bf Michael Hanselmann
        tnode.Release()
442 5d831182 Michael Hanselmann
    finally:
443 6f88e076 Michael Hanselmann
      newinst.Release()
444 5d831182 Michael Hanselmann
445 283f9d4c Michael Hanselmann
446 b998270c Iustin Pop
def RunDaemonTests(instance):
447 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
448 9df6d173 Michael Hanselmann

449 b1ffe1eb Michael Hanselmann
  """
450 8201b996 Iustin Pop
  RunTest(qa_daemon.TestPauseWatcher)
451 e9e35aaa Michael Hanselmann
452 7d88f255 Iustin Pop
  RunTestIf("instance-automatic-restart",
453 b998270c Iustin Pop
            qa_daemon.TestInstanceAutomaticRestart, instance)
454 7d88f255 Iustin Pop
  RunTestIf("instance-consecutive-failures",
455 b998270c Iustin Pop
            qa_daemon.TestInstanceConsecutiveFailures, instance)
456 e9e35aaa Michael Hanselmann
457 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
458 8201b996 Iustin Pop
459 9df6d173 Michael Hanselmann
460 c99200a3 Bernardo Dal Seno
def RunHardwareFailureTests(instance, inodes):
461 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
462 a8083063 Iustin Pop

463 b1ffe1eb Michael Hanselmann
  """
464 7d88f255 Iustin Pop
  RunTestIf("instance-failover", qa_instance.TestInstanceFailover, instance)
465 301adaae Michael Hanselmann
  RunTestIf(["instance-failover", qa_rapi.Enabled],
466 c0a146a1 Michael Hanselmann
            qa_rapi.TestRapiInstanceFailover, instance)
467 b1ffe1eb Michael Hanselmann
468 7d88f255 Iustin Pop
  RunTestIf("instance-migrate", qa_instance.TestInstanceMigrate, instance)
469 301adaae Michael Hanselmann
  RunTestIf(["instance-migrate", qa_rapi.Enabled],
470 7d88f255 Iustin Pop
            qa_rapi.TestRapiInstanceMigrate, instance)
471 938bde86 Michael Hanselmann
472 d0c8c01d Iustin Pop
  if qa_config.TestEnabled("instance-replace-disks"):
473 c99200a3 Bernardo Dal Seno
    # We just need alternative secondary nodes, hence "- 1"
474 c99200a3 Bernardo Dal Seno
    othernodes = qa_config.AcquireManyNodes(len(inodes) - 1, exclude=inodes)
475 7910e7a5 Michael Hanselmann
    try:
476 301adaae Michael Hanselmann
      RunTestIf(qa_rapi.Enabled, qa_rapi.TestRapiInstanceReplaceDisks, instance)
477 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
478 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
479 7910e7a5 Michael Hanselmann
    finally:
480 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(othernodes)
481 c99200a3 Bernardo Dal Seno
    del othernodes
482 7910e7a5 Michael Hanselmann
483 83180411 Bernardo Dal Seno
  if qa_config.TestEnabled("instance-recreate-disks"):
484 83180411 Bernardo Dal Seno
    try:
485 c99200a3 Bernardo Dal Seno
      acquirednodes = qa_config.AcquireManyNodes(len(inodes), exclude=inodes)
486 c99200a3 Bernardo Dal Seno
      othernodes = acquirednodes
487 83180411 Bernardo Dal Seno
    except qa_error.OutOfNodesError:
488 c99200a3 Bernardo Dal Seno
      if len(inodes) > 1:
489 c99200a3 Bernardo Dal Seno
        # If the cluster is not big enough, let's reuse some of the nodes, but
490 c99200a3 Bernardo Dal Seno
        # with different roles. In this way, we can test a DRBD instance even on
491 c99200a3 Bernardo Dal Seno
        # a 3-node cluster.
492 c99200a3 Bernardo Dal Seno
        acquirednodes = [qa_config.AcquireNode(exclude=inodes)]
493 c99200a3 Bernardo Dal Seno
        othernodes = acquirednodes + inodes[:-1]
494 c99200a3 Bernardo Dal Seno
      else:
495 c99200a3 Bernardo Dal Seno
        raise
496 83180411 Bernardo Dal Seno
    try:
497 83180411 Bernardo Dal Seno
      RunTest(qa_instance.TestRecreateDisks,
498 c99200a3 Bernardo Dal Seno
              instance, inodes, othernodes)
499 83180411 Bernardo Dal Seno
    finally:
500 c99200a3 Bernardo Dal Seno
      qa_config.ReleaseManyNodes(acquirednodes)
501 83180411 Bernardo Dal Seno
502 c99200a3 Bernardo Dal Seno
  if len(inodes) >= 2:
503 c99200a3 Bernardo Dal Seno
    RunTestIf("node-evacuate", qa_node.TestNodeEvacuate, inodes[0], inodes[1])
504 c99200a3 Bernardo Dal Seno
    RunTestIf("node-failover", qa_node.TestNodeFailover, inodes[0], inodes[1])
505 b1ffe1eb Michael Hanselmann
506 b1ffe1eb Michael Hanselmann
507 50ef6a41 Bernardo Dal Seno
def RunExclusiveStorageTests():
508 50ef6a41 Bernardo Dal Seno
  """Test exclusive storage."""
509 50ef6a41 Bernardo Dal Seno
  if not qa_config.TestEnabled("cluster-exclusive-storage"):
510 50ef6a41 Bernardo Dal Seno
    return
511 50ef6a41 Bernardo Dal Seno
512 50ef6a41 Bernardo Dal Seno
  node = qa_config.AcquireNode()
513 50ef6a41 Bernardo Dal Seno
  try:
514 e8b919a1 Bernardo Dal Seno
    old_es = qa_cluster.TestSetExclStorCluster(False)
515 250a9404 Bernardo Dal Seno
    qa_node.TestExclStorSingleNode(node)
516 e8b919a1 Bernardo Dal Seno
517 e8b919a1 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(True)
518 21e2734f Bernardo Dal Seno
    qa_cluster.TestExclStorSharedPv(node)
519 21e2734f Bernardo Dal Seno
520 50ef6a41 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-plain-disk"):
521 50ef6a41 Bernardo Dal Seno
      # Make sure that the cluster doesn't have any pre-existing problem
522 50ef6a41 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
523 a77e3d33 Michael Hanselmann
524 a77e3d33 Michael Hanselmann
      # Create and allocate instances
525 c99200a3 Bernardo Dal Seno
      instance1 = qa_instance.TestInstanceAddWithPlainDisk([node])
526 a77e3d33 Michael Hanselmann
      try:
527 a77e3d33 Michael Hanselmann
        instance2 = qa_instance.TestInstanceAddWithPlainDisk([node])
528 a77e3d33 Michael Hanselmann
        try:
529 a77e3d33 Michael Hanselmann
          # cluster-verify checks that disks are allocated correctly
530 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify()
531 a77e3d33 Michael Hanselmann
532 a77e3d33 Michael Hanselmann
          # Remove instances
533 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance2)
534 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance1)
535 a77e3d33 Michael Hanselmann
        finally:
536 6f88e076 Michael Hanselmann
          instance2.Release()
537 a77e3d33 Michael Hanselmann
      finally:
538 6f88e076 Michael Hanselmann
        instance1.Release()
539 a77e3d33 Michael Hanselmann
540 efd58d99 Bernardo Dal Seno
    if qa_config.TestEnabled("instance-add-drbd-disk"):
541 efd58d99 Bernardo Dal Seno
      snode = qa_config.AcquireNode()
542 efd58d99 Bernardo Dal Seno
      try:
543 efd58d99 Bernardo Dal Seno
        qa_cluster.TestSetExclStorCluster(False)
544 c99200a3 Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([node, snode])
545 a77e3d33 Michael Hanselmann
        try:
546 a77e3d33 Michael Hanselmann
          qa_cluster.TestSetExclStorCluster(True)
547 a77e3d33 Michael Hanselmann
          exp_err = [constants.CV_EINSTANCEUNSUITABLENODE]
548 a77e3d33 Michael Hanselmann
          qa_cluster.AssertClusterVerify(fail=True, errors=exp_err)
549 a77e3d33 Michael Hanselmann
          qa_instance.TestInstanceRemove(instance)
550 a77e3d33 Michael Hanselmann
        finally:
551 6f88e076 Michael Hanselmann
          instance.Release()
552 efd58d99 Bernardo Dal Seno
      finally:
553 565cb4bf Michael Hanselmann
        snode.Release()
554 50ef6a41 Bernardo Dal Seno
    qa_cluster.TestSetExclStorCluster(old_es)
555 50ef6a41 Bernardo Dal Seno
  finally:
556 565cb4bf Michael Hanselmann
    node.Release()
557 50ef6a41 Bernardo Dal Seno
558 50ef6a41 Bernardo Dal Seno
559 ab4832d1 Bernardo Dal Seno
def _BuildSpecDict(par, mn, st, mx):
560 ec996117 Bernardo Dal Seno
  return {
561 7c8ae421 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [{
562 7c8ae421 Bernardo Dal Seno
      constants.ISPECS_MIN: {par: mn},
563 7c8ae421 Bernardo Dal Seno
      constants.ISPECS_MAX: {par: mx},
564 7c8ae421 Bernardo Dal Seno
      }],
565 7c8ae421 Bernardo Dal Seno
    constants.ISPECS_STD: {par: st},
566 ec996117 Bernardo Dal Seno
    }
567 ab4832d1 Bernardo Dal Seno
568 ab4832d1 Bernardo Dal Seno
569 5fdf8491 Bernardo Dal Seno
def _BuildDoubleSpecDict(index, par, mn, st, mx):
570 5fdf8491 Bernardo Dal Seno
  new_spec = {
571 5fdf8491 Bernardo Dal Seno
    constants.ISPECS_MINMAX: [{}, {}],
572 5fdf8491 Bernardo Dal Seno
    }
573 5fdf8491 Bernardo Dal Seno
  if st is not None:
574 5fdf8491 Bernardo Dal Seno
    new_spec[constants.ISPECS_STD] = {par: st}
575 5fdf8491 Bernardo Dal Seno
  new_spec[constants.ISPECS_MINMAX][index] = {
576 5fdf8491 Bernardo Dal Seno
    constants.ISPECS_MIN: {par: mn},
577 5fdf8491 Bernardo Dal Seno
    constants.ISPECS_MAX: {par: mx},
578 5fdf8491 Bernardo Dal Seno
    }
579 5fdf8491 Bernardo Dal Seno
  return new_spec
580 5fdf8491 Bernardo Dal Seno
581 5fdf8491 Bernardo Dal Seno
582 ab4832d1 Bernardo Dal Seno
def TestIPolicyPlainInstance():
583 ab4832d1 Bernardo Dal Seno
  """Test instance policy interaction with instances"""
584 cb178a1e Bernardo Dal Seno
  params = ["memory-size", "cpu-count", "disk-count", "disk-size", "nic-count"]
585 ab4832d1 Bernardo Dal Seno
  if not qa_config.IsTemplateSupported(constants.DT_PLAIN):
586 ab4832d1 Bernardo Dal Seno
    print "Template %s not supported" % constants.DT_PLAIN
587 ab4832d1 Bernardo Dal Seno
    return
588 ab4832d1 Bernardo Dal Seno
589 ab4832d1 Bernardo Dal Seno
  # This test assumes that the group policy is empty
590 ec996117 Bernardo Dal Seno
  (_, old_specs) = qa_cluster.TestClusterSetISpecs()
591 7c8ae421 Bernardo Dal Seno
  # We also assume to have only one min/max bound
592 7c8ae421 Bernardo Dal Seno
  assert len(old_specs[constants.ISPECS_MINMAX]) == 1
593 ab4832d1 Bernardo Dal Seno
  node = qa_config.AcquireNode()
594 ab4832d1 Bernardo Dal Seno
  try:
595 ec996117 Bernardo Dal Seno
    # Log of policy changes, list of tuples:
596 ec996117 Bernardo Dal Seno
    # (full_change, incremental_change, policy_violated)
597 fa84c8a4 Bernardo Dal Seno
    history = []
598 ab4832d1 Bernardo Dal Seno
    instance = qa_instance.TestInstanceAddWithPlainDisk([node])
599 ab4832d1 Bernardo Dal Seno
    try:
600 ab4832d1 Bernardo Dal Seno
      policyerror = [constants.CV_EINSTANCEPOLICY]
601 ab4832d1 Bernardo Dal Seno
      for par in params:
602 46d21495 Bernardo Dal Seno
        (iminval, imaxval) = qa_instance.GetInstanceSpec(instance.name, par)
603 ab4832d1 Bernardo Dal Seno
        # Some specs must be multiple of 4
604 ab4832d1 Bernardo Dal Seno
        new_spec = _BuildSpecDict(par, imaxval + 4, imaxval + 4, imaxval + 4)
605 ec996117 Bernardo Dal Seno
        history.append((None, new_spec, True))
606 ab4832d1 Bernardo Dal Seno
        if iminval > 0:
607 ab4832d1 Bernardo Dal Seno
          # Some specs must be multiple of 4
608 ab4832d1 Bernardo Dal Seno
          if iminval >= 4:
609 ab4832d1 Bernardo Dal Seno
            upper = iminval - 4
610 ab4832d1 Bernardo Dal Seno
          else:
611 ab4832d1 Bernardo Dal Seno
            upper = iminval - 1
612 ab4832d1 Bernardo Dal Seno
          new_spec = _BuildSpecDict(par, 0, upper, upper)
613 ec996117 Bernardo Dal Seno
          history.append((None, new_spec, True))
614 ec996117 Bernardo Dal Seno
        history.append((old_specs, None, False))
615 5fdf8491 Bernardo Dal Seno
616 5fdf8491 Bernardo Dal Seno
      # Test with two instance specs
617 5fdf8491 Bernardo Dal Seno
      double_specs = copy.deepcopy(old_specs)
618 5fdf8491 Bernardo Dal Seno
      double_specs[constants.ISPECS_MINMAX] = \
619 5fdf8491 Bernardo Dal Seno
          double_specs[constants.ISPECS_MINMAX] * 2
620 5fdf8491 Bernardo Dal Seno
      (par1, par2) = params[0:2]
621 5fdf8491 Bernardo Dal Seno
      (_, imaxval1) = qa_instance.GetInstanceSpec(instance.name, par1)
622 5fdf8491 Bernardo Dal Seno
      (_, imaxval2) = qa_instance.GetInstanceSpec(instance.name, par2)
623 5fdf8491 Bernardo Dal Seno
      old_minmax = old_specs[constants.ISPECS_MINMAX][0]
624 5fdf8491 Bernardo Dal Seno
      history.extend([
625 5fdf8491 Bernardo Dal Seno
        (double_specs, None, False),
626 5fdf8491 Bernardo Dal Seno
        # The first min/max limit is being violated
627 5fdf8491 Bernardo Dal Seno
        (None,
628 5fdf8491 Bernardo Dal Seno
         _BuildDoubleSpecDict(0, par1, imaxval1 + 4, imaxval1 + 4,
629 5fdf8491 Bernardo Dal Seno
                              imaxval1 + 4),
630 5fdf8491 Bernardo Dal Seno
         False),
631 5fdf8491 Bernardo Dal Seno
        # Both min/max limits are being violated
632 5fdf8491 Bernardo Dal Seno
        (None,
633 5fdf8491 Bernardo Dal Seno
         _BuildDoubleSpecDict(1, par2, imaxval2 + 4, None, imaxval2 + 4),
634 5fdf8491 Bernardo Dal Seno
         True),
635 5fdf8491 Bernardo Dal Seno
        # The second min/max limit is being violated
636 5fdf8491 Bernardo Dal Seno
        (None,
637 5fdf8491 Bernardo Dal Seno
         _BuildDoubleSpecDict(0, par1,
638 5fdf8491 Bernardo Dal Seno
                              old_minmax[constants.ISPECS_MIN][par1],
639 5fdf8491 Bernardo Dal Seno
                              old_specs[constants.ISPECS_STD][par1],
640 5fdf8491 Bernardo Dal Seno
                              old_minmax[constants.ISPECS_MAX][par1]),
641 5fdf8491 Bernardo Dal Seno
         False),
642 5fdf8491 Bernardo Dal Seno
        (old_specs, None, False),
643 5fdf8491 Bernardo Dal Seno
        ])
644 5fdf8491 Bernardo Dal Seno
645 5fdf8491 Bernardo Dal Seno
      # Apply the changes, and check policy violations after each change
646 5fdf8491 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
647 5fdf8491 Bernardo Dal Seno
      for (new_specs, diff_specs, failed) in history:
648 5fdf8491 Bernardo Dal Seno
        qa_cluster.TestClusterSetISpecs(new_specs=new_specs,
649 5fdf8491 Bernardo Dal Seno
                                        diff_specs=diff_specs)
650 5fdf8491 Bernardo Dal Seno
        if failed:
651 5fdf8491 Bernardo Dal Seno
          qa_cluster.AssertClusterVerify(warnings=policyerror)
652 5fdf8491 Bernardo Dal Seno
        else:
653 5fdf8491 Bernardo Dal Seno
          qa_cluster.AssertClusterVerify()
654 5fdf8491 Bernardo Dal Seno
655 ab4832d1 Bernardo Dal Seno
      qa_instance.TestInstanceRemove(instance)
656 ab4832d1 Bernardo Dal Seno
    finally:
657 46d21495 Bernardo Dal Seno
      instance.Release()
658 fa84c8a4 Bernardo Dal Seno
659 fa84c8a4 Bernardo Dal Seno
    # Now we replay the same policy changes, and we expect that the instance
660 fa84c8a4 Bernardo Dal Seno
    # cannot be created for the cases where we had a policy violation above
661 ec996117 Bernardo Dal Seno
    for (new_specs, diff_specs, failed) in history:
662 ec996117 Bernardo Dal Seno
      qa_cluster.TestClusterSetISpecs(new_specs=new_specs,
663 ec996117 Bernardo Dal Seno
                                      diff_specs=diff_specs)
664 fa84c8a4 Bernardo Dal Seno
      if failed:
665 fa84c8a4 Bernardo Dal Seno
        qa_instance.TestInstanceAddWithPlainDisk([node], fail=True)
666 fa84c8a4 Bernardo Dal Seno
      # Instance creation with no policy violation has been tested already
667 ab4832d1 Bernardo Dal Seno
  finally:
668 46d21495 Bernardo Dal Seno
    node.Release()
669 ab4832d1 Bernardo Dal Seno
670 ab4832d1 Bernardo Dal Seno
671 98bdd169 Bernardo Dal Seno
def IsExclusiveStorageInstanceTestEnabled():
672 98bdd169 Bernardo Dal Seno
  test_name = "exclusive-storage-instance-tests"
673 98bdd169 Bernardo Dal Seno
  if qa_config.TestEnabled(test_name):
674 98bdd169 Bernardo Dal Seno
    vgname = qa_config.get("vg-name", constants.DEFAULT_VG)
675 98bdd169 Bernardo Dal Seno
    vgscmd = utils.ShellQuoteArgs([
676 98bdd169 Bernardo Dal Seno
      "vgs", "--noheadings", "-o", "pv_count", vgname,
677 98bdd169 Bernardo Dal Seno
      ])
678 98bdd169 Bernardo Dal Seno
    nodes = qa_config.GetConfig()["nodes"]
679 98bdd169 Bernardo Dal Seno
    for node in nodes:
680 98bdd169 Bernardo Dal Seno
      try:
681 98bdd169 Bernardo Dal Seno
        pvnum = int(qa_utils.GetCommandOutput(node.primary, vgscmd))
682 98bdd169 Bernardo Dal Seno
      except Exception, e:
683 98bdd169 Bernardo Dal Seno
        msg = ("Cannot get the number of PVs on %s, needed by '%s': %s" %
684 98bdd169 Bernardo Dal Seno
               (node.primary, test_name, e))
685 98bdd169 Bernardo Dal Seno
        raise qa_error.Error(msg)
686 98bdd169 Bernardo Dal Seno
      if pvnum < 2:
687 98bdd169 Bernardo Dal Seno
        raise qa_error.Error("Node %s has not enough PVs (%s) to run '%s'" %
688 98bdd169 Bernardo Dal Seno
                             (node.primary, pvnum, test_name))
689 98bdd169 Bernardo Dal Seno
    res = True
690 98bdd169 Bernardo Dal Seno
  else:
691 98bdd169 Bernardo Dal Seno
    res = False
692 98bdd169 Bernardo Dal Seno
  return res
693 98bdd169 Bernardo Dal Seno
694 98bdd169 Bernardo Dal Seno
695 deadfa13 Bernardo Dal Seno
def RunInstanceTests():
696 deadfa13 Bernardo Dal Seno
  """Create and exercise instances."""
697 02cff8aa Bernardo Dal Seno
  instance_tests = [
698 02cff8aa Bernardo Dal Seno
    ("instance-add-plain-disk", constants.DT_PLAIN,
699 02cff8aa Bernardo Dal Seno
     qa_instance.TestInstanceAddWithPlainDisk, 1),
700 02cff8aa Bernardo Dal Seno
    ("instance-add-drbd-disk", constants.DT_DRBD8,
701 02cff8aa Bernardo Dal Seno
     qa_instance.TestInstanceAddWithDrbdDisk, 2),
702 02cff8aa Bernardo Dal Seno
    ("instance-add-diskless", constants.DT_DISKLESS,
703 02cff8aa Bernardo Dal Seno
     qa_instance.TestInstanceAddDiskless, 1),
704 02cff8aa Bernardo Dal Seno
    ("instance-add-file", constants.DT_FILE,
705 02cff8aa Bernardo Dal Seno
     qa_instance.TestInstanceAddFile, 1)
706 02cff8aa Bernardo Dal Seno
    ]
707 deadfa13 Bernardo Dal Seno
708 deadfa13 Bernardo Dal Seno
  for (test_name, templ, create_fun, num_nodes) in instance_tests:
709 deadfa13 Bernardo Dal Seno
    if (qa_config.TestEnabled(test_name) and
710 deadfa13 Bernardo Dal Seno
        qa_config.IsTemplateSupported(templ)):
711 deadfa13 Bernardo Dal Seno
      inodes = qa_config.AcquireManyNodes(num_nodes)
712 deadfa13 Bernardo Dal Seno
      try:
713 deadfa13 Bernardo Dal Seno
        instance = RunTest(create_fun, inodes)
714 a77e3d33 Michael Hanselmann
        try:
715 a77e3d33 Michael Hanselmann
          RunTestIf("cluster-epo", qa_cluster.TestClusterEpo)
716 a77e3d33 Michael Hanselmann
          RunDaemonTests(instance)
717 a77e3d33 Michael Hanselmann
          for node in inodes:
718 a77e3d33 Michael Hanselmann
            RunTestIf("haskell-confd", qa_node.TestNodeListDrbd, node)
719 a77e3d33 Michael Hanselmann
          if len(inodes) > 1:
720 a77e3d33 Michael Hanselmann
            RunTestIf("group-rwops", qa_group.TestAssignNodesIncludingSplit,
721 a77e3d33 Michael Hanselmann
                      constants.INITIAL_NODE_GROUP_NAME,
722 aecba21e Michael Hanselmann
                      inodes[0].primary, inodes[1].primary)
723 a77e3d33 Michael Hanselmann
          if qa_config.TestEnabled("instance-convert-disk"):
724 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceShutdown, instance)
725 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceConvertDiskToPlain,
726 a77e3d33 Michael Hanselmann
                    instance, inodes)
727 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceStartup, instance)
728 a365b47f Bernardo Dal Seno
          RunTestIf("instance-modify-disks",
729 a365b47f Bernardo Dal Seno
                    qa_instance.TestInstanceModifyDisks, instance)
730 a77e3d33 Michael Hanselmann
          RunCommonInstanceTests(instance)
731 d0a44ec0 Klaus Aehlig
          if qa_config.TestEnabled("instance-modify-primary"):
732 d0a44ec0 Klaus Aehlig
            othernode = qa_config.AcquireNode()
733 d0a44ec0 Klaus Aehlig
            RunTest(qa_instance.TestInstanceModifyPrimaryAndBack,
734 d0a44ec0 Klaus Aehlig
                    instance, inodes[0], othernode)
735 d0a44ec0 Klaus Aehlig
            othernode.Release()
736 a77e3d33 Michael Hanselmann
          RunGroupListTests()
737 a77e3d33 Michael Hanselmann
          RunExportImportTests(instance, inodes)
738 a77e3d33 Michael Hanselmann
          RunHardwareFailureTests(instance, inodes)
739 a77e3d33 Michael Hanselmann
          RunRepairDiskSizes()
740 a77e3d33 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
741 a77e3d33 Michael Hanselmann
        finally:
742 6f88e076 Michael Hanselmann
          instance.Release()
743 deadfa13 Bernardo Dal Seno
        del instance
744 deadfa13 Bernardo Dal Seno
      finally:
745 deadfa13 Bernardo Dal Seno
        qa_config.ReleaseManyNodes(inodes)
746 deadfa13 Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
747 b1ffe1eb Michael Hanselmann
748 b1ffe1eb Michael Hanselmann
749 f7e6f3c8 Iustin Pop
def RunQa():
750 f7e6f3c8 Iustin Pop
  """Main QA body.
751 b1ffe1eb Michael Hanselmann

752 b1ffe1eb Michael Hanselmann
  """
753 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
754 725ec2f1 René Nussbaumer
755 b1ffe1eb Michael Hanselmann
  RunEnvTests()
756 35ff270b Bernardo Dal Seno
  rapi_secret = SetupCluster(rapi_user)
757 2771835c Michael Hanselmann
758 0fe54825 Bernardo Dal Seno
  if qa_rapi.Enabled():
759 0fe54825 Bernardo Dal Seno
    # Load RAPI certificate
760 0fe54825 Bernardo Dal Seno
    qa_rapi.Setup(rapi_user, rapi_secret)
761 2771835c Michael Hanselmann
762 b1ffe1eb Michael Hanselmann
  RunClusterTests()
763 b1ffe1eb Michael Hanselmann
  RunOsTests()
764 4b62db14 Michael Hanselmann
765 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
766 d74c2ca1 Michael Hanselmann
767 729c4377 Iustin Pop
  RunCommonNodeTests()
768 30131294 Adeodato Simo
  RunGroupListTests()
769 66787da5 Adeodato Simo
  RunGroupRwTests()
770 ea7693c1 Helga Velroyen
  RunNetworkTests()
771 729c4377 Iustin Pop
772 6f058bf2 Bernardo Dal Seno
  # The master shouldn't be readded or put offline; "delay" needs a non-master
773 6f058bf2 Bernardo Dal Seno
  # node to test
774 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
775 d0cb68cb Michael Hanselmann
  try:
776 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
777 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
778 5a85b99e Michael Hanselmann
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
779 d0cb68cb Michael Hanselmann
  finally:
780 565cb4bf Michael Hanselmann
    pnode.Release()
781 102b115b Michael Hanselmann
782 a36f690c Bernardo Dal Seno
  # Make sure the cluster is clean before running instance tests
783 a36f690c Bernardo Dal Seno
  qa_cluster.AssertClusterVerify()
784 a36f690c Bernardo Dal Seno
785 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
786 b1ffe1eb Michael Hanselmann
  try:
787 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
788 d74c2ca1 Michael Hanselmann
789 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
790 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
791 a47f574c Oleksiy Mishchenko
792 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
793 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
794 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
795 924e95f9 Michael Hanselmann
                                  use_client)
796 a77e3d33 Michael Hanselmann
          try:
797 a77e3d33 Michael Hanselmann
            if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
798 a77e3d33 Michael Hanselmann
              RunCommonInstanceTests(rapi_instance)
799 a77e3d33 Michael Hanselmann
            RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
800 a77e3d33 Michael Hanselmann
          finally:
801 6f88e076 Michael Hanselmann
            rapi_instance.Release()
802 924e95f9 Michael Hanselmann
          del rapi_instance
803 8cb70e56 Michael Hanselmann
804 6f058bf2 Bernardo Dal Seno
  finally:
805 565cb4bf Michael Hanselmann
    pnode.Release()
806 6f058bf2 Bernardo Dal Seno
807 deadfa13 Bernardo Dal Seno
  config_list = [
808 deadfa13 Bernardo Dal Seno
    ("default-instance-tests", lambda: None, lambda _: None),
809 98bdd169 Bernardo Dal Seno
    (IsExclusiveStorageInstanceTestEnabled,
810 deadfa13 Bernardo Dal Seno
     lambda: qa_cluster.TestSetExclStorCluster(True),
811 deadfa13 Bernardo Dal Seno
     qa_cluster.TestSetExclStorCluster),
812 27eba428 Bernardo Dal Seno
  ]
813 deadfa13 Bernardo Dal Seno
  for (conf_name, setup_conf_f, restore_conf_f) in config_list:
814 deadfa13 Bernardo Dal Seno
    if qa_config.TestEnabled(conf_name):
815 deadfa13 Bernardo Dal Seno
      oldconf = setup_conf_f()
816 deadfa13 Bernardo Dal Seno
      RunInstanceTests()
817 deadfa13 Bernardo Dal Seno
      restore_conf_f(oldconf)
818 c7e54e1d Agata Murawska
819 6f058bf2 Bernardo Dal Seno
  pnode = qa_config.AcquireNode()
820 6f058bf2 Bernardo Dal Seno
  try:
821 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
822 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
823 c99200a3 Bernardo Dal Seno
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, [pnode])
824 7d7609a3 Michael Hanselmann
        try:
825 a77e3d33 Michael Hanselmann
          expnode = qa_config.AcquireNode(exclude=pnode)
826 a77e3d33 Michael Hanselmann
          try:
827 a77e3d33 Michael Hanselmann
            if shutdown:
828 a77e3d33 Michael Hanselmann
              # Stop instance before exporting and removing it
829 a77e3d33 Michael Hanselmann
              RunTest(qa_instance.TestInstanceShutdown, instance)
830 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
831 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestBackupList, expnode)
832 a77e3d33 Michael Hanselmann
          finally:
833 565cb4bf Michael Hanselmann
            expnode.Release()
834 7d7609a3 Michael Hanselmann
        finally:
835 6f88e076 Michael Hanselmann
          instance.Release()
836 3b01286e Michael Hanselmann
        del expnode
837 3b01286e Michael Hanselmann
        del instance
838 a36f690c Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
839 a8083063 Iustin Pop
840 6f058bf2 Bernardo Dal Seno
  finally:
841 565cb4bf Michael Hanselmann
    pnode.Release()
842 6f058bf2 Bernardo Dal Seno
843 50ef6a41 Bernardo Dal Seno
  RunExclusiveStorageTests()
844 ab4832d1 Bernardo Dal Seno
  RunTestIf(["cluster-instance-policy", "instance-add-plain-disk"],
845 ab4832d1 Bernardo Dal Seno
            TestIPolicyPlainInstance)
846 50ef6a41 Bernardo Dal Seno
847 2ef21e6e Bernardo Dal Seno
  RunTestIf(
848 2ef21e6e Bernardo Dal Seno
    "instance-add-restricted-by-disktemplates",
849 2ef21e6e Bernardo Dal Seno
    qa_instance.TestInstanceCreationRestrictedByDiskTemplates)
850 2ef21e6e Bernardo Dal Seno
851 6f058bf2 Bernardo Dal Seno
  # Test removing instance with offline drbd secondary
852 04b5f222 Michael Hanselmann
  if qa_config.TestEnabled(["instance-remove-drbd-offline",
853 04b5f222 Michael Hanselmann
                            "instance-add-drbd-disk"]):
854 6f058bf2 Bernardo Dal Seno
    # Make sure the master is not put offline
855 6f058bf2 Bernardo Dal Seno
    snode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
856 6f058bf2 Bernardo Dal Seno
    try:
857 6f058bf2 Bernardo Dal Seno
      pnode = qa_config.AcquireNode(exclude=snode)
858 c7e54e1d Agata Murawska
      try:
859 a36f690c Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([pnode, snode])
860 f006f110 Bernardo Dal Seno
        set_offline = lambda node: qa_node.MakeNodeOffline(node, "yes")
861 f006f110 Bernardo Dal Seno
        set_online = lambda node: qa_node.MakeNodeOffline(node, "no")
862 f006f110 Bernardo Dal Seno
        RunTest(qa_instance.TestRemoveInstanceOfflineNode, instance, snode,
863 f006f110 Bernardo Dal Seno
                set_offline, set_online)
864 c7e54e1d Agata Murawska
      finally:
865 565cb4bf Michael Hanselmann
        pnode.Release()
866 6f058bf2 Bernardo Dal Seno
    finally:
867 565cb4bf Michael Hanselmann
      snode.Release()
868 f006f110 Bernardo Dal Seno
    qa_cluster.AssertClusterVerify()
869 a8083063 Iustin Pop
870 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
871 a8083063 Iustin Pop
872 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
873 a8083063 Iustin Pop
874 cec9845c Michael Hanselmann
875 fc3f75dd Iustin Pop
@UsesRapiClient
876 f7e6f3c8 Iustin Pop
def main():
877 f7e6f3c8 Iustin Pop
  """Main program.
878 f7e6f3c8 Iustin Pop

879 f7e6f3c8 Iustin Pop
  """
880 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
881 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
882 5ae4945a Iustin Pop
                    action="store_true",
883 5ae4945a Iustin Pop
                    help="Really execute the tests")
884 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
885 f7e6f3c8 Iustin Pop
886 f7e6f3c8 Iustin Pop
  if len(args) == 1:
887 f7e6f3c8 Iustin Pop
    (config_file, ) = args
888 f7e6f3c8 Iustin Pop
  else:
889 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
890 f7e6f3c8 Iustin Pop
891 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
892 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
893 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
894 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
895 f7e6f3c8 Iustin Pop
    sys.exit(1)
896 f7e6f3c8 Iustin Pop
897 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
898 f7e6f3c8 Iustin Pop
899 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
900 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
901 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
902 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
903 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
904 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
905 f7e6f3c8 Iustin Pop
  try:
906 f7e6f3c8 Iustin Pop
    RunQa()
907 f7e6f3c8 Iustin Pop
  finally:
908 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
909 f7e6f3c8 Iustin Pop
910 d0c8c01d Iustin Pop
if __name__ == "__main__":
911 cec9845c Michael Hanselmann
  main()