From: Yiqiao Pu <[email protected]> In the new version of qemu device_add is instead of pci_add. So modify the scripts to suit for the new version of qemu. Now both nic and block devices are support in qemu, so keep using monitor command line for this test.
Changs from v1: Can support block device hotplug in scripts. But scsi is still not supported. Changs from v2: - using "?" to check which command is supported in qemu and add the debug information for unsupported commands. - using "$add_cmd ?" to check the support devices in command line and add the debug information for unsupported devices Signed-off-by: Yiqiao Pu <[email protected]> --- client/tests/kvm/tests/pci_hotplug.py | 77 +++++++++++++++++++++++++------- 1 files changed, 60 insertions(+), 17 deletions(-) diff --git a/client/tests/kvm/tests/pci_hotplug.py b/client/tests/kvm/tests/pci_hotplug.py index 2c459d7..dbc8db8 100644 --- a/client/tests/kvm/tests/pci_hotplug.py +++ b/client/tests/kvm/tests/pci_hotplug.py @@ -1,4 +1,4 @@ -import logging, os +import logging, os, commands, re from autotest_lib.client.common_lib import error import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_vm @@ -35,26 +35,69 @@ def run_pci_hotplug(test, params, env): tested_model = params.get("pci_model") test_type = params.get("pci_type") - - if test_type == "nic": - pci_add_cmd = "pci_add pci_addr=auto nic model=%s" % tested_model - elif test_type == "block": - image_params = kvm_utils.get_sub_dict(params, "stg") - image_filename = kvm_vm.get_image_filename(image_params, test.bindir) - pci_add_cmd = ("pci_add pci_addr=auto storage file=%s,if=%s" % - (image_filename, tested_model)) - - # Execute pci_add (should be replaced by a proper monitor method call) - add_output = vm.monitor.cmd(pci_add_cmd) - if not "OK domain" in add_output: - raise error.TestFail("Add device failed. Hypervisor command is: %s. " - "Output: %r" % (pci_add_cmd, add_output)) - after_add = vm.monitor.info("pci") + image_format = params.get("image_format_stg") + cmd_output = vm.monitor.cmd("?") + if len(re.findall("\ndevice_add", cmd_output)) > 0: + cmd_type = "device_add" + elif len(re.findall("\npci_add", cmd_output)) > 0: + cmd_type = "pci_add" + else: + raise error.TestError("Unknow version of qemu") + + if cmd_type == "pci_add": + if test_type == "nic": + pci_add_cmd = "pci_add pci_addr=auto nic model=%s" % tested_model + elif test_type == "block": + image_params = kvm_utils.get_sub_dict(params, "stg") + image_filename = kvm_vm.get_image_filename(image_params, + test.bindir) + pci_add_cmd = ("pci_add pci_addr=auto storage file=%s,if=%s" % + (image_filename, tested_model)) + # Execute pci_add (should be replaced by a proper monitor method call) + add_output = vm.monitor.cmd(pci_add_cmd) + if not "OK domain" in add_output: + raise error.TestFail("Add device failed. Hypervisor command is: %s" + ". Output: %r" % (pci_add_cmd, add_output)) + after_add = vm.monitor.info("pci") + elif cmd_type == "device_add": + driver_id = test_type + "-" + kvm_utils.generate_random_id() + id = test_type + "-" + kvm_utils.generate_random_id() + if test_type == "nic": + if tested_model == "virtio": + tested_model = "virtio-net-pci" + pci_add_cmd = "device_add id=%s,driver=%s" % (id, tested_model) + elif test_type == "block": + image_params = kvm_utils.get_sub_dict(params, "stg") + image_filename = kvm_vm.get_image_filename(image_params, + test.bindir) + if tested_model == "virtio": + tested_model = "virtio-blk-pci" + if tested_model == "scsi": + tested_model = "scsi-disk" + driver_add_cmd = " __com.redhat_drive_add file=%s,format=%s,id=%s"\ + % (image_filename, image_format, driver_id) + pci_add_cmd = "device_add id=%s,driver=%s,drive=%s" % \ + (id, tested_model, driver_id) + driver_output = vm.monitor.cmd(driver_add_cmd) + # Check if the device is support in qemu + devices_support = vm.monitor.cmd("%s ?" % cmd_type) + if len(re.findall(tested_model, devices_support)) > 0: + add_output = vm.monitor.cmd(pci_add_cmd) + else: + raise error.TestError("%s doesn't support device: %s" % (cmd_type, + tested_model)) + after_add = vm.monitor.info("pci") + if not id in after_add: + raise error.TestFail("Add device failed. Hypervisor command is: %s" + ". Output: %r" % (pci_add_cmd, add_output)) # Define a helper function to delete the device def pci_del(ignore_failure=False): - slot_id = "0" + add_output.split(",")[2].split()[1] - cmd = "pci_del pci_addr=%s" % slot_id + if cmd_type == "pci_add": + slot_id = "0" + add_output.split(",")[2].split()[1] + cmd = "pci_del pci_addr=%s" % slot_id + elif cmd_type == "device_add": + cmd = "device_del %s" % id # This should be replaced by a proper monitor method call vm.monitor.cmd(cmd) -- 1.7.1 _______________________________________________ Autotest mailing list [email protected] http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
