Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ bebe7a73

History | View | Annotate | Download (15.7 kB)

1 c68d1f43 Michael Hanselmann
#
2 c68d1f43 Michael Hanselmann
#
3 c68d1f43 Michael Hanselmann
4 4c1a464b Iustin Pop
# Copyright (C) 2007, 2011, 2012 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 8ccbbe4b Guido Trotter
  params = ["-B"]
46 8ccbbe4b Guido Trotter
  params.append("%s=%s,%s=%s" % (constants.BE_MINMEM,
47 8ccbbe4b Guido Trotter
                                 qa_config.get(constants.BE_MINMEM),
48 8ccbbe4b Guido Trotter
                                 constants.BE_MAXMEM,
49 8ccbbe4b Guido Trotter
                                 qa_config.get(constants.BE_MAXMEM)))
50 d0c8c01d Iustin Pop
  for idx, size in enumerate(qa_config.get("disk")):
51 1d693311 Michael Hanselmann
    params.extend(["--disk", "%s:size=%s" % (idx, size)])
52 1d693311 Michael Hanselmann
  return params
53 5d640672 Michael Hanselmann
54 5d640672 Michael Hanselmann
55 113b8d89 Michael Hanselmann
def _DiskTest(node, disk_template):
56 cec9845c Michael Hanselmann
  instance = qa_config.AcquireInstance()
57 cec9845c Michael Hanselmann
  try:
58 d0c8c01d Iustin Pop
    cmd = (["gnt-instance", "add",
59 d0c8c01d Iustin Pop
            "--os-type=%s" % qa_config.get("os"),
60 d0c8c01d Iustin Pop
            "--disk-template=%s" % disk_template,
61 d0c8c01d Iustin Pop
            "--node=%s" % node] +
62 5d640672 Michael Hanselmann
           _GetGenericAddParameters())
63 d0c8c01d Iustin Pop
    cmd.append(instance["name"])
64 cec9845c Michael Hanselmann
65 2f4b4f78 Iustin Pop
    AssertCommand(cmd)
66 6a343475 Michael Hanselmann
67 6a343475 Michael Hanselmann
    _CheckSsconfInstanceList(instance["name"])
68 6a343475 Michael Hanselmann
69 cec9845c Michael Hanselmann
    return instance
70 cec9845c Michael Hanselmann
  except:
71 cec9845c Michael Hanselmann
    qa_config.ReleaseInstance(instance)
72 cec9845c Michael Hanselmann
    raise
73 cec9845c Michael Hanselmann
74 cec9845c Michael Hanselmann
75 cec9845c Michael Hanselmann
def TestInstanceAddWithPlainDisk(node):
76 cec9845c Michael Hanselmann
  """gnt-instance add -t plain"""
77 d0c8c01d Iustin Pop
  return _DiskTest(node["primary"], "plain")
78 cec9845c Michael Hanselmann
79 cec9845c Michael Hanselmann
80 7d7609a3 Michael Hanselmann
def TestInstanceAddWithDrbdDisk(node, node2):
81 7d7609a3 Michael Hanselmann
  """gnt-instance add -t drbd"""
82 d0c8c01d Iustin Pop
  return _DiskTest("%s:%s" % (node["primary"], node2["primary"]),
83 d0c8c01d Iustin Pop
                   "drbd")
84 7d7609a3 Michael Hanselmann
85 7d7609a3 Michael Hanselmann
86 cec9845c Michael Hanselmann
def TestInstanceRemove(instance):
87 cec9845c Michael Hanselmann
  """gnt-instance remove"""
88 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "remove", "-f", instance["name"]])
89 cec9845c Michael Hanselmann
90 cec9845c Michael Hanselmann
  qa_config.ReleaseInstance(instance)
91 cec9845c Michael Hanselmann
92 cec9845c Michael Hanselmann
93 cec9845c Michael Hanselmann
def TestInstanceStartup(instance):
94 cec9845c Michael Hanselmann
  """gnt-instance startup"""
95 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "startup", instance["name"]])
96 cec9845c Michael Hanselmann
97 cec9845c Michael Hanselmann
98 cec9845c Michael Hanselmann
def TestInstanceShutdown(instance):
99 cec9845c Michael Hanselmann
  """gnt-instance shutdown"""
