Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ 1abbbbe2

History | View | Annotate | Download (12 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 5d640672 Michael Hanselmann
  return ['--os-size=%s' % qa_config.get('os-size'),
45 5d640672 Michael Hanselmann
          '--swap-size=%s' % qa_config.get('swap-size'),
46 5d640672 Michael Hanselmann
          '--memory=%s' % qa_config.get('mem')]
47 5d640672 Michael Hanselmann
48 5d640672 Michael Hanselmann
49 113b8d89 Michael Hanselmann
def _DiskTest(node, disk_template):
50 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
51 cec9845c Michael Hanselmann
52 cec9845c Michael Hanselmann
  instance = qa_config.AcquireInstance()
53 cec9845c Michael Hanselmann
  try:
54 5d640672 Michael Hanselmann
    cmd = (['gnt-instance', 'add',
55 5d640672 Michael Hanselmann
            '--os-type=%s' % qa_config.get('os'),
56 113b8d89 Michael Hanselmann
            '--disk-template=%s' % disk_template,
57 113b8d89 Michael Hanselmann
            '--node=%s' % node] +
58 5d640672 Michael Hanselmann
           _GetGenericAddParameters())
59 cec9845c Michael Hanselmann
    cmd.append(instance['name'])
60 cec9845c Michael Hanselmann
61 cec9845c Michael Hanselmann
    AssertEqual(StartSSH(master['primary'],
62 cec9845c Michael Hanselmann
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
63 cec9845c Michael Hanselmann
    return instance
64 cec9845c Michael Hanselmann
  except:
65 cec9845c Michael Hanselmann
    qa_config.ReleaseInstance(instance)
66 cec9845c Michael Hanselmann
    raise
67 cec9845c Michael Hanselmann
68 cec9845c Michael Hanselmann
69 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-add-plain-disk')
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 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-add-local-mirror-disk')
76 cec9845c Michael Hanselmann
def TestInstanceAddWithLocalMirrorDisk(node):
77 cec9845c Michael Hanselmann
  """gnt-instance add -t local_raid1"""
78 113b8d89 Michael Hanselmann
  return _DiskTest(node['primary'], 'local_raid1')
79 cec9845c Michael Hanselmann
80 cec9845c Michael Hanselmann
81 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-add-remote-raid-disk')
82 cec9845c Michael Hanselmann
def TestInstanceAddWithRemoteRaidDisk(node, node2):
83 cec9845c Michael Hanselmann
  """gnt-instance add -t remote_raid1"""
84 113b8d89 Michael Hanselmann
  return _DiskTest("%s:%s" % (node['primary'], node2['primary']),
85 113b8d89 Michael Hanselmann
                   'remote_raid1')
86 cec9845c Michael Hanselmann
87 cec9845c Michael Hanselmann
88 7d7609a3 Michael Hanselmann
@qa_utils.DefineHook('instance-add-drbd-disk')
89 7d7609a3 Michael Hanselmann
def TestInstanceAddWithDrbdDisk(node, node2):
90 7d7609a3 Michael Hanselmann
  """gnt-instance add -t drbd"""
91 7d7609a3 Michael Hanselmann
  return _DiskTest("%s:%s" % (node['primary'], node2['primary']),
92 7d7609a3 Michael Hanselmann
                   'drbd')
93 7d7609a3 Michael Hanselmann
94 7d7609a3 Michael Hanselmann
95 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-remove')
96 cec9845c Michael Hanselmann
def TestInstanceRemove(instance):
97 cec9845c Michael Hanselmann
  """gnt-instance remove"""
98 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
99 cec9845c Michael Hanselmann
100 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'remove', '-f', instance['name']]
101 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
102 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
103 cec9845c Michael Hanselmann
104 cec9845c Michael Hanselmann
  qa_config.ReleaseInstance(instance)
105 cec9845c Michael Hanselmann
106 cec9845c Michael Hanselmann
107 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-startup')
108 cec9845c Michael Hanselmann
def TestInstanceStartup(instance):
109 cec9845c Michael Hanselmann
  """gnt-instance startup"""
110 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
111 cec9845c Michael Hanselmann
112 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'startup', instance['name']]
113 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
114 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
115 cec9845c Michael Hanselmann
116 cec9845c Michael Hanselmann
117 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-shutdown')
118 cec9845c Michael Hanselmann
def TestInstanceShutdown(instance):
119 cec9845c Michael Hanselmann
  """gnt-instance shutdown"""
120 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
121 cec9845c Michael Hanselmann
122 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'shutdown', instance['name']]
123 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
124 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
125 cec9845c Michael Hanselmann
126 cec9845c Michael Hanselmann
127 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-reinstall')
128 283f9d4c Michael Hanselmann
def TestInstanceReinstall(instance):
129 283f9d4c Michael Hanselmann
  """gnt-instance reinstall"""
130 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
131 283f9d4c Michael Hanselmann
132 283f9d4c Michael Hanselmann
  cmd = ['gnt-instance', 'reinstall', '-f', instance['name']]
133 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
134 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
135 283f9d4c Michael Hanselmann
136 283f9d4c Michael Hanselmann
137 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-failover')
138 cec9845c Michael Hanselmann
def TestInstanceFailover(instance):
139 cec9845c Michael Hanselmann
  """gnt-instance failover"""
140 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
141 cec9845c Michael Hanselmann
142 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'failover', '--force', instance['name']]
143 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
144 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
145 cec9845c Michael Hanselmann
146 cec9845c Michael Hanselmann
147 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-info')
148 cec9845c Michael Hanselmann
def TestInstanceInfo(instance):
149 cec9845c Michael Hanselmann
  """gnt-instance info"""
150 cec9845c Michael Hanselmann
  master = qa_config.GetMasterNode()
151 cec9845c Michael Hanselmann
152 cec9845c Michael Hanselmann
  cmd = ['gnt-instance', 'info', instance['name']]
153 cec9845c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
154 cec9845c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
155 5d640672 Michael Hanselmann
156 5d640672 Michael Hanselmann
157 c0f74c55 Iustin Pop
@qa_utils.DefineHook('instance-modify')
158 c0f74c55 Iustin Pop
def TestInstanceModify(instance):
159 c0f74c55 Iustin Pop
  """gnt-instance modify"""
160 c0f74c55 Iustin Pop
  master = qa_config.GetMasterNode()
161 c0f74c55 Iustin Pop
162 c0f74c55 Iustin Pop
  orig_memory = qa_config.get('mem')
163 c0f74c55 Iustin Pop
  orig_bridge = qa_config.get('bridge', 'xen-br0')
164 c0f74c55 Iustin Pop
  args = [
165 c0f74c55 Iustin Pop
    ["--memory", "128"],
166 c0f74c55 Iustin Pop
    ["--memory", str(orig_memory)],
167 c0f74c55 Iustin Pop
    ["--cpu", "2"],
168 c0f74c55 Iustin Pop
    ["--cpu", "1"],
169 c0f74c55 Iustin Pop
    ["--bridge", "xen-br1"],
170 c0f74c55 Iustin Pop
    ["--bridge", orig_bridge],
171 c0f74c55 Iustin Pop
    ["--kernel", "/dev/null"],
172 c0f74c55 Iustin Pop
    ["--kernel", "default"],
173 c0f74c55 Iustin Pop
    ["--initrd", "/dev/null"],
174 c0f74c55 Iustin Pop
    ["--initrd", "none"],
175 c0f74c55 Iustin Pop
    ["--initrd", "default"],
176 c0f74c55 Iustin Pop
    ["--hvm-boot-order", "acn"],
177 c0f74c55 Iustin Pop
    ["--hvm-boot-order", "default"],
178 c0f74c55 Iustin Pop
    ]
179 c0f74c55 Iustin Pop
  for alist in args:
180 c0f74c55 Iustin Pop
    cmd = ['gnt-instance', 'modify'] + alist + [instance['name']]
181 c0f74c55 Iustin Pop
    AssertEqual(StartSSH(master['primary'],
182 c0f74c55 Iustin Pop
                         utils.ShellQuoteArgs(cmd)).wait(), 0)
183 c0f74c55 Iustin Pop
184 c0f74c55 Iustin Pop
  # check no-modify
185 c0f74c55 Iustin Pop
  cmd = ['gnt-instance', 'modify', instance['name']]
186 c0f74c55 Iustin Pop
  AssertNotEqual(StartSSH(master['primary'],
187 c0f74c55 Iustin Pop
                          utils.ShellQuoteArgs(cmd)).wait(), 0)
188 c0f74c55 Iustin Pop
189 c0f74c55 Iustin Pop
190 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('instance-list')
191 283f9d4c Michael Hanselmann
def TestInstanceList():
192 283f9d4c Michael Hanselmann
  """gnt-instance list"""
193 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
194 283f9d4c Michael Hanselmann
195 283f9d4c Michael Hanselmann
  cmd = ['gnt-instance', 'list']
196 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
197 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
198 283f9d4c Michael Hanselmann
199 283f9d4c Michael Hanselmann
200 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('backup-export')
201 5d640672 Michael Hanselmann
def TestInstanceExport(instance, node):
202 5d640672 Michael Hanselmann
  """gnt-backup export"""
203 5d640672 Michael Hanselmann
  master = qa_config.GetMasterNode()
204 5d640672 Michael Hanselmann
205 5d640672 Michael Hanselmann
  cmd = ['gnt-backup', 'export', '-n', node['primary'], instance['name']]
206 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
207 5d640672 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
208 5d640672 Michael Hanselmann
209 5d640672 Michael Hanselmann
  return qa_utils.ResolveInstanceName(instance)
210 5d640672 Michael Hanselmann
211 5d640672 Michael Hanselmann
212 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('backup-import')
213 5d640672 Michael Hanselmann
def TestInstanceImport(node, newinst, expnode, name):
214 5d640672 Michael Hanselmann
  """gnt-backup import"""
215 5d640672 Michael Hanselmann
  master = qa_config.GetMasterNode()
216 5d640672 Michael Hanselmann
217 5d640672 Michael Hanselmann
  cmd = (['gnt-backup', 'import',
218 5d640672 Michael Hanselmann
          '--disk-template=plain',
219 5d640672 Michael Hanselmann
          '--no-ip-check',
220 5d640672 Michael Hanselmann
          '--src-node=%s' % expnode['primary'],
221 5d640672 Michael Hanselmann
          '--src-dir=%s/%s' % (constants.EXPORT_DIR, name),
222 5d640672 Michael Hanselmann
          '--node=%s' % node['primary']] +
223 5d640672 Michael Hanselmann
         _GetGenericAddParameters())
224 5d640672 Michael Hanselmann
  cmd.append(newinst['name'])
225 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
226 5d640672 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
227 283f9d4c Michael Hanselmann
228 283f9d4c Michael Hanselmann
229 e42b5307 Michael Hanselmann
@qa_utils.DefineHook('backup-list')
230 283f9d4c Michael Hanselmann
def TestBackupList(expnode):
231 283f9d4c Michael Hanselmann
  """gnt-backup list"""
232 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
233 283f9d4c Michael Hanselmann
234 1e020d1b Michael Hanselmann
  cmd = ['gnt-backup', 'list', '--node=%s' % expnode['primary']]
235 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
236 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
237 e8ae0c20 Michael Hanselmann
238 e8ae0c20 Michael Hanselmann
239 e8ae0c20 Michael Hanselmann
def _TestInstanceDiskFailure(instance, node, node2, onmaster):
240 e8ae0c20 Michael Hanselmann
  """Testing disk failure."""
241 e8ae0c20 Michael Hanselmann
  master = qa_config.GetMasterNode()
242 e8ae0c20 Michael Hanselmann
  sq = utils.ShellQuoteArgs
243 e8ae0c20 Michael Hanselmann
244 e8ae0c20 Michael Hanselmann
  instance_full = qa_utils.ResolveInstanceName(instance)
245 e8ae0c20 Michael Hanselmann
  node_full = qa_utils.ResolveNodeName(node)
246 e8ae0c20 Michael Hanselmann
  node2_full = qa_utils.ResolveNodeName(node2)
247 e8ae0c20 Michael Hanselmann
248 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting physical disk names")
249 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-node', 'volumes', '--separator=|', '--no-headers',
250 e8ae0c20 Michael Hanselmann
         '--output=node,phys,instance',
