Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ a5877534

History | View | Annotate | Download (27.6 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 a5877534 Michele Tartara
import qa_monitoring
42 ea7693c1 Helga Velroyen
import qa_network
43 cec9845c Michael Hanselmann
import qa_node
44 8947cf2b Michael Hanselmann
import qa_os
45 09470dd8 Michael Hanselmann
import qa_job
46 a47f574c Oleksiy Mishchenko
import qa_rapi
47 d74c2ca1 Michael Hanselmann
import qa_tags
48 1672a0d1 Michael Hanselmann
import qa_utils
49 a8083063 Iustin Pop
50 725ec2f1 René Nussbaumer
from ganeti import utils
51 8ad0da1e Iustin Pop
from ganeti import rapi # pylint: disable=W0611
52 f3fd2c9d Adeodato Simo
from ganeti import constants
53 2a7c3583 Michael Hanselmann
54 b459a848 Andrea Spadaccini
import ganeti.rapi.client # pylint: disable=W0611
55 fc3f75dd Iustin Pop
from ganeti.rapi.client import UsesRapiClient
56 725ec2f1 René Nussbaumer
57 a8083063 Iustin Pop
58 7d88f255 Iustin Pop
def _FormatHeader(line, end=72):
59 f89d59b9 Iustin Pop
  """Fill a line up to the end column.
60 f89d59b9 Iustin Pop

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

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

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

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

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

121 a8083063 Iustin Pop
  """
122 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestSshConnection)
123 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestIcmpPing)
124 7d88f255 Iustin Pop
  RunTestIf("env", qa_env.TestGanetiCommands)
125 a8083063 Iustin Pop
126 94508060 Michael Hanselmann
127 725ec2f1 René Nussbaumer
def SetupCluster(rapi_user, rapi_secret):
128 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
129 a8083063 Iustin Pop

130 725ec2f1 René Nussbaumer
  @param rapi_user: Login user for RAPI
131 725ec2f1 René Nussbaumer
  @param rapi_secret: Login secret for RAPI
132 725ec2f1 René Nussbaumer

133 b1ffe1eb Michael Hanselmann
  """
134 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_cluster.TestClusterInit,
135 7d88f255 Iustin Pop
            rapi_user, rapi_secret)
136 6a0f22e1 Bernardo Dal Seno
  if not qa_config.TestEnabled("create-cluster"):
137 6a0f22e1 Bernardo Dal Seno
    # If the cluster is already in place, we assume that exclusive-storage is
138 6a0f22e1 Bernardo Dal Seno
    # already set according to the configuration
139 6a0f22e1 Bernardo Dal Seno
    qa_config.SetExclusiveStorage(qa_config.get("exclusive-storage", False))
140 288d6440 Michael Hanselmann
141 288d6440 Michael Hanselmann
  # Test on empty cluster
142 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
143 288d6440 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceList)
144 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobList)
145 288d6440 Michael Hanselmann
146 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeAddAll)
147 7d88f255 Iustin Pop
  if not qa_config.TestEnabled("create-cluster"):
148 8e671b7c Iustin Pop
    # consider the nodes are already there
149 8e671b7c Iustin Pop
    qa_node.MarkNodeAddedAll()
150 8201b996 Iustin Pop
151 7d88f255 Iustin Pop
  RunTestIf("test-jobqueue", qa_cluster.TestJobqueue)
152 cd04f8c2 Michael Hanselmann
153 8201b996 Iustin Pop
  # enable the watcher (unconditionally)
154 8201b996 Iustin Pop
  RunTest(qa_daemon.TestResumeWatcher)
155 8201b996 Iustin Pop
156 288d6440 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeList)
157 288d6440 Michael Hanselmann
158 2214cf14 Michael Hanselmann
  # Test listing fields
159 2214cf14 Michael Hanselmann
  RunTestIf("node-list", qa_node.TestNodeListFields)
160 2214cf14 Michael Hanselmann
  RunTestIf("instance-list", qa_instance.TestInstanceListFields)
161 09470dd8 Michael Hanselmann
  RunTestIf("job-list", qa_job.TestJobListFields)
162 0fdf247d Michael Hanselmann
  RunTestIf("instance-export", qa_instance.TestBackupListFields)
163 2214cf14 Michael Hanselmann
164 7d88f255 Iustin Pop
  RunTestIf("node-info", qa_node.TestNodeInfo)
165 b1ffe1eb Michael Hanselmann
166 b1ffe1eb Michael Hanselmann
167 b1ffe1eb Michael Hanselmann
def RunClusterTests():
168 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
169 180bdd1f Michael Hanselmann

170 b1ffe1eb Michael Hanselmann
  """
