Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ 5b349fd1

History | View | Annotate | Download (14.2 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 7f69aabb Iustin Pop
  cmd = ['gnt-instance', 'modify', '-t', 'drbd', '-n', snode, instance['name']]
219 7f69aabb Iustin Pop
  AssertEqual(StartSSH(master['primary'],
220 7f69aabb Iustin Pop
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
221 7f69aabb Iustin Pop
222 7f69aabb Iustin Pop
223 283f9d4c Michael Hanselmann
def TestInstanceList():
224 283f9d4c Michael Hanselmann
  """gnt-instance list"""
225 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
226 283f9d4c Michael Hanselmann
227 283f9d4c Michael Hanselmann
  cmd = ['gnt-instance', 'list']
228 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
229 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
230 283f9d4c Michael Hanselmann
231 283f9d4c Michael Hanselmann
232 4379b1fa Michael Hanselmann
def TestInstanceConsole(instance):
233 4379b1fa Michael Hanselmann
  """gnt-instance console"""
234 4379b1fa Michael Hanselmann
  master = qa_config.GetMasterNode()
235 4379b1fa Michael Hanselmann
236 4379b1fa Michael Hanselmann
  cmd = ['gnt-instance', 'console', '--show-cmd', instance['name']]
237 4379b1fa Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
238 4379b1fa Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
239 4379b1fa Michael Hanselmann
240 4379b1fa Michael Hanselmann
241 7910e7a5 Michael Hanselmann
def TestReplaceDisks(instance, pnode, snode, othernode):
242 7910e7a5 Michael Hanselmann
  """gnt-instance replace-disks"""
243 7910e7a5 Michael Hanselmann
  master = qa_config.GetMasterNode()
244 7910e7a5 Michael Hanselmann
245 7910e7a5 Michael Hanselmann
  def buildcmd(args):
246 7910e7a5 Michael Hanselmann
    cmd = ['gnt-instance', 'replace-disks']
247 7910e7a5 Michael Hanselmann
    cmd.extend(args)
248 7910e7a5 Michael Hanselmann
    cmd.append(instance["name"])
249 7910e7a5 Michael Hanselmann
    return cmd
250 7910e7a5 Michael Hanselmann
251 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["-p"])
252 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
253 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
254 7910e7a5 Michael Hanselmann
255 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["-s"])
256 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
257 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
258 7910e7a5 Michael Hanselmann
259 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["--new-secondary=%s" % othernode["primary"]])
260 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
261 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
262 7910e7a5 Michael Hanselmann
263 7910e7a5 Michael Hanselmann
  # Restore
264 7910e7a5 Michael Hanselmann
  cmd = buildcmd(["--new-secondary=%s" % snode["primary"]])
265 7910e7a5 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
266 7910e7a5 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
267 7910e7a5 Michael Hanselmann
268 7910e7a5 Michael Hanselmann
269 5d640672 Michael Hanselmann
def TestInstanceExport(instance, node):
270 5d640672 Michael Hanselmann
  """gnt-backup export"""
271 5d640672 Michael Hanselmann
  master = qa_config.GetMasterNode()
272 5d640672 Michael Hanselmann
273 5d640672 Michael Hanselmann
  cmd = ['gnt-backup', 'export', '-n', node['primary'], instance['name']]
274 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
275 5d640672 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
276 5d640672 Michael Hanselmann
277 5d640672 Michael Hanselmann
  return qa_utils.ResolveInstanceName(instance)
278 5d640672 Michael Hanselmann
279 5d640672 Michael Hanselmann
280 5d640672 Michael Hanselmann
def TestInstanceImport(node, newinst, expnode, name):
281 5d640672 Michael Hanselmann
  """gnt-backup import"""
282 5d640672 Michael Hanselmann
  master = qa_config.GetMasterNode()
283 5d640672 Michael Hanselmann
284 5d640672 Michael Hanselmann
  cmd = (['gnt-backup', 'import',
285 5d640672 Michael Hanselmann
          '--disk-template=plain',
286 5d640672 Michael Hanselmann
          '--no-ip-check',
287 5d640672 Michael Hanselmann
          '--src-node=%s' % expnode['primary'],
288 5d640672 Michael Hanselmann
          '--src-dir=%s/%s' % (constants.EXPORT_DIR, name),
289 5d640672 Michael Hanselmann
          '--node=%s' % node['primary']] +
290 5d640672 Michael Hanselmann
         _GetGenericAddParameters())
291 5d640672 Michael Hanselmann
  cmd.append(newinst['name'])
292 5d640672 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
293 5d640672 Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
294 283f9d4c Michael Hanselmann
295 283f9d4c Michael Hanselmann
296 283f9d4c Michael Hanselmann
def TestBackupList(expnode):
297 283f9d4c Michael Hanselmann
  """gnt-backup list"""
298 283f9d4c Michael Hanselmann
  master = qa_config.GetMasterNode()
299 283f9d4c Michael Hanselmann
300 1e020d1b Michael Hanselmann
  cmd = ['gnt-backup', 'list', '--node=%s' % expnode['primary']]