100 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "shutdown", instance["name"]])
101 cec9845c Michael Hanselmann
102 cec9845c Michael Hanselmann
103 8a4e8898 Michael Hanselmann
def TestInstanceReboot(instance):
104 8a4e8898 Michael Hanselmann
  """gnt-instance reboot"""
105 d0c8c01d Iustin Pop
  options = qa_config.get("options", {})
106 1d103c02 Iustin Pop
  reboot_types = options.get("reboot-types", constants.REBOOT_TYPES)
107 2f4b4f78 Iustin Pop
  name = instance["name"]
108 1d103c02 Iustin Pop
  for rtype in reboot_types:
109 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-instance", "reboot", "--type=%s" % rtype, name])
110 8a4e8898 Michael Hanselmann
111 cc27265e René Nussbaumer
  AssertCommand(["gnt-instance", "shutdown", name])
112 cc27265e René Nussbaumer
  AssertCommand(["gnt-instance", "reboot", name])
113 cc27265e René Nussbaumer
114 cc27265e René Nussbaumer
  master = qa_config.GetMasterNode()
115 58ea8d17 Michael Hanselmann
  cmd = ["gnt-instance", "list", "--no-headers", "-o", "status", name]
116 cc27265e René Nussbaumer
  result_output = qa_utils.GetCommandOutput(master["primary"],
117 cc27265e René Nussbaumer
                                            utils.ShellQuoteArgs(cmd))
118 cc27265e René Nussbaumer
  AssertEqual(result_output.strip(), constants.INSTST_RUNNING)
119 cc27265e René Nussbaumer
120 8a4e8898 Michael Hanselmann
121 283f9d4c Michael Hanselmann
def TestInstanceReinstall(instance):
122 283f9d4c Michael Hanselmann
  """gnt-instance reinstall"""
123 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "reinstall", "-f", instance["name"]])
124 283f9d4c Michael Hanselmann
125 283f9d4c Michael Hanselmann
126 6a343475 Michael Hanselmann
def _ReadSsconfInstanceList():
127 6a343475 Michael Hanselmann
  """Reads ssconf_instance_list from the master node.
128 6a343475 Michael Hanselmann

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

142 6a343475 Michael Hanselmann
  @type instance: string
143 6a343475 Michael Hanselmann
  @param instance: Instance name
144 6a343475 Michael Hanselmann

145 6a343475 Michael Hanselmann
  """
146 6a343475 Michael Hanselmann
  AssertIn(qa_utils.ResolveInstanceName(instance),
147 6a343475 Michael Hanselmann
           _ReadSsconfInstanceList())
148 6a343475 Michael Hanselmann
149 6a343475 Michael Hanselmann
150 4c1a464b Iustin Pop
def TestInstanceRenameAndBack(rename_source, rename_target):
151 4c1a464b Iustin Pop
  """gnt-instance rename
152 4c1a464b Iustin Pop

153 4c1a464b Iustin Pop
  This must leave the instance with the original name, not the target
154 4c1a464b Iustin Pop
  name.
155 4c1a464b Iustin Pop

156 4c1a464b Iustin Pop
  """
157 31fe5102 René Nussbaumer
  _CheckSsconfInstanceList(rename_source)
158 4c1a464b Iustin Pop
  # first do a rename to a different actual name, expecting it to fail
159 31fe5102 René Nussbaumer
  qa_utils.AddToEtcHosts(["meeeeh-not-exists", rename_target])
160 31fe5102 René Nussbaumer
  try:
161 31fe5102 René Nussbaumer
    AssertCommand(["gnt-instance", "rename", rename_source, rename_target],
162 31fe5102 René Nussbaumer
                  fail=True)
163 31fe5102 René Nussbaumer
    _CheckSsconfInstanceList(rename_source)
164 31fe5102 René Nussbaumer
  finally:
165 31fe5102 René Nussbaumer
    qa_utils.RemoveFromEtcHosts(["meeeeh-not-exists", rename_target])
166 4c1a464b Iustin Pop
  # and now rename instance to rename_target...
167 31fe5102 René Nussbaumer
  AssertCommand(["gnt-instance", "rename", rename_source, rename_target])