171 7d88f255 Iustin Pop
  for test, fn in [
172 92cb4940 Andrea Spadaccini
    ("create-cluster", qa_cluster.TestClusterInitDisk),
173 7d88f255 Iustin Pop
    ("cluster-renew-crypto", qa_cluster.TestClusterRenewCrypto),
174 7d88f255 Iustin Pop
    ("cluster-verify", qa_cluster.TestClusterVerify),
175 7d88f255 Iustin Pop
    ("cluster-reserved-lvs", qa_cluster.TestClusterReservedLvs),
176 9738ca94 Iustin Pop
    # TODO: add more cluster modify tests
177 1e7acc3b Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyEmpty),
178 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyIPolicy),
179 b3f3aa3d Bernardo Dal Seno
    ("cluster-modify", qa_cluster.TestClusterModifyISpecs),
180 7d88f255 Iustin Pop
    ("cluster-modify", qa_cluster.TestClusterModifyBe),
181 92cb4940 Andrea Spadaccini
    ("cluster-modify", qa_cluster.TestClusterModifyDisk),
182 2dae8d64 Helga Velroyen
    ("cluster-modify", qa_cluster.TestClusterModifyDiskTemplates),
183 7d88f255 Iustin Pop
    ("cluster-rename", qa_cluster.TestClusterRename),
184 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterVersion),
185 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterInfo),
186 7d88f255 Iustin Pop
    ("cluster-info", qa_cluster.TestClusterGetmaster),
187 3e8b5a9c Iustin Pop
    ("cluster-redist-conf", qa_cluster.TestClusterRedistConf),
188 db41409c Michael Hanselmann
    (["cluster-copyfile", qa_config.NoVirtualCluster],
189 db41409c Michael Hanselmann
     qa_cluster.TestClusterCopyfile),
190 7d88f255 Iustin Pop
    ("cluster-command", qa_cluster.TestClusterCommand),
191 7d88f255 Iustin Pop
    ("cluster-burnin", qa_cluster.TestClusterBurnin),
192 7d88f255 Iustin Pop
    ("cluster-master-failover", qa_cluster.TestClusterMasterFailover),
193 ff699aa9 Michael Hanselmann
    ("cluster-master-failover",
194 ff699aa9 Michael Hanselmann
     qa_cluster.TestClusterMasterFailoverWithDrainedQueue),
195 c0464536 Michael Hanselmann
    (["cluster-oob", qa_config.NoVirtualCluster],
196 c0464536 Michael Hanselmann
     qa_cluster.TestClusterOob),
197 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestVersion),
198 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestEmptyCluster),
199 301adaae Michael Hanselmann
    (qa_rapi.Enabled, qa_rapi.TestRapiQuery),
200 7d88f255 Iustin Pop
    ]:
201 7d88f255 Iustin Pop
    RunTestIf(test, fn)
202 8947cf2b Michael Hanselmann
203 6d4a1656 Michael Hanselmann
204 65a884ef Iustin Pop
def RunRepairDiskSizes():
205 65a884ef Iustin Pop
  """Run the repair disk-sizes test.
206 65a884ef Iustin Pop

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

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

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

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

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

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

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

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

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

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

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

699 b1ffe1eb Michael Hanselmann
  """
700 725ec2f1 René Nussbaumer
  rapi_user = "ganeti-qa"
701 725ec2f1 René Nussbaumer
  rapi_secret = utils.GenerateSecret()
702 725ec2f1 René Nussbaumer
703 b1ffe1eb Michael Hanselmann
  RunEnvTests()