251 e8ae0c20 Michael Hanselmann
         node['primary'], node2['primary']]
252 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
253 e8ae0c20 Michael Hanselmann
254 e8ae0c20 Michael Hanselmann
  # Get physical disk names
255 e8ae0c20 Michael Hanselmann
  re_disk = re.compile(r'^/dev/([a-z]+)\d+$')
256 e8ae0c20 Michael Hanselmann
  node2disk = {}
257 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
258 e8ae0c20 Michael Hanselmann
    (node_name, phys, inst) = line.split('|')
259 e8ae0c20 Michael Hanselmann
    if inst == instance_full:
260 e8ae0c20 Michael Hanselmann
      if node_name not in node2disk:
261 e8ae0c20 Michael Hanselmann
        node2disk[node_name] = []
262 e8ae0c20 Michael Hanselmann
263 e8ae0c20 Michael Hanselmann
      m = re_disk.match(phys)
264 e8ae0c20 Michael Hanselmann
      if not m:
265 e8ae0c20 Michael Hanselmann
        raise qa_error.Error("Unknown disk name format: %s" % disk)
266 e8ae0c20 Michael Hanselmann
267 e8ae0c20 Michael Hanselmann
      name = m.group(1)
268 e8ae0c20 Michael Hanselmann
      if name not in node2disk[node_name]:
269 e8ae0c20 Michael Hanselmann
        node2disk[node_name].append(name)
270 e8ae0c20 Michael Hanselmann
271 e8ae0c20 Michael Hanselmann
  if [node2_full, node_full][int(onmaster)] not in node2disk:
272 f4bc1f2c Michael Hanselmann
    raise qa_error.Error("Couldn't find physical disks used on"
273 f4bc1f2c Michael Hanselmann
                         " %s node" % ["secondary", "master"][int(onmaster)])
274 e8ae0c20 Michael Hanselmann
275 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Checking whether nodes have ability to stop"
276 29df1f02 Michael Hanselmann
                            " disks")
277 e8ae0c20 Michael Hanselmann
  for node_name, disks in node2disk.iteritems():
278 e8ae0c20 Michael Hanselmann
    cmds = []
279 e8ae0c20 Michael Hanselmann
    for disk in disks:
280 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["test", "-f", _GetDiskStatePath(disk)]))
281 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH(node_name, ' && '.join(cmds)).wait(), 0)
282 e8ae0c20 Michael Hanselmann
283 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting device paths")
284 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'activate-disks', instance['name']]
285 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
286 e8ae0c20 Michael Hanselmann
  devpath = []
287 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
288 e8ae0c20 Michael Hanselmann
    (_, _, tmpdevpath) = line.split(':')
289 e8ae0c20 Michael Hanselmann
    devpath.append(tmpdevpath)
290 29df1f02 Michael Hanselmann
  print devpath
291 e8ae0c20 Michael Hanselmann
292 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting drbd device paths")
293 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'info', instance['name']]
294 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
295 29df1f02 Michael Hanselmann
  pattern = (r'\s+-\s+sd[a-z]+,\s+type:\s+drbd8?,\s+.*$'
296 e8ae0c20 Michael Hanselmann
             r'\s+primary:\s+(/dev/drbd\d+)\s+')
297 e8ae0c20 Michael Hanselmann
  drbddevs = re.findall(pattern, output, re.M)
298 29df1f02 Michael Hanselmann
  print drbddevs
299 e8ae0c20 Michael Hanselmann
300 e8ae0c20 Michael Hanselmann
  halted_disks = []
301 e8ae0c20 Michael Hanselmann
  try:
302 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Deactivating disks")
303 b1ffe1eb Michael Hanselmann
    cmds = []
304 b1ffe1eb Michael Hanselmann
    for name in node2disk[[node2_full, node_full][int(onmaster)]]:
305 b1ffe1eb Michael Hanselmann
      halted_disks.append(name)
306 b1ffe1eb Michael Hanselmann
      cmds.append(sq(["echo", "offline"]) + " >%s" % _GetDiskStatePath(name))