168 31fe5102 René Nussbaumer
  _CheckSsconfInstanceList(rename_target)
169 4c1a464b Iustin Pop
  # and back
170 4c1a464b Iustin Pop
  AssertCommand(["gnt-instance", "rename", rename_target, rename_source])
171 4c1a464b Iustin Pop
  _CheckSsconfInstanceList(rename_source)
172 18337ca9 Iustin Pop
173 18337ca9 Iustin Pop
174 cec9845c Michael Hanselmann
def TestInstanceFailover(instance):
175 cec9845c Michael Hanselmann
  """gnt-instance failover"""
176 d0c8c01d Iustin Pop
  cmd = ["gnt-instance", "failover", "--force", instance["name"]]
177 2f4b4f78 Iustin Pop
  # failover ...
178 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
179 76f59a32 Michael Hanselmann
  # ... and back
180 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
181 76f59a32 Michael Hanselmann
182 cec9845c Michael Hanselmann
183 938bde86 Michael Hanselmann
def TestInstanceMigrate(instance):
184 938bde86 Michael Hanselmann
  """gnt-instance migrate"""
185 938bde86 Michael Hanselmann
  cmd = ["gnt-instance", "migrate", "--force", instance["name"]]
186 2f4b4f78 Iustin Pop
  # migrate ...
187 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
188 938bde86 Michael Hanselmann
  # ... and back
189 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
190 e9c487be René Nussbaumer
  AssertCommand(["gnt-instance", "shutdown", instance["name"]])
191 e9c487be René Nussbaumer
  AssertCommand(cmd, fail=True)
192 e9c487be René Nussbaumer
  AssertCommand(["gnt-instance", "migrate", "--force", "--allow-failover",
193 e9c487be René Nussbaumer
                 instance["name"]])
194 e9c487be René Nussbaumer
  AssertCommand(["gnt-instance", "start", instance["name"]])
195 e9c487be René Nussbaumer
  AssertCommand(cmd)
196 42a769f9 Bernardo Dal Seno
  AssertCommand(["gnt-instance", "modify", "-B",
197 42a769f9 Bernardo Dal Seno
                 ("%s=%s" %
198 42a769f9 Bernardo Dal Seno
                  (constants.BE_ALWAYS_FAILOVER, constants.VALUE_TRUE)),
199 42a769f9 Bernardo Dal Seno
                 instance["name"]])
200 42a769f9 Bernardo Dal Seno
  AssertCommand(cmd, fail=True)
201 42a769f9 Bernardo Dal Seno
  AssertCommand(["gnt-instance", "migrate", "--force", "--allow-failover",
202 42a769f9 Bernardo Dal Seno
                 instance["name"]])
203 42a769f9 Bernardo Dal Seno
  AssertCommand(["gnt-instance", "modify", "-B",
204 42a769f9 Bernardo Dal Seno
                 ("%s=%s" %
205 42a769f9 Bernardo Dal Seno
                  (constants.BE_ALWAYS_FAILOVER, constants.VALUE_FALSE)),
206 42a769f9 Bernardo Dal Seno
                 instance["name"]])
207 42a769f9 Bernardo Dal Seno
  AssertCommand(cmd)
208 938bde86 Michael Hanselmann
209 938bde86 Michael Hanselmann
210 cec9845c Michael Hanselmann
def TestInstanceInfo(instance):
211 cec9845c Michael Hanselmann
  """gnt-instance info"""
212 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "info", instance["name"]])
213 5d640672 Michael Hanselmann
214 5d640672 Michael Hanselmann
215 c0f74c55 Iustin Pop
def TestInstanceModify(instance):
216 c0f74c55 Iustin Pop
  """gnt-instance modify"""
217 1d693311 Michael Hanselmann
  # Assume /sbin/init exists on all systems
218 1d693311 Michael Hanselmann
  test_kernel = "/sbin/init"
219 1d693311 Michael Hanselmann
  test_initrd = test_kernel
220 1d693311 Michael Hanselmann
221 8ccbbe4b Guido Trotter
  orig_maxmem = qa_config.get(constants.BE_MAXMEM)
222 8ccbbe4b Guido Trotter
  orig_minmem = qa_config.get(constants.BE_MINMEM)
