Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ e51ca051

History | View | Annotate | Download (14.7 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 cec9845c Michael Hanselmann
# Copyright (C) 2007 Google Inc.
5 cec9845c Michael Hanselmann
#
6 cec9845c Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 cec9845c Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 cec9845c Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 cec9845c Michael Hanselmann
# (at your option) any later version.
10 cec9845c Michael Hanselmann
#
11 cec9845c Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 cec9845c Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 cec9845c Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 cec9845c Michael Hanselmann
# General Public License for more details.
15 cec9845c Michael Hanselmann
#
16 cec9845c Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 cec9845c Michael Hanselmann
# along with this program; if not, write to the Free Software
18 cec9845c Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 cec9845c Michael Hanselmann
# 02110-1301, USA.
20 cec9845c Michael Hanselmann
21 cec9845c Michael Hanselmann
22 cec9845c Michael Hanselmann
"""Instance related QA tests.
23 cec9845c Michael Hanselmann

24 cec9845c Michael Hanselmann
"""
25 cec9845c Michael Hanselmann
26 e8ae0c20 Michael Hanselmann
import re
27 e8ae0c20 Michael Hanselmann
import time
28 e8ae0c20 Michael Hanselmann
29 cec9845c Michael Hanselmann
from ganeti import utils
30 5d640672 Michael Hanselmann
from ganeti import constants
31 cec9845c Michael Hanselmann
32 cec9845c Michael Hanselmann
import qa_config
33 5d640672 Michael Hanselmann
import qa_utils
34 e8ae0c20 Michael Hanselmann
import qa_error
35 e8ae0c20 Michael Hanselmann
36 e8ae0c20 Michael Hanselmann
from qa_utils import AssertEqual, AssertNotEqual, StartSSH
37 cec9845c Michael Hanselmann
38 e8ae0c20 Michael Hanselmann
39 e8ae0c20 Michael Hanselmann
def _GetDiskStatePath(disk):
40 e8ae0c20 Michael Hanselmann
  return "/sys/block/%s/device/state" % disk
41 cec9845c Michael Hanselmann
42 cec9845c Michael Hanselmann
43 5d640672 Michael Hanselmann
def _GetGenericAddParameters():
44 1d693311 Michael Hanselmann
  params = ['-B', '%s=%s' % (constants.BE_MEMORY, qa_config.get('mem'))]
45 1d693311 Michael Hanselmann
  for idx, size in enumerate(qa_config.get('disk')):
46 1d693311 Michael Hanselmann
    params.extend(["--disk", "%s:size=%s" % (idx, size)])
47 1d693311 Michael Hanselmann
  return params
48 5d640672 Michael Hanselmann
49 5d640672 Michael Hanselmann
50 113b8d89 Michael Hanselmann
def _DiskTest(node, disk_template):
51 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
52 cec9845c Michael Hanselmann
53 cec9845c Michael Hanselmann
  instance = qa_config.AcquireInstance()
54 cec9845c Michael Hanselmann
  try:
55 5d640672 Michael Hanselmann
    cmd = (['gnt-instance', 'add',
56 5d640672 Michael Hanselmann
            '--os-type=%s' % qa_config.get('os'),
57 113b8d89 Michael Hanselmann
            '--disk-template=%s' % disk_template,
58 113b8d89 Michael Hanselmann
            '--node=%s' % node] +
59 5d640672 Michael Hanselmann
           _GetGenericAddParameters())
60 cec9845c Michael Hanselmann
    cmd.append(instance['name'])
61 cec9845c Michael Hanselmann
62 cec9845c Michael Hanselmann
    AssertEqual(StartSSH(master['primary'],
63 cec9845c Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
64 cec9845c Michael Hanselmann
    return instance
65 cec9845c Michael Hanselmann
  except:
66 cec9845c Michael Hanselmann
    qa_config.ReleaseInstance(instance)
67 cec9845c Michael Hanselmann
    raise
68 cec9845c Michael Hanselmann
69 cec9845c Michael Hanselmann
70 cec9845c Michael Hanselmann
def TestInstanceAddWithPlainDisk(node):
71 cec9845c Michael Hanselmann
  """gnt-instance add -t plain"""
72 113b8d89 Michael Hanselmann
  return _DiskTest(node['primary'], 'plain')
73 cec9845c Michael Hanselmann
74 cec9845c Michael Hanselmann
75 7d7609a3 Michael Hanselmann
def TestInstanceAddWithDrbdDisk(node, node2):
76 7d7609a3 Michael Hanselmann
  """gnt-instance add -t drbd"""
77 7d7609a3 Michael Hanselmann
  return _DiskTest("%s:%s" % (node['primary'], node2['primary']),
78 7d7609a3 Michael Hanselmann
                   'drbd')
79 7d7609a3 Michael Hanselmann
80 7d7609a3 Michael Hanselmann
81 cec9845c Michael Hanselmann
def TestInstanceRemove(instance):
82 cec9845c Michael Hanselmann
  """gnt-instance remove"""
83 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
84 cec9845c Michael Hanselmann
85 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'remove', '-f', instance['name']]
86 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
87 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
88 cec9845c Michael Hanselmann
89 cec9845c Michael Hanselmann
  qa_config.ReleaseInstance(instance)
90 cec9845c Michael Hanselmann
91 cec9845c Michael Hanselmann
92 cec9845c Michael Hanselmann
def TestInstanceStartup(instance):
93 cec9845c Michael Hanselmann
  """gnt-instance startup"""
94 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
95 cec9845c Michael Hanselmann
96 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'startup', instance['name']]
97 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
98 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
99 cec9845c Michael Hanselmann
100 cec9845c Michael Hanselmann
101 cec9845c Michael Hanselmann
def TestInstanceShutdown(instance):
102 cec9845c Michael Hanselmann
  """gnt-instance shutdown"""
103 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
104 cec9845c Michael Hanselmann
105 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'shutdown', instance['name']]
106 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
107 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
108 cec9845c Michael Hanselmann
109 cec9845c Michael Hanselmann
110 8a4e8898 Michael Hanselmann
def TestInstanceReboot(instance):
111 8a4e8898 Michael Hanselmann
  """gnt-instance reboot"""
