Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ 3fc175f0

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