All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yolkfull Chow <yzhou@redhat.com>
To: kvm@vger.kernel.org
Cc: autotest@test.kernel.org, lmr@redhat.com
Subject: Re: [PATCH] Add a subtest pci_hotplug in kvm test
Date: Tue, 4 Aug 2009 16:47:45 +0800	[thread overview]
Message-ID: <20090804084745.GC8907@aFu.nay.redhat.com> (raw)
In-Reply-To: <20090804075359.GB8907@aFu.nay.redhat.com>


Sorry for just submitting a wrong patch file which including a bug, please ignore previous one
and review following patch:

Differences between previous patch:

- Use a loop waiting for some seconds to compare output of a command
- Use a loop waiting for some seconds to catch string indicates which
  PCI device
- Add option kill_vm_on_error in block_hotplug since once a model failed
  to be hot removed, it will affect next model

A better result I can get is:
-------
./scan_results.py
test                                                       status	seconds info
----                                                       ------	------- ----
Fedora.11.32.nic_hotplug.nic_8139                          GOOD	107     completed successfully
Fedora.11.32.nic_hotplug.nic_virtio                        FAIL	76	Not found pci model:virtio; Command is:lspci | tail -n1
Fedora.11.32.block_hotplug.fmt_qcow2.block_virtio          GOOD	92	completed successfully
Fedora.11.32.block_hotplug.fmt_qcow2.block_scsi            GOOD	48	completed successfully
RHEL.5.3.i386.nic_hotplug.nic_8139                         GOOD	144     completed successfully
RHEL.5.3.i386.nic_hotplug.nic_virtio                       GOOD	48	completed successfully
RHEL.5.3.i386.block_hotplug.fmt_qcow2.block_virtio         GOOD	47	completed successfully
RHEL.5.3.i386.block_hotplug.fmt_qcow2.block_scsi           GOOD	47	completed successfully
Win2008.32.nic_hotplug.nic_8139                            GOOD	141     completed successfully
Win2008.32.nic_hotplug.nic_virtio                          GOOD	99	completed successfully
Win2008.32.block_hotplug.fmt_qcow2.block_scsi              GOOD	90	completed successfully
----                                                       GOOD	953


Signed-off-by: Yolkfull Chow <yzhou@redhat.com>
---
 client/tests/kvm/kvm.py               |    1 +
 client/tests/kvm/kvm_tests.cfg.sample |   67 +++++++++++++++++++++
 client/tests/kvm/kvm_tests.py         |  105 +++++++++++++++++++++++++++++++++
 client/tests/kvm/kvm_vm.py            |    2 +
 4 files changed, 175 insertions(+), 0 deletions(-)

diff --git a/client/tests/kvm/kvm.py b/client/tests/kvm/kvm.py
index 070e463..f985388 100644
--- a/client/tests/kvm/kvm.py
+++ b/client/tests/kvm/kvm.py
@@ -56,6 +56,7 @@ class kvm(test.test):
                 "linux_s3":     test_routine("kvm_tests", "run_linux_s3"),
                 "stress_boot":  test_routine("kvm_tests", "run_stress_boot"),
                 "timedrift":    test_routine("kvm_tests", "run_timedrift"),
+                "pci_hotplug":   test_routine("kvm_tests", "run_pci_hotplug"),
                 }
 
         # Make it possible to import modules from the test's bindir
diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
index 7cd12cb..9af1bc8 100644
--- a/client/tests/kvm/kvm_tests.cfg.sample
+++ b/client/tests/kvm/kvm_tests.cfg.sample
@@ -118,6 +118,53 @@ variants:
         kill_vm = yes
         kill_vm_gracefully = no
 
+    - nic_hotplug:
+        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'
+        wait_secs_for_hook_up = 3
+        variants:
+            - nic_8139:
+                pci_model = rtl8139
+                match_string = "8139"
+            - nic_virtio:
+                pci_model = virtio
+                match_string = "Virtio network device"
+            - nic_e1000:
+                pci_model = e1000
+                match_string = "Gigabit Ethernet Controller"
+
+    - block_hotplug:
+        type = pci_hotplug
+        pci_type = block
+        reference_cmd = lspci
+        find_pci_cmd = 'lspci | tail -n1'
+        images += " stg"
+        boot_drive_stg = no
+        image_name_stg = storage
+        image_size_stg = 1G
+        remove_image_stg = yes
+        force_create_image_stg = yes
+        pci_test_cmd = "yes | mke2fs `fdisk -l 2>&1 | awk '/\/dev\/[sv]d[a-z] doesn/ {print $2}'`"
+        wait_secs_for_hook_up = 3
+        kill_vm_on_error = yes
+        variants:
+            - block_virtio:
+                pci_model = virtio
+                match_string = "Virtio block device"
+            - block_scsi:
+                pci_model = scsi
+                match_string = "SCSI"
+        variants:
+            - fmt_qcow2:
+                image_format_stg = qcow2
+            - fmt_raw:
+                image_format_stg = raw
+                only Fedora Ubuntu Windows
+
 
 # NICs
 variants:
@@ -259,6 +306,10 @@ variants:
             - RHEL:
                 no setup
                 ssh_prompt = "\[root@.{0,50}][\#\$] "
+                nic_hotplug:
+                    modprobe_module = acpiphp
+                block_hotplug:
+                    modprobe_module = acpiphp
 
                 variants:
                     - 5.3.i386:
@@ -345,6 +396,22 @@ variants:
             # Alternative host load:
             #host_load_command = "dd if=/dev/urandom of=/dev/null"
             host_load_instances = 8
+        nic_hotplug:
+            reference_cmd = ipconfig /all
+            find_pci_cmd = ipconfig /all | find "Description"
+            wait_secs_for_hook_up = 10
+            nic_e1000:
+                match_string = "Intel(R) PRO/1000 MT Network Connection"
+            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
 
         variants:
             - Win2000:
diff --git a/client/tests/kvm/kvm_tests.py b/client/tests/kvm/kvm_tests.py
index 9784ec9..b553003 100644
--- a/client/tests/kvm/kvm_tests.py
+++ b/client/tests/kvm/kvm_tests.py
@@ -743,3 +743,108 @@ def run_timedrift(test, params, env):
                              % drift_total)
 
     session.close()
+
+
+def run_pci_hotplug(test, params, env):
+    """
+    Test pci devices' hotplug
+    1) PCI add a deivce (NIC / block)
+    2) Compare output of hypervisor command `info pci`
+    3) Compare output of guest command `reference_cmd`
+    4) Verify whether pci_model is shown in `pci_find_cmd`
+    5) Check whether the newly added pci device works fine
+    6) PCI delete the device, verify whether could remove the pci device
+
+    @param test:   kvm test object
+    @param params: Dictionary with the test parameters
+    @param env:    Dictionary with test environment.
+    """
+    vm = kvm_utils.env_get_vm(env, params.get("main_vm"))
+    if not vm:
+        raise error.TestError("VM object not found in environment")
+    if not vm.is_alive():
+        raise error.TestError("VM seems to be dead; Test requires a living VM")
+
+    logging.info("Waiting for guest to be up...")
+
+    session = kvm_utils.wait_for(vm.ssh_login, 240, 0, 2)
+    if not session:
+        raise error.TestFail("Could not log into guest")
+
+    logging.info("Logged in")
+
+    # Modprobe the module if specified in config file
+    if params.get("modprobe_module"):
+        module = params.get("modprobe_module")
+        if session.get_command_status("modprobe %s" % module):
+            raise error.TestError("Modprobe module '%s' failed" % module)
+
+    # Get output of command 'info pci' as reference
+    s, info_pci_ref = vm.send_monitor_cmd("info pci")
+
+    # Get output of command as reference
+    reference = session.get_command_output(params.get("reference_cmd"))
+
+    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_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)
+        pci_add_cmd = ("pci_add pci_addr=auto storage file=%s,if=%s" %
+                                    (storage_name, 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'
+    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 in 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("Not found pci model:%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:
+        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()
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index eba9b84..4a7a85c 100644
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -225,6 +225,8 @@ class VM:
 
         for image_name in kvm_utils.get_sub_dict_names(params, "images"):
             image_params = kvm_utils.get_sub_dict(params, image_name)
+            if image_params.get("boot_drive") == "no":
+                continue
             qemu_cmd += " -drive file=%s" % get_image_filename(image_params,
                                                                image_dir)
             if image_params.get("drive_format"):
-- 
1.6.2.5


  reply	other threads:[~2009-08-04  8:47 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-30 11:11 [PATCH] Add a subtest pci_hotplug in kvm test Yolkfull Chow
2009-06-30 13:58 ` Dor Laor
2009-07-01  2:09   ` Yolkfull Chow
2009-08-03  9:19   ` Yolkfull Chow
2009-08-03 11:37     ` Dor Laor
2009-08-04  3:30       ` Yolkfull Chow
2009-08-04  7:54         ` Yolkfull Chow
2009-08-04  8:47           ` Yolkfull Chow [this message]
2009-08-03 13:21     ` Glauber Costa
2009-06-30 22:40 ` Lucas Meneghel Rodrigues
2009-07-03  5:57 Yolkfull Chow
2009-07-03  6:00 ` Yolkfull Chow

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090804084745.GC8907@aFu.nay.redhat.com \
    --to=yzhou@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=lmr@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.