704 725ec2f1 René Nussbaumer
  SetupCluster(rapi_user, rapi_secret)
705 2771835c Michael Hanselmann
706 0fe54825 Bernardo Dal Seno
  if qa_rapi.Enabled():
707 0fe54825 Bernardo Dal Seno
    # Load RAPI certificate
708 0fe54825 Bernardo Dal Seno
    qa_rapi.Setup(rapi_user, rapi_secret)
709 2771835c Michael Hanselmann
710 b1ffe1eb Michael Hanselmann
  RunClusterTests()
711 b1ffe1eb Michael Hanselmann
  RunOsTests()
712 4b62db14 Michael Hanselmann
713 7d88f255 Iustin Pop
  RunTestIf("tags", qa_tags.TestClusterTags)
714 d74c2ca1 Michael Hanselmann
715 729c4377 Iustin Pop
  RunCommonNodeTests()
716 30131294 Adeodato Simo
  RunGroupListTests()
717 66787da5 Adeodato Simo
  RunGroupRwTests()
718 ea7693c1 Helga Velroyen
  RunNetworkTests()
719 729c4377 Iustin Pop
720 6f058bf2 Bernardo Dal Seno
  # The master shouldn't be readded or put offline; "delay" needs a non-master
721 6f058bf2 Bernardo Dal Seno
  # node to test
722 d0cb68cb Michael Hanselmann
  pnode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
723 d0cb68cb Michael Hanselmann
  try:
724 7d88f255 Iustin Pop
    RunTestIf("node-readd", qa_node.TestNodeReadd, pnode)
725 7d88f255 Iustin Pop
    RunTestIf("node-modify", qa_node.TestNodeModify, pnode)
726 5a85b99e Michael Hanselmann
    RunTestIf("delay", qa_cluster.TestDelay, pnode)
727 d0cb68cb Michael Hanselmann
  finally:
728 565cb4bf Michael Hanselmann
    pnode.Release()
729 102b115b Michael Hanselmann
730 a36f690c Bernardo Dal Seno
  # Make sure the cluster is clean before running instance tests
731 a36f690c Bernardo Dal Seno
  qa_cluster.AssertClusterVerify()
732 a36f690c Bernardo Dal Seno
733 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
734 b1ffe1eb Michael Hanselmann
  try:
735 7d88f255 Iustin Pop
    RunTestIf("tags", qa_tags.TestNodeTags, pnode)
736 d74c2ca1 Michael Hanselmann
737 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
738 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
739 a47f574c Oleksiy Mishchenko
740 8cb70e56 Michael Hanselmann
      if qa_config.TestEnabled("instance-add-plain-disk"):
741 924e95f9 Michael Hanselmann
        for use_client in [True, False]:
742 924e95f9 Michael Hanselmann
          rapi_instance = RunTest(qa_rapi.TestRapiInstanceAdd, pnode,
743 924e95f9 Michael Hanselmann
                                  use_client)
744 a77e3d33 Michael Hanselmann
          try:
745 a77e3d33 Michael Hanselmann
            if qa_config.TestEnabled("instance-plain-rapi-common-tests"):
746 a77e3d33 Michael Hanselmann
              RunCommonInstanceTests(rapi_instance)
747 a77e3d33 Michael Hanselmann
            RunTest(qa_rapi.TestRapiInstanceRemove, rapi_instance, use_client)
748 a77e3d33 Michael Hanselmann
          finally:
749 6f88e076 Michael Hanselmann
            rapi_instance.Release()
750 924e95f9 Michael Hanselmann
          del rapi_instance
751 8cb70e56 Michael Hanselmann
752 6f058bf2 Bernardo Dal Seno
  finally:
753 565cb4bf Michael Hanselmann
    pnode.Release()
754 6f058bf2 Bernardo Dal Seno
755 deadfa13 Bernardo Dal Seno
  config_list = [
756 deadfa13 Bernardo Dal Seno
    ("default-instance-tests", lambda: None, lambda _: None),
757 deadfa13 Bernardo Dal Seno
    ("exclusive-storage-instance-tests",
758 deadfa13 Bernardo Dal Seno
     lambda: qa_cluster.TestSetExclStorCluster(True),
759 deadfa13 Bernardo Dal Seno
     qa_cluster.TestSetExclStorCluster),
760 27eba428 Bernardo Dal Seno
  ]