307 b1ffe1eb Michael Hanselmann
    AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
308 b1ffe1eb Michael Hanselmann
                         ' && '.join(cmds)).wait(), 0)
309 b1ffe1eb Michael Hanselmann
310 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Write to disks and give some time to notice"
311 29df1f02 Michael Hanselmann
                              " to notice the problem")
312 e8ae0c20 Michael Hanselmann
    cmds = []
313 e8ae0c20 Michael Hanselmann
    for disk in devpath:
314 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["dd", "count=1", "bs=512", "conv=notrunc",
315 e8ae0c20 Michael Hanselmann
                      "if=%s" % disk, "of=%s" % disk]))
316 e8ae0c20 Michael Hanselmann
    for _ in (0, 1, 2):
317 e8ae0c20 Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], ' && '.join(cmds)).wait(), 0)
318 e8ae0c20 Michael Hanselmann
      time.sleep(3)
319 e8ae0c20 Michael Hanselmann
320 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Debugging info")
321 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
322 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'show']
323 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0)
324 b1ffe1eb Michael Hanselmann
325 e8ae0c20 Michael Hanselmann
    cmd = ['gnt-instance', 'info', instance['name']]
326 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
327 e8ae0c20 Michael Hanselmann
328 e8ae0c20 Michael Hanselmann
  finally:
329 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Activating disks again")
330 e8ae0c20 Michael Hanselmann
    cmds = []
331 e8ae0c20 Michael Hanselmann
    for name in halted_disks:
332 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["echo", "running"]) + " >%s" % _GetDiskStatePath(name))
333 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
334 e8ae0c20 Michael Hanselmann
                         '; '.join(cmds)).wait(), 0)
335 e8ae0c20 Michael Hanselmann
336 b1ffe1eb Michael Hanselmann
  if onmaster:
337 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
338 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'detach']
339 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0)
340 b1ffe1eb Michael Hanselmann
  else:
341 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
342 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'disconnect']
343 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node2['primary'], sq(cmd)).wait(), 0)
344 b1ffe1eb Michael Hanselmann
345 29df1f02 Michael Hanselmann
  # TODO
346 29df1f02 Michael Hanselmann
  #cmd = ['vgs']
347 29df1f02 Michael Hanselmann
  #AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
348 29df1f02 Michael Hanselmann
  #                     sq(cmd)).wait(), 0)
349 b1ffe1eb Michael Hanselmann
350 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Making sure disks are up again")
351 29df1f02 Michael Hanselmann
  cmd = ['gnt-instance', 'replace-disks', instance['name']]
352 29df1f02 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
353 29df1f02 Michael Hanselmann
354 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Restarting instance")
355 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'shutdown', instance['name']]
356 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
357 e8ae0c20 Michael Hanselmann
358 b1ffe1eb Michael Hanselmann
  cmd = ['gnt-instance', 'startup', instance['name']]
359 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
360 e8ae0c20 Michael Hanselmann
361 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-cluster', 'verify']
362 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
363 e8ae0c20 Michael Hanselmann
364 e8ae0c20 Michael Hanselmann
365 e8ae0c20 Michael Hanselmann
def TestInstanceMasterDiskFailure(instance, node, node2):
366 e8ae0c20 Michael Hanselmann
  """Testing disk failure on master node."""
367 f4bc1f2c Michael Hanselmann
  print qa_utils.FormatError("Disk failure on primary node cannot be"
368 f4bc1f2c Michael Hanselmann
                             " tested due to potential crashes.")
369 e8ae0c20 Michael Hanselmann
  # The following can cause crashes, thus it's disabled until fixed
370 dfe11bad Michael Hanselmann
  #return _TestInstanceDiskFailure(instance, node, node2, True)
371 e8ae0c20 Michael Hanselmann
372 e8ae0c20 Michael Hanselmann
373 e8ae0c20 Michael Hanselmann
def TestInstanceSecondaryDiskFailure(instance, node, node2):
374 e8ae0c20 Michael Hanselmann
  """Testing disk failure on secondary node."""
375 e8ae0c20 Michael Hanselmann
  return _TestInstanceDiskFailure(instance, node, node2, False)