Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ 62843684

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

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

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

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

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

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

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

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

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

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

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