223 2f4b4f78 Iustin Pop
  #orig_bridge = qa_config.get("bridge", "xen-br0")
224 c0f74c55 Iustin Pop
  args = [
225 8ccbbe4b Guido Trotter
    ["-B", "%s=128" % constants.BE_MINMEM],
226 8ccbbe4b Guido Trotter
    ["-B", "%s=128" % constants.BE_MAXMEM],
227 8ccbbe4b Guido Trotter
    ["-B", "%s=%s,%s=%s" % (constants.BE_MINMEM, orig_minmem,
228 8ccbbe4b Guido Trotter
                            constants.BE_MAXMEM, orig_maxmem)],
229 1d693311 Michael Hanselmann
    ["-B", "%s=2" % constants.BE_VCPUS],
230 1d693311 Michael Hanselmann
    ["-B", "%s=1" % constants.BE_VCPUS],
231 1d693311 Michael Hanselmann
    ["-B", "%s=%s" % (constants.BE_VCPUS, constants.VALUE_DEFAULT)],
232 42a769f9 Bernardo Dal Seno
    ["-B", "%s=%s" % (constants.BE_ALWAYS_FAILOVER, constants.VALUE_TRUE)],
233 42a769f9 Bernardo Dal Seno
    ["-B", "%s=%s" % (constants.BE_ALWAYS_FAILOVER, constants.VALUE_DEFAULT)],
234 1d693311 Michael Hanselmann
235 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_KERNEL_PATH, test_kernel)],
236 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_KERNEL_PATH, constants.VALUE_DEFAULT)],
237 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_INITRD_PATH, test_initrd)],
238 5645d16b Iustin Pop
    ["-H", "no_%s" % (constants.HV_INITRD_PATH, )],
239 1d693311 Michael Hanselmann
    ["-H", "%s=%s" % (constants.HV_INITRD_PATH, constants.VALUE_DEFAULT)],
240 1d693311 Michael Hanselmann
241 1d693311 Michael Hanselmann
    # TODO: bridge tests
242 1d693311 Michael Hanselmann
    #["--bridge", "xen-br1"],
243 1d693311 Michael Hanselmann
    #["--bridge", orig_bridge],
244 1d693311 Michael Hanselmann
245 1d693311 Michael Hanselmann
    # TODO: Do these tests only with xen-hvm
246 1d693311 Michael Hanselmann
    #["-H", "%s=acn" % constants.HV_BOOT_ORDER],
247 1d693311 Michael Hanselmann
    #["-H", "%s=%s" % (constants.HV_BOOT_ORDER, constants.VALUE_DEFAULT)],
248 c0f74c55 Iustin Pop
    ]
249 c0f74c55 Iustin Pop
  for alist in args:
250 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-instance", "modify"] + alist + [instance["name"]])
251 c0f74c55 Iustin Pop
252 c0f74c55 Iustin Pop
  # check no-modify
253 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "modify", instance["name"]], fail=True)
254 c0f74c55 Iustin Pop
255 3016bc1f Michael Hanselmann
  # Marking offline/online while instance is running must fail
256 3016bc1f Michael Hanselmann
  for arg in ["--online", "--offline"]:
257 3016bc1f Michael Hanselmann
    AssertCommand(["gnt-instance", "modify", arg, instance["name"]], fail=True)
258 3016bc1f Michael Hanselmann
259 3016bc1f Michael Hanselmann
260 3016bc1f Michael Hanselmann
def TestInstanceStoppedModify(instance):
261 3016bc1f Michael Hanselmann
  """gnt-instance modify (stopped instance)"""
262 3016bc1f Michael Hanselmann
  name = instance["name"]
263 3016bc1f Michael Hanselmann
264 58f0ce16 Michael Hanselmann
  # Instance was not marked offline; try marking it online once more
265 58f0ce16 Michael Hanselmann
  AssertCommand(["gnt-instance", "modify", "--online", name])
266 3016bc1f Michael Hanselmann
267 3016bc1f Michael Hanselmann
  # Mark instance as offline
268 3016bc1f Michael Hanselmann
  AssertCommand(["gnt-instance", "modify", "--offline", name])
269 3016bc1f Michael Hanselmann
270 3016bc1f Michael Hanselmann
  # And online again
