Revision 2f4b4f78 qa/qa_instance.py
b/qa/qa_instance.py | ||
---|---|---|
33 | 33 |
import qa_utils |
34 | 34 |
import qa_error |
35 | 35 |
|
36 |
from qa_utils import AssertEqual, AssertNotEqual, AssertIn, StartSSH
|
|
36 |
from qa_utils import AssertIn, AssertCommand
|
|
37 | 37 |
|
38 | 38 |
|
39 | 39 |
def _GetDiskStatePath(disk): |
... | ... | |
48 | 48 |
|
49 | 49 |
|
50 | 50 |
def _DiskTest(node, disk_template): |
51 |
master = qa_config.GetMasterNode() |
|
52 |
|
|
53 | 51 |
instance = qa_config.AcquireInstance() |
54 | 52 |
try: |
55 | 53 |
cmd = (['gnt-instance', 'add', |
... | ... | |
59 | 57 |
_GetGenericAddParameters()) |
60 | 58 |
cmd.append(instance['name']) |
61 | 59 |
|
62 |
AssertEqual(StartSSH(master['primary'], |
|
63 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
60 |
AssertCommand(cmd) |
|
64 | 61 |
|
65 | 62 |
_CheckSsconfInstanceList(instance["name"]) |
66 | 63 |
|
... | ... | |
83 | 80 |
|
84 | 81 |
def TestInstanceRemove(instance): |
85 | 82 |
"""gnt-instance remove""" |
86 |
master = qa_config.GetMasterNode() |
|
87 |
|
|
88 |
cmd = ['gnt-instance', 'remove', '-f', instance['name']] |
|
89 |
AssertEqual(StartSSH(master['primary'], |
|
90 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
83 |
AssertCommand(["gnt-instance", "remove", "-f", instance["name"]]) |
|
91 | 84 |
|
92 | 85 |
qa_config.ReleaseInstance(instance) |
93 | 86 |
|
94 | 87 |
|
95 | 88 |
def TestInstanceStartup(instance): |
96 | 89 |
"""gnt-instance startup""" |
97 |
master = qa_config.GetMasterNode() |
|
98 |
|
|
99 |
cmd = ['gnt-instance', 'startup', instance['name']] |
|
100 |
AssertEqual(StartSSH(master['primary'], |
|
101 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
90 |
AssertCommand(["gnt-instance", "startup", instance["name"]]) |
|
102 | 91 |
|
103 | 92 |
|
104 | 93 |
def TestInstanceShutdown(instance): |
105 | 94 |
"""gnt-instance shutdown""" |
106 |
master = qa_config.GetMasterNode() |
|
107 |
|
|
108 |
cmd = ['gnt-instance', 'shutdown', instance['name']] |
|
109 |
AssertEqual(StartSSH(master['primary'], |
|
110 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
95 |
AssertCommand(["gnt-instance", "shutdown", instance["name"]]) |
|
111 | 96 |
|
112 | 97 |
|
113 | 98 |
def TestInstanceReboot(instance): |
114 | 99 |
"""gnt-instance reboot""" |
115 |
master = qa_config.GetMasterNode() |
|
116 |
|
|
117 | 100 |
options = qa_config.get('options', {}) |
118 | 101 |
reboot_types = options.get("reboot-types", constants.REBOOT_TYPES) |
119 |
|
|
102 |
name = instance["name"] |
|
120 | 103 |
for rtype in reboot_types: |
121 |
cmd = ['gnt-instance', 'reboot', '--type=%s' % rtype, instance['name']] |
|
122 |
AssertEqual(StartSSH(master['primary'], |
|
123 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
104 |
AssertCommand(["gnt-instance", "reboot", "--type=%s" % rtype, name]) |
|
124 | 105 |
|
125 | 106 |
|
126 | 107 |
def TestInstanceReinstall(instance): |
127 | 108 |
"""gnt-instance reinstall""" |
128 |
master = qa_config.GetMasterNode() |
|
129 |
|
|
130 |
cmd = ['gnt-instance', 'reinstall', '-f', instance['name']] |
|
131 |
AssertEqual(StartSSH(master['primary'], |
|
132 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
109 |
AssertCommand(["gnt-instance", "reinstall", "-f", instance["name"]]) |
|
133 | 110 |
|
134 | 111 |
|
135 | 112 |
def _ReadSsconfInstanceList(): |
... | ... | |
158 | 135 |
|
159 | 136 |
def TestInstanceRename(instance, rename_target): |
160 | 137 |
"""gnt-instance rename""" |
161 |
master = qa_config.GetMasterNode() |
|
162 |
|
|
163 | 138 |
rename_source = instance['name'] |
164 | 139 |
|
165 | 140 |
for name1, name2 in [(rename_source, rename_target), |
166 | 141 |
(rename_target, rename_source)]: |
167 | 142 |
_CheckSsconfInstanceList(name1) |
168 |
cmd = ['gnt-instance', 'rename', name1, name2] |
|
169 |
AssertEqual(StartSSH(master['primary'], |
|
170 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
143 |
AssertCommand(["gnt-instance", "rename", name1, name2]) |
|
171 | 144 |
_CheckSsconfInstanceList(name2) |
172 | 145 |
|
173 | 146 |
|
174 | 147 |
def TestInstanceFailover(instance): |
175 | 148 |
"""gnt-instance failover""" |
176 |
master = qa_config.GetMasterNode() |
|
177 |
|
|
178 | 149 |
cmd = ['gnt-instance', 'failover', '--force', instance['name']] |
179 |
AssertEqual(StartSSH(master['primary'], |
|
180 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
181 |
|
|
150 |
# failover ... |
|
151 |
AssertCommand(cmd) |
|
182 | 152 |
# ... and back |
183 |
cmd = ['gnt-instance', 'failover', '--force', instance['name']] |
|
184 |
AssertEqual(StartSSH(master['primary'], |
|
185 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
153 |
AssertCommand(cmd) |
|
186 | 154 |
|
187 | 155 |
|
188 | 156 |
def TestInstanceMigrate(instance): |
189 | 157 |
"""gnt-instance migrate""" |
190 |
master = qa_config.GetMasterNode() |
|
191 |
|
|
192 | 158 |
cmd = ["gnt-instance", "migrate", "--force", instance["name"]] |
193 |
AssertEqual(StartSSH(master["primary"], |
|
194 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
195 |
|
|
159 |
# migrate ... |
|
160 |
AssertCommand(cmd) |
|
196 | 161 |
# ... and back |
197 |
cmd = ["gnt-instance", "migrate", "--force", instance["name"]] |
|
198 |
AssertEqual(StartSSH(master["primary"], |
|
199 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
162 |
AssertCommand(cmd) |
|
200 | 163 |
|
201 | 164 |
|
202 | 165 |
def TestInstanceInfo(instance): |
203 | 166 |
"""gnt-instance info""" |
204 |
master = qa_config.GetMasterNode() |
|
205 |
|
|
206 |
cmd = ['gnt-instance', 'info', instance['name']] |
|
207 |
AssertEqual(StartSSH(master['primary'], |
|
208 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
167 |
AssertCommand(["gnt-instance", "info", instance["name"]]) |
|
209 | 168 |
|
210 | 169 |
|
211 | 170 |
def TestInstanceModify(instance): |
212 | 171 |
"""gnt-instance modify""" |
213 |
master = qa_config.GetMasterNode() |
|
214 |
|
|
215 | 172 |
# Assume /sbin/init exists on all systems |
216 | 173 |
test_kernel = "/sbin/init" |
217 | 174 |
test_initrd = test_kernel |
218 | 175 |
|
219 | 176 |
orig_memory = qa_config.get('mem') |
220 |
orig_bridge = qa_config.get('bridge', 'xen-br0')
|
|
177 |
#orig_bridge = qa_config.get("bridge", "xen-br0")
|
|
221 | 178 |
args = [ |
222 | 179 |
["-B", "%s=128" % constants.BE_MEMORY], |
223 | 180 |
["-B", "%s=%s" % (constants.BE_MEMORY, orig_memory)], |
... | ... | |
240 | 197 |
#["-H", "%s=%s" % (constants.HV_BOOT_ORDER, constants.VALUE_DEFAULT)], |
241 | 198 |
] |
242 | 199 |
for alist in args: |
243 |
cmd = ['gnt-instance', 'modify'] + alist + [instance['name']] |
|
244 |
AssertEqual(StartSSH(master['primary'], |
|
245 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
200 |
AssertCommand(["gnt-instance", "modify"] + alist + [instance["name"]]) |
|
246 | 201 |
|
247 | 202 |
# check no-modify |
248 |
cmd = ['gnt-instance', 'modify', instance['name']] |
|
249 |
AssertNotEqual(StartSSH(master['primary'], |
|
250 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
203 |
AssertCommand(["gnt-instance", "modify", instance["name"]], fail=True) |
|
251 | 204 |
|
252 | 205 |
|
253 | 206 |
def TestInstanceConvertDisk(instance, snode): |
254 | 207 |
"""gnt-instance modify -t""" |
255 |
master = qa_config.GetMasterNode() |
|
256 |
cmd = ['gnt-instance', 'modify', '-t', 'plain', instance['name']] |
|
257 |
AssertEqual(StartSSH(master['primary'], |
|
258 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
259 |
cmd = ['gnt-instance', 'modify', '-t', 'drbd', '-n', snode['primary'], |
|
260 |
instance['name']] |
|
261 |
AssertEqual(StartSSH(master['primary'], |
|
262 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
208 |
name = instance["name"] |
|
209 |
AssertCommand(["gnt-instance", "modify", "-t", "plain", name]) |
|
210 |
AssertCommand(["gnt-instance", "modify", "-t", "drbd", |
|
211 |
"-n", snode["primary"], name]) |
|
263 | 212 |
|
264 | 213 |
|
265 | 214 |
def TestInstanceList(): |
266 | 215 |
"""gnt-instance list""" |
267 |
master = qa_config.GetMasterNode() |
|
268 |
|
|
269 |
cmd = ['gnt-instance', 'list'] |
|
270 |
AssertEqual(StartSSH(master['primary'], |
|
271 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
216 |
AssertCommand(["gnt-instance", "list"]) |
|
272 | 217 |
|
273 | 218 |
|
274 | 219 |
def TestInstanceConsole(instance): |
275 | 220 |
"""gnt-instance console""" |
276 |
master = qa_config.GetMasterNode() |
|
277 |
|
|
278 |
cmd = ['gnt-instance', 'console', '--show-cmd', instance['name']] |
|
279 |
AssertEqual(StartSSH(master['primary'], |
|
280 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
221 |
AssertCommand(["gnt-instance", "console", "--show-cmd", instance["name"]]) |
|
281 | 222 |
|
282 | 223 |
|
283 | 224 |
def TestReplaceDisks(instance, pnode, snode, othernode): |
284 | 225 |
"""gnt-instance replace-disks""" |
285 |
master = qa_config.GetMasterNode() |
|
286 |
|
|
287 | 226 |
def buildcmd(args): |
288 | 227 |
cmd = ['gnt-instance', 'replace-disks'] |
289 | 228 |
cmd.extend(args) |
290 | 229 |
cmd.append(instance["name"]) |
291 | 230 |
return cmd |
292 | 231 |
|
293 |
cmd = buildcmd(["-p"]) |
|
294 |
AssertEqual(StartSSH(master['primary'], |
|
295 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
296 |
|
|
297 |
cmd = buildcmd(["-s"]) |
|
298 |
AssertEqual(StartSSH(master['primary'], |
|
299 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
300 |
|
|
301 |
cmd = buildcmd(["--new-secondary=%s" % othernode["primary"]]) |
|
302 |
AssertEqual(StartSSH(master['primary'], |
|
303 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
304 |
|
|
305 |
# Restore |
|
306 |
cmd = buildcmd(["--new-secondary=%s" % snode["primary"]]) |
|
307 |
AssertEqual(StartSSH(master['primary'], |
|
308 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
232 |
for data in [ |
|
233 |
["-p"], |
|
234 |
["-s"], |
|
235 |
["--new-secondary=%s" % othernode["primary"]], |
|
236 |
# and restore |
|
237 |
["--new-secondary=%s" % snode["primary"]], |
|
238 |
]: |
|
239 |
AssertCommand(buildcmd(data)) |
|
309 | 240 |
|
310 | 241 |
|
311 | 242 |
def TestInstanceExport(instance, node): |
312 | 243 |
"""gnt-backup export -n ...""" |
313 |
master = qa_config.GetMasterNode() |
|
314 |
|
|
315 |
cmd = ['gnt-backup', 'export', '-n', node['primary'], instance['name']] |
|
316 |
AssertEqual(StartSSH(master['primary'], |
|
317 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
318 |
|
|
319 |
return qa_utils.ResolveInstanceName(instance["name"]) |
|
244 |
name = instance["name"] |
|
245 |
AssertCommand(["gnt-backup", "export", "-n", node["primary"], name]) |
|
246 |
return qa_utils.ResolveInstanceName(name) |
|
320 | 247 |
|
321 | 248 |
|
322 | 249 |
def TestInstanceExportWithRemove(instance, node): |
323 | 250 |
"""gnt-backup export --remove-instance""" |
324 |
master = qa_config.GetMasterNode() |
|
325 |
|
|
326 |
cmd = ['gnt-backup', 'export', '-n', node['primary'], "--remove-instance", |
|
327 |
instance['name']] |
|
328 |
AssertEqual(StartSSH(master['primary'], |
|
329 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
251 |
AssertCommand(["gnt-backup", "export", "-n", node["primary"], |
|
252 |
"--remove-instance", instance["name"]]) |
|
330 | 253 |
|
331 | 254 |
|
332 | 255 |
def TestInstanceExportNoTarget(instance): |
333 | 256 |
"""gnt-backup export (without target node, should fail)""" |
334 |
master = qa_config.GetMasterNode() |
|
335 |
|
|
336 |
cmd = ["gnt-backup", "export", instance["name"]] |
|
337 |
AssertNotEqual(StartSSH(master['primary'], |
|
338 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
257 |
AssertCommand(["gnt-backup", "export", instance["name"]], fail=True) |
|
339 | 258 |
|
340 | 259 |
|
341 | 260 |
def TestInstanceImport(node, newinst, expnode, name): |
342 | 261 |
"""gnt-backup import""" |
343 |
master = qa_config.GetMasterNode() |
|
344 |
|
|
345 | 262 |
cmd = (['gnt-backup', 'import', |
346 | 263 |
'--disk-template=plain', |
347 | 264 |
'--no-ip-check', |
... | ... | |
351 | 268 |
'--node=%s' % node['primary']] + |
352 | 269 |
_GetGenericAddParameters()) |
353 | 270 |
cmd.append(newinst['name']) |
354 |
AssertEqual(StartSSH(master['primary'], |
|
355 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
271 |
AssertCommand(cmd) |
|
356 | 272 |
|
357 | 273 |
|
358 | 274 |
def TestBackupList(expnode): |
359 | 275 |
"""gnt-backup list""" |
360 |
master = qa_config.GetMasterNode() |
|
361 |
|
|
362 |
cmd = ['gnt-backup', 'list', '--node=%s' % expnode['primary']] |
|
363 |
AssertEqual(StartSSH(master['primary'], |
|
364 |
utils.ShellQuoteArgs(cmd)).wait(), 0) |
|
276 |
AssertCommand(["gnt-backup", "list", "--node=%s" % expnode["primary"]]) |
|
365 | 277 |
|
366 | 278 |
|
367 | 279 |
def _TestInstanceDiskFailure(instance, node, node2, onmaster): |
... | ... | |
390 | 302 |
|
391 | 303 |
m = re_disk.match(phys) |
392 | 304 |
if not m: |
393 |
raise qa_error.Error("Unknown disk name format: %s" % disk)
|
|
305 |
raise qa_error.Error("Unknown disk name format: %s" % phys)
|
|
394 | 306 |
|
395 | 307 |
name = m.group(1) |
396 | 308 |
if name not in node2disk[node_name]: |
... | ... | |
406 | 318 |
cmds = [] |
407 | 319 |
for disk in disks: |
408 | 320 |
cmds.append(sq(["test", "-f", _GetDiskStatePath(disk)])) |
409 |
AssertEqual(StartSSH(node_name, ' && '.join(cmds)).wait(), 0)
|
|
321 |
AssertCommand(" && ".join(cmds), node=node_name)
|
|
410 | 322 |
|
411 | 323 |
print qa_utils.FormatInfo("Getting device paths") |
412 | 324 |
cmd = ['gnt-instance', 'activate-disks', instance['name']] |
... | ... | |
432 | 344 |
for name in node2disk[[node2_full, node_full][int(onmaster)]]: |
433 | 345 |
halted_disks.append(name) |
434 | 346 |
cmds.append(sq(["echo", "offline"]) + " >%s" % _GetDiskStatePath(name)) |
435 |
AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'], |
|
436 |
' && '.join(cmds)).wait(), 0) |
|
347 |
AssertCommand(" && ".join(cmds), node=[node2, node][int(onmaster)]) |
|
437 | 348 |
|
438 | 349 |
print qa_utils.FormatInfo("Write to disks and give some time to notice" |
439 | 350 |
" to notice the problem") |
... | ... | |
442 | 353 |
cmds.append(sq(["dd", "count=1", "bs=512", "conv=notrunc", |
443 | 354 |
"if=%s" % disk, "of=%s" % disk])) |
444 | 355 |
for _ in (0, 1, 2): |
445 |
AssertEqual(StartSSH(node['primary'], ' && '.join(cmds)).wait(), 0)
|
|
356 |
AssertCommand(" && ".join(cmds), node=node)
|
|
446 | 357 |
time.sleep(3) |
447 | 358 |
|
448 | 359 |
print qa_utils.FormatInfo("Debugging info") |
449 | 360 |
for name in drbddevs: |
450 |
cmd = ['drbdsetup', name, 'show'] |
|
451 |
AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0) |
|
361 |
AssertCommand(["drbdsetup", name, "show"], node=node) |
|
452 | 362 |
|
453 |
cmd = ['gnt-instance', 'info', instance['name']] |
|
454 |
AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0) |
|
363 |
AssertCommand(["gnt-instance", "info", instance["name"]]) |
|
455 | 364 |
|
456 | 365 |
finally: |
457 | 366 |
print qa_utils.FormatInfo("Activating disks again") |
458 | 367 |
cmds = [] |
459 | 368 |
for name in halted_disks: |
460 | 369 |
cmds.append(sq(["echo", "running"]) + " >%s" % _GetDiskStatePath(name)) |
461 |
AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'], |
|
462 |
'; '.join(cmds)).wait(), 0) |
|
370 |
AssertCommand("; ".join(cmds), node=[node2, node][int(onmaster)]) |
|
463 | 371 |
|
464 | 372 |
if onmaster: |
465 | 373 |
for name in drbddevs: |
466 |
cmd = ['drbdsetup', name, 'detach'] |
|
467 |
AssertEqual(StartSSH(node['primary'], sq(cmd)).wait(), 0) |
|
374 |
AssertCommand(["drbdsetup", name, "detach"], node=node) |
|
468 | 375 |
else: |
469 | 376 |
for name in drbddevs: |
470 |
cmd = ['drbdsetup', name, 'disconnect'] |
|
471 |
AssertEqual(StartSSH(node2['primary'], sq(cmd)).wait(), 0) |
|
377 |
AssertCommand(["drbdsetup", name, "disconnect"], node=node2) |
|
472 | 378 |
|
473 | 379 |
# TODO |
474 |
#cmd = ['vgs'] |
|
475 |
#AssertEqual(StartSSH([node2, node][int(onmaster)]['primary'], |
|
476 |
# sq(cmd)).wait(), 0) |
|
380 |
#AssertCommand(["vgs"], [node2, node][int(onmaster)]) |
|
477 | 381 |
|
478 | 382 |
print qa_utils.FormatInfo("Making sure disks are up again") |
479 |
cmd = ['gnt-instance', 'replace-disks', instance['name']] |
|
480 |
AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0) |
|
383 |
AssertCommand(["gnt-instance", "replace-disks", instance["name"]]) |
|
481 | 384 |
|
482 | 385 |
print qa_utils.FormatInfo("Restarting instance") |
483 |
cmd = ['gnt-instance', 'shutdown', instance['name']] |
|
484 |
AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0) |
|
485 |
|
|
486 |
cmd = ['gnt-instance', 'startup', instance['name']] |
|
487 |
AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0) |
|
386 |
AssertCommand(["gnt-instance", "shutdown", instance["name"]]) |
|
387 |
AssertCommand(["gnt-instance", "startup", instance["name"]]) |
|
488 | 388 |
|
489 |
cmd = ['gnt-cluster', 'verify'] |
|
490 |
AssertEqual(StartSSH(master['primary'], sq(cmd)).wait(), 0) |
|
389 |
AssertCommand(["gnt-cluster", "verify"]) |
|
491 | 390 |
|
492 | 391 |
|
493 | 392 |
def TestInstanceMasterDiskFailure(instance, node, node2): |
Also available in: Unified diff