112 8a4e8898 Michael Hanselmann
  master = qa_config.GetMasterNode()
113 8a4e8898 Michael Hanselmann
114 1d103c02 Iustin Pop
  options = qa_config.get('options', {})
115 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
116 1d103c02 Iustin Pop
117 1d103c02 Iustin Pop
  for rtype in reboot_types:
118 1d103c02 Iustin Pop
    cmd = ['gnt-instance', 'reboot', '--type=%s' % rtype, instance['name']]
119 8a4e8898 Michael Hanselmann
    AssertEqual(StartSSH(master['primary'],
120 8a4e8898 Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
121 8a4e8898 Michael Hanselmann
122 8a4e8898 Michael Hanselmann
123 283f9d4c Michael Hanselmann
def TestInstanceReinstall(instance):
124 283f9d4c Michael Hanselmann
  """gnt-instance reinstall"""
125 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
126 283f9d4c Michael Hanselmann
127 283f9d4c Michael Hanselmann
  cmd = ['gnt-instance', 'reinstall', '-f', instance['name']]
128 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
129 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
130 283f9d4c Michael Hanselmann
131 283f9d4c Michael Hanselmann
132 18337ca9 Iustin Pop
def TestInstanceRename(instance):
133 18337ca9 Iustin Pop
  """gnt-instance rename"""
134 18337ca9 Iustin Pop
  master = qa_config.GetMasterNode()
135 18337ca9 Iustin Pop
136 18337ca9 Iustin Pop
  rename_source = instance['name']
137 18337ca9 Iustin Pop
  rename_target = qa_config.get('rename', None)
138 18337ca9 Iustin Pop
  if rename_target is None:
139 18337ca9 Iustin Pop
    print qa_utils.FormatError('"rename" entry is missing')
140 18337ca9 Iustin Pop
    return
141 18337ca9 Iustin Pop
142 18337ca9 Iustin Pop
  for name1, name2 in [(rename_source, rename_target),
143 18337ca9 Iustin Pop
                       (rename_target, rename_source)]:
144 18337ca9 Iustin Pop
    cmd = ['gnt-instance', 'rename', name1, name2]
145 18337ca9 Iustin Pop
    AssertEqual(StartSSH(master['primary'],
146 18337ca9 Iustin Pop
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
147 18337ca9 Iustin Pop
148 18337ca9 Iustin Pop
149 cec9845c Michael Hanselmann
def TestInstanceFailover(instance):
150 cec9845c Michael Hanselmann
  """gnt-instance failover"""
151 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
152 cec9845c Michael Hanselmann
153 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'failover', '--force', instance['name']]
154 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
155 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
156 cec9845c Michael Hanselmann
157 76f59a32 Michael Hanselmann
  # ... and back
158 76f59a32 Michael Hanselmann
  cmd = ['gnt-instance', 'failover', '--force', instance['name']]
159 76f59a32 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
160 76f59a32 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
161 76f59a32 Michael Hanselmann
162 cec9845c Michael Hanselmann
163 cec9845c Michael Hanselmann
def TestInstanceInfo(instance):
164 cec9845c Michael Hanselmann
  """gnt-instance info"""
165 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
166 cec9845c Michael Hanselmann
167 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'info', instance['name']]
168 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
169 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
170 5d640672 Michael Hanselmann
171 5d640672 Michael Hanselmann
172 c0f74c55 Iustin Pop
def TestInstanceModify(instance):
173 c0f74c55 Iustin Pop
  """gnt-instance modify"""
174 c0f74c55 Iustin Pop
  master = qa_config.GetMasterNode()
175 c0f74c55 Iustin Pop
176 1d693311 Michael Hanselmann
  # Assume /sbin/init exists on all systems
177 1d693311 Michael Hanselmann
  test_kernel = "/sbin/init"
178 1d693311 Michael Hanselmann
  test_initrd = test_kernel
179 1d693311 Michael Hanselmann
180 c0f74c55 Iustin Pop
  orig_memory = qa_config.get('mem')
181 c0f74c55 Iustin Pop
  orig_bridge = qa_config.get('bridge', 'xen-br0')
182 c0f74c55 Iustin Pop
  args = [
183 1d693311 Michael Hanselmann
    ["-B", "%s=128" % constants.BE_MEMORY],
184 1d693311 Michael Hanselmann
    ["-B", "%s=%s" % (constants.BE_MEMORY, orig_memory)],
185 1d693311 Michael Hanselmann
    ["-B", "%s=2" % constants.BE_VCPUS],
186 1d693311 Michael Hanselmann
    ["-B", "%s=1" % constants.BE_VCPUS],
187 1d693311 Michael Hanselmann
    ["-B", "%s=%s" % (constants.BE_VCPUS, constants.VALUE_DEFAULT)],
188 1d693311 Michael Hanselmann
189 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_KERNEL_PATH, test_kernel)],
190 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_KERNEL_PATH, constants.VALUE_DEFAULT)],
191 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_INITRD_PATH, test_initrd)],
192 5645d16b Iustin Pop
    ["-H", "no_%s" % (constants.HV_INITRD_PATH, )],
193 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_INITRD_PATH, constants.VALUE_DEFAULT)],
194 1d693311 Michael Hanselmann
195 1d693311 Michael Hanselmann
    # TODO: bridge tests
196 1d693311 Michael Hanselmann
    #["--bridge", "xen-br1"],
197 1d693311 Michael Hanselmann
    #["--bridge", orig_bridge],
198 1d693311 Michael Hanselmann
199 1d693311 Michael Hanselmann
    # TODO: Do these tests only with xen-hvm
200 1d693311 Michael Hanselmann
    #["-H", "%s=acn" % constants.HV_BOOT_ORDER],
201 1d693311 Michael Hanselmann
    #["-H", "%s=%s" % (constants.HV_BOOT_ORDER, constants.VALUE_DEFAULT)],
202 c0f74c55 Iustin Pop
    ]
203 c0f74c55 Iustin Pop
  for alist in args:
204 c0f74c55 Iustin Pop
    cmd = ['gnt-instance', 'modify'] + alist + [instance['name']]
205 c0f74c55 Iustin Pop
    AssertEqual(StartSSH(master['primary'],
206 c0f74c55 Iustin Pop
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
207 c0f74c55 Iustin Pop
208 c0f74c55 Iustin Pop
  # check no-modify
209 c0f74c55 Iustin Pop
  cmd = ['gnt-instance', 'modify', instance['name']]
210 c0f74c55 Iustin Pop
  AssertNotEqual(StartSSH(master['primary'],
211 c0f74c55 Iustin Pop
                          utils.ShellQuoteArgs(cmd)).wait(), 0)
212 c0f74c55 Iustin Pop
213 c0f74c55 Iustin Pop
214 7f69aabb Iustin Pop
def TestInstanceConvertDisk(instance, snode):
215 7f69aabb Iustin Pop
  """gnt-instance modify -t"""
216 7f69aabb Iustin Pop
  master = qa_config.GetMasterNode()
217 7f69aabb Iustin Pop
  cmd = ['gnt-instance', 'modify', '-t', 'plain', instance['name']]
218 7f69aabb Iustin Pop
  AssertEqual(StartSSH(master['primary'],
219 7f69aabb Iustin Pop
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
220 b73302c4 Guido Trotter
  cmd = ['gnt-instance', 'modify', '-t', 'drbd', '-n', snode['primary'],
221 b73302c4 Guido Trotter
         instance['name']]
222 7f69aabb Iustin Pop
  AssertEqual(StartSSH(master['primary'],
223 7f69aabb Iustin Pop
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
224 7f69aabb Iustin Pop
225 7f69aabb Iustin Pop
226 283f9d4c Michael Hanselmann
def TestInstanceList():
227 283f9d4c Michael Hanselmann
  """gnt-instance list"""
228 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
229 283f9d4c Michael Hanselmann
230 283f9d4c Michael Hanselmann
  cmd = ['gnt-instance', 'list']
231 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
232 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
233 283f9d4c Michael Hanselmann
234 283f9d4c Michael Hanselmann
235 4379b1fa Michael Hanselmann
def TestInstanceConsole(instance):
236 4379b1fa Michael Hanselmann
  """gnt-instance console"""
237 4379b1fa Michael Hanselmann
  master = qa_config.GetMasterNode()
238 4379b1fa Michael Hanselmann
239 4379b1fa Michael Hanselmann
  cmd = ['gnt-instance', 'console', '--show-cmd', instance['name']]
240 4379b1fa Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
241 4379b1fa Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
242 4379b1fa Michael Hanselmann
243 4379b1fa Michael Hanselmann
244 7910e7a5 Michael Hanselmann
def TestReplaceDisks(instance, pnode, snode, othernode):
245 7910e7a5 Michael Hanselmann
  """gnt-instance replace-disks"""
246 7910e7a5 Michael Hanselmann
  master = qa_config.GetMasterNode()
247 7910e7a5 Michael Hanselmann
248 7910e7a5 Michael Hanselmann
  def buildcmd(args):
249 7910e7a5 Michael Hanselmann
    cmd = ['gnt-instance', 'replace-disks']
250 7910e7a5 Michael Hanselmann
    cmd.extend(args)
251 7910e7a5 Michael Hanselmann
    cmd.append(instance["name"])
252 7910e7a5 Michael Hanselmann
    return cmd
253 7910e7a5 Michael Hanselmann
254 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["-p"])
255 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
256 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
257 7910e7a5 Michael Hanselmann
258 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["-s"])
259 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
260 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
261 7910e7a5 Michael Hanselmann
262 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["--new-secondary=%s" % othernode["primary"]])
263 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
264 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
265 7910e7a5 Michael Hanselmann
266 7910e7a5 Michael Hanselmann
  # Restore
267 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["--new-secondary=%s" % snode["primary"]])
268 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
269 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
270 7910e7a5 Michael Hanselmann
271 7910e7a5 Michael Hanselmann
272 5d640672 Michael Hanselmann
def TestInstanceExport(instance, node):
273 5d640672 Michael Hanselmann
  """gnt-backup export"""
274 5d640672 Michael Hanselmann
  master = qa_config.GetMasterNode()
275 5d640672 Michael Hanselmann
276 5d640672 Michael Hanselmann
  cmd = ['gnt-backup', 'export', '-n', node['primary'], instance['name']]
277 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
278 5d640672 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
279 5d640672 Michael Hanselmann
280 5d640672 Michael Hanselmann
  return qa_utils.ResolveInstanceName(instance)
281 5d640672 Michael Hanselmann
282 5d640672 Michael Hanselmann
283 8d8d650c Michael Hanselmann
def TestInstanceExportWithRemove(instance, node):
284 8d8d650c Michael Hanselmann
  """gnt-backup export --remove-instance"""
285 8d8d650c Michael Hanselmann
  master = qa_config.GetMasterNode()
286 8d8d650c Michael Hanselmann
287 8d8d650c Michael Hanselmann
  cmd = ['gnt-backup', 'export', '-n', node['primary'], "--remove-instance",
288 8d8d650c Michael Hanselmann
         instance['name']]
289 8d8d650c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
290 8d8d650c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
291 8d8d650c Michael Hanselmann
292 8d8d650c Michael Hanselmann
293 5d640672 Michael Hanselmann
def TestInstanceImport(node, newinst, expnode, name):
294 5d640672 Michael Hanselmann
  """gnt-backup import"""
295 5d640672 Michael Hanselmann
  master = qa_config.GetMasterNode()
296 5d640672 Michael Hanselmann
297 5d640672 Michael Hanselmann
  cmd = (['gnt-backup', 'import',
298 5d640672 Michael Hanselmann
          '--disk-template=plain',
299 5d640672 Michael Hanselmann
          '--no-ip-check',
300 53a8da8e Iustin Pop
          '--net', '0:mac=generate',
301 5d640672 Michael Hanselmann
          '--src-node=%s' % expnode['primary'],
302 5d640672 Michael Hanselmann
          '--src-dir=%s/%s' % (constants.EXPORT_DIR, name),
303 5d640672 Michael Hanselmann
          '--node=%s' % node['primary']] +
304 5d640672 Michael Hanselmann
         _GetGenericAddParameters())
305 5d640672 Michael Hanselmann
  cmd.append(newinst['name'])
306 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
307 5d640672 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
308 283f9d4c Michael Hanselmann
309 283f9d4c Michael Hanselmann
310 283f9d4c Michael Hanselmann
def TestBackupList(expnode):
311 283f9d4c Michael Hanselmann
  """gnt-backup list"""
312 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
313 283f9d4c Michael Hanselmann
314 1e020d1b Michael Hanselmann
  cmd = ['gnt-backup', 'list', '--node=%s' % expnode['primary']]
315 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
316 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
317 e8ae0c20 Michael Hanselmann
318 e8ae0c20 Michael Hanselmann
319 e8ae0c20 Michael Hanselmann
def _TestInstanceDiskFailure(instance, node, node2, onmaster):
320 e8ae0c20 Michael Hanselmann
  """Testing disk failure."""
321 e8ae0c20 Michael Hanselmann
  master = qa_config.GetMasterNode()
322 e8ae0c20 Michael Hanselmann
  sq = utils.ShellQuoteArgs
323 e8ae0c20 Michael Hanselmann
324 e8ae0c20 Michael Hanselmann
  instance_full = qa_utils.ResolveInstanceName(instance)
325 e8ae0c20 Michael Hanselmann
  node_full = qa_utils.ResolveNodeName(node)
326 e8ae0c20 Michael Hanselmann
  node2_full = qa_utils.ResolveNodeName(node2)
327 e8ae0c20 Michael Hanselmann
328 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting physical disk names")
329 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-node', 'volumes', '--separator=|', '--no-headers',
330 e8ae0c20 Michael Hanselmann
         '--output=node,phys,instance',
331 e8ae0c20 Michael Hanselmann
         node['primary'], node2['primary']]
332 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
333 e8ae0c20 Michael Hanselmann
334 e8ae0c20 Michael Hanselmann
  # Get physical disk names
335 e8ae0c20 Michael Hanselmann
  re_disk = re.compile(r'^/dev/([a-z]+)\d+$')
336 e8ae0c20 Michael Hanselmann
  node2disk = {}
337 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
338 e8ae0c20 Michael Hanselmann
    (node_name, phys, inst) = line.split('|')
339 e8ae0c20 Michael Hanselmann
    if inst == instance_full:
340 e8ae0c20 Michael Hanselmann
      if node_name not in node2disk:
341 e8ae0c20 Michael Hanselmann
        node2disk[node_name] = []
342 e8ae0c20 Michael Hanselmann
343 e8ae0c20 Michael Hanselmann
      m = re_disk.match(phys)
344 e8ae0c20 Michael Hanselmann
      if not m:
345 e8ae0c20 Michael Hanselmann
        raise qa_error.Error("Unknown disk name format: %s" % disk)
346 e8ae0c20 Michael Hanselmann
347 e8ae0c20 Michael Hanselmann
      name = m.group(1)
348 e8ae0c20 Michael Hanselmann
      if name not in node2disk[node_name]:
349 e8ae0c20 Michael Hanselmann
        node2disk[node_name].append(name)
350 e8ae0c20 Michael Hanselmann
351 e8ae0c20 Michael Hanselmann
  if [node2_full, node_full][int(onmaster)] not in node2disk:
352 f4bc1f2c Michael Hanselmann
    raise qa_error.Error("Couldn't find physical disks used on"
353 f4bc1f2c Michael Hanselmann
                         " %s node" % ["secondary", "master"][int(onmaster)])
354 e8ae0c20 Michael Hanselmann
355 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Checking whether nodes have ability to stop"
356 29df1f02 Michael Hanselmann
                            " disks")