271 3016bc1f Michael Hanselmann
  AssertCommand(["gnt-instance", "modify", "--online", name])
272 3016bc1f Michael Hanselmann
273 c0f74c55 Iustin Pop
274 7f69aabb Iustin Pop
def TestInstanceConvertDisk(instance, snode):
275 7f69aabb Iustin Pop
  """gnt-instance modify -t"""
276 2f4b4f78 Iustin Pop
  name = instance["name"]
277 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "modify", "-t", "plain", name])
278 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "modify", "-t", "drbd",
279 2f4b4f78 Iustin Pop
                 "-n", snode["primary"], name])
280 7f69aabb Iustin Pop
281 7f69aabb Iustin Pop
282 283f9d4c Michael Hanselmann
def TestInstanceList():
283 283f9d4c Michael Hanselmann
  """gnt-instance list"""
284 288d6440 Michael Hanselmann
  qa_utils.GenericQueryTest("gnt-instance", query.INSTANCE_FIELDS.keys())
285 283f9d4c Michael Hanselmann
286 283f9d4c Michael Hanselmann
287 2214cf14 Michael Hanselmann
def TestInstanceListFields():
288 2214cf14 Michael Hanselmann
  """gnt-instance list-fields"""
289 2214cf14 Michael Hanselmann
  qa_utils.GenericQueryFieldsTest("gnt-instance", query.INSTANCE_FIELDS.keys())
290 2214cf14 Michael Hanselmann
291 2214cf14 Michael Hanselmann
292 4379b1fa Michael Hanselmann
def TestInstanceConsole(instance):
293 4379b1fa Michael Hanselmann
  """gnt-instance console"""
294 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "console", "--show-cmd", instance["name"]])
295 4379b1fa Michael Hanselmann
296 4379b1fa Michael Hanselmann
297 7910e7a5 Michael Hanselmann
def TestReplaceDisks(instance, pnode, snode, othernode):
298 7910e7a5 Michael Hanselmann
  """gnt-instance replace-disks"""
299 b459a848 Andrea Spadaccini
  # pylint: disable=W0613
300 3582eef6 Iustin Pop
  # due to unused pnode arg
301 3582eef6 Iustin Pop
  # FIXME: should be removed from the function completely
302 7910e7a5 Michael Hanselmann
  def buildcmd(args):
303 d0c8c01d Iustin Pop
    cmd = ["gnt-instance", "replace-disks"]
304 7910e7a5 Michael Hanselmann
    cmd.extend(args)
305 7910e7a5 Michael Hanselmann
    cmd.append(instance["name"])
306 7910e7a5 Michael Hanselmann
    return cmd
307 7910e7a5 Michael Hanselmann
308 2f4b4f78 Iustin Pop
  for data in [
309 2f4b4f78 Iustin Pop
    ["-p"],
310 2f4b4f78 Iustin Pop
    ["-s"],
311 2f4b4f78 Iustin Pop
    ["--new-secondary=%s" % othernode["primary"]],
312 2f4b4f78 Iustin Pop
    # and restore
313 2f4b4f78 Iustin Pop
    ["--new-secondary=%s" % snode["primary"]],
314 2f4b4f78 Iustin Pop
    ]:
315 2f4b4f78 Iustin Pop
    AssertCommand(buildcmd(data))
316 7910e7a5 Michael Hanselmann
317 9026e935 René Nussbaumer
  AssertCommand(buildcmd(["-a"]))
318 9026e935 René Nussbaumer
  AssertCommand(["gnt-instance", "stop", instance["name"]])
319 9026e935 René Nussbaumer
  AssertCommand(buildcmd(["-a"]), fail=True)
320 9026e935 René Nussbaumer
  AssertCommand(["gnt-instance", "activate-disks", instance["name"]])
321 9026e935 René Nussbaumer
  AssertCommand(buildcmd(["-a"]))
322 9026e935 René Nussbaumer
  AssertCommand(["gnt-instance", "start", instance["name"]])
323 9026e935 René Nussbaumer
324 7910e7a5 Michael Hanselmann
325 5d640672 Michael Hanselmann
def TestInstanceExport(instance, node):
326 bc696589 Michael Hanselmann
  """gnt-backup export -n ..."""
