Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ b73302c4

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