[KVM-AUTOTEST PATCH v2] KVM test: minor pci_hotplug fixes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



- Put the PCI device removal code in a finally clause.
- Use kvm_vm.get_image_filename() instead of os.path.join().
It's a bit cleaner because if we ever change the names of image parameters
we'll only have to change the code in one place.
Also, the way os.path.join() was used lead to image filenames being prefixed
with 'images/' twice, e.g. 'images/images/foo.qcow2'.
- Make some failure messages clearer.
- Remove 'only Fedora Ubuntu Windows' from the fmt_raw variant.
'only' works for things that have already been defined, but the guests are
defined later.
- Remove unused 'modprobe_acpiphp' parameter.
- Change 'online disk' to 'online' in pci_test_cmd for Windows ('online disk'
doesn't seem to work).
- Remove the unneeded telnet/ssh/guest_port parameters from the Windows
block_hotplug parameters.

Changes from previous version:
- When deleting the PCI device compare the output of 'info pci' rather than the
output of the pci_del command.
- If an exception is raised in the 'try' block, do not raise an exception in
the device deletion code, because it will mask the first exception.
- After pci_del, give the device some time to disappear from 'info pci'.

Signed-off-by: Michael Goldish <mgoldish@xxxxxxxxxx>
---
 client/tests/kvm/kvm_tests.cfg.sample |    7 +--
 client/tests/kvm/tests/pci_hotplug.py |  120 ++++++++++++++++++---------------
 2 files changed, 67 insertions(+), 60 deletions(-)

diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
index f271a09..326ae20 100644
--- a/client/tests/kvm/kvm_tests.cfg.sample
+++ b/client/tests/kvm/kvm_tests.cfg.sample
@@ -181,7 +181,6 @@ variants:
     - nic_hotplug:  install setup unattended_install
         type = pci_hotplug
         pci_type = nic
-        modprobe_acpiphp = no
         reference_cmd = lspci
         find_pci_cmd = 'lspci | tail -n1'
         pci_test_cmd = 'nslookup www.redhat.com'
@@ -223,7 +222,6 @@ variants:
                 image_format_stg = qcow2
             - fmt_raw:
                 image_format_stg = raw
-                only Fedora Ubuntu Windows
 
     - system_reset: install setup unattended_install
         type = boot
@@ -538,13 +536,10 @@ variants:
             nic_virtio:
                 match_string = "VirtIO Ethernet"
         block_hotplug:
-            use_telnet = yes
-            ssh_port = 23
-            guest_port_ssh = 23
             wait_secs_for_hook_up = 10
             reference_cmd = wmic diskdrive list brief
             find_pci_cmd = wmic diskdrive list brief
-            pci_test_cmd = echo select disk 1 > dt && echo online disk >> dt && echo detail disk >> dt && echo exit >> dt && diskpart /s dt
+            pci_test_cmd = echo select disk 1 > dt && echo online >> dt && echo detail disk >> dt && echo exit >> dt && diskpart /s dt
 
         variants:
             - Win2000:
diff --git a/client/tests/kvm/tests/pci_hotplug.py b/client/tests/kvm/tests/pci_hotplug.py
index 3ad9ea2..d8f34f8 100644
--- a/client/tests/kvm/tests/pci_hotplug.py
+++ b/client/tests/kvm/tests/pci_hotplug.py
@@ -1,6 +1,6 @@
 import logging, os
 from autotest_lib.client.common_lib import error
-import kvm_subprocess, kvm_test_utils, kvm_utils
+import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_vm
 
 
 def run_pci_hotplug(test, params, env):
@@ -21,8 +21,8 @@ def run_pci_hotplug(test, params, env):
     session = kvm_test_utils.wait_for_login(vm)
 
     # Modprobe the module if specified in config file
-    if params.get("modprobe_module"):
-        module = params.get("modprobe_module")
+    module = params.get("modprobe_module")
+    if module:
         if session.get_command_status("modprobe %s" % module):
             raise error.TestError("Modprobe module '%s' failed" % module)
 
@@ -38,61 +38,73 @@ def run_pci_hotplug(test, params, env):
     if test_type == "nic":
         pci_add_cmd = "pci_add pci_addr=auto nic model=%s" % tested_model
     elif test_type == "block":
-        image_name = params.get("image_name_stg")
-        image_filename = "%s.%s" % (image_name, params.get("image_format_stg"))
-        image_dir = os.path.join(test.bindir, "images")
-        storage_name = os.path.join(image_dir, image_filename)
+        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" %
-                                    (storage_name, tested_model))
+                       (image_filename, tested_model))
 
     # Implement pci_add
     s, add_output = vm.send_monitor_cmd(pci_add_cmd)
     if not "OK domain" in add_output:
         raise error.TestFail("Add device failed. Hypervisor command is: %s. "
-                             "Output: %s" % (pci_add_cmd, add_output))
-
-    # Compare the output of 'info pci'
+                             "Output: %r" % (pci_add_cmd, add_output))
     s, after_add = vm.send_monitor_cmd("info pci")
