Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 21f04e5e

History | View | Annotate | Download (8.5 kB)

1 a8083063 Iustin Pop
#!/usr/bin/python
2 a8083063 Iustin Pop
#
3 a8083063 Iustin Pop
4 cec9845c Michael Hanselmann
# Copyright (C) 2007 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 a8083063 Iustin Pop
import sys
27 c68d1f43 Michael Hanselmann
import datetime
28 c68d1f43 Michael Hanselmann
import optparse
29 a8083063 Iustin Pop
30 cec9845c Michael Hanselmann
import qa_cluster
31 cec9845c Michael Hanselmann
import qa_config
32 cec9845c Michael Hanselmann
import qa_daemon
33 cec9845c Michael Hanselmann
import qa_env
34 cec9845c Michael Hanselmann
import qa_instance
35 cec9845c Michael Hanselmann
import qa_node
36 8947cf2b Michael Hanselmann
import qa_os
37 a47f574c Oleksiy Mishchenko
import qa_rapi
38 d74c2ca1 Michael Hanselmann
import qa_tags
39 1672a0d1 Michael Hanselmann
import qa_utils
40 a8083063 Iustin Pop
41 a8083063 Iustin Pop
42 cec9845c Michael Hanselmann
def RunTest(fn, *args):
43 a8083063 Iustin Pop
  """Runs a test after printing a header.
44 a8083063 Iustin Pop

45 a8083063 Iustin Pop
  """
46 cec9845c Michael Hanselmann
  if fn.__doc__:
47 cec9845c Michael Hanselmann
    desc = fn.__doc__.splitlines()[0].strip()
48 a8083063 Iustin Pop
  else:
49 cec9845c Michael Hanselmann
    desc = '%r' % fn
50 a8083063 Iustin Pop
51 c68d1f43 Michael Hanselmann
  now = str(datetime.datetime.now())
52 a8083063 Iustin Pop
53 a8083063 Iustin Pop
  print
54 a8083063 Iustin Pop
  print '---', now, ('-' * (55 - len(now)))
55 a8083063 Iustin Pop
  print desc
56 a8083063 Iustin Pop
  print '-' * 60
57 a8083063 Iustin Pop
58 cec9845c Michael Hanselmann
  return fn(*args)
59 a8083063 Iustin Pop
60 a8083063 Iustin Pop
61 b1ffe1eb Michael Hanselmann
def RunEnvTests():
62 b1ffe1eb Michael Hanselmann
  """Run several environment tests.
63 a8083063 Iustin Pop

64 a8083063 Iustin Pop
  """
65 b1ffe1eb Michael Hanselmann
  if not qa_config.TestEnabled('env'):
66 b1ffe1eb Michael Hanselmann
    return
67 a8083063 Iustin Pop
68 b1ffe1eb Michael Hanselmann
  RunTest(qa_env.TestSshConnection)
69 b1ffe1eb Michael Hanselmann
  RunTest(qa_env.TestIcmpPing)
70 b1ffe1eb Michael Hanselmann
  RunTest(qa_env.TestGanetiCommands)
71 a8083063 Iustin Pop
72 94508060 Michael Hanselmann
73 b1ffe1eb Michael Hanselmann
def SetupCluster():
74 b1ffe1eb Michael Hanselmann
  """Initializes the cluster.
75 a8083063 Iustin Pop

76 b1ffe1eb Michael Hanselmann
  """
77 cec9845c Michael Hanselmann
  RunTest(qa_cluster.TestClusterInit)
78 cec9845c Michael Hanselmann
  RunTest(qa_node.TestNodeAddAll)
79 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-info'):
80 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeInfo)
81 b1ffe1eb Michael Hanselmann
82 b1ffe1eb Michael Hanselmann
83 b1ffe1eb Michael Hanselmann
def RunClusterTests():
84 b1ffe1eb Michael Hanselmann
  """Runs tests related to gnt-cluster.
85 180bdd1f Michael Hanselmann

86 b1ffe1eb Michael Hanselmann
  """
87 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-verify'):
88 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterVerify)
89 e9e35aaa Michael Hanselmann
90 caea3b32 Iustin Pop
  if qa_config.TestEnabled('cluster-rename'):
91 caea3b32 Iustin Pop
    RunTest(qa_cluster.TestClusterRename)
92 caea3b32 Iustin Pop
93 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-info'):
94 62843684 Michael Hanselmann
    RunTest(qa_cluster.TestClusterVersion)
95 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterInfo)
96 283f9d4c Michael Hanselmann
    RunTest(qa_cluster.TestClusterGetmaster)
