Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ a7ea861a

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