-    if after_add == info_pci_ref:
-        raise error.TestFail("No new PCI device shown after executing "
-                             "hypervisor command: 'info pci'")
-
-    # Define a helper function to compare the output
-    def new_shown():
-        o = session.get_command_output(params.get("reference_cmd"))
-        if reference == o:
-            return False
-        return True
-
-    secs = int(params.get("wait_secs_for_hook_up"))
-    if not kvm_utils.wait_for(new_shown, 30, secs, 3):
-        raise error.TestFail("No new device shown in output of command "
-                             "executed inside the guest: %s" %
-                             params.get("reference_cmd"))
-
-    # Define a helper function to catch PCI device string
-    def find_pci():
-        output = session.get_command_output(params.get("find_pci_cmd"))
-        if not params.get("match_string") in output:
-            return False
-        return True
-
-    if not kvm_utils.wait_for(find_pci, 30, 3, 3):
-        raise error.TestFail("PCI model not found: %s. Command is: %s" %
-                             (tested_model, params.get("find_pci_cmd")))
-
-    # Test the newly added device
-    s, o = session.get_command_status_output(params.get("pci_test_cmd"))
-    if s != 0:
-        raise error.TestFail("Check for %s device failed after PCI hotplug. "
-                             "Output: %s" % (test_type, o))
-
-    # Delete the added pci device
-    slot_id = "0" + add_output.split(",")[2].split()[1]
-    cmd = "pci_del pci_addr=%s" % slot_id
-    s, after_del = vm.send_monitor_cmd(cmd)
-    if after_del == after_add:
-        raise error.TestFail("Failed to hot remove PCI device: %s. "
-                             "Hypervisor command: %s" % (tested_model, cmd))
-
-    session.close()
+
+    # 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
+        vm.send_monitor_cmd(cmd)
+
+        def device_removed():
+            s, after_del = vm.send_monitor_cmd("info pci")
+            return after_del != after_add
+
+        if (not kvm_utils.wait_for(device_removed, 10, 0, 1)
+            and not ignore_failure):
+            raise error.TestFail("Failed to hot remove PCI device: %s. "
+                                 "Hypervisor command: %s" % (tested_model,
+                                                             cmd))
+
+    try:
+        # Compare the output of 'info pci'
+        if after_add == info_pci_ref:
+            raise error.TestFail("No new PCI device shown after executing "
+                                 "hypervisor command: 'info pci'")
+
+        # Define a helper function to compare the output
+        def new_shown():
+            o = session.get_command_output(params.get("reference_cmd"))
+            return o != reference
+
+        secs = int(params.get("wait_secs_for_hook_up"))
+        if not kvm_utils.wait_for(new_shown, 30, secs, 3):
+            raise error.TestFail("No new device shown in output of command "
+                                 "executed inside the guest: %s" %
+                                 params.get("reference_cmd"))
+
+        # Define a helper function to catch PCI device string
+        def find_pci():
+            o = session.get_command_output(params.get("find_pci_cmd"))
+            return params.get("match_string") in o
+
+        if not kvm_utils.wait_for(find_pci, 30, 3, 3):
+            raise error.TestFail("PCI %s %s device not found in guest. "
+                                 "Command was: %s" %
+                                 (tested_model, test_type,
+                                  params.get("find_pci_cmd")))
+
+        # Test the newly added device
+        s, o = session.get_command_status_output(params.get("pci_test_cmd"))
+        if s != 0:
+            raise error.TestFail("Check for %s device failed after PCI "
+                                 "hotplug. Output: %r" % (test_type, o))
+
+        session.close()
+
+    except:
+        pci_del(ignore_failure=True)
+        raise
+
+    else:
+        pci_del()
-- 
1.5.4.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux