Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ d74c2ca1

History | View | Annotate | Download (8 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 a8083063 Iustin Pop
44 a8083063 Iustin Pop
45 cec9845c Michael Hanselmann
def RunTest(fn, *args):
46 a8083063 Iustin Pop
  """Runs a test after printing a header.
47 a8083063 Iustin Pop

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

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

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

89 b1ffe1eb Michael Hanselmann
  """
90 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-verify'):
91 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterVerify)
92 e9e35aaa Michael Hanselmann
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 8947cf2b Michael Hanselmann
111 b1ffe1eb Michael Hanselmann
def RunOsTests():
112 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
113 5d640672 Michael Hanselmann

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

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

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

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

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

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