未验证 提交 256e9436 编写于 作者: X Xu Han 提交者: GitHub

Merge pull request #1396 from aliang123/1583472

Replace hotplug device defination by qcontainer.images_define_ by_params()
import logging import logging
import re import re
import random
from virttest import data_dir
from virttest import storage
from virttest import error_context from virttest import error_context
from virttest import utils_misc from virttest import utils_misc
from virttest import utils_test from virttest import utils_test
from virttest.qemu_devices import qdevices from virttest.qemu_devices import qdevices
from virttest import qemu_qtree
@error_context.context_aware @error_context.context_aware
...@@ -25,14 +21,6 @@ def run(test, params, env): ...@@ -25,14 +21,6 @@ def run(test, params, env):
:param params: Dictionary with the test parameters. :param params: Dictionary with the test parameters.
:param env: Dictionary with test environment. :param env: Dictionary with test environment.
""" """
def find_image(image_name):
"""
Find the path of the iamge.
"""
image_params = params.object_params(image_name)
o = storage.get_image_filename(image_params, data_dir.get_data_dir())
return o
def find_disk(vm, cmd): def find_disk(vm, cmd):
""" """
Find all disks in guest. Find all disks in guest.
...@@ -58,20 +46,25 @@ def run(test, params, env): ...@@ -58,20 +46,25 @@ def run(test, params, env):
disk = list(set(disk2).difference(set(disk1))) disk = list(set(disk2).difference(set(disk1)))
return disk return disk
def unplug_device(vm, get_disk_cmd, device): def run_sub_test(params, plug_tag):
""" """
Unplug device Run subtest before/after hotplug/unplug device.
:param plug_tag: identify when to run subtest,
ex, before_hotplug.
:return: whether vm was successfully shut-down
if needed
""" """
disks_before_unplug = find_disk(vm, get_disk_cmd) sub_type = params.get("sub_type_%s" % plug_tag)
device.unplug(vm.monitor) if sub_type:
device.verify_unplug("", vm.monitor) error_context.context(context_msg % (sub_type, plug_tag),
unplug_status = utils_misc.wait_for(lambda: len(get_new_disk(find_disk logging.info)
(vm, get_disk_cmd), disks_before_unplug)) != 0, pause) utils_test.run_virt_sub_test(test, params, env, sub_type)
return unplug_status if sub_type == "shutdown" and vm.is_dead():
return True
return None
img_list = params.get("images").split() img_list = params.get("images").split()
img_format_type = params.get("img_format_type", "qcow2")
pci_type = params.get("pci_type", "virtio-blk-pci")
#sometimes, ppc can't get new plugged disk in 5s, so time to 10s #sometimes, ppc can't get new plugged disk in 5s, so time to 10s
pause = float(params.get("virtio_block_pause", 10.0)) pause = float(params.get("virtio_block_pause", 10.0))
blk_num = int(params.get("blk_num", 1)) blk_num = int(params.get("blk_num", 1))
...@@ -88,153 +81,83 @@ def run(test, params, env): ...@@ -88,153 +81,83 @@ def run(test, params, env):
for iteration in range(repeat_times): for iteration in range(repeat_times):
device_list = [] device_list = []
controller_list = []
controller_device_dict = {}
error_context.context("Hotplug block device (iteration %d)" % iteration, error_context.context("Hotplug block device (iteration %d)" % iteration,
logging.info) logging.info)
sub_type = params.get("sub_type_before_plug") plug_tag = "before_plug"
if sub_type: run_sub_test(params, plug_tag)
error_context.context(context_msg % (sub_type, "before hotplug"),
logging.info)
utils_test.run_virt_sub_test(test, params, env, sub_type)
for num in range(blk_num): for num in range(blk_num):
device = qdevices.QDevice(pci_type) image_name = img_list[num + 1]
image_params = params.object_params(image_name)
if params.get("need_plug") == "yes": if params.get("need_plug") == "yes":
disks_before_plug = find_disk(vm, get_disk_cmd) disks_before_plug = find_disk(vm, get_disk_cmd)
devs = vm.devices.images_define_by_params(image_name,
if params.get("need_controller", "no") == "yes": image_params, 'disk')
controller_model = params.get("controller_model") for dev in devs:
controller = qdevices.QDevice(controller_model, params={"id": ret = vm.devices.simple_hotplug(dev, vm.monitor)
"hotadded_scsi%s" % num}) if ret[1] is False:
bus_extra_param = params.get("bus_extra_params_%s" % img_list[num + 1]) test.fail("Failed to hotplug device '%s'."
if bus_extra_param: "Output:\n%s" % (dev, ret[0]))
for item in bus_extra_param.split(): plug_disks = utils_misc.wait_for(lambda: get_new_disk(disks_before_plug,
key, value = item.split("=", 1) find_disk(vm, get_disk_cmd)), pause)
qdevice_params = {key: value} if not plug_disks:
controller.params.update(qdevice_params) test.fail("Failed to hotplug device to guest")
controller.hotplug(vm.monitor) disk = plug_disks[0]
ver_out = controller.verify_hotplug("", vm.monitor)
if not ver_out: session = vm.wait_for_login(timeout=timeout)
err = "%s is not in qtree after hotplug" % controller_model if params.get("os_type") == "windows":
test.fail(err) if iteration == 0:
else: error_context.context("Format disk", logging.info)
controller_list.append(controller) utils_misc.format_windows_disk(session, disk_index[num],
mountpoint=disk_letter[num])
drive = qdevices.QRHDrive("block%d" % num) error_context.context("Check block device after hotplug.",
drive.set_param("file", find_image(img_list[num + 1])) logging.info)
drive.set_param("format", img_format_type) if params.get("disk_op_cmd"):
drive_id = drive.get_param("id") if params.get("os_type") == "linux":
drive.hotplug(vm.monitor) test_cmd = params.get("disk_op_cmd") % (disk, disk)
elif params.get("os_type") == "windows":
device.set_param("drive", drive_id) test_cmd = params.get("disk_op_cmd") % (disk_letter[num],
device.set_param("id", "block%d" % num) disk_letter[num])
if params.get("need_controller", "no") == "yes" and bool(random.randrange(2)): test_cmd = utils_misc.set_winutils_letter(session, test_cmd)
device.set_param("bus", controller.get_param("id")+'.0')
blk_extra_param = params.get("blk_extra_params_%s" % img_list[num + 1])
if blk_extra_param:
for item in blk_extra_param.split():
key, value = item.split("=", 1)
device.set_param(key, value)
device.hotplug(vm.monitor)
ver_out = device.verify_hotplug("", vm.monitor)
if not ver_out:
err = "%s is not in qtree after hotplug" % pci_type
test.fail(err)
plug_status = utils_misc.wait_for(lambda: len(get_new_disk(disks_before_plug,
find_disk(vm, get_disk_cmd))) != 0, pause)
if plug_status:
disks_after_plug = find_disk(vm, get_disk_cmd)
new_disks = get_new_disk(disks_before_plug, disks_after_plug)
else:
test.fail("Can't get new disks")
if params.get("need_controller", "no") == "yes":
info_qtree = vm.monitor.info('qtree', False)
qtree = qemu_qtree.QtreeContainer()
qtree.parse_info_qtree(info_qtree)
for node in qtree.get_nodes():
if node.qtree.get("id") == device.get_param("id"):
try:
controller_id = node.parent.qtree.get("id").split(".")[0]
except AttributeError:
test.fail("can't get parent of:\n%s" % node)
controller_device_dict.setdefault(controller_id, []).append(device)
break
else: else:
test.fail("Can't find device '%s' in qtree" % device.get_param("id")) test.cancel("Unsupported OS type '%s'" % params.get("os_type"))
else:
if params.get("drive_format") in pci_type:
get_disk_cmd += " | egrep -v '^/dev/[hsv]da[0-9]*$'"
device.set_param("id", img_list[num + 1]) status, output = session.cmd_status_output(test_cmd,
new_disks = find_disk(vm, get_disk_cmd) timeout=disk_op_timeout)
if status:
test.fail("Check for block device failed."
"Output: %s" % output)
device_list.append(device) devs = [dev for dev in devs if not isinstance(dev, qdevices.QDrive)]
if not new_disks: device_list.extend(devs)
test.fail("Cannot find new disk after hotplug.")
if params.get("need_plug") == "yes":
disk = new_disks[0]
else: else:
disk = new_disks[num] for device in vm.devices:
if device.get_param("id") == img_list[num + 1]:
session = vm.wait_for_login(timeout=timeout) device_list.append(device)
if params.get("os_type") == "windows":
if iteration == 0:
error_context.context("Format disk", logging.info)
utils_misc.format_windows_disk(session, disk_index[num],
mountpoint=disk_letter[num])
error_context.context("Check block device after hotplug.",
logging.info)
if params.get("disk_op_cmd"):
if params.get("os_type") == "linux":
test_cmd = params.get("disk_op_cmd") % (disk, disk)
elif params.get("os_type") == "windows":
test_cmd = params.get("disk_op_cmd") % (disk_letter[num],
disk_letter[num])
test_cmd = utils_misc.set_winutils_letter(session, test_cmd)
else:
test.cancel("Unsupported OS type '%s'" % params.get("os_type"))
status, output = session.cmd_status_output(test_cmd,
timeout=disk_op_timeout)
if status:
test.fail("Check for block device failed "
"after hotplug, Output: %r" % output)
session.close()
sub_type = params.get("sub_type_after_plug")
if sub_type:
error_context.context(context_msg % (sub_type, "after hotplug"),
logging.info)
utils_test.run_virt_sub_test(test, params, env, sub_type)
if sub_type == "shutdown" and vm.is_dead():
return
sub_type = params.get("sub_type_before_unplug") plug_tag = "after_plug"
if sub_type: vm_switched_off = run_sub_test(params, plug_tag)
error_context.context(context_msg % (sub_type, "before unplug"), if vm_switched_off:
logging.info) return
utils_test.run_virt_sub_test(test, params, env, sub_type)
plug_tag = "before_unplug"
run_sub_test(params, plug_tag)
error_context.context("Unplug block device (iteration %d)" % iteration, error_context.context("Unplug block device (iteration %d)" % iteration,
logging.info) logging.info)
for controller in controller_list: disks_before_unplug = find_disk(vm, get_disk_cmd)
controller_id = controller.get_param("id") for device in reversed(device_list):
for device in controller_device_dict.get(controller_id, []): ret = vm.devices.simple_unplug(device, vm.monitor)
unplug_status = unplug_device(vm, get_disk_cmd, device) if ret[1] is False:
if not unplug_status: test.fail("Failed to unplug device '%s'."
test.fail("Failed to unplug disks '%s'" % device.get_param("id")) "Ouptut:\n%s" % (dev, ret[0]))
device_list.remove(device)
controller.unplug(vm.monitor) unplug_disks = utils_misc.wait_for(lambda: get_new_disk(find_disk(vm, get_disk_cmd),
for device in device_list: disks_before_unplug), pause)
unplug_status = unplug_device(vm, get_disk_cmd, device) if len(unplug_disks) != blk_num:
if not unplug_status: test.fail("Failed to unplug devices from guest, need to unplug: %d,"
test.fail("Failed to unplug disks '%s'" % device.get_param("id")) "actual unplug: %d" % (blk_num, len(unplug_disks)))
sub_type = params.get("sub_type_after_unplug") plug_tag = "after_unplug"
if sub_type: run_sub_test(params, plug_tag)
error_context.context(context_msg % (sub_type, "after unplug"),
logging.info)
utils_test.run_virt_sub_test(test, params, env, sub_type)
...@@ -121,22 +121,13 @@ ...@@ -121,22 +121,13 @@
variants: variants:
- block_virtio: - block_virtio:
pci_type = virtio-blk-pci
s390x:
pci_type = virtio-blk-ccw
drive_format_stg0 = virtio drive_format_stg0 = virtio
drive_format_stg1 = virtio drive_format_stg1 = virtio
get_disk_pattern = "^/dev/vd[a-z]*$" get_disk_pattern = "^/dev/vd[a-z]*$"
- block_scsi: - block_scsi:
pci_type = scsi-hd
drive_format_stg0 = scsi-hd drive_format_stg0 = scsi-hd
drive_format_stg1 = scsi-hd drive_format_stg1 = scsi-hd
get_disk_pattern = "^/dev/sd[a-z]*$" get_disk_pattern = "^/dev/sd[a-z]*$"
virtio_blk:
need_controller = yes
controller_model = virtio-scsi-pci
s390x:
controller_model = virtio-scsi-ccw
variants: variants:
- @default: - @default:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册