97 283f9d4c Michael Hanselmann
98 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-copyfile'):
99 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterCopyfile)
100 a8083063 Iustin Pop
101 830da270 Michael Hanselmann
  if qa_config.TestEnabled('cluster-command'):
102 830da270 Michael Hanselmann
    RunTest(qa_cluster.TestClusterCommand)
103 830da270 Michael Hanselmann
104 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-burnin'):
105 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterBurnin)
106 a8083063 Iustin Pop
107 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-master-failover'):
108 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterMasterFailover)
109 a8083063 Iustin Pop
110 a47f574c Oleksiy Mishchenko
  if qa_rapi.Enabled():
111 a47f574c Oleksiy Mishchenko
    RunTest(qa_rapi.TestVersion)
112 a47f574c Oleksiy Mishchenko
    RunTest(qa_rapi.TestEmptyCluster)
113 8947cf2b Michael Hanselmann
114 b1ffe1eb Michael Hanselmann
def RunOsTests():
115 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
116 5d640672 Michael Hanselmann

117 b1ffe1eb Michael Hanselmann
  """
118 b1ffe1eb Michael Hanselmann
  if not qa_config.TestEnabled('os'):
119 b1ffe1eb Michael Hanselmann
    return
120 b1ffe1eb Michael Hanselmann
121 b1ffe1eb Michael Hanselmann
  RunTest(qa_os.TestOsList)
122 b1ffe1eb Michael Hanselmann
  RunTest(qa_os.TestOsDiagnose)
123 b1ffe1eb Michael Hanselmann
  RunTest(qa_os.TestOsValid)
124 b1ffe1eb Michael Hanselmann
  RunTest(qa_os.TestOsInvalid)
125 b1ffe1eb Michael Hanselmann
  RunTest(qa_os.TestOsPartiallyValid)
126 b1ffe1eb Michael Hanselmann
127 b1ffe1eb Michael Hanselmann
128 b1ffe1eb Michael Hanselmann
def RunCommonInstanceTests(instance):
129 b1ffe1eb Michael Hanselmann
  """Runs a few tests that are common to all disk types.
130 b1ffe1eb Michael Hanselmann

131 b1ffe1eb Michael Hanselmann
  """
132 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-shutdown'):
133 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceShutdown, instance)
134 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceStartup, instance)
135 a8083063 Iustin Pop
136 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-list'):
137 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceList)
138 283f9d4c Michael Hanselmann
139 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-info'):
140 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceInfo, instance)
141 e9e35aaa Michael Hanselmann
142 c0f74c55 Iustin Pop
  if qa_config.TestEnabled('instance-modify'):
143 c0f74c55 Iustin Pop
    RunTest(qa_instance.TestInstanceModify, instance)
144 c0f74c55 Iustin Pop
145 4379b1fa Michael Hanselmann
  if qa_config.TestEnabled('instance-console'):
146 4379b1fa Michael Hanselmann
    RunTest(qa_instance.TestInstanceConsole, instance)
147 4379b1fa Michael Hanselmann
148 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-reinstall'):
149 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceShutdown, instance)
150 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceReinstall, instance)
151 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceStartup, instance)
152 a8083063 Iustin Pop
153 8a4e8898 Michael Hanselmann
  if qa_config.TestEnabled('instance-reboot'):
154 8a4e8898 Michael Hanselmann
    RunTest(qa_instance.TestInstanceReboot, instance)
155 8a4e8898 Michael Hanselmann
156 d74c2ca1 Michael Hanselmann
  if qa_config.TestEnabled('tags'):
157 d74c2ca1 Michael Hanselmann
    RunTest(qa_tags.TestInstanceTags, instance)
158 d74c2ca1 Michael Hanselmann
159 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-volumes'):
160 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeVolumes)
161 23269c5b Michael Hanselmann
162 a47f574c Oleksiy Mishchenko
  if qa_rapi.Enabled():
163 a47f574c Oleksiy Mishchenko
    RunTest(qa_rapi.TestInstance, instance)
164 23269c5b Michael Hanselmann
165 b1ffe1eb Michael Hanselmann
def RunExportImportTests(instance, pnode):
166 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
167 a8083063 Iustin Pop

168 b1ffe1eb Michael Hanselmann
  """
169 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-export'):
170 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
171 b1ffe1eb Michael Hanselmann
    try:
172 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
173 b1ffe1eb Michael Hanselmann
174 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
175 b1ffe1eb Michael Hanselmann
176 b1ffe1eb Michael Hanselmann
      if qa_config.TestEnabled('instance-import'):
177 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
178 5d640672 Michael Hanselmann
        try:
179 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
180 b1ffe1eb Michael Hanselmann
                  expnode, name)
181 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
182 5d640672 Michael Hanselmann
        finally:
183 b1ffe1eb Michael Hanselmann
          qa_config.ReleaseInstance(newinst)
184 b1ffe1eb Michael Hanselmann
    finally:
185 b1ffe1eb Michael Hanselmann
      qa_config.ReleaseNode(expnode)
186 5d640672 Michael Hanselmann
187 283f9d4c Michael Hanselmann
188 b1ffe1eb Michael Hanselmann
def RunDaemonTests(instance, pnode):
189 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
190 9df6d173 Michael Hanselmann

191 b1ffe1eb Michael Hanselmann
  """
192 b1ffe1eb Michael Hanselmann
  automatic_restart = \
193 b1ffe1eb Michael Hanselmann
    qa_config.TestEnabled('instance-automatic-restart')
194 b1ffe1eb Michael Hanselmann
  consecutive_failures = \
195 b1ffe1eb Michael Hanselmann
    qa_config.TestEnabled('instance-consecutive-failures')
196 a8083063 Iustin Pop
197 b1ffe1eb Michael Hanselmann
  if automatic_restart or consecutive_failures:
198 b1ffe1eb Michael Hanselmann
    qa_daemon.PrintCronWarning()
199 5d640672 Michael Hanselmann
200 b1ffe1eb Michael Hanselmann
    if automatic_restart:
201 b1ffe1eb Michael Hanselmann
      RunTest(qa_daemon.TestInstanceAutomaticRestart, pnode, instance)
202 e9e35aaa Michael Hanselmann
203 b1ffe1eb Michael Hanselmann
    if consecutive_failures:
204 6623a5c1 Michael Hanselmann
      RunTest(qa_daemon.TestInstanceConsecutiveFailures, pnode, instance)
205 e9e35aaa Michael Hanselmann
206 9df6d173 Michael Hanselmann
207 b1ffe1eb Michael Hanselmann
def RunHardwareFailureTests(instance, pnode, snode):
208 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
209 a8083063 Iustin Pop

210 b1ffe1eb Michael Hanselmann
  """
211 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-failover'):
212 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceFailover, instance)
213 b1ffe1eb Michael Hanselmann
214 7910e7a5 Michael Hanselmann
  if qa_config.TestEnabled('instance-replace-disks'):
215 76f59a32 Michael Hanselmann
    othernode = qa_config.AcquireNode(exclude=[pnode, snode])
216 7910e7a5 Michael Hanselmann
    try:
217 7910e7a5 Michael Hanselmann
      RunTest(qa_instance.TestReplaceDisks,
218 7910e7a5 Michael Hanselmann
              instance, pnode, snode, othernode)
219 7910e7a5 Michael Hanselmann
    finally:
220 7910e7a5 Michael Hanselmann
      qa_config.ReleaseNode(othernode)
221 7910e7a5 Michael Hanselmann
222 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-evacuate'):
223 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeEvacuate, pnode, snode)
224 b1ffe1eb Michael Hanselmann
225 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-failover'):
226 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeFailover, pnode, snode)
227 b1ffe1eb Michael Hanselmann
228 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-disk-failure'):
229 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceMasterDiskFailure,
230 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
231 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceSecondaryDiskFailure,
232 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
233 b1ffe1eb Michael Hanselmann
234 b1ffe1eb Michael Hanselmann
235 b1ffe1eb Michael Hanselmann
def main():
236 b1ffe1eb Michael Hanselmann
  """Main program.
237 b1ffe1eb Michael Hanselmann

238 b1ffe1eb Michael Hanselmann
  """
239 a39ec11a Michael Hanselmann
  parser = optparse.OptionParser(usage="%prog [options] <config-file>")
240 b1ffe1eb Michael Hanselmann
  parser.add_option('--yes-do-it', dest='yes_do_it',
241 b1ffe1eb Michael Hanselmann
      action="store_true",
242 b1ffe1eb Michael Hanselmann
      help="Really execute the tests")
243 b1ffe1eb Michael Hanselmann
  (qa_config.options, args) = parser.parse_args()
244 5d640672 Michael Hanselmann
245 a39ec11a Michael Hanselmann
  if len(args) == 1:
246 a39ec11a Michael Hanselmann
    (config_file, ) = args
247 b1ffe1eb Michael Hanselmann
  else:
248 a39ec11a Michael Hanselmann
    parser.error("Wrong number of arguments.")
249 a8083063 Iustin Pop
250 b1ffe1eb Michael Hanselmann
  if not qa_config.options.yes_do_it:
251 b1ffe1eb Michael Hanselmann
    print ("Executing this script irreversibly destroys any Ganeti\n"
252 b1ffe1eb Michael Hanselmann
           "configuration on all nodes involved. If you really want\n"
253 b1ffe1eb Michael Hanselmann
           "to start testing, supply the --yes-do-it option.")
