Statistics
| Branch: | Tag: | Revision:

root / qa / qa_instance.py @ 51131cad

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

138 6a343475 Michael Hanselmann
  """
139 6a343475 Michael Hanselmann
  master = qa_config.GetMasterNode()
140 6a343475 Michael Hanselmann
141 6a343475 Michael Hanselmann
  cmd = ["cat", utils.PathJoin(constants.DATA_DIR,
142 6a343475 Michael Hanselmann
                               "ssconf_%s" % constants.SS_INSTANCE_LIST)]
143 6a343475 Michael Hanselmann
144 6a343475 Michael Hanselmann
  return qa_utils.GetCommandOutput(master["primary"],
145 6a343475 Michael Hanselmann
                                   utils.ShellQuoteArgs(cmd)).splitlines()
146 6a343475 Michael Hanselmann
147 6a343475 Michael Hanselmann
148 6a343475 Michael Hanselmann
def _CheckSsconfInstanceList(instance):
149 6a343475 Michael Hanselmann
  """Checks if a certain instance is in the ssconf instance list.
150 6a343475 Michael Hanselmann

151 6a343475 Michael Hanselmann
  @type instance: string
152 6a343475 Michael Hanselmann
  @param instance: Instance name
153 6a343475 Michael Hanselmann

154 6a343475 Michael Hanselmann
  """
155 6a343475 Michael Hanselmann
  AssertIn(qa_utils.ResolveInstanceName(instance),
156 6a343475 Michael Hanselmann
           _ReadSsconfInstanceList())
157 6a343475 Michael Hanselmann
158 6a343475 Michael Hanselmann
159 51131cad Michael Hanselmann
@InstanceCheck(INST_DOWN, INST_DOWN, FIRST_ARG)
160 4c1a464b Iustin Pop
def TestInstanceRenameAndBack(rename_source, rename_target):
161 4c1a464b Iustin Pop
  """gnt-instance rename
162 4c1a464b Iustin Pop

163 4c1a464b Iustin Pop
  This must leave the instance with the original name, not the target
164 4c1a464b Iustin Pop
  name.
165 4c1a464b Iustin Pop

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