Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ 7910e7a5

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