327 2f4b4f78 Iustin Pop
  name = instance["name"]
328 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-backup", "export", "-n", node["primary"], name])
329 2f4b4f78 Iustin Pop
  return qa_utils.ResolveInstanceName(name)
330 5d640672 Michael Hanselmann
331 5d640672 Michael Hanselmann
332 8d8d650c Michael Hanselmann
def TestInstanceExportWithRemove(instance, node):
333 8d8d650c Michael Hanselmann
  """gnt-backup export --remove-instance"""
334 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-backup", "export", "-n", node["primary"],
335 2f4b4f78 Iustin Pop
                 "--remove-instance", instance["name"]])
336 8d8d650c Michael Hanselmann
337 8d8d650c Michael Hanselmann
338 bc696589 Michael Hanselmann
def TestInstanceExportNoTarget(instance):
339 bc696589 Michael Hanselmann
  """gnt-backup export (without target node, should fail)"""
340 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-backup", "export", instance["name"]], fail=True)
341 bc696589 Michael Hanselmann
342 bc696589 Michael Hanselmann
343 5d640672 Michael Hanselmann
def TestInstanceImport(node, newinst, expnode, name):
344 5d640672 Michael Hanselmann
  """gnt-backup import"""
345 d0c8c01d Iustin Pop
  cmd = (["gnt-backup", "import",
346 d0c8c01d Iustin Pop
          "--disk-template=plain",
347 d0c8c01d Iustin Pop
          "--no-ip-check",
348 d0c8c01d Iustin Pop
          "--net", "0:mac=generate",
349 d0c8c01d Iustin Pop
          "--src-node=%s" % expnode["primary"],
350 d0c8c01d Iustin Pop
          "--src-dir=%s/%s" % (constants.EXPORT_DIR, name),
351 d0c8c01d Iustin Pop
          "--node=%s" % node["primary"]] +
352 5d640672 Michael Hanselmann
         _GetGenericAddParameters())
353 d0c8c01d Iustin Pop
  cmd.append(newinst["name"])
354 2f4b4f78 Iustin Pop
  AssertCommand(cmd)
355 283f9d4c Michael Hanselmann
356 283f9d4c Michael Hanselmann
357 283f9d4c Michael Hanselmann
def TestBackupList(expnode):
358 283f9d4c Michael Hanselmann
  """gnt-backup list"""
359 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-backup", "list", "--node=%s" % expnode["primary"]])
360 e8ae0c20 Michael Hanselmann
361 e8ae0c20 Michael Hanselmann
362 e8ae0c20 Michael Hanselmann
def _TestInstanceDiskFailure(instance, node, node2, onmaster):
363 e8ae0c20 Michael Hanselmann
  """Testing disk failure."""
364 e8ae0c20 Michael Hanselmann
  master = qa_config.GetMasterNode()
365 e8ae0c20 Michael Hanselmann
  sq = utils.ShellQuoteArgs
366 e8ae0c20 Michael Hanselmann
367 46f9a948 Michael Hanselmann
  instance_full = qa_utils.ResolveInstanceName(instance["name"])
368 e8ae0c20 Michael Hanselmann
  node_full = qa_utils.ResolveNodeName(node)
369 e8ae0c20 Michael Hanselmann
  node2_full = qa_utils.ResolveNodeName(node2)
370 e8ae0c20 Michael Hanselmann
371 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting physical disk names")
372 d0c8c01d Iustin Pop
  cmd = ["gnt-node", "volumes", "--separator=|", "--no-headers",
373 d0c8c01d Iustin Pop
         "--output=node,phys,instance",
374 d0c8c01d Iustin Pop
         node["primary"], node2["primary"]]
375 d0c8c01d Iustin Pop
  output = qa_utils.GetCommandOutput(master["primary"], sq(cmd))
376 e8ae0c20 Michael Hanselmann
377 e8ae0c20 Michael Hanselmann
  # Get physical disk names
378 d0c8c01d Iustin Pop
  re_disk = re.compile(r"^/dev/([a-z]+)\d+$")
379 e8ae0c20 Michael Hanselmann
  node2disk = {}
380 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
381 d0c8c01d Iustin Pop
    (node_name, phys, inst) = line.split("|")
382 e8ae0c20 Michael Hanselmann
    if inst == instance_full:
383 e8ae0c20 Michael Hanselmann
      if node_name not in node2disk:
384 e8ae0c20 Michael Hanselmann
        node2disk[node_name] = []
385 e8ae0c20 Michael Hanselmann
386 e8ae0c20 Michael Hanselmann
      m = re_disk.match(phys)
387 e8ae0c20 Michael Hanselmann
      if not m:
388 2f4b4f78 Iustin Pop
        raise qa_error.Error("Unknown disk name format: %s" % phys)
389 e8ae0c20 Michael Hanselmann
390 e8ae0c20 Michael Hanselmann
      name = m.group(1)
391 e8ae0c20 Michael Hanselmann
      if name not in node2disk[node_name]:
392 e8ae0c20 Michael Hanselmann
        node2disk[node_name].append(name)
393 e8ae0c20 Michael Hanselmann
394 e8ae0c20 Michael Hanselmann
  if [node2_full, node_full][int(onmaster)] not in node2disk:
395 f4bc1f2c Michael Hanselmann
    raise qa_error.Error("Couldn't find physical disks used on"
396 f4bc1f2c Michael Hanselmann
                         " %s node" % ["secondary", "master"][int(onmaster)])
397 e8ae0c20 Michael Hanselmann
398 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Checking whether nodes have ability to stop"
399 29df1f02 Michael Hanselmann
                            " disks")
400 e8ae0c20 Michael Hanselmann
  for node_name, disks in node2disk.iteritems():
401 e8ae0c20 Michael Hanselmann
    cmds = []
402 e8ae0c20 Michael Hanselmann
    for disk in disks:
403 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["test", "-f", _GetDiskStatePath(disk)]))
404 2f4b4f78 Iustin Pop
    AssertCommand(" && ".join(cmds), node=node_name)
405 e8ae0c20 Michael Hanselmann
406 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting device paths")
407 d0c8c01d Iustin Pop
  cmd = ["gnt-instance", "activate-disks", instance["name"]]
408 d0c8c01d Iustin Pop
  output = qa_utils.GetCommandOutput(master["primary"], sq(cmd))
409 e8ae0c20 Michael Hanselmann
  devpath = []
410 e8ae0c20 Michael Hanselmann
  for line in output.splitlines():
411 d0c8c01d Iustin Pop
    (_, _, tmpdevpath) = line.split(":")
412 e8ae0c20 Michael Hanselmann
    devpath.append(tmpdevpath)
413 29df1f02 Michael Hanselmann
  print devpath
414 e8ae0c20 Michael Hanselmann
415 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Getting drbd device paths")
416 d0c8c01d Iustin Pop
  cmd = ["gnt-instance", "info", instance["name"]]
417 d0c8c01d Iustin Pop
  output = qa_utils.GetCommandOutput(master["primary"], sq(cmd))
418 d0c8c01d Iustin Pop
  pattern = (r"\s+-\s+sd[a-z]+,\s+type:\s+drbd8?,\s+.*$"
419 d0c8c01d Iustin Pop
             r"\s+primary:\s+(/dev/drbd\d+)\s+")
420 e8ae0c20 Michael Hanselmann
  drbddevs = re.findall(pattern, output, re.M)
421 29df1f02 Michael Hanselmann
  print drbddevs
422 e8ae0c20 Michael Hanselmann
423 e8ae0c20 Michael Hanselmann
  halted_disks = []
424 e8ae0c20 Michael Hanselmann
  try:
425 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Deactivating disks")
426 b1ffe1eb Michael Hanselmann
    cmds = []
427 b1ffe1eb Michael Hanselmann
    for name in node2disk[[node2_full, node_full][int(onmaster)]]:
428 b1ffe1eb Michael Hanselmann
      halted_disks.append(name)
429 b1ffe1eb Michael Hanselmann
      cmds.append(sq(["echo", "offline"]) + " >%s" % _GetDiskStatePath(name))
430 2f4b4f78 Iustin Pop
    AssertCommand(" && ".join(cmds), node=[node2, node][int(onmaster)])
431 b1ffe1eb Michael Hanselmann
432 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Write to disks and give some time to notice"
433 29df1f02 Michael Hanselmann
                              " to notice the problem")
434 e8ae0c20 Michael Hanselmann
    cmds = []
435 e8ae0c20 Michael Hanselmann
    for disk in devpath:
436 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["dd", "count=1", "bs=512", "conv=notrunc",
437 e8ae0c20 Michael Hanselmann
                      "if=%s" % disk, "of=%s" % disk]))
438 e8ae0c20 Michael Hanselmann
    for _ in (0, 1, 2):
439 2f4b4f78 Iustin Pop
      AssertCommand(" && ".join(cmds), node=node)
440 e8ae0c20 Michael Hanselmann
      time.sleep(3)
441 e8ae0c20 Michael Hanselmann
442 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Debugging info")
443 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
444 2f4b4f78 Iustin Pop
      AssertCommand(["drbdsetup", name, "show"], node=node)
445 b1ffe1eb Michael Hanselmann
446 2f4b4f78 Iustin Pop
    AssertCommand(["gnt-instance", "info", instance["name"]])
447 e8ae0c20 Michael Hanselmann
448 e8ae0c20 Michael Hanselmann
  finally:
449 29df1f02 Michael Hanselmann
    print qa_utils.FormatInfo("Activating disks again")
450 e8ae0c20 Michael Hanselmann
    cmds = []
451 e8ae0c20 Michael Hanselmann
    for name in halted_disks:
452 e8ae0c20 Michael Hanselmann
      cmds.append(sq(["echo", "running"]) + " >%s" % _GetDiskStatePath(name))
453 2f4b4f78 Iustin Pop
    AssertCommand("; ".join(cmds), node=[node2, node][int(onmaster)])
454 e8ae0c20 Michael Hanselmann
455 b1ffe1eb Michael Hanselmann
  if onmaster:
456 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
457 2f4b4f78 Iustin Pop
      AssertCommand(["drbdsetup", name, "detach"], node=node)
458 b1ffe1eb Michael Hanselmann
  else:
459 b1ffe1eb Michael Hanselmann
    for name in drbddevs:
460 2f4b4f78 Iustin Pop
      AssertCommand(["drbdsetup", name, "disconnect"], node=node2)
461 b1ffe1eb Michael Hanselmann
462 29df1f02 Michael Hanselmann
  # TODO
463 2f4b4f78 Iustin Pop
  #AssertCommand(["vgs"], [node2, node][int(onmaster)])
464 b1ffe1eb Michael Hanselmann
465 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Making sure disks are up again")
466 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "replace-disks", instance["name"]])
467 29df1f02 Michael Hanselmann
468 29df1f02 Michael Hanselmann
  print qa_utils.FormatInfo("Restarting instance")
469 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "shutdown", instance["name"]])
470 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-instance", "startup", instance["name"]])
471 e8ae0c20 Michael Hanselmann
472 2f4b4f78 Iustin Pop
  AssertCommand(["gnt-cluster", "verify"])
473 e8ae0c20 Michael Hanselmann
474 e8ae0c20 Michael Hanselmann
475 e8ae0c20 Michael Hanselmann
def TestInstanceMasterDiskFailure(instance, node, node2):
476 e8ae0c20 Michael Hanselmann
  """Testing disk failure on master node."""
477 b459a848 Andrea Spadaccini
  # pylint: disable=W0613
478 3582eef6 Iustin Pop
  # due to unused args
479 f4bc1f2c Michael Hanselmann
  print qa_utils.FormatError("Disk failure on primary node cannot be"
480 f4bc1f2c Michael Hanselmann
                             " tested due to potential crashes.")
481 e8ae0c20 Michael Hanselmann
  # The following can cause crashes, thus it's disabled until fixed
482 dfe11bad Michael Hanselmann
  #return _TestInstanceDiskFailure(instance, node, node2, True)
483 e8ae0c20 Michael Hanselmann
484 e8ae0c20 Michael Hanselmann
485 e8ae0c20 Michael Hanselmann
def TestInstanceSecondaryDiskFailure(instance, node, node2):
486 e8ae0c20 Michael Hanselmann
  """Testing disk failure on secondary node."""
487 e8ae0c20 Michael Hanselmann
  return _TestInstanceDiskFailure(instance, node, node2, False)