254 b1ffe1eb Michael Hanselmann
    sys.exit(1)
255 e9e35aaa Michael Hanselmann
256 b1ffe1eb Michael Hanselmann
  qa_config.Load(config_file)
257 a8083063 Iustin Pop
258 b1ffe1eb Michael Hanselmann
  RunEnvTests()
259 b1ffe1eb Michael Hanselmann
  SetupCluster()
260 b1ffe1eb Michael Hanselmann
  RunClusterTests()
261 b1ffe1eb Michael Hanselmann
  RunOsTests()
262 4b62db14 Michael Hanselmann
263 d74c2ca1 Michael Hanselmann
  if qa_config.TestEnabled('tags'):
264 d74c2ca1 Michael Hanselmann
    RunTest(qa_tags.TestClusterTags)
265 d74c2ca1 Michael Hanselmann
266 102b115b Michael Hanselmann
  if qa_config.TestEnabled('node-readd'):
267 102b115b Michael Hanselmann
    master = qa_config.GetMasterNode()
268 102b115b Michael Hanselmann
    pnode = qa_config.AcquireNode(exclude=master)
269 102b115b Michael Hanselmann
    try:
270 102b115b Michael Hanselmann
      RunTest(qa_node.TestNodeReadd, pnode)
271 102b115b Michael Hanselmann
    finally:
272 102b115b Michael Hanselmann
      qa_config.ReleaseNode(pnode)
273 102b115b Michael Hanselmann
274 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
275 b1ffe1eb Michael Hanselmann
  try:
276 d74c2ca1 Michael Hanselmann
    if qa_config.TestEnabled('tags'):
277 d74c2ca1 Michael Hanselmann
      RunTest(qa_tags.TestNodeTags, pnode)
278 d74c2ca1 Michael Hanselmann
279 a47f574c Oleksiy Mishchenko
    if qa_rapi.Enabled():
280 a47f574c Oleksiy Mishchenko
      RunTest(qa_rapi.TestNode, pnode)
281 a47f574c Oleksiy Mishchenko
282 b1ffe1eb Michael Hanselmann
    if qa_config.TestEnabled('instance-add-plain-disk'):
283 b1ffe1eb Michael Hanselmann
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
284 b1ffe1eb Michael Hanselmann
      RunCommonInstanceTests(instance)
285 b1ffe1eb Michael Hanselmann
      RunExportImportTests(instance, pnode)
286 b1ffe1eb Michael Hanselmann
      RunDaemonTests(instance, pnode)
287 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestInstanceRemove, instance)
288 b1ffe1eb Michael Hanselmann
      del instance
289 9df6d173 Michael Hanselmann
290 7d7609a3 Michael Hanselmann
    multinode_tests = [
291 7d7609a3 Michael Hanselmann
      ('instance-add-drbd-disk',
292 7d7609a3 Michael Hanselmann
       qa_instance.TestInstanceAddWithDrbdDisk),
293 7d7609a3 Michael Hanselmann
    ]
294 7d7609a3 Michael Hanselmann
295 7d7609a3 Michael Hanselmann
    for name, func in multinode_tests:
296 7d7609a3 Michael Hanselmann
      if qa_config.TestEnabled(name):
297 7d7609a3 Michael Hanselmann
        snode = qa_config.AcquireNode(exclude=pnode)
298 7d7609a3 Michael Hanselmann
        try:
299 7d7609a3 Michael Hanselmann
          instance = RunTest(func, pnode, snode)
300 7d7609a3 Michael Hanselmann
          RunCommonInstanceTests(instance)
301 7d7609a3 Michael Hanselmann
          RunExportImportTests(instance, pnode)
302 7d7609a3 Michael Hanselmann
          RunHardwareFailureTests(instance, pnode, snode)
303 7d7609a3 Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, instance)
304 7d7609a3 Michael Hanselmann
          del instance
305 7d7609a3 Michael Hanselmann
        finally:
306 7d7609a3 Michael Hanselmann
          qa_config.ReleaseNode(snode)
307 a8083063 Iustin Pop
308 a8083063 Iustin Pop
  finally:
309 b1ffe1eb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
310 a8083063 Iustin Pop
311 cec9845c Michael Hanselmann
  RunTest(qa_node.TestNodeRemoveAll)
312 a8083063 Iustin Pop
313 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-destroy'):
314 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterDestroy)
315 a8083063 Iustin Pop
316 cec9845c Michael Hanselmann
317 cec9845c Michael Hanselmann
if __name__ == '__main__':
318 cec9845c Michael Hanselmann
  main()