Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ 3d8f154f

History | View | Annotate | Download (12.5 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 3582eef6 Iustin Pop
# Copyright (C) 2007, 2011 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 288d6440 Michael Hanselmann
from ganeti import query
32 cec9845c Michael Hanselmann
33 cec9845c Michael Hanselmann
import qa_config
34 5d640672 Michael Hanselmann
import qa_utils
35 e8ae0c20 Michael Hanselmann
import qa_error
36 e8ae0c20 Michael Hanselmann
37 2f4b4f78 Iustin Pop
from qa_utils import AssertIn, AssertCommand
38 cec9845c Michael Hanselmann
39 e8ae0c20 Michael Hanselmann
40 e8ae0c20 Michael Hanselmann
def _GetDiskStatePath(disk):
41 e8ae0c20 Michael Hanselmann
  return "/sys/block/%s/device/state" % disk
42 cec9845c Michael Hanselmann
43 cec9845c Michael Hanselmann
44 5d640672 Michael Hanselmann
def _GetGenericAddParameters():
45 1d693311 Michael Hanselmann
  params = ['-B', '%s=%s' % (constants.BE_MEMORY, qa_config.get('mem'))]
46 1d693311 Michael Hanselmann
  for idx, size in enumerate(qa_config.get('disk')):
47 1d693311 Michael Hanselmann
    params.extend(["--disk", "%s:size=%s" % (idx, size)])
48 1d693311 Michael Hanselmann
  return params
49 5d640672 Michael Hanselmann
50 5d640672 Michael Hanselmann
51 113b8d89 Michael Hanselmann
def _DiskTest(node, disk_template):
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 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
62 6a343475 Michael Hanselmann
63 6a343475 Michael Hanselmann
    _CheckSsconfInstanceList(instance["name"])
64 6a343475 Michael Hanselmann
65 cec9845c Michael Hanselmann
    return instance
66 cec9845c Michael Hanselmann
  except:
67 cec9845c Michael Hanselmann
    qa_config.ReleaseInstance(instance)
68 cec9845c Michael Hanselmann
    raise
69 cec9845c Michael Hanselmann
70 cec9845c Michael Hanselmann
71 cec9845c Michael Hanselmann
def TestInstanceAddWithPlainDisk(node):
72 cec9845c Michael Hanselmann
  """gnt-instance add -t plain"""
73 113b8d89 Michael Hanselmann
  return _DiskTest(node['primary'], 'plain')
74 cec9845c Michael Hanselmann
75 cec9845c Michael Hanselmann
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 cec9845c Michael Hanselmann
def TestInstanceRemove(instance):
83 cec9845c Michael Hanselmann
  """gnt-instance remove"""
84 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "remove", "-f", instance["name"]])
85 cec9845c Michael Hanselmann
86 cec9845c Michael Hanselmann
  qa_config.ReleaseInstance(instance)
87 cec9845c Michael Hanselmann
88 cec9845c Michael Hanselmann
89 cec9845c Michael Hanselmann
def TestInstanceStartup(instance):
90 cec9845c Michael Hanselmann
  """gnt-instance startup"""
91 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "startup", instance["name"]])
92 cec9845c Michael Hanselmann
93 cec9845c Michael Hanselmann
94 cec9845c Michael Hanselmann
def TestInstanceShutdown(instance):
95 cec9845c Michael Hanselmann
  """gnt-instance shutdown"""
96 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "shutdown", instance["name"]])
97 cec9845c Michael Hanselmann
98 cec9845c Michael Hanselmann
99 8a4e8898 Michael Hanselmann
def TestInstanceReboot(instance):
100 8a4e8898 Michael Hanselmann
  """gnt-instance reboot"""
101 1d103c02 Iustin Pop
  options = qa_config.get('options', {})
102 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
103 2f4b4f78 Iustin Pop
  name = instance["name"]
104 1d103c02 Iustin Pop
  for rtype in reboot_types:
105 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-instance", "reboot", "--type=%s" % rtype, name])
106 8a4e8898 Michael Hanselmann
107 8a4e8898 Michael Hanselmann
108 283f9d4c Michael Hanselmann
def TestInstanceReinstall(instance):
109 283f9d4c Michael Hanselmann
  """gnt-instance reinstall"""
110 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "reinstall", "-f", instance["name"]])
111 283f9d4c Michael Hanselmann
112 283f9d4c Michael Hanselmann
113 6a343475 Michael Hanselmann
def _ReadSsconfInstanceList():
114 6a343475 Michael Hanselmann
  """Reads ssconf_instance_list from the master node.
115 6a343475 Michael Hanselmann

116 6a343475 Michael Hanselmann
  """
117 6a343475 Michael Hanselmann
  master = qa_config.GetMasterNode()
118 6a343475 Michael Hanselmann
119 6a343475 Michael Hanselmann
  cmd = ["cat", utils.PathJoin(constants.DATA_DIR,
120 6a343475 Michael Hanselmann
                               "ssconf_%s" % constants.SS_INSTANCE_LIST)]
121 6a343475 Michael Hanselmann
122 6a343475 Michael Hanselmann
  return qa_utils.GetCommandOutput(master["primary"],
123 6a343475 Michael Hanselmann
                                   utils.ShellQuoteArgs(cmd)).splitlines()
124 6a343475 Michael Hanselmann
125 6a343475 Michael Hanselmann
126 6a343475 Michael Hanselmann
def _CheckSsconfInstanceList(instance):
127 6a343475 Michael Hanselmann
  """Checks if a certain instance is in the ssconf instance list.
128 6a343475 Michael Hanselmann

129 6a343475 Michael Hanselmann
  @type instance: string
130 6a343475 Michael Hanselmann
  @param instance: Instance name
131 6a343475 Michael Hanselmann

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