357 e8ae0c20 Michael Hanselmann
  for node_name, disks in node2disk.iteritems():
358 e8ae0c20 Michael Hanselmann
    cmds = []
359 e8ae0c20 Michael Hanselmann
    for disk in disks:
360 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["test", "-f", _GetDiskStatePath(disk)]))
361 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH(node_name, ' && '.join(cmds)).wait(), 0)
362 e8ae0c20 Michael Hanselmann
363 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting device paths")
364 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'activate-disks', instance['name']]
365 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
366 e8ae0c20 Michael Hanselmann
  devpath = []
367 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
368 e8ae0c20 Michael Hanselmann
    (_, _, tmpdevpath) = line.split(':')
369 e8ae0c20 Michael Hanselmann
    devpath.append(tmpdevpath)
370 29df1f02 Michael Hanselmann
  print devpath
371 e8ae0c20 Michael Hanselmann
372 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting drbd device paths")
373 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'info', instance['name']]
374 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
375 29df1f02 Michael Hanselmann
  pattern = (r'\s+-\s+sd[a-z]+,\s+type:\s+drbd8?,\s+.*$'
376 e8ae0c20 Michael Hanselmann
             r'\s+primary:\s+(/dev/drbd\d+)\s+')
377 e8ae0c20 Michael Hanselmann
  drbddevs = re.findall(pattern, output, re.M)
