From: Amos Kong <akong@xxxxxxxxxx> Original nic hotplug test only adds a netdev to guest, but it doesn't add a nic device to guest and check the network status of new interface. This test only works with latest qemu-kvm. Changes from v1: * Style fixes * Don't sleep before erroring out the test * Don't close serial session Signed-off-by: Jason Wang <jasowang@xxxxxxxxxx> Signed-off-by: Amos Kong <akong@xxxxxxxxxx> --- client/tests/kvm/tests/nic_hotplug.py | 144 ++++++++++++++++++++++++++++++++ client/tests/kvm/tests_base.cfg.sample | 7 ++- 2 files changed, 150 insertions(+), 1 deletions(-) create mode 100644 client/tests/kvm/tests/nic_hotplug.py diff --git a/client/tests/kvm/tests/nic_hotplug.py b/client/tests/kvm/tests/nic_hotplug.py new file mode 100644 index 0000000..9dc003f --- /dev/null +++ b/client/tests/kvm/tests/nic_hotplug.py @@ -0,0 +1,144 @@ +import logging, os, commands, re, time +from autotest_lib.client.common_lib import error +import kvm_subprocess, kvm_test_utils, kvm_utils, kvm_vm + + +def run_nic_hotplug(test, params, env): + """ + Test hotplug of NIC devices + + 1) Boot up guest with one nic + 2) Add a host network device through monitor cmd and check if it's added + 3) Add nic device through monitor cmd and check if it's added + 4) Check if new interface gets ip address + 5) Disable primary link of guest + 6) Ping guest new ip from host + 7) Delete nic device and netdev + 8) Re-enable primary link of guest + + @param test: KVM test object. + @param params: Dictionary with the test parameters. + @param env: Dictionary with test environment. + """ + vm = kvm_test_utils.get_living_vm(env, params.get("main_vm")) + timeout = int(params.get("login_timeout", 360)) + guest_delay = int(params.get("guest_delay", 20)) + session_serial = kvm_test_utils.wait_for_login(vm, timeout=timeout, + serial=True) + + # Modprobe the module if specified in config file + module = params.get("modprobe_module") + if module: + session_serial.get_command_output("modprobe %s" % module) + + def netdev_add(vm): + netdev_id = kvm_utils.generate_random_id() + attach_cmd = ("netdev_add tap,id=%s,script=%s" % + (netdev_id, kvm_utils.get_path(vm.root_dir, + params.get("nic_script")))) + netdev_extra_params = params.get("netdev_extra_params") + if netdev_extra_params: + attach_cmd += ",%s" % netdev_extra_params + logging.info("Adding netdev through %s" % attach_cmd) + vm.monitor.cmd(attach_cmd) + + network = vm.monitor.info("network") + if netdev_id not in network: + logging.error(network) + raise error.TestError("Fail to add netdev: %s" % netdev_id) + else: + return netdev_id + + def netdev_del(vm, id): + vm.monitor.cmd("netdev_del %s" % id) + + network = vm.monitor.info("network") + if id in network: + logging.error(network) + raise error.TestError("Fail to remove netdev %s" % id) + + def nic_add(vm, model, netdev_id, mac): + """ + Add a nic to virtual machine + + @vm: VM object + @model: nic model + @netdev_id: id of netdev + @mac: Mac address of new nic + """ + id = kvm_utils.generate_random_id() + if model=="virtio": model="virtio-net-pci" + device_add_cmd = "device_add %s,netdev=%s,mac=%s,id=%s" % (model, + netdev_id, + mac, id) + logging.info("Adding nic through %s" % device_add_cmd) + vm.monitor.cmd(device_add_cmd) + + qdev = vm.monitor.info("qtree") + if id not in qdev: + logging.error(qdev) + raise error.TestFail("Device %s was not plugged into qdev" + "tree" % id) + else: + return id + + def nic_del(vm, id, wait=True): + """ + Remove the nic from pci tree. + + @vm: VM object + @id: the nic id + @wait: Whether need to wait for the guest to unplug the device + """ + nic_del_cmd = "device_del %s" % id + vm.monitor.cmd(nic_del_cmd) + if wait: + logging.info("waiting for the guest to finish the unplug") + if not kvm_utils.wait_for(lambda: id not in + vm.monitor.info("qtree"), + guest_delay, 5 ,1): + logging.error(vm.monitor.info("qtree")) + raise error.TestError("Device is not unplugged by " + "guest, please check whether the " + "hotplug module was loaded in guest"); + + logging.info("Attach a virtio nic to vm") + mac = kvm_utils.generate_mac_address(vm.instance, 1) + if not mac: + mac = "00:00:02:00:00:02" + netdev_id = netdev_add(vm) + device_id = nic_add(vm, "virtio", netdev_id, mac) + + if "Win" not in params.get("guest_name", ""): + session_serial.sendline("dhclient %s &" % + kvm_test_utils.get_linux_ifname(session_serial, mac)) + + logging.info("Shutting down the primary link") + vm.monitor.cmd("set_link %s down" % vm.netdev_id[0]) + + try: + logging.info("Waiting for new nic's ip address acquisition...") + if not kvm_utils.wait_for(lambda: (vm.address_cache.get(mac) is + not None), 10, 1): + raise error.TestFail("Could not get ip address of new nic") + ip = vm.address_cache.get(mac) + if not kvm_utils.verify_ip_address_ownership(ip, mac): + raise error.TestFail("Could not verify the ip address of new nic") + else: + logging.info("Got the ip address of new nic: %s" % ip) + + logging.info("Ping test the new nic ...") + s, o = kvm_test_utils.ping(ip, 100) + if s != 0: + logging.error(o) + raise error.TestFail("New nic failed ping test") + + logging.info("Detaching a virtio nic from vm") + nic_del(vm, device_id) + netdev_del(vm,netdev_id) + + finally: + vm.free_mac_address(1) + logging.info("Re-enabling the primary link") + vm.monitor.cmd("set_link %s up" % vm.netdev_id[0]) + diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample index 833e3a6..c0859f0 100644 --- a/client/tests/kvm/tests_base.cfg.sample +++ b/client/tests/kvm/tests_base.cfg.sample @@ -528,7 +528,6 @@ variants: relogin_timeout = 240 - nic_hotplug: install setup unattended_install.cdrom - type = pci_hotplug pci_type = nic reference_cmd = lspci find_pci_cmd = 'lspci | tail -n1' @@ -544,6 +543,12 @@ variants: - nic_e1000: pci_model = e1000 match_string = "Gigabit Ethernet Controller" + variants: + - default: + type = pci_hotplug + - additional: + type = nic_hotplug + - block_hotplug: install setup unattended_install.cdrom type = pci_hotplug -- 1.7.2.3 -- 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