Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 1e020d1b

History | View | Annotate | Download (8.1 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
You can create the required known_hosts file using ssh-keyscan. It's mandatory
25 94508060 Michael Hanselmann
to use the full name of a node (FQDN). For security reasons, verify the keys
26 94508060 Michael Hanselmann
before using them.
27 94508060 Michael Hanselmann
Example: ssh-keyscan -t rsa node{1,2,3,4}.example.com > known_hosts
28 94508060 Michael Hanselmann
"""
29 a8083063 Iustin Pop
30 a8083063 Iustin Pop
import sys
31 a8083063 Iustin Pop
from datetime import datetime
32 a8083063 Iustin Pop
from optparse import OptionParser
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 cec9845c Michael Hanselmann
import qa_instance
39 cec9845c Michael Hanselmann
import qa_node
40 8947cf2b Michael Hanselmann
import qa_os
41 cec9845c Michael Hanselmann
import qa_other
42 d74c2ca1 Michael Hanselmann
import qa_tags
43 1672a0d1 Michael Hanselmann
import qa_utils
44 a8083063 Iustin Pop
45 a8083063 Iustin Pop
46 cec9845c Michael Hanselmann
def RunTest(fn, *args):
47 a8083063 Iustin Pop
  """Runs a test after printing a header.
48 a8083063 Iustin Pop

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

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

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

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

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

129 b1ffe1eb Michael Hanselmann
  """
130 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-shutdown'):
131 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceShutdown, instance)
132 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceStartup, instance)
133 a8083063 Iustin Pop
134 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-list'):
135 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceList)
136 283f9d4c Michael Hanselmann
137 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-info'):
138 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceInfo, instance)
139 e9e35aaa Michael Hanselmann
140 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-reinstall'):
141 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceShutdown, instance)
142 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceReinstall, instance)
143 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceStartup, instance)
144 a8083063 Iustin Pop
145 d74c2ca1 Michael Hanselmann
  if qa_config.TestEnabled('tags'):
146 d74c2ca1 Michael Hanselmann
    RunTest(qa_tags.TestInstanceTags, instance)
147 d74c2ca1 Michael Hanselmann
148 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-volumes'):
149 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeVolumes)
150 23269c5b Michael Hanselmann
151 23269c5b Michael Hanselmann
152 b1ffe1eb Michael Hanselmann
def RunExportImportTests(instance, pnode):
153 b1ffe1eb Michael Hanselmann
  """Tries to export and import the instance.
154 a8083063 Iustin Pop

155 b1ffe1eb Michael Hanselmann
  """
156 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-export'):
157 b1ffe1eb Michael Hanselmann
    expnode = qa_config.AcquireNode(exclude=pnode)
158 b1ffe1eb Michael Hanselmann
    try:
159 b1ffe1eb Michael Hanselmann
      name = RunTest(qa_instance.TestInstanceExport, instance, expnode)
160 b1ffe1eb Michael Hanselmann
161 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestBackupList, expnode)
162 b1ffe1eb Michael Hanselmann
163 b1ffe1eb Michael Hanselmann
      if qa_config.TestEnabled('instance-import'):
164 b1ffe1eb Michael Hanselmann
        newinst = qa_config.AcquireInstance()
165 5d640672 Michael Hanselmann
        try:
166 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceImport, pnode, newinst,
167 b1ffe1eb Michael Hanselmann
                  expnode, name)
168 b1ffe1eb Michael Hanselmann
          RunTest(qa_instance.TestInstanceRemove, newinst)
169 5d640672 Michael Hanselmann
        finally:
170 b1ffe1eb Michael Hanselmann
          qa_config.ReleaseInstance(newinst)
171 b1ffe1eb Michael Hanselmann
    finally:
172 b1ffe1eb Michael Hanselmann
      qa_config.ReleaseNode(expnode)
173 5d640672 Michael Hanselmann
174 283f9d4c Michael Hanselmann
175 b1ffe1eb Michael Hanselmann
def RunDaemonTests(instance, pnode):
176 b1ffe1eb Michael Hanselmann
  """Test the ganeti-watcher script.
177 9df6d173 Michael Hanselmann

178 b1ffe1eb Michael Hanselmann
  """
179 b1ffe1eb Michael Hanselmann
  automatic_restart = \
180 b1ffe1eb Michael Hanselmann
    qa_config.TestEnabled('instance-automatic-restart')
181 b1ffe1eb Michael Hanselmann
  consecutive_failures = \
182 b1ffe1eb Michael Hanselmann
    qa_config.TestEnabled('instance-consecutive-failures')
183 a8083063 Iustin Pop
184 b1ffe1eb Michael Hanselmann
  if automatic_restart or consecutive_failures:
185 b1ffe1eb Michael Hanselmann
    qa_daemon.PrintCronWarning()
186 5d640672 Michael Hanselmann
187 b1ffe1eb Michael Hanselmann
    if automatic_restart:
188 b1ffe1eb Michael Hanselmann
      RunTest(qa_daemon.TestInstanceAutomaticRestart, pnode, instance)
189 e9e35aaa Michael Hanselmann
190 b1ffe1eb Michael Hanselmann
    if consecutive_failures:
191 b1ffe1eb Michael Hanselmann
      RunTest(qa_daemon.TestInstanceConsecutiveFailures, node, instance)
192 e9e35aaa Michael Hanselmann
193 9df6d173 Michael Hanselmann
194 b1ffe1eb Michael Hanselmann
def RunHardwareFailureTests(instance, pnode, snode):
195 b1ffe1eb Michael Hanselmann
  """Test cluster internal hardware failure recovery.
196 a8083063 Iustin Pop

197 b1ffe1eb Michael Hanselmann
  """
198 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-failover'):
199 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceFailover, instance)
200 b1ffe1eb Michael Hanselmann
201 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-evacuate'):
202 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeEvacuate, pnode, snode)
203 b1ffe1eb Michael Hanselmann
204 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('node-failover'):
205 b1ffe1eb Michael Hanselmann
    RunTest(qa_node.TestNodeFailover, pnode, snode)
206 b1ffe1eb Michael Hanselmann
207 b1ffe1eb Michael Hanselmann
  if qa_config.TestEnabled('instance-disk-failure'):
208 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceMasterDiskFailure,
209 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
210 b1ffe1eb Michael Hanselmann
    RunTest(qa_instance.TestInstanceSecondaryDiskFailure,
211 b1ffe1eb Michael Hanselmann
            instance, pnode, snode)
212 b1ffe1eb Michael Hanselmann
213 b1ffe1eb Michael Hanselmann
214 b1ffe1eb Michael Hanselmann
def main():
215 b1ffe1eb Michael Hanselmann
  """Main program.
216 b1ffe1eb Michael Hanselmann

217 b1ffe1eb Michael Hanselmann
  """
218 b1ffe1eb Michael Hanselmann
  parser = OptionParser(usage="%prog [options] <config-file> "
219 b1ffe1eb Michael Hanselmann
                              "<known-hosts-file>")
220 b1ffe1eb Michael Hanselmann
  parser.add_option('--dry-run', dest='dry_run',
221 b1ffe1eb Michael Hanselmann
      action="store_true",
222 b1ffe1eb Michael Hanselmann
      help="Show what would be done")
223 b1ffe1eb Michael Hanselmann
  parser.add_option('--yes-do-it', dest='yes_do_it',
224 b1ffe1eb Michael Hanselmann
      action="store_true",
225 b1ffe1eb Michael Hanselmann
      help="Really execute the tests")
226 b1ffe1eb Michael Hanselmann
  (qa_config.options, args) = parser.parse_args()
227 5d640672 Michael Hanselmann
228 b1ffe1eb Michael Hanselmann
  if len(args) == 2:
229 b1ffe1eb Michael Hanselmann
    (config_file, known_hosts_file) = args
230 b1ffe1eb Michael Hanselmann
  else:
231 b1ffe1eb Michael Hanselmann
    parser.error("Not enough arguments.")
232 a8083063 Iustin Pop
233 b1ffe1eb Michael Hanselmann
  if not qa_config.options.yes_do_it:
234 b1ffe1eb Michael Hanselmann
    print ("Executing this script irreversibly destroys any Ganeti\n"
235 b1ffe1eb Michael Hanselmann
           "configuration on all nodes involved. If you really want\n"
236 b1ffe1eb Michael Hanselmann
           "to start testing, supply the --yes-do-it option.")
237 b1ffe1eb Michael Hanselmann
    sys.exit(1)
238 e9e35aaa Michael Hanselmann
239 b1ffe1eb Michael Hanselmann
  qa_config.Load(config_file)
240 1672a0d1 Michael Hanselmann
  qa_utils.LoadHooks()
241 a8083063 Iustin Pop
242 b1ffe1eb Michael Hanselmann
  RunTest(qa_other.UploadKnownHostsFile, known_hosts_file)
243 4b62db14 Michael Hanselmann
244 b1ffe1eb Michael Hanselmann
  RunEnvTests()
245 b1ffe1eb Michael Hanselmann
  SetupCluster()
246 b1ffe1eb Michael Hanselmann
  RunClusterTests()
247 b1ffe1eb Michael Hanselmann
  RunOsTests()
248 4b62db14 Michael Hanselmann
249 d74c2ca1 Michael Hanselmann
  if qa_config.TestEnabled('tags'):
250 d74c2ca1 Michael Hanselmann
    RunTest(qa_tags.TestClusterTags)
251 d74c2ca1 Michael Hanselmann
252 b1ffe1eb Michael Hanselmann
  pnode = qa_config.AcquireNode()
253 b1ffe1eb Michael Hanselmann
  try:
254 d74c2ca1 Michael Hanselmann
    if qa_config.TestEnabled('tags'):
255 d74c2ca1 Michael Hanselmann
      RunTest(qa_tags.TestNodeTags, pnode)
256 d74c2ca1 Michael Hanselmann
257 b1ffe1eb Michael Hanselmann
    if qa_config.TestEnabled('instance-add-plain-disk'):
258 b1ffe1eb Michael Hanselmann
      instance = RunTest(qa_instance.TestInstanceAddWithPlainDisk, pnode)
259 b1ffe1eb Michael Hanselmann
      RunCommonInstanceTests(instance)
260 b1ffe1eb Michael Hanselmann
      RunExportImportTests(instance, pnode)
261 b1ffe1eb Michael Hanselmann
      RunDaemonTests(instance, pnode)
262 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestInstanceRemove, instance)
263 b1ffe1eb Michael Hanselmann
      del instance
264 9df6d173 Michael Hanselmann
265 b1ffe1eb Michael Hanselmann
    if qa_config.TestEnabled('instance-add-local-mirror-disk'):
266 b1ffe1eb Michael Hanselmann
      instance = RunTest(qa_instance.TestInstanceAddWithLocalMirrorDisk, pnode)
267 b1ffe1eb Michael Hanselmann
      RunCommonInstanceTests(instance)
268 b1ffe1eb Michael Hanselmann
      RunExportImportTests(instance, pnode)
269 b1ffe1eb Michael Hanselmann
      RunTest(qa_instance.TestInstanceRemove, instance)
270 b1ffe1eb Michael Hanselmann
      del instance
271 e8ae0c20 Michael Hanselmann
272 b1ffe1eb Michael Hanselmann
    if qa_config.TestEnabled('instance-add-remote-raid-disk'):
273 b1ffe1eb Michael Hanselmann
      snode = qa_config.AcquireNode(exclude=pnode)
274 b1ffe1eb Michael Hanselmann
      try:
275 b1ffe1eb Michael Hanselmann
        instance = RunTest(qa_instance.TestInstanceAddWithRemoteRaidDisk,
276 b1ffe1eb Michael Hanselmann
                           pnode, snode)
277 b1ffe1eb Michael Hanselmann
        RunCommonInstanceTests(instance)
278 b1ffe1eb Michael Hanselmann
        RunExportImportTests(instance, pnode)
279 b1ffe1eb Michael Hanselmann
        RunHardwareFailureTests(instance, pnode, snode)
280 cec9845c Michael Hanselmann
        RunTest(qa_instance.TestInstanceRemove, instance)
281 a8083063 Iustin Pop
        del instance
282 a8083063 Iustin Pop
      finally:
283 b1ffe1eb Michael Hanselmann
        qa_config.ReleaseNode(snode)
284 a8083063 Iustin Pop
285 a8083063 Iustin Pop
  finally:
286 b1ffe1eb Michael Hanselmann
    qa_config.ReleaseNode(pnode)
287 a8083063 Iustin Pop
288 cec9845c Michael Hanselmann
  RunTest(qa_node.TestNodeRemoveAll)
289 a8083063 Iustin Pop
290 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-destroy'):
291 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterDestroy)
292 a8083063 Iustin Pop
293 cec9845c Michael Hanselmann
294 cec9845c Michael Hanselmann
if __name__ == '__main__':
295 cec9845c Michael Hanselmann
  main()