378 29df1f02 Michael Hanselmann
  print drbddevs
379 e8ae0c20 Michael Hanselmann
380 e8ae0c20 Michael Hanselmann
  halted_disks = []
381 e8ae0c20 Michael Hanselmann
  try:
382 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Deactivating disks")
383 b1ffe1eb Michael Hanselmann
    cmds = []
384 b1ffe1eb Michael Hanselmann
    for name in node2disk[[node2_full, node_full][int(onmaster)]]:
385 b1ffe1eb Michael Hanselmann
      halted_disks.append(name)
386 b1ffe1eb Michael Hanselmann
      cmds.append(sq(["echo", "offline"]) + " >%s" % _GetDiskStatePath(name))
387 b1ffe1eb Michael Hanselmann
    AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
388 b1ffe1eb Michael Hanselmann
                         ' && '.join(cmds)).wait(), 0)
389 b1ffe1eb Michael Hanselmann
390 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Write to disks and give some time to notice"
391 29df1f02 Michael Hanselmann
                              " to notice the problem")
392 e8ae0c20 Michael Hanselmann
    cmds = []
393 e8ae0c20 Michael Hanselmann
    for disk in devpath:
394 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["dd", "count=1", "bs=512", "conv=notrunc",
395 e8ae0c20 Michael Hanselmann
                      "if=%s" % disk, "of=%s" % disk]))