301 283f9d4c Michael Hanselmann
  AssertEqual(StartSSH(master['primary'],
302 283f9d4c Michael Hanselmann
                       utils.ShellQuoteArgs(cmd)).wait(), 0)
303 e8ae0c20 Michael Hanselmann
304 e8ae0c20 Michael Hanselmann
305 e8ae0c20 Michael Hanselmann
def _TestInstanceDiskFailure(instance, node, node2, onmaster):
306 e8ae0c20 Michael Hanselmann
  """Testing disk failure."""
307 e8ae0c20 Michael Hanselmann
  master = qa_config.GetMasterNode()
308 e8ae0c20 Michael Hanselmann
  sq = utils.ShellQuoteArgs
309 e8ae0c20 Michael Hanselmann
310 e8ae0c20 Michael Hanselmann
  instance_full = qa_utils.ResolveInstanceName(instance)
311 e8ae0c20 Michael Hanselmann
  node_full = qa_utils.ResolveNodeName(node)
312 e8ae0c20 Michael Hanselmann
  node2_full = qa_utils.ResolveNodeName(node2)
313 e8ae0c20 Michael Hanselmann
314 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting physical disk names")
315 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-node', 'volumes', '--separator=|', '--no-headers',
316 e8ae0c20 Michael Hanselmann
         '--output=node,phys,instance',
317 e8ae0c20 Michael Hanselmann
         node['primary'], node2['primary']]
318 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
319 e8ae0c20 Michael Hanselmann
320 e8ae0c20 Michael Hanselmann
  # Get physical disk names
321 e8ae0c20 Michael Hanselmann
  re_disk = re.compile(r'^/dev/([a-z]+)\d+$')
322 e8ae0c20 Michael Hanselmann
  node2disk = {}
323 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
324 e8ae0c20 Michael Hanselmann
    (node_name, phys, inst) = line.split('|')
325 e8ae0c20 Michael Hanselmann
    if inst == instance_full:
326 e8ae0c20 Michael Hanselmann
      if node_name not in node2disk:
327 e8ae0c20 Michael Hanselmann
        node2disk[node_name] = []
328 e8ae0c20 Michael Hanselmann
329 e8ae0c20 Michael Hanselmann
      m = re_disk.match(phys)
330 e8ae0c20 Michael Hanselmann
      if not m:
331 e8ae0c20 Michael Hanselmann
        raise qa_error.Error("Unknown disk name format: %s" % disk)
332 e8ae0c20 Michael Hanselmann
333 e8ae0c20 Michael Hanselmann
      name = m.group(1)
334 e8ae0c20 Michael Hanselmann
      if name not in node2disk[node_name]:
335 e8ae0c20 Michael Hanselmann
        node2disk[node_name].append(name)
336 e8ae0c20 Michael Hanselmann
337 e8ae0c20 Michael Hanselmann
  if [node2_full, node_full][int(onmaster)] not in node2disk:
338 f4bc1f2c Michael Hanselmann
    raise qa_error.Error("Couldn't find physical disks used on"
339 f4bc1f2c Michael Hanselmann
                         " %s node" % ["secondary", "master"][int(onmaster)])
340 e8ae0c20 Michael Hanselmann
341 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Checking whether nodes have ability to stop"
342 29df1f02 Michael Hanselmann
                            " disks")
343 e8ae0c20 Michael Hanselmann
  for node_name, disks in node2disk.iteritems():
344 e8ae0c20 Michael Hanselmann
    cmds = []
345 e8ae0c20 Michael Hanselmann
    for disk in disks:
346 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["test", "-f", _GetDiskStatePath(disk)]))
347 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH(node_name, ' && '.join(cmds)).wait(), 0)
348 e8ae0c20 Michael Hanselmann
349 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting device paths")
350 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'activate-disks', instance['name']]
351 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
352 e8ae0c20 Michael Hanselmann
  devpath = []
353 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
354 e8ae0c20 Michael Hanselmann
    (_, _, tmpdevpath) = line.split(':')
355 e8ae0c20 Michael Hanselmann
    devpath.append(tmpdevpath)
356 29df1f02 Michael Hanselmann
  print devpath
357 e8ae0c20 Michael Hanselmann
358 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting drbd device paths")
359 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'info', instance['name']]
360 e8ae0c20 Michael Hanselmann
  output = qa_utils.GetCommandOutput(master['primary'], sq(cmd))
361 29df1f02 Michael Hanselmann
  pattern = (r'\s+-\s+sd[a-z]+,\s+type:\s+drbd8?,\s+.*$'
362 e8ae0c20 Michael Hanselmann
             r'\s+primary:\s+(/dev/drbd\d+)\s+')
363 e8ae0c20 Michael Hanselmann
  drbddevs = re.findall(pattern, output, re.M)
364 29df1f02 Michael Hanselmann
  print drbddevs
365 e8ae0c20 Michael Hanselmann
366 e8ae0c20 Michael Hanselmann
  halted_disks = []
367 e8ae0c20 Michael Hanselmann
  try:
368 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Deactivating disks")
369 b1ffe1eb Michael Hanselmann
    cmds = []
370 b1ffe1eb Michael Hanselmann
    for name in node2disk[[node2_full, node_full][int(onmaster)]]:
371 b1ffe1eb Michael Hanselmann
      halted_disks.append(name)
372 b1ffe1eb Michael Hanselmann
      cmds.append(sq(["echo", "offline"]) + " >%s" % _GetDiskStatePath(name))
373 b1ffe1eb Michael Hanselmann
    AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
374 b1ffe1eb Michael Hanselmann
                         ' && '.join(cmds)).wait(), 0)
375 b1ffe1eb Michael Hanselmann
376 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Write to disks and give some time to notice"
377 29df1f02 Michael Hanselmann
                              " to notice the problem")
378 e8ae0c20 Michael Hanselmann
    cmds = []
379 e8ae0c20 Michael Hanselmann
    for disk in devpath:
380 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["dd", "count=1", "bs=512", "conv=notrunc",
381 e8ae0c20 Michael Hanselmann
                      "if=%s" % disk, "of=%s" % disk]))
382 e8ae0c20 Michael Hanselmann
    for _ in (0, 1, 2):
383 e8ae0c20 Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], ' && '.join(cmds)).wait(), 0)
384 e8ae0c20 Michael Hanselmann
      time.sleep(3)
385 e8ae0c20 Michael Hanselmann
386 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Debugging info")
387 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
388 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'show']
389 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0)
390 b1ffe1eb Michael Hanselmann
391 e8ae0c20 Michael Hanselmann
    cmd = ['gnt-instance', 'info', instance['name']]
392 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
393 e8ae0c20 Michael Hanselmann
394 e8ae0c20 Michael Hanselmann
  finally:
395 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Activating disks again")
396 e8ae0c20 Michael Hanselmann
    cmds = []
397 e8ae0c20 Michael Hanselmann
    for name in halted_disks:
398 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["echo", "running"]) + " >%s" % _GetDiskStatePath(name))
399 e8ae0c20 Michael Hanselmann
    AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
400 e8ae0c20 Michael Hanselmann
                         '; '.join(cmds)).wait(), 0)
401 e8ae0c20 Michael Hanselmann
402 b1ffe1eb Michael Hanselmann
  if onmaster:
403 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
404 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'detach']
405 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0)
406 b1ffe1eb Michael Hanselmann
  else:
407 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
408 b1ffe1eb Michael Hanselmann
      cmd = ['drbdsetup', name, 'disconnect']
409 b1ffe1eb Michael Hanselmann
      AssertEqual(StartSSH(node2['primary'], sq(cmd)).wait(), 0)
410 b1ffe1eb Michael Hanselmann
411 29df1f02 Michael Hanselmann
  # TODO
412 29df1f02 Michael Hanselmann
  #cmd = ['vgs']
413 29df1f02 Michael Hanselmann
  #AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'],
414 29df1f02 Michael Hanselmann
  #                     sq(cmd)).wait(), 0)
415 b1ffe1eb Michael Hanselmann
416 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Making sure disks are up again")
417 29df1f02 Michael Hanselmann
  cmd = ['gnt-instance', 'replace-disks', instance['name']]
418 29df1f02 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
419 29df1f02 Michael Hanselmann
420 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Restarting instance")
421 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-instance', 'shutdown', instance['name']]
422 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
423 e8ae0c20 Michael Hanselmann
424 b1ffe1eb Michael Hanselmann
  cmd = ['gnt-instance', 'startup', instance['name']]
425 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
426 e8ae0c20 Michael Hanselmann
427 e8ae0c20 Michael Hanselmann
  cmd = ['gnt-cluster', 'verify']
428 e8ae0c20 Michael Hanselmann
  AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0)
429 e8ae0c20 Michael Hanselmann
430 e8ae0c20 Michael Hanselmann
431 e8ae0c20 Michael Hanselmann
def TestInstanceMasterDiskFailure(instance, node, node2):
432 e8ae0c20 Michael Hanselmann
  """Testing disk failure on master node."""
433 f4bc1f2c Michael Hanselmann
  print qa_utils.FormatError("Disk failure on primary node cannot be"
434 f4bc1f2c Michael Hanselmann
                             " tested due to potential crashes.")
435 e8ae0c20 Michael Hanselmann
  # The following can cause crashes, thus it's disabled until fixed
436 dfe11bad Michael Hanselmann
  #return _TestInstanceDiskFailure(instance, node, node2, True)
437 e8ae0c20 Michael Hanselmann
438 e8ae0c20 Michael Hanselmann
439 e8ae0c20 Michael Hanselmann
def TestInstanceSecondaryDiskFailure(instance, node, node2):
440 e8ae0c20 Michael Hanselmann
  """Testing disk failure on secondary node."""
441 e8ae0c20 Michael Hanselmann
  return _TestInstanceDiskFailure(instance, node, node2, False)