761 deadfa13 Bernardo Dal Seno
  for (conf_name, setup_conf_f, restore_conf_f) in config_list:
762 deadfa13 Bernardo Dal Seno
    if qa_config.TestEnabled(conf_name):
763 deadfa13 Bernardo Dal Seno
      oldconf = setup_conf_f()
764 deadfa13 Bernardo Dal Seno
      RunInstanceTests()
765 deadfa13 Bernardo Dal Seno
      restore_conf_f(oldconf)
766 c7e54e1d Agata Murawska
767 6f058bf2 Bernardo Dal Seno
  pnode = qa_config.AcquireNode()
768 6f058bf2 Bernardo Dal Seno
  try:
769 7d88f255 Iustin Pop
    if qa_config.TestEnabled(["instance-add-plain-disk", "instance-export"]):
770 3b01286e Michael Hanselmann
      for shutdown in [False, True]:
771 c99200a3 Bernardo Dal Seno
        instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, [pnode])
772 7d7609a3 Michael Hanselmann
        try:
773 a77e3d33 Michael Hanselmann
          expnode = qa_config.AcquireNode(exclude=pnode)
774 a77e3d33 Michael Hanselmann
          try:
775 a77e3d33 Michael Hanselmann
            if shutdown:
776 a77e3d33 Michael Hanselmann
              # Stop instance before exporting and removing it
777 a77e3d33 Michael Hanselmann
              RunTest(qa_instance.TestInstanceShutdown, instance)
778 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestInstanceExportWithRemove, instance, expnode)
779 a77e3d33 Michael Hanselmann
            RunTest(qa_instance.TestBackupList, expnode)
780 a77e3d33 Michael Hanselmann
          finally:
781 565cb4bf Michael Hanselmann
            expnode.Release()
782 7d7609a3 Michael Hanselmann
        finally:
783 6f88e076 Michael Hanselmann
          instance.Release()
784 3b01286e Michael Hanselmann
        del expnode
785 3b01286e Michael Hanselmann
        del instance
786 a36f690c Bernardo Dal Seno
      qa_cluster.AssertClusterVerify()
787 a8083063 Iustin Pop
788 6f058bf2 Bernardo Dal Seno
  finally:
789 565cb4bf Michael Hanselmann
    pnode.Release()
790 6f058bf2 Bernardo Dal Seno
791 50ef6a41 Bernardo Dal Seno
  RunExclusiveStorageTests()
792 ab4832d1 Bernardo Dal Seno
  RunTestIf(["cluster-instance-policy", "instance-add-plain-disk"],
793 ab4832d1 Bernardo Dal Seno
            TestIPolicyPlainInstance)
794 50ef6a41 Bernardo Dal Seno
795 2ef21e6e Bernardo Dal Seno
  RunTestIf(
796 2ef21e6e Bernardo Dal Seno
    "instance-add-restricted-by-disktemplates",
797 2ef21e6e Bernardo Dal Seno
    qa_instance.TestInstanceCreationRestrictedByDiskTemplates)
798 2ef21e6e Bernardo Dal Seno
799 6f058bf2 Bernardo Dal Seno
  # Test removing instance with offline drbd secondary
800 04b5f222 Michael Hanselmann
  if qa_config.TestEnabled(["instance-remove-drbd-offline",
801 04b5f222 Michael Hanselmann
                            "instance-add-drbd-disk"]):
802 6f058bf2 Bernardo Dal Seno
    # Make sure the master is not put offline
803 6f058bf2 Bernardo Dal Seno
    snode = qa_config.AcquireNode(exclude=qa_config.GetMasterNode())
804 6f058bf2 Bernardo Dal Seno
    try:
805 6f058bf2 Bernardo Dal Seno
      pnode = qa_config.AcquireNode(exclude=snode)
806 c7e54e1d Agata Murawska
      try:
807 a36f690c Bernardo Dal Seno
        instance = qa_instance.TestInstanceAddWithDrbdDisk([pnode, snode])
808 f006f110 Bernardo Dal Seno
        set_offline = lambda node: qa_node.MakeNodeOffline(node, "yes")
809 f006f110 Bernardo Dal Seno
        set_online = lambda node: qa_node.MakeNodeOffline(node, "no")
810 f006f110 Bernardo Dal Seno
        RunTest(qa_instance.TestRemoveInstanceOfflineNode, instance, snode,
811 f006f110 Bernardo Dal Seno
                set_offline, set_online)
812 c7e54e1d Agata Murawska
      finally:
813 565cb4bf Michael Hanselmann
        pnode.Release()
814 6f058bf2 Bernardo Dal Seno
    finally:
815 565cb4bf Michael Hanselmann
      snode.Release()
816 f006f110 Bernardo Dal Seno
    qa_cluster.AssertClusterVerify()
817 a8083063 Iustin Pop
818 a5877534 Michele Tartara
  RunMonitoringTests()
819 a5877534 Michele Tartara
820 7d88f255 Iustin Pop
  RunTestIf("create-cluster", qa_node.TestNodeRemoveAll)
821 a8083063 Iustin Pop
822 7d88f255 Iustin Pop
  RunTestIf("cluster-destroy", qa_cluster.TestClusterDestroy)
823 a8083063 Iustin Pop
824 cec9845c Michael Hanselmann
825 fc3f75dd Iustin Pop
@UsesRapiClient
826 f7e6f3c8 Iustin Pop
def main():
827 f7e6f3c8 Iustin Pop
  """Main program.
828 f7e6f3c8 Iustin Pop

829 f7e6f3c8 Iustin Pop
  """
830 f7e6f3c8 Iustin Pop
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
831 d0c8c01d Iustin Pop
  parser.add_option("--yes-do-it", dest="yes_do_it",
832 5ae4945a Iustin Pop
                    action="store_true",
833 5ae4945a Iustin Pop
                    help="Really execute the tests")
834 c5cd9637 Michael Hanselmann
  (opts, args) = parser.parse_args()
835 f7e6f3c8 Iustin Pop
836 f7e6f3c8 Iustin Pop
  if len(args) == 1:
837 f7e6f3c8 Iustin Pop
    (config_file, ) = args
838 f7e6f3c8 Iustin Pop
  else:
839 f7e6f3c8 Iustin Pop
    parser.error("Wrong number of arguments.")
840 f7e6f3c8 Iustin Pop
841 c5cd9637 Michael Hanselmann
  if not opts.yes_do_it:
842 f7e6f3c8 Iustin Pop
    print ("Executing this script irreversibly destroys any Ganeti\n"
843 f7e6f3c8 Iustin Pop
           "configuration on all nodes involved. If you really want\n"
844 f7e6f3c8 Iustin Pop
           "to start testing, supply the --yes-do-it option.")
845 f7e6f3c8 Iustin Pop
    sys.exit(1)
846 f7e6f3c8 Iustin Pop
847 f7e6f3c8 Iustin Pop
  qa_config.Load(config_file)
848 f7e6f3c8 Iustin Pop
849 aecba21e Michael Hanselmann
  primary = qa_config.GetMasterNode().primary
850 710bc88c Iustin Pop
  qa_utils.StartMultiplexer(primary)
851 710bc88c Iustin Pop
  print ("SSH command for primary node: %s" %
852 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand(primary, "")))
853 710bc88c Iustin Pop
  print ("SSH command for other nodes: %s" %
854 710bc88c Iustin Pop
         utils.ShellQuoteArgs(qa_utils.GetSSHCommand("NODE", "")))
855 f7e6f3c8 Iustin Pop
  try:
856 f7e6f3c8 Iustin Pop
    RunQa()
857 f7e6f3c8 Iustin Pop
  finally:
858 f7e6f3c8 Iustin Pop
    qa_utils.CloseMultiplexers()
859 f7e6f3c8 Iustin Pop
860 d0c8c01d Iustin Pop
if __name__ == "__main__":
861 cec9845c Michael Hanselmann
  main()