Statistics
| Branch: | Tag: | Revision:

root / qa / ganeti-qa.py @ e8230860

History | View | Annotate | Download (8.7 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 c68d1f43 Michael Hanselmann
import datetime
32 c68d1f43 Michael Hanselmann
import optparse
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 c68d1f43 Michael Hanselmann
  now = str(datetime.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 caea3b32 Iustin Pop
  if qa_config.TestEnabled('cluster-rename'):
95 caea3b32 Iustin Pop
    RunTest(qa_cluster.TestClusterRename)
96 caea3b32 Iustin Pop
97 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-info'):
98 62843684 Michael Hanselmann
    RunTest(qa_cluster.TestClusterVersion)
99 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterInfo)
100 283f9d4c Michael Hanselmann
    RunTest(qa_cluster.TestClusterGetmaster)
101 283f9d4c Michael Hanselmann
102 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-copyfile'):
103 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterCopyfile)
104 a8083063 Iustin Pop
105 830da270 Michael Hanselmann
  if qa_config.TestEnabled('cluster-command'):
106 830da270 Michael Hanselmann
    RunTest(qa_cluster.TestClusterCommand)
107 830da270 Michael Hanselmann
108 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-burnin'):
109 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterBurnin)
110 a8083063 Iustin Pop
111 cec9845c Michael Hanselmann
  if qa_config.TestEnabled('cluster-master-failover'):
112 cec9845c Michael Hanselmann
    RunTest(qa_cluster.TestClusterMasterFailover)
113 a8083063 Iustin Pop
114 8947cf2b Michael Hanselmann
115 b1ffe1eb Michael Hanselmann
def RunOsTests():
116 b1ffe1eb Michael Hanselmann
  """Runs all tests related to gnt-os.
117 5d640672 Michael Hanselmann

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

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

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

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

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

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