396 e8ae0c20 Michael Hanselmann
    for _ in (0, 1, 2):
397 e8ae0c20 Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], ' && '.join(cmds)).wait(), 0)
398 e8ae0c20 Michael Hanselmann
      time.sleep(3)
399 e8ae0c20 Michael Hanselmann
400 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Debugging info")
401 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
402 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'show']
403 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0)
404 b1ffe1eb Michael Hanselmann
405 e8ae0c20 Michael Hanselmann
    cmd = ['gnt-instance', 'info', instance['name']]
406 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
407 e8ae0c20 Michael Hanselmann
408 e8ae0c20 Michael Hanselmann
  finally:
409 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Activating disks again")
410 e8ae0c20 Michael Hanselmann
    cmds = []
411 e8ae0c20 Michael Hanselmann
    for name in halted_disks:
412 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["echo", "running"]) + " >%s" % _GetDiskStatePath(name))
413 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
414 e8ae0c20 Michael Hanselmann
                         '; '.join(cmds)).wait(), 0)
415 e8ae0c20 Michael Hanselmann
416 b1ffe1eb Michael Hanselmann
  if onmaster:
417 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
418 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'detach']
419 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0)
420 b1ffe1eb Michael Hanselmann
  else:
421 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
422 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'disconnect']
423 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node2['primary'], sq(cmd)).wait(), 0)
424 b1ffe1eb Michael Hanselmann
425 29df1f02 Michael Hanselmann
  # TODO
426 29df1f02 Michael Hanselmann
  #cmd = ['vgs']
427 29df1f02 Michael Hanselmann
  #AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
428 29df1f02 Michael Hanselmann
  #                     sq(cmd)).wait(), 0)
429 b1ffe1eb Michael Hanselmann
430 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Making sure disks are up again")
431 29df1f02 Michael Hanselmann
  cmd = ['gnt-instance', 'replace-disks', instance['name']]
432 29df1f02 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
433 29df1f02 Michael Hanselmann
434 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Restarting instance")
435 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'shutdown', instance['name']]
436 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
437 e8ae0c20 Michael Hanselmann
438 b1ffe1eb Michael Hanselmann
  cmd = ['gnt-instance', 'startup', instance['name']]
439 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
440 e8ae0c20 Michael Hanselmann
441 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-cluster', 'verify']
442 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
443 e8ae0c20 Michael Hanselmann
444 e8ae0c20 Michael Hanselmann
445 e8ae0c20 Michael Hanselmann
def TestInstanceMasterDiskFailure(instance, node, node2):
446 e8ae0c20 Michael Hanselmann
  """Testing disk failure on master node."""
447 f4bc1f2c Michael Hanselmann
  print qa_utils.FormatError("Disk failure on primary node cannot be"
448 f4bc1f2c Michael Hanselmann
                             " tested due to potential crashes.")
449 e8ae0c20 Michael Hanselmann
  # The following can cause crashes, thus it's disabled until fixed
450 dfe11bad Michael Hanselmann
  #return _TestInstanceDiskFailure(instance, node, node2, True)
451 e8ae0c20 Michael Hanselmann
452 e8ae0c20 Michael Hanselmann
453 e8ae0c20 Michael Hanselmann
def TestInstanceSecondaryDiskFailure(instance, node, node2):
454 e8ae0c20 Michael Hanselmann
  """Testing disk failure on secondary node."""
455 e8ae0c20 Michael Hanselmann
  return _TestInstanceDiskFailure(instance, node, node2, False)