Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ ff699aa9

History | View | Annotate | Download (12.9 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 cc27265e René Nussbaumer
from qa_utils import AssertIn, AssertCommand, AssertEqual
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 cc27265e René Nussbaumer
  AssertCommand(["gnt-instance", "shutdown", name])
108 cc27265e René Nussbaumer
  AssertCommand(["gnt-instance", "reboot", name])
109 cc27265e René Nussbaumer
110 cc27265e René Nussbaumer
  master = qa_config.GetMasterNode()
111 cc27265e René Nussbaumer
  cmd = ["gnt-instance", "list", "--no-header", "-o", "status", name]
112 cc27265e René Nussbaumer
  result_output = qa_utils.GetCommandOutput(master["primary"],
113 cc27265e René Nussbaumer
                                            utils.ShellQuoteArgs(cmd))
114 cc27265e René Nussbaumer
  AssertEqual(result_output.strip(), constants.INSTST_RUNNING)
115 cc27265e René Nussbaumer
116 8a4e8898 Michael Hanselmann
117 283f9d4c Michael Hanselmann
def TestInstanceReinstall(instance):
118 283f9d4c Michael Hanselmann
  """gnt-instance reinstall"""
119 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "reinstall", "-f", instance["name"]])
120 283f9d4c Michael Hanselmann
121 283f9d4c Michael Hanselmann
122 6a343475 Michael Hanselmann
def _ReadSsconfInstanceList():
123 6a343475 Michael Hanselmann
  """Reads ssconf_instance_list from the master node.
124 6a343475 Michael Hanselmann

125 6a343475 Michael Hanselmann
  """
126 6a343475 Michael Hanselmann
  master = qa_config.GetMasterNode()
127 6a343475 Michael Hanselmann
128 6a343475 Michael Hanselmann
  cmd = ["cat", utils.PathJoin(constants.DATA_DIR,
129 6a343475 Michael Hanselmann
                               "ssconf_%s" % constants.SS_INSTANCE_LIST)]
130 6a343475 Michael Hanselmann
131 6a343475 Michael Hanselmann
  return qa_utils.GetCommandOutput(master["primary"],
132 6a343475 Michael Hanselmann
                                   utils.ShellQuoteArgs(cmd)).splitlines()
133 6a343475 Michael Hanselmann
134 6a343475 Michael Hanselmann
135 6a343475 Michael Hanselmann
def _CheckSsconfInstanceList(instance):
136 6a343475 Michael Hanselmann
  """Checks if a certain instance is in the ssconf instance list.
137 6a343475 Michael Hanselmann

138 6a343475 Michael Hanselmann
  @type instance: string
139 6a343475 Michael Hanselmann
  @param instance: Instance name
140 6a343475 Michael Hanselmann

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