コード例 #1
0
ファイル: usb_redir.py プロジェクト: huangyum/tp-qemu
 def _generate_usb_redir_cmdline():
     extra_params = ''
     _backend = 'socket' if 'socket' in backend else backend
     chardev_id = usbredir_params.get("chardev_id",
                                      "chardev_%s" % usbredirdev_name)
     chardev_params = Params({'backend': _backend, 'id': chardev_id})
     if backend == 'spicevmc':
         chardev_params['debug'] = usbredir_params.get('chardev_debug')
         chardev_params['name'] = usbredir_params.get('chardev_name')
     else:
         chardev_params['host'] = usbredir_params['chardev_host']
         chardev_params['port'] = free_port
         chardev_params['server'] = usbredir_params.get(
             'chardev_server')
         chardev_params['wait'] = usbredir_params.get('chardev_wait')
     chardev = qdevices.CharDevice(chardev_params, chardev_id)
     usbredir_dev = qdevices.QDevice('usb-redir',
                                     aobject=usbredirdev_name)
     usbredir_filter = usbredir_params.get("usbdev_option_filter")
     usbredir_bootindex = usbredir_params.get("usbdev_option_bootindex")
     usbredir_bus = usbredir_params.get("usb_bus")
     usbredir_dev.set_param('id', 'usb-%s' % usbredirdev_name)
     usbredir_dev.set_param('chardev', chardev_id)
     usbredir_dev.set_param('filter', usbredir_filter)
     usbredir_dev.set_param('bootindex', usbredir_bootindex)
     usbredir_dev.set_param('bus', usbredir_bus)
     extra_params += ' '.join(
         [chardev.cmdline(), usbredir_dev.cmdline()])
     return extra_params
コード例 #2
0
ファイル: balloon_hotplug.py プロジェクト: wkf31156/tp-qemu
def run(test, params, env):
    """
    Test hotplug of balloon devices.

    1) Boot up guest w/o balloon device.
    2) Hoplug balloon device and check hotplug successfully or not.
    3) Do memory balloon.
    4) Unplug balloon device and check unplug successfully or not.

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :param env:    Dictionary with test environment.
    """
    pause = float(params.get("virtio_balloon_pause", 3.0))
    idx = 0
    err = ""
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    error_context.context("Hotplug and unplug balloon device in a loop",
                          logging.info)
    for i in xrange(int(params.get("balloon_repeats", 3))):
        vm.devices.set_dirty()
        new_dev = qdevices.QDevice("virtio-balloon-pci",
                                   {'id': 'balloon%d' % idx},
                                   parent_bus={'aobject': 'pci.0'})

        error_context.context("Hotplug balloon device for %d times" % (i + 1),
                              logging.info)
        out = new_dev.hotplug(vm.monitor)
        if out:
            err += "\nHotplug monitor output: %s" % out
        # Pause
        time.sleep(pause)
        ver_out = new_dev.verify_hotplug(out, vm.monitor)
        if not ver_out:
            err += ("\nDevice is not in qtree %ss after hotplug:\n%s" %
                    (pause, vm.monitor.info("qtree")))

        error_context.context(
            "Check whether balloon device work after hotplug", logging.info)
        balloon_check.run(test, params, env)

        error_context.context("Unplug balloon device for %d times" % (i + 1),
                              logging.info)
        out = new_dev.unplug(vm.monitor)
        if out:
            err += "\nUnplug monitor output: %s" % out
        # Pause
        time.sleep(pause)
        ver_out = new_dev.verify_unplug(out, vm.monitor)
        if not ver_out:
            err += ("\nDevice is still in qtree %ss after unplug:\n%s" %
                    (pause, vm.monitor.info("qtree")))

        if err:
            logging.error(vm.monitor.info("qtree"))
            raise exceptions.TestFail("Error occurred while hotpluging "
                                      "virtio-pci. Iteration %s, monitor "
                                      "output:%s" % (i, err))
コード例 #3
0
def run(test, params, env):
    """
    Test hotplug/unplug of rng device
    1) Boot up w/o rng device
    2) Hotplug one or more rng devices
    3) Run random read test after hotplug
    4) Unplug rng devices
    5) Repeat step 2 ~ step4 (option)


    :param test: QEMU test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment
    """

    login_timeout = int(params.get("login_timeout", 360))
    repeat_times = int(params.get("repeat_times", 1))
    rng_num = int(params.get("rng_num", 1))
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    vm.wait_for_login(timeout=login_timeout)

    for i in xrange(repeat_times):
        dev_list = []
        logging.info("Hotplug/unplug rng devices the %sth times", (i + 1))

        for num in xrange(rng_num):
            vm.devices.set_dirty()
            new_dev = qdevices.QDevice("virtio-rng-pci",
                                       {'id': 'virtio-rng-pci-%d' % num})
            dev_list.append(new_dev)
            error_context.context("Hotplug %s" % new_dev, logging.info)
            output = new_dev.hotplug(vm.monitor)
            time.sleep(2)

            error_context.context("Check %sfrom qtree after hotplug" % new_dev,
                                  logging.info)
            qtree_output = new_dev.verify_hotplug(output, vm.monitor)
            if not qtree_output:
                msg = "no % device in qtree after hotplug"
                msg += "the %sth time" % (new_dev, i)
                raise exceptions.TestFail(msg)
            logging.info("virtio-rng-pci-%d is hotpluged successfully" % num)
        sub_test = params.get("sub_test_after_hotplug")
        if sub_test:
            utils_test.run_virt_sub_test(test, params, env, sub_test)

        for dev in dev_list:
            error_context.context("Unplug %s" % dev, logging.info)
            output = dev.unplug(vm.monitor)
            time.sleep(2)

            error_context.context("Check rng device from qtree after unplug",
                                  logging.info)
            qtree_output = dev.verify_unplug(output, vm.monitor)
            if not qtree_output:
                msg = "Still get %s in qtree after unplug %s times" % (dev, i)
                raise exceptions.TestFail(msg)
            logging.info("%s is unpluged successfully" % dev)
コード例 #4
0
    def test_pci(self):
        qdev = self.create_qdev('vm1')
        devs = qdev.machine_by_params(ParamsDict({'machine_type': 'pc'}))
        for dev in devs:
            qdev.insert(dev)
        # machine creates main pci (pci.0)
        # buses root.1 pci_switch pci_bridge
        # root.1: ioh3420(pci.0)
        # pci_switch: x3130(root.1)
        # pci_bridge: pci-bridge(root.1)
        devs = qdev.pcic_by_params('root.1', {'pci_bus': 'pci.0',
                                              'type': 'ioh3420'})
        qdev.insert(devs)
        devs = qdev.pcic_by_params('pci_switch', {'pci_bus': 'root.1',
                                                  'type': 'x3130'})

        qdev.insert(devs)
        devs = qdev.pcic_by_params('pci_bridge', {'pci_bus': 'root.1',
                                                  'type': 'pci-bridge'})
        qdev.insert(devs)

        qdev.insert(qdevices.QDevice("ahci", {'id': 'in_bridge'},
                                     parent_bus={'type': ('PCI', 'PCIE'),
                                                 'aobject': 'pci_bridge'}))

        qdev.insert(qdevices.QDevice("ahci", {'id': 'in_switch1'},
                                     parent_bus={'type': ('PCI', 'PCIE'),
                                                 'aobject': 'pci_switch'}))
        qdev.insert(qdevices.QDevice("ahci", {'id': 'in_switch2'},
                                     parent_bus={'type': ('PCI', 'PCIE'),
                                                 'aobject': 'pci_switch'}))
        qdev.insert(qdevices.QDevice("ahci", {'id': 'in_switch3'},
                                     parent_bus={'type': ('PCI', 'PCIE'),
                                                 'aobject': 'pci_switch'}))

        qdev.insert(qdevices.QDevice("ahci", {'id': 'in_root1'},
                                     parent_bus={'type': ('PCI', 'PCIE'),
                                                 'aobject': 'root.1'}))

        qdev.insert(qdevices.QDevice("ahci", {'id': 'in_pci.0'},
                                     parent_bus={'type': ('PCI', 'PCIE'),
                                                 'aobject': 'pci.0'}))

        exp = ("-machine pc -device ioh3420,id=root.1,bus=pci.0,addr=02 "
               "-device x3130-upstream,id=pci_switch,bus=root.1,addr=00 "
               "-device pci-bridge,id=pci_bridge,bus=root.1,addr=01,"
               "chassis_nr=1 -device ahci,id=in_bridge,bus=pci_bridge,addr=01"
               " -device xio3130-downstream,bus=pci_switch,id=pci_switch.0,"
               "addr=00,chassis=1 -device ahci,id=in_switch1,bus=pci_switch.0"
               ",addr=00 "
               "-device xio3130-downstream,bus=pci_switch,id=pci_switch.1,"
               "addr=01,chassis=2 -device ahci,id=in_switch2,bus=pci_switch.1"
               ",addr=00 "
               "-device xio3130-downstream,bus=pci_switch,id=pci_switch.2,"
               "addr=02,chassis=3 -device ahci,id=in_switch3,bus=pci_switch.2"
               ",addr=00 "
               "-device ahci,id=in_root1,bus=root.1,addr=02 "
               "-device ahci,id=in_pci.0,bus=pci.0,addr=03")
        out = qdev.cmdline()
        assert out == exp, (out, exp)
コード例 #5
0
    def test_qdev_equal(self):
        qdev1 = self.create_qdev('vm1', allow_hotplugged_vm='no')
        qdev2 = self.create_qdev('vm1', allow_hotplugged_vm='no')
        qdev3 = self.create_qdev('vm1', allow_hotplugged_vm='yes')
        monitor = MockHMPMonitor()

        assert qdev1 == qdev2, ("Init qdevs are not alike\n%s\n%s" %
                                (qdev1.str_long(), qdev2.str_long()))

        # Insert a device to qdev1
        dev = qdevices.QDevice('dev1', {'id': 'dev1'})
        qdev1.insert(dev)

        assert qdev1 != qdev2, ("Different qdevs match:\n%s\n%s" %
                                (qdev1.str_long(), qdev2.str_long()))

        # Insert similar device to qdev2
        dev = qdevices.QDevice('dev1', {'id': 'dev1'})
        qdev2.insert(dev)

        assert qdev1 == qdev2, ("Similar qdevs are not alike\n%s\n%s" %
                                (qdev1.str_long(), qdev2.str_long()))

        # Hotplug similar device to qdev3
        dev = qdevices.QDevice('dev1', {'id': 'dev1'})
        dev.hotplug = lambda _monitor: ""  # override the hotplug method
        dev.verify_hotplug = lambda _out, _monitor: True
        qdev3.simple_hotplug(dev, monitor)
        assert qdev1 == qdev3, ("Similar hotplugged qdevs are not alike\n%s\n"
                                "%s" % (qdev1.str_long(), qdev2.str_long()))

        # Eq. is not symmetrical, qdev1 doesn't allow hotplugged VMs.
        assert qdev3 != qdev1, ("Similar hotplugged qdevs match even thought "
                                "qdev1 doesn't allow hotplugged VM\n%s\n%s" %
                                (qdev1.str_long(), qdev2.str_long()))

        qdev2.__qemu_help = "I support only this :-)"  # pylint: disable=W0212
        assert qdev1 == qdev2, ("qdevs of different qemu versions match:\n%s\n"
                                "%s" % (qdev1.str_long(), qdev2.str_long()))
コード例 #6
0
def run(test, params, env):
    """
    hotplug guest agent device

    :param test: kvm test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment.
    """
    def check_status_unplug(out, dev):
        if out is True:
            logging.debug("Unplug %s successfully", dev)
        else:
            test.fail("Error occurred while unpluging %s" % dev)

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    char_backend = params["backend_char_plug"]
    char_id = params["id_char_plug"]
    gagent_name = params["gagent_name"]
    char_path = vm.get_serial_console_filename(gagent_name)
    params["path_char_plug"] = char_path
    dev_driver = params["dev_driver"]
    dev_id = params["dev_id"]
    error_context.context("hotplug guest agent device", logging.info)
    params_char_plug = params.object_params("char_plug")
    chardev = qdevices.CharDevice(params=params_char_plug)
    chardev.hotplug(vm.monitor, vm.devices.qemu_version)
    device = qdevices.QDevice(dev_driver)
    device.set_param("chardev", char_id)
    device.set_param("id", dev_id)
    device.set_param("name", gagent_name)
    device.hotplug(vm.monitor, vm.devices.qemu_version)

    error_context.context("install and start guest agent", logging.info)
    guest_agent_run(test, params, env)

    error_context.context("hot unplug guest agent device", logging.info)
    device.unplug(vm.monitor)
    device_status = device.verify_unplug("", vm.monitor)
    check_status_unplug(device_status, "virtserialport")
    time.sleep(3)
    chardev.unplug(vm.monitor)
    chardev_status = chardev.verify_unplug("", vm.monitor)
    check_status_unplug(chardev_status, "socket")
    vm.verify_alive()
コード例 #7
0
    def test_q_device(self):
        """ QDevice tests """
        qdevice = qdevices.QDevice('ahci', {'addr': '0x7'})

        self.assertEqual(str(qdevice), "a'ahci'", "Alternative name error %s "
                         "!= %s" % (str(qdevice), "a'ahci'"))

        qdevice['id'] = 'ahci1'
        self.assertEqual(str(qdevice), "q'ahci1'", "Id name error %s "
                         "!= %s" % (str(qdevice), "q'ahci1'"))

        exp = "device_add ahci,addr=0x7,id=ahci1"
        out = qdevice.hotplug_hmp()
        self.assertEqual(out, exp, "HMP command corrupted:\n%s\n%s"
                         % (out, exp))

        exp = ("('device_add', OrderedDict([('addr', '0x7'), "
               "('driver', 'ahci'), ('id', 'ahci1')]))")
        out = str(qdevice.hotplug_qmp())
        self.assertEqual(out, exp, "QMP command corrupted:\n%s\n%s"
                         % (out, exp))
コード例 #8
0
ファイル: block_hotplug.py プロジェクト: Zhengtong/tp-qemu
def run(test, params, env):
    """
    Test hotplug of block devices.

    1) Boot up guest with/without block device(s).
    2) Hoplug block device and verify
    3) Do read/write data on hotplug block.
    4) Unplug block device and verify

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :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):
        """
        Find all disks in guest.
        """
        if params.get("os_type") == "linux":
            pattern = params.get("get_disk_pattern", "^/dev/vd[a-z]*$")
        elif params.get("os_type") == "windows":
            pattern = "^\d+"
            cmd = params.get("get_disk_index", "wmic diskdrive get index")
        else:
            test.cancel("Unsupported OS type '%s'" % params.get("os_type"))

        session = vm.wait_for_login(timeout=timeout)
        output = session.cmd_output_safe(cmd)
        disks = re.findall(pattern, output, re.M)
        session.close()
        return disks

    def get_new_disk(disk1, disk2):
        """
        Get the different disk between disk1 and disk2.
        """
        disk = list(set(disk2).difference(set(disk1)))
        return disk

    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
    pause = float(params.get("virtio_block_pause", 10.0))
    blk_num = int(params.get("blk_num", 1))
    repeat_times = int(params.get("repeat_times", 3))
    timeout = int(params.get("login_timeout", 360))
    disk_op_timeout = int(params.get("disk_op_timeout", 360))
    get_disk_cmd = params.get("get_disk_cmd")
    context_msg = "Running sub test '%s' %s"
    device_list = []
    disk_index = params.objects("disk_index")
    disk_letter = params.objects("disk_letter")

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    for iteration in xrange(repeat_times):
        error_context.context(
            "Hotplug block device (iteration %d)" % iteration, logging.info)

        sub_type = params.get("sub_type_before_plug")
        if sub_type:
            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 xrange(blk_num):
            device = qdevices.QDevice(pci_type)
            if params.get("need_plug") == "yes":
                disks_before_plug = find_disk(vm, get_disk_cmd)

                if params.get("need_controller", "no") == "yes":
                    controller_model = params.get("controller_model")
                    controller = qdevices.QDevice(controller_model)
                    bus_extra_param = params.get("bus_extra_params_%s" %
                                                 img_list[num + 1])
                    # TODO:Add iothread support for qdevice
                    if bus_extra_param and "iothread" in bus_extra_param:
                        match = re.search("iothread=(\w+)", bus_extra_param)
                        if match:
                            qdevice_params = {"iothread": match.group(1)}
                            controller.params.update(qdevice_params)
                    controller.hotplug(vm.monitor)
                    ver_out = controller.verify_hotplug("", vm.monitor)
                    if not ver_out:
                        err = "%s is not in qtree after hotplug" % controller_model
                        test.fail(err)

                drive = qdevices.QRHDrive("block%d" % num)
                drive.set_param("file", find_image(img_list[num + 1]))
                drive.set_param("format", img_format_type)
                drive_id = drive.get_param("id")
                drive.hotplug(vm.monitor)

                device.set_param("drive", drive_id)
                device.set_param("id", "block%d" % num)
                blk_extra_param = params.get("blk_extra_params_%s" %
                                             img_list[num + 1])
                if blk_extra_param and "iothread" in blk_extra_param:
                    match = re.search("iothread=(\w+)", blk_extra_param)
                    if match:
                        device.set_param("iothread", match.group(1))
                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")
            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])
                new_disks = find_disk(vm, get_disk_cmd)

            device_list.append(device)
            if not new_disks:
                test.fail("Cannot find new disk after hotplug.")

            if params.get("need_plug") == "yes":
                disk = new_disks[0]
            else:
                disk = new_disks[num]

            session = vm.wait_for_login(timeout=timeout)
            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 vm.is_dead():
                return

        sub_type = params.get("sub_type_before_unplug")
        if sub_type:
            error_context.context(context_msg % (sub_type, "before unplug"),
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, sub_type)

        for num in xrange(blk_num):
            error_context.context(
                "Unplug block device (iteration %d)" % iteration, logging.info)
            disks_before_unplug = find_disk(vm, get_disk_cmd)
            device_list[num].unplug(vm.monitor)
            device_list[num].verify_unplug("", vm.monitor)
            unplug_status = utils_misc.wait_for(
                lambda: len(
                    get_new_disk(find_disk(vm, get_disk_cmd),
                                 disks_before_unplug)) != 0, pause)
            if not unplug_status:
                test.fail("Failed to unplug disks")

        sub_type = params.get("sub_type_after_unplug")
        if sub_type:
            error_context.context(context_msg % (sub_type, "after unplug"),
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, sub_type)
コード例 #9
0
def run(test, params, env):
    """
    Test hotplug of block devices.

    1) Boot up guest with/without block device(s).
    2) Hoplug block device and verify
    3) Do read/write data on hotplug block.
    4) Unplug block device and verify

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :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):
        """
        Find all disks in guest.
        """
        if params.get("os_type") == "linux":
            pattern = params.get("get_disk_pattern", "^/dev/vd[a-z]*$")
        else:
            pattern = "^\d+"
            cmd = params.get("get_disk_index", "wmic diskdrive get index")

        session = vm.wait_for_login(timeout=timeout)
        output = session.cmd_output_safe(cmd)
        disks = re.findall(pattern, output, re.M)
        session.close()
        return disks

    def get_new_disk(disk1, disk2):
        """
        Get the different disk between disk1 and disk2.
        """
        disk = list(set(disk2).difference(set(disk1)))
        return disk

    img_list = params.get("images").split()
    img_format_type = params.get("img_format_type", "qcow2")
    pci_type = params.get("pci_type", "virtio-blk-pci")
    pause = float(params.get("virtio_block_pause", 5.0))
    blk_num = int(params.get("blk_num", 1))
    repeat_times = int(params.get("repeat_times", 3))
    timeout = int(params.get("login_timeout", 360))
    disk_op_timeout = int(params.get("disk_op_timeout", 360))
    get_disk_cmd = params.get("get_disk_cmd")
    context_msg = "Running sub test '%s' %s"
    device_list = []

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    for i in xrange(repeat_times):
        error_context.context("Hotplug block device (iteration %d)" % i,
                              logging.info)

        sub_type = params.get("sub_type_before_plug")
        if sub_type:
            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 xrange(blk_num):
            device = qdevices.QDevice(pci_type)
            if params.get("need_plug") == "yes":
                if params.get("need_controller", "no") == "yes":
                    controller_model = params.get("controller_model")
                    controller = qdevices.QDevice(controller_model)
                    controller.hotplug(vm.monitor)
                    ver_out = controller.verify_hotplug("", vm.monitor)
                    if not ver_out:
                        err = "%s is not in qtree after hotplug" % controller_model
                        raise exceptions.TestFail(err)

                disks_before_plug = find_disk(vm, get_disk_cmd)

                drive = qdevices.QRHDrive("block%d" % num)
                drive.set_param("file", find_image(img_list[num + 1]))
                drive.set_param("format", img_format_type)
                drive_id = drive.get_param("id")
                drive.hotplug(vm.monitor)

                device.set_param("drive", drive_id)
                device.set_param("id", "block%d" % num)
                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
                    raise exceptions.TestFail(err)
                time.sleep(pause)

                disks_after_plug = find_disk(vm, get_disk_cmd)
                new_disks = get_new_disk(disks_before_plug, disks_after_plug)
            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])
                new_disks = find_disk(vm, get_disk_cmd)

            device_list.append(device)
            if not new_disks:
                raise exceptions.TestFail(
                    "Cannot find new disk after hotplug.")

            if params.get("need_plug") == "yes":
                disk = new_disks[0]
            else:
                disk = new_disks[num]

            error_context.context("Check block device after hotplug.",
                                  logging.info)
            if params.get("pci_test_cmd"):
                if params.get("os_type") == "linux":
                    test_cmd = params.get("pci_test_cmd") % (disk, disk)
                else:
                    test_cmd = re.sub("PCI_NUM", "%s" % (num + 1),
                                      params.get("pci_test_cmd"))
                session = vm.wait_for_login(timeout=timeout)
                s, o = session.cmd_status_output(test_cmd,
                                                 timeout=disk_op_timeout)
                session.close()
                if s:
                    raise exceptions.TestFail("Check for block device failed "
                                              "after hotplug, Output: %r" % o)

        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)

        sub_type = params.get("sub_type_before_unplug")
        if sub_type:
            error_context.context(context_msg % (sub_type, "before unplug"),
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, sub_type)

        for num in xrange(blk_num):
            error_context.context("Unplug block device (iteration %d)" % i,
                                  logging.info)
            device_list[num].unplug(vm.monitor)
            device_list[num].verify_unplug("", vm.monitor)
            time.sleep(pause)

        sub_type = params.get("sub_type_after_unplug")
        if sub_type:
            error_context.context(context_msg % (sub_type, "after unplug"),
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, sub_type)
コード例 #10
0
def run(test, params, env):
    """
    Test hotplug of balloon devices.

    1) Boot up guest w/o balloon device.
    2) Hoplug balloon device and check hotplug successfully or not.
    3) Do memory balloon.
    4) Reboot/shutdown guest after hotplug balloon device(option)
    5) Do memory balloon after guest reboot(option)
    6) Unplug balloon device and check unplug successfully or not.
    7) Reboot/shutdown guest after unplug balloon device(option)

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :param env:    Dictionary with test environment.
    """
    def run_pm_test(pm_test, plug_type):
        """
        Run pm(reboot/system_reset/shutdown) related test after balloon
        device is hot-plug or hot-unplug
        :param pm_test: power management test name,e.g. reboot/shutdown
        :param plug_type:balloon device plug operation,e.g.hot_plug or hot_unplug
        """
        error_context.context(
            "Run %s test after %s balloon device" % (pm_test, plug_type),
            logging.info)
        utils_test.run_virt_sub_test(test, params, env, pm_test)

    pause = float(params.get("virtio_balloon_pause", 3.0))
    pm_test_after_plug = params.get("pm_test_after_plug")
    pm_test_after_unplug = params.get("pm_test_after_unplug")
    idx = 0
    err = ""
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    error_context.context("Hotplug and unplug balloon device in a loop",
                          logging.info)
    for i in xrange(int(params.get("balloon_repeats", 3))):
        vm.devices.set_dirty()
        new_dev = qdevices.QDevice("virtio-balloon-pci",
                                   {'id': 'balloon%d' % idx},
                                   parent_bus={'aobject': 'pci.0'})

        error_context.context("Hotplug balloon device for %d times" % (i + 1),
                              logging.info)
        out = new_dev.hotplug(vm.monitor)
        if out:
            err += "\nHotplug monitor output: %s" % out
        # Pause
        time.sleep(pause)
        ver_out = new_dev.verify_hotplug(out, vm.monitor)
        if not ver_out:
            err += ("\nDevice is not in qtree %ss after hotplug:\n%s" %
                    (pause, vm.monitor.info("qtree")))

        error_context.context(
            "Check whether balloon device work after hotplug", logging.info)
        balloon_check.run(test, params, env)

        if pm_test_after_plug:
            run_pm_test(pm_test_after_plug, "hot-plug")
            # run balloon test after reboot,skip followed test if
            # pm_test_after_plug is shutdown
            if vm.is_alive():
                balloon_check.run(test, params, env)
            else:
                return

        error_context.context("Unplug balloon device for %d times" % (i + 1),
                              logging.info)
        out = new_dev.unplug(vm.monitor)
        if out:
            err += "\nUnplug monitor output: %s" % out
        # Pause
        time.sleep(pause)
        ver_out = new_dev.verify_unplug(out, vm.monitor)
        if not ver_out:
            err += ("\nDevice is still in qtree %ss after unplug:\n%s" %
                    (pause, vm.monitor.info("qtree")))
        if err:
            logging.error(vm.monitor.info("qtree"))
            raise exceptions.TestFail("Error occurred while hotpluging "
                                      "virtio-pci. Iteration %s, monitor "
                                      "output:%s" % (i, err))
        else:
            if pm_test_after_unplug:
                run_pm_test(pm_test_after_unplug, "hot-unplug")
                if not vm.is_alive():
                    return
コード例 #11
0
def run(test, params, env):
    """
    Test hotplug of balloon devices.

    1) Boot up guest w/o balloon device.
    2) Hoplug balloon device and check hotplug successfully or not.
    3) Install balloon service and check its status in windows guests.
    4) Do memory balloon.
    5) Reboot/shutdown guest after hotplug balloon device(option)
    6) Do memory balloon after guest reboot(option)
    7) Unplug balloon device and check unplug successfully or not.
    8) Reboot/shutdown guest after unplug balloon device(option)

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :param env:    Dictionary with test environment.
    """
    def run_pm_test(pm_test, plug_type):
        """
        Run pm(reboot/system_reset/shutdown) related test after balloon
        device is hot-plug or hot-unplug
        :param pm_test: power management test name,e.g. reboot/shutdown
        :param plug_type:balloon device plug operation,e.g.hot_plug or hot_unplug
        """
        error_context.context(
            "Run %s test after %s balloon device" % (pm_test, plug_type),
            logging.info)
        utils_test.run_virt_sub_test(test, params, env, pm_test)

    def enable_balloon_service():
        """
        Install balloon service and check its status in windows guests
        """
        if params['os_type'] != 'windows':
            return
        error_context.context(
            "Install and check balloon service in windows "
            "guest", logging.info)
        session = vm.wait_for_login()
        driver_name = params.get("driver_name", "balloon")
        session = utils_test.qemu.windrv_check_running_verifier(
            session, vm, test, driver_name)
        balloon_test.configure_balloon_service(session)

        output = balloon_test.operate_balloon_service(session, "status")
        if not re.search(r"running", output.lower(), re.M):
            test.error("Ballooon service status is not running")
        session.close()

    pm_test_after_plug = params.get("pm_test_after_plug")
    pm_test_after_unplug = params.get("pm_test_after_unplug")
    unplug_timeout = params.get("unplug_timeout", 30)
    idx = 0
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    balloon_device = params.get("balloon_device", "virtio-balloon-pci")
    error_context.context("Hotplug and unplug balloon device in a loop",
                          logging.info)
    for i in range(int(params.get("balloon_repeats", 3))):
        vm.devices.set_dirty()
        new_dev = qdevices.QDevice(
            balloon_device, {'id': 'balloon%d' % idx},
            parent_bus={'aobject': params.get("balloon_bus", 'pci.0')})

        error_context.context("Hotplug balloon device for %d times" % (i + 1),
                              logging.info)
        out = vm.devices.simple_hotplug(new_dev, vm.monitor)
        if out[1] is False:
            test.fail("Failed to hotplug balloon in iteration %s, %s" %
                      (i, out[0]))

        # temporary workaround for migration
        vm.params["balloon"] = "balloon%d" % idx
        vm.params["balloon_dev_devid"] = "balloon%d" % idx
        vm.params["balloon_dev_add_bus"] = "yes"
        devs = vm.devices.get_by_params({"id": 'balloon%d' % idx})
        vm.params["balloon_pci_bus"] = devs[0]["bus"]

        if params['os_type'] == 'windows':
            balloon_test = BallooningTestWin(test, params, env)
        else:
            balloon_test = BallooningTestLinux(test, params, env)
        min_sz, max_sz = balloon_test.get_memory_boundary()

        enable_balloon_service()

        error_context.context(
            "Check whether balloon device work after hotplug", logging.info)
        balloon_test.balloon_memory(int(random.uniform(min_sz, max_sz)))

        if pm_test_after_plug:
            run_pm_test(pm_test_after_plug, "hot-plug")
            # run balloon test after reboot,skip followed test if
            # pm_test_after_plug is shutdown
            if vm.is_alive():
                balloon_test.balloon_memory(int(random.uniform(min_sz,
                                                               max_sz)))
            else:
                return

        if params['os_type'] == 'windows':
            time.sleep(10)

        error_context.context("Unplug balloon device for %d times" % (i + 1),
                              logging.info)

        out = vm.devices.simple_unplug(devs[0].get_aid(),
                                       vm.monitor,
                                       timeout=unplug_timeout)
        if out[1] is False:
            test.fail("Failed to unplug balloon in iteration %s, %s" %
                      (i, out[0]))
        time.sleep(2)

        if params.get("migrate_after_unplug", "no") == "yes":
            error_context.context("Migrate after hotunplug balloon device",
                                  logging.info)
            # temporary workaround for migration
            del vm.params["balloon"]
            del vm.params["balloon_dev_devid"]
            del vm.params["balloon_dev_add_bus"]
            del vm.params["balloon_pci_bus"]
            vm.migrate(float(params.get("mig_timeout", "3600")))

        if pm_test_after_unplug:
            run_pm_test(pm_test_after_unplug, "hot-unplug")
            if not vm.is_alive():
                return

    error_context.context("Verify guest alive!", logging.info)
    vm.verify_kernel_crash()
コード例 #12
0
def run(test, params, env):
    """
    Test virtio-fs by sharing the data between host and guest.
    Steps:
        1. Create shared directories on the host.
        2. Set capability on the host.
        3. Run virtiofsd daemons on capability shell env.
        4. Boot a guest on the host with virtiofs options.
        5. Log into guest then mount the virtiofs targets.
        6. Generate files or run stress on the mount points inside guest.

    :param test: QEMU test object.
    :param params: Dictionary with the test parameters.
    :param env: Dictionary with test environment.
    """
    def get_viofs_exe(session):
        """
        Get viofs.exe from virtio win iso,such as E:\viofs\2k19\amd64
        """
        media_type = params["virtio_win_media_type"]
        try:
            get_drive_letter = getattr(virtio_win,
                                       "drive_letter_%s" % media_type)
            get_product_dirname = getattr(virtio_win,
                                          "product_dirname_%s" % media_type)
            get_arch_dirname = getattr(virtio_win,
                                       "arch_dirname_%s" % media_type)
        except AttributeError:
            test.error("Not supported virtio win media type '%s'", media_type)
        viowin_ltr = get_drive_letter(session)
        if not viowin_ltr:
            test.error("Could not find virtio-win drive in guest")
        guest_name = get_product_dirname(session)
        if not guest_name:
            test.error("Could not get product dirname of the vm")
        guest_arch = get_arch_dirname(session)
        if not guest_arch:
            test.error("Could not get architecture dirname of the vm")

        exe_middle_path = ("{name}\\{arch}" if media_type == "iso" else
                           "{arch}\\{name}").format(name=guest_name,
                                                    arch=guest_arch)
        exe_file_name = "virtiofs.exe"
        exe_find_cmd = 'dir /b /s %s\\%s | findstr "\\%s\\\\"'
        exe_find_cmd %= (viowin_ltr, exe_file_name, exe_middle_path)
        exe_path = session.cmd(exe_find_cmd).strip()
        logging.info("Found exe file '%s'", exe_path)
        return exe_path

    # data io config
    cmd_dd = params.get('cmd_dd')
    cmd_md5 = params.get('cmd_md5')
    io_timeout = params.get_numeric('io_timeout')

    # remove capability config
    cmd_create_fs_source = params.get('cmd_create_fs_source')
    cmd_run_virtiofsd = params.get('cmd_run_virtiofsd')
    capability = params.get('capability')
    cmd_capsh_print = params.get('cmd_capsh_print')
    cmd_capsh_drop = params.get('cmd_capsh_drop')

    # set trusted config
    cmd_yum_attr = params.get('cmd_yum_attr')
    cmd_set_trusted = params.get('cmd_set_trusted')
    cmd_get_trusted = params.get('cmd_get_trusted')
    cmd_create_file = params.get('cmd_create_file')
    cmd_set_capability = params.get('cmd_set_capability')
    cmd_get_capability = params.get('cmd_get_capability')
    cmd_echo_file = params.get('cmd_echo_file')

    # set fs daemon path
    target = params.get('fs_target')
    fs_source = params.get('fs_source_dir')
    base_dir = params.get('fs_source_base_dir', data_dir.get_data_dir())

    if not os.path.isabs(fs_source):
        fs_source = os.path.join(base_dir, fs_source)
    if os.path.exists(fs_source):
        shutil.rmtree(fs_source, ignore_errors=True)
    logging.info("Create filesystem source %s.", fs_source)
    os.makedirs(fs_source)

    sock_path = os.path.join(
        data_dir.get_tmp_dir(), '-'.join(
            ('avocado-vt-vm1', 'viofs', 'virtiofsd.sock')))

    # set capability
    cmd_capsh_drop = (cmd_capsh_drop % capability)
    error_context.context("Remove capability on host.", logging.info)
    session = aexpect.ShellSession(
        cmd_capsh_drop,
        auto_close=False,
        output_func=utils_misc.log_line,
        output_params=('virtiofs_fs-virtiofs.log', ),
        prompt=r"^\[.*\][\#\$]\s*$")
    output = session.cmd_output(cmd_capsh_print)
    logging.info("Check current capability is %s.", output)
    if capability in output:
        test.error("It's failed to check the trusted info from the host.")

    # run daemon
    session.sendline(cmd_create_fs_source)
    cmd_run_virtiofsd = cmd_run_virtiofsd % sock_path
    cmd_run_virtiofsd += ' -o source=%s' % fs_source
    cmd_run_virtiofsd += params.get('fs_binary_extra_options')
    logging.info('Running daemon command %s.', cmd_run_virtiofsd)
    session.sendline(cmd_run_virtiofsd)

    # insert devices
    vm = env.get_vm(params.get("main_vm"))
    vm.devices, _ = vm.make_create_command()

    machine_type = params.get("machine_type", "")
    qbus_type = "PCI"
    if machine_type.startswith("q35") or machine_type.startswith("arm64"):
        qbus_type = "PCIE"

    devices = []
    vfsd = qdevices.QCustomDevice('chardev null,id=serial_vfsd',
                                  aobject='fs',
                                  child_bus=qdevices.QUnixSocketBus(
                                      sock_path, 'fs'))
    devices.append(vfsd)

    char_params = Params()
    char_params["backend"] = "socket"
    char_params["id"] = 'virtiofs_fs'
    sock_bus = {'busid': sock_path}
    char = qdevices.CharDevice(char_params, parent_bus=sock_bus)
    char.set_aid('virtiofs_fs')
    devices.append(char)

    qdriver = "vhost-user-fs"
    if "-mmio:" in machine_type:
        qdriver += "-device"
        qbus_type = "virtio-bus"
    elif machine_type.startswith("s390"):
        qdriver += "-ccw"
        qbus_type = "virtio-bus"
    else:
        qdriver += "-pci"

    bus = {"type": qbus_type}

    dev_params = {
        "id": "vufs_virtiofs_fs",
        "chardev": char.get_qid(),
        "tag": target
    }
    fs_driver_props = json.loads(params.get("fs_driver_props", "{}"))
    dev_params.update(fs_driver_props)
    vufs = qdevices.QDevice(qdriver, params=dev_params, parent_bus=bus)
    vufs.set_aid('virtiofs_fs')
    devices.append(vufs)

    vm.devices.insert(devices)

    # Since if 'redirs' has a value, the vm.create() method will reset the devices.
    # So set 'redirs' to empty for a workaround.
    vm.params['redirs'] = ''

    vm.create()
    vm.verify_alive()
    is_windows = params.get("os_type") == "windows"
    session = vm.wait_for_login()

    if is_windows:
        cmd_timeout = params.get_numeric("cmd_timeout", 120)
        driver_name = params["driver_name"]
        install_path = params["install_path"]
        check_installed_cmd = params["check_installed_cmd"] % install_path

        # Check whether windows driver is running,and enable driver verifier
        session = utils_test.qemu.windrv_check_running_verifier(
            session, vm, test, driver_name)
        # Install winfsp tool
        error_context.context("Install winfsp for windows guest.",
                              logging.info)
        is_installed = session.cmd_status(check_installed_cmd) == 0
        if is_installed:
            logging.info("Winfsp tool is already installed.")
        else:
            install_cmd = utils_misc.set_winutils_letter(
                session, params["install_cmd"])
            session.cmd(install_cmd, cmd_timeout)
            if not utils_misc.wait_for(
                    lambda: not session.cmd_status(check_installed_cmd), 60):
                test.error("Winfsp tool is not installed.")

    fs_params = params.object_params('fs')
    fs_target = fs_params.get("fs_target")
    fs_dest = fs_params.get("fs_dest")
    host_data = os.path.join(fs_source, 'fs_test')

    if not is_windows:
        error_context.context(
            "Create a destination directory %s "
            "inside guest." % fs_dest, logging.info)
        utils_misc.make_dirs(fs_dest, session)
        error_context.context(
            "Mount virtiofs target %s to %s inside"
            " guest." % (fs_target, fs_dest), logging.info)
        if not utils_disk.mount(
                fs_target, fs_dest, 'virtiofs', session=session):
            test.fail('Mount virtiofs target failed.')
    else:
        error_context.context("Start virtiofs service in guest.", logging.info)
        viofs_sc_create_cmd = params["viofs_sc_create_cmd"]
        viofs_sc_start_cmd = params["viofs_sc_start_cmd"]
        viofs_sc_query_cmd = params["viofs_sc_query_cmd"]

        logging.info("Check if virtiofs service is registered.")
        status, output = session.cmd_status_output(viofs_sc_query_cmd)
        if "not exist as an installed service" in output:
            logging.info("Register virtiofs service in windows guest.")
            exe_path = get_viofs_exe(session)
            viofs_sc_create_cmd = viofs_sc_create_cmd % exe_path
            sc_create_s, sc_create_o = session.cmd_status_output(
                viofs_sc_create_cmd)
            if sc_create_s != 0:
                test.fail("Failed to register virtiofs service, output is %s" %
                          sc_create_o)

        logging.info("Check if virtiofs service is started.")
        status, output = session.cmd_status_output(viofs_sc_query_cmd)
        if "RUNNING" not in output:
            logging.info("Start virtiofs service.")
            sc_start_s, sc_start_o = session.cmd_status_output(
                viofs_sc_start_cmd)
            if sc_start_s != 0:
                test.fail("Failed to start virtiofs service, output is %s" %
                          sc_start_o)
        else:
            logging.info("Virtiofs service is running.")

        # get fs dest for vm
        virtio_fs_disk_label = fs_target
        error_context.context(
            "Get Volume letter of virtio fs target, the disk"
            "lable is %s." % virtio_fs_disk_label, logging.info)
        vol_con = "VolumeName='%s'" % virtio_fs_disk_label
        vol_func = utils_misc.get_win_disk_vol(session, condition=vol_con)
        volume_letter = utils_misc.wait_for(lambda: vol_func, 120)
        if volume_letter is None:
            test.fail("Could not get virtio-fs mounted volume letter.")
        fs_dest = "%s:" % volume_letter

    guest_file = os.path.join(fs_dest, 'fs_test')
    logging.info("The guest file in shared dir is %s.", guest_file)

    try:
        # No extended attributes (file steams) in virtio-fs for windows
        if not is_windows:
            if cmd_set_trusted:
                error_context.context(
                    "Trusted attribute test without "
                    "%s for linux guest" % capability, logging.info)
                host_attributes = params["host_attributes"]
                guest_trusted = params["guest_trusted"]
                file_capability = params["file_capability"]
                logging.info("Set a trusted on guest.")
                session.cmd(cmd_yum_attr)
                session.cmd(cmd_set_trusted)
                output = session.cmd_output(cmd_get_trusted)
                logging.info(
                    "Failed to check the trusted attribute from "
                    "guest, the output is %s.", output)
                if guest_trusted not in output:
                    test.fail(
                        "It's failed to check the trusted info from the guest."
                    )

                process.run(cmd_yum_attr)
                output = str(
                    process.run('getfattr %s' % fs_source).stdout.strip())
                logging.info("The host file trusted is %s.", output)
                if host_attributes not in output:
                    test.fail("Failed to check the trusted attribute from "
                              "host, the output is %s." % output)

                session.cmd(cmd_create_file)
                error_context.context(
                    "Privileged capabilities test without "
                    "%s for linux guest" % capability, logging.info)
                session.cmd(cmd_set_capability)
                output = session.cmd_output(cmd_get_capability)
                logging.info("The guest file capability is %s.", output)
                if file_capability not in output:
                    test.fail("Failed to check the trusted attribute from "
                              "guest, the output is %s." % output)
                logging.info(
                    "Modify file content and check the file capability.")
                session.cmd(cmd_echo_file)
                output = session.cmd_output(cmd_get_capability)
                logging.info("The guest change file capability is %s.", output)
                if file_capability in output:
                    test.fail(
                        "Still can get capability after file content is changed."
                    )

        if cmd_dd:
            error_context.context(
                "Creating file under %s inside guest." % fs_dest, logging.info)
            session.cmd(cmd_dd % guest_file, io_timeout)

            if not is_windows:
                cmd_md5_vm = cmd_md5 % guest_file
            else:
                guest_file_win = guest_file.replace("/", "\\")
                cmd_md5_vm = cmd_md5 % (volume_letter, guest_file_win)
            md5_guest = session.cmd_output(cmd_md5_vm,
                                           io_timeout).strip().split()[0]

            logging.info(md5_guest)
            md5_host = process.run("md5sum %s" % host_data,
                                   io_timeout).stdout_text.strip().split()[0]
            if md5_guest != md5_host:
                test.fail('The md5 value of host is not same to guest.')

    finally:
        if not is_windows:
            utils_disk.umount(fs_target, fs_dest, 'virtiofs', session=session)
            utils_misc.safe_rmdir(fs_dest, session=session)
        session.close()
        vm.destroy()
        utils_misc.safe_rmdir(fs_source)
コード例 #13
0
    def test_usb_bus(self):
        """ Tests the specific handlings of QUSBBus """
        usbc1 = qbuses.QUSBBus(2, 'usb1.0', 'uhci')

        # Insert device into usb controller, default port
        dev = qdevices.QDevice('usb-kbd', parent_bus={'type': 'uhci'})
        assert usbc1.insert(dev) == []

        # Insert usb-hub into usb controller, default port
        dev = qdevices.QDevice('usb-hub', parent_bus={'type': 'uhci'})
        assert usbc1.insert(dev) == []
        hub1 = dev.child_bus[-1]

        # Insert usb-hub into usb-hub, exact port
        dev = qdevices.QDevice('usb-hub', {'port': '2.4'},
                               parent_bus={'type': 'uhci'})
        assert hub1.insert(dev) == []
        hub2 = dev.child_bus[-1]

        # Insert usb-hub into usb-hub in usb-hub, exact port
        dev = qdevices.QDevice('usb-hub', {'port': '2.4.3'},
                               parent_bus={'type': 'uhci'})
        assert hub2.insert(dev) == []
        hub3 = dev.child_bus[-1]
        # verify that port is updated correctly
        self.assertEqual("2.4.3", dev.get_param("port"))

        # Insert usb-device into usb-hub in usb-hub in usb-hub, exact port
        dev = qdevices.QDevice('usb-kbd', {'port': '2.4.3.1'},
                               parent_bus={'type': 'uhci'})
        assert hub3.insert(dev) == []
        # Insert usb-device into usb-hub in usb-hub in usb-hub, default port
        dev = qdevices.QDevice('usb-kbd', parent_bus={'type': 'uhci'})
        assert hub3.insert(dev) == []

        # Try to insert device into specific port which belongs to inferior bus
        out = hub2.insert(
            qdevices.QDevice('usb-kbd', {'port': '2.4.3.3'},
                             parent_bus={'type': 'uhci'}))
        assert out == "BusId"

        # Try to insert device into specific port which belongs to superior bus
        out = hub2.insert(
            qdevices.QDevice('usb-kbd', {'port': '2.4'},
                             parent_bus={'type': 'uhci'}))
        assert out == "BusId"

        # Try to insert device into specific port which belongs to same level
        # but different port
        out = hub2.insert(
            qdevices.QDevice('usb-kbd', {'port': '2.3.4'},
                             parent_bus={'type': 'uhci'}))
        assert out == "BusId"

        # Force insert device with port which belongs to other hub
        dev = qdevices.QDevice('usb-hub', {'port': '2.4.3.4'},
                               parent_bus={'type': 'uhci'})

        # Check the overall buses correctness
        self.assertEqual("usb1.0(uhci): {1:a'usb-kbd',2:a'usb-hub'}",
                         usbc1.str_short())
        self.assertEqual("usb1.0(uhci): {4:a'usb-hub'}", hub1.str_short())
        self.assertEqual("usb1.0(uhci): {3:a'usb-hub'}", hub2.str_short())
        self.assertEqual("usb1.0(uhci): {1:a'usb-kbd',2:a'usb-kbd'}",
                         hub3.str_short())
コード例 #14
0
    def test_qdev_low_level(self):
        """ Test low level functions """
        qdev = self.create_qdev('vm1')

        # Representation state (used for hotplug or other nasty things)
        out = qdev.get_state()
        assert out == -1, "qdev state is incorrect %s != %s" % (out, 1)

        qdev.set_dirty()
        out = qdev.get_state()
        self.assertEqual(out, 1, "qdev state is incorrect %s != %s" % (out, 1))

        qdev.set_dirty()
        out = qdev.get_state()
        self.assertEqual(out, 2, "qdev state is incorrect %s != %s" % (out, 1))

        qdev.set_clean()
        out = qdev.get_state()
        self.assertEqual(out, 1, "qdev state is incorrect %s != %s" % (out, 1))

        qdev.set_clean()
        out = qdev.get_state()
        self.assertEqual(out, 0, "qdev state is incorrect %s != %s" % (out, 1))

        qdev.reset_state()
        out = qdev.get_state()
        assert out == -1, "qdev state is incorrect %s != %s" % (out, 1)

        # __create_unique_aid
        dev = qdevices.QDevice()
        qdev.insert(dev)
        out = dev.get_aid()
        self.assertEqual(out, '__0', "incorrect aid %s != %s" % (out, '__0'))

        dev = qdevices.QDevice(None, {'id': 'qid'})
        qdev.insert(dev)
        out = dev.get_aid()
        self.assertEqual(out, 'qid', "incorrect aid %s != %s" % (out, 'qid'))

        # has_option
        out = qdev.has_option('device')
        self.assertEqual(out, True)

        out = qdev.has_option('missing_option')
        self.assertEqual(out, False)

        # has_device
        out = qdev.has_device('ide-drive')
        self.assertEqual(out, True)

        out = qdev.has_device('missing_device')
        self.assertEqual(out, False)

        # get_help_text
        out = qdev.get_help_text()
        self.assertEqual(out, QEMU_HELP)

        # has_hmp_cmd
        self.assertTrue(qdev.has_hmp_cmd('pcie_aer_inject_error'))
        self.assertTrue(qdev.has_hmp_cmd('c'))
        self.assertTrue(qdev.has_hmp_cmd('cont'))
        self.assertFalse(qdev.has_hmp_cmd('off'))
        self.assertFalse(qdev.has_hmp_cmd('\ndump-guest-memory'))
        self.assertFalse(qdev.has_hmp_cmd('The'))

        # has_qmp_cmd
        self.assertTrue(qdev.has_qmp_cmd('device_add'))
        self.assertFalse(qdev.has_qmp_cmd('RAND91'))

        # Add some buses
        bus1 = qbuses.QPCIBus('pci.0', 'pci', 'a_pci0')
        qdev.insert(qdevices.QDevice(params={'id': 'pci0'}, child_bus=bus1))
        bus2 = qbuses.QPCIBus('pci.1', 'pci', 'a_pci1')
        qdev.insert(qdevices.QDevice(child_bus=bus2))
        bus3 = qbuses.QPCIBus('pci.2', 'pci', 'a_pci2')
        qdev.insert(qdevices.QDevice(child_bus=bus3))
        bus4 = qbuses.QPCIBus('pcie.0', 'pcie', 'a_pcie0')
        qdev.insert(qdevices.QDevice(child_bus=bus4))

        # get_buses (all buses of this type)
        out = qdev.get_buses({'type': 'pci'})
        self.assertEqual(
            len(out), 3, 'get_buses should return 3 buses but '
            'returned %s instead:\n%s' % (len(out), out))

        # get_first_free_bus (last added bus of this type)
        out = qdev.get_first_free_bus({'type': 'pci'}, [None, None])
        self.assertEqual(bus3, out)

        # fill the first pci bus
        for _ in xrange(32):
            qdev.insert(qdevices.QDevice(parent_bus={'type': 'pci'}))

        # get_first_free_bus (last one is full, return the previous one)
        out = qdev.get_first_free_bus({'type': 'pci'}, [None, None])
        self.assertEqual(bus2, out)

        # list_named_buses
        out = qdev.list_missing_named_buses('pci.', 'pci', 5)
        self.assertEqual(
            len(out), 2, 'Number of missing named buses is '
            'incorrect: %s != %s\n%s' % (len(out), 2, out))
        out = qdev.list_missing_named_buses('pci.', 'abc', 5)
        self.assertEqual(
            len(out), 5, 'Number of missing named buses is '
            'incorrect: %s != %s\n%s' % (len(out), 2, out))

        # idx_of_next_named_bus
        out = qdev.idx_of_next_named_bus('pci.')
        self.assertEqual(
            out, 3, 'Incorrect idx of next named bus: %s !='
            ' %s' % (out, 3))

        # get_children
        dev = qdevices.QDevice(parent_bus={'aobject': 'a_pci0'})
        bus = qbuses.QPCIBus('test1', 'test', 'a_test1')
        dev.add_child_bus(bus)
        bus = qbuses.QPCIBus('test2', 'test', 'a_test2')
        dev.add_child_bus(bus)
        qdev.insert(dev)
        qdev.insert(qdevices.QDevice(parent_bus={'aobject': 'a_test1'}))
        qdev.insert(qdevices.QDevice(parent_bus={'aobject': 'a_test2'}))
        out = dev.get_children()
        assert len(out) == 2, ("Not all children were listed %d != 2:\n%s" %
                               (len(out), out))

        out = bus.get_device()
        assert out == dev, ("bus.get_device() returned different device "
                            "than the one in which it was plugged:\n"
                            "%s\n%s\n%s" %
                            (out.str_long(), dev.str_long(), qdev.str_long()))
コード例 #15
0
def run(test, params, env):
    """
    Hotplug/unhotplug virtio-vsock device

    1. Boot guest without virtio-vsock-pci device
    2. Hotplug virtio-vsock device
    3. Check device inside guest(lspci/dmesg)
    4. Transfer data from guest to host
    5. Unplug virtio-vsock device
    6. Cancel the vsock process on host
    7. Reboot guest

    :param test: QEMU test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment
    """

    linux_modules.load_module('vhost_vsock')
    vm = env.get_vm(params['main_vm'])
    session = vm.wait_for_login()
    guest_cid = utils_vsock.get_guest_cid(3)
    vsock_id = 'hotplugged_vsock'
    vsock_params = {'id': vsock_id, 'guest-cid': guest_cid}
    vsock_test_tool = params["vsock_test_tool"]
    if '-mmio:' in params.get('machine_type'):
        dev_vsock = qdevices.QDevice('vhost-vsock-device', vsock_params)
    elif params.get('machine_type').startswith("s390"):
        vsock_params['devno'] = params.get('devno')
        dev_vsock = qdevices.QDevice("vhost-vsock-ccw", vsock_params)
    else:
        dev_vsock = qdevices.QDevice('vhost-vsock-pci', vsock_params)
    vm.devices.simple_hotplug(dev_vsock, vm.monitor)
    error_context.context(
        'Check vsock device exist in guest lspci and '
        'dmesg output.', logging.info)
    addr_pattern = params['addr_pattern']
    device_pattern = params['device_pattern']
    check_vsock_cmd = params.get('check_vsock_cmd', 'lspci')
    time.sleep(10)
    lspci_output = session.cmd_output(check_vsock_cmd)
    device_str = re.findall(r'%s\s%s' % (addr_pattern, device_pattern),
                            lspci_output)

    if params.get('dmesg_check') == 'yes':
        if not device_str:
            test.fail('check_vsock_cmd failed, no device "%s"' %
                      device_pattern)
        else:
            address = re.findall(addr_pattern, device_str[0])[0]
            chk_dmesg_cmd = 'dmesg'
            output = re.findall(address, session.cmd_output(chk_dmesg_cmd))
            if not output:
                test.fail('dmesg failed, no info related to %s' % address)
            else:
                error_msg = ''
                for o in output:
                    if re.search(r'fail|error', o, re.I):
                        error_msg += '%s' % o
                        break
                if error_msg:
                    test.fail("dmesg check failed: %s" % error_msg)
    # Transfer data from guest to host
    try:
        if vsock_test_tool == "nc_vsock":
            tool_bin = vsock_test.compile_nc_vsock(test, vm, session)
        if vsock_test_tool == "ncat":
            tool_bin = path.find_command("ncat")
        tmp_file = "/tmp/vsock_file_%s" % utils_misc.generate_random_string(6)
        rec_session = vsock_test.send_data_from_guest_to_host(session,
                                                              tool_bin,
                                                              guest_cid,
                                                              tmp_file,
                                                              file_size=10000)
        vsock_negative_test.check_data_received(test, rec_session, tmp_file)
        vm.devices.simple_unplug(dev_vsock, vm.monitor)
        vsock_negative_test.kill_host_receive_process(test, rec_session)
        vsock_test.check_guest_vsock_conn_exit(test, session)
    finally:
        session.cmd_output("rm -f %s" % tmp_file)
        session.close()
    vm.reboot()
コード例 #16
0
def run(test, params, env):
    """
    Test hotplug of block devices.

    1) Boot up guest without block device.
    2) Hotplug a drive
    2) Hoplug block device with invalid blk params.
    3) Unplug the drive
    4) Hotplug the drive again
    5) Check vm is alive after drive unplug/hotplug

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :param env:    Dictionary with test environment.
    """
    def find_image(image_name):
        """
        Find the path of the iamge.

        :param image_name: name of image.
        :return mage_filename: filename of image.
        """
        image_params = params.object_params(image_name)
        image_filename = storage.get_image_filename(image_params,
                                                    data_dir.get_data_dir())
        return image_filename

    def drive_unplug_plug(drive, vm):
        """
        Unplug drive then replug it.

        :param drive: instance of QRHDrive
        :param vm: Vitual Machine object
        """
        error_context.context("unplug the drive", logging.info)
        drive.unplug(vm.monitor)
        time.sleep(5)
        error_context.context("Hotplug the drive", logging.info)
        drive.hotplug(vm.monitor)

    img_list = params.get("images").split()
    img_format_type = params.get("img_format_type", "qcow2")
    pci_type = params.get("pci_type", "virtio-blk-pci")
    blk_num = int(params.get("blk_num", 1))
    add_block_device = True

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    error_context.context("Hotplug block device", logging.info)
    for num in xrange(blk_num):
        device = qdevices.QDevice(pci_type)
        drive = qdevices.QRHDrive("block%d" % num)
        drive.set_param("file", find_image(img_list[num + 1]))
        drive.set_param("format", img_format_type)
        drive_id = drive.get_param("id")
        drive.hotplug(vm.monitor)
        #add controller if needed
        if params.get("need_controller", "no") == "yes":
            controller_model = params.get("controller_model")
            controller = qdevices.QDevice(controller_model)
            bus_extra_param = params.get("bus_extra_params_%s" %
                                         img_list[num + 1])
            if bus_extra_param:
                key, value = bus_extra_param.split("=")
                qdevice_params = {key: value}
                controller.params.update(qdevice_params)
            try:
                controller.hotplug(vm.monitor)
            except Exception, e:
                if "QMP command 'device_add' failed" in str(e):
                    logging.info(
                        "Failed to add controller with invalid params")
                    drive_unplug_plug(drive, vm)
                    add_block_device = False

        if add_block_device:
            device.set_param("drive", drive_id)
            device.set_param("id", "block%d" % num)
            blk_extra_param = params.get("blk_extra_params_%s" %
                                         img_list[num + 1])
            if blk_extra_param:
                key, value = blk_extra_param.split("=")
                device.set_param(key, value)
            try:
                device.hotplug(vm.monitor)
            except Exception, e:
                if "QMP command 'device_add' failed" in str(e):
                    logging.info("Failed to add block with invalid params")
                    drive_unplug_plug(drive, vm)
コード例 #17
0
ファイル: usb_host.py プロジェクト: PaulYuuu/tp-qemu
def run(test, params, env):
    """
    Test usb host device passthrough

    :param test: kvm test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment.
    """
    def get_usb_host_dev():
        device_list = []
        for device in vm.devices:
            if isinstance(device, qdevices.QDevice):
                if device.get_param("driver") == "usb-host":
                    device_list.append(device)
        return device_list

    def get_vendorid_productid(bus, addr):
        out = process.getoutput("lsusb -v -s %s:%s" % (bus, addr))
        res = re.search(r"idVendor\s+0x(\w+).*idProduct\s+0x(\w+)", out, re.S)
        return (res.group(1), res.group(2))

    @error_context.context_aware
    def usb_dev_hotplug(dev):
        error_context.context("Hotplug usb-host device", logging.info)
        session.cmd_status("dmesg -c")
        vm.devices.simple_hotplug(dev, vm.monitor)
        session.cmd_status("sleep 2")
        session.cmd_status("udevadm settle")
        messages_add = session.cmd("dmesg")
        for line in messages_add.splitlines():
            logging.debug("[dmesg add] %s", line)
        if messages_add.find(match_add) == -1:
            test.fail("kernel didn't detect plugin")

    @error_context.context_aware
    def usb_dev_verify():
        error_context.context("Check usb device in guest", logging.info)
        session.cmd(lsusb_cmd)

    @error_context.context_aware
    def usb_dev_unplug(dev):
        error_context.context("Unplug usb-host device", logging.info)
        session.cmd("dmesg -c")
        vm.devices.simple_unplug(dev, vm.monitor)
        session.cmd_status("sleep 2")
        messages_del = session.cmd("dmesg -c")
        for line in messages_del.splitlines():
            logging.debug("[dmesg del] %s", line)
        if messages_del.find(match_del) == -1:
            test.fail("kernel didn't detect unplug")

    def _get_usb_mount_point():
        """ Get passthrough usb stick mount point """
        dmesg_cmd = "dmesg | grep 'Attached SCSI removable disk'"
        s, o = session.cmd_status_output(dmesg_cmd)
        if s:
            test.error("Fail to get passthrough usb stick in guest.")
        dev = re.findall(r'\[(sd\w+)\]', o)[0]
        mounts_cmd = "cat /proc/mounts | grep /dev/%s" % dev
        s, o = session.cmd_status_output(mounts_cmd)
        if not s:
            s, o = session.cmd_status_output('umount /dev/%s' % dev)
            if s:
                test.error("Fail to umount /dev/%s, output: %s" % (s, o))
        mkfs_cmd = "mkfs.vfat /dev/%s" % dev
        s, o = session.cmd_status_output(mkfs_cmd)
        if s:
            test.error("Fail to build filesystem on usb stick: %s" % o)
        mount_point = "/mnt"
        s, o = session.cmd_status_output("mount /dev/%s %s" %
                                         (dev, mount_point))
        if s:
            test.error("Fail to mount /dev/%s, output: %s" % (s, o))
        return mount_point

    def _usb_stick_io(mount_point, bg=False):
        """
        Do I/O operations on passthrough usb stick
        """
        error_context.context("Read and write on usb stick ", logging.info)
        testfile = os.path.join(mount_point, 'testfile')
        if bg:
            iozone_cmd = params.get("iozone_cmd_bg", " -az -I -g 1g -f %s")
            iozone_thread = BackgroundTest(iozone_test.run,
                                           (iozone_cmd % testfile, ))
            iozone_thread.start()
            if not utils_misc.wait_for(iozone_thread.is_alive, timeout=10):
                test.fail("Fail to start the iozone background test.")
            time.sleep(10)
        else:
            iozone_cmd = params.get("iozone_cmd",
                                    " -a -I -r 64k -s 1m -i 0 -i 1 -f %s")
            iozone_test.run(iozone_cmd % testfile)

    usb_params = {}

    if params.get("usb_negative_test", "no") != "no":
        # Negative test.
        vm = env.get_vm(params["main_vm"])
        vm.verify_alive()
        session = vm.wait_for_login()
        usb_reply_msg_list = params.get("usb_reply_msg").split(";")
        usb_host_device_list = params["usb_host_device_list"].split(",")
        for dev in usb_host_device_list:
            vid, pid = dev.split(":")
            usb_params["vendorid"] = vid
            usb_params["productid"] = pid
            dev = qdevices.QDevice("usb-host", usb_params)
            try:
                vm.devices.simple_hotplug(dev, vm.monitor)
            except QMPCmdError as detail:
                logging.warn(detail)
                for msg in usb_reply_msg_list:
                    if msg in detail.data['desc']:
                        break
                else:
                    test.fail("Could not get expected warning"
                              " msg in negative test, monitor"
                              " returns: '%s'" % detail)
            else:
                test.fail("Hotplug operation in negative test"
                          " should not succeed.")
        return

    usb_hostdev = params["usb_devices"].split()[-1]
    usb_options = params.get("options")
    if usb_options == "with_vendorid_productid":
        vendorid = params["usbdev_option_vendorid_%s" % usb_hostdev]
        productid = params["usbdev_option_productid_%s" % usb_hostdev]
        usb_params["vendorid"] = "0x%s" % vendorid
        usb_params["productid"] = "0x%s" % productid
    elif usb_options == "with_hostbus_hostaddr":
        hostbus = params["usbdev_option_hostbus_%s" % usb_hostdev]
        hostaddr = params["usbdev_option_hostaddr_%s" % usb_hostdev]
        usb_params["hostbus"] = hostbus
        usb_params["hostaddr"] = hostaddr
        (vendorid, productid) = get_vendorid_productid(hostbus, hostaddr)

    lsusb_cmd = "lsusb -v -d %s:%s" % (vendorid, productid)
    match_add = "New USB device found, "
    match_add += "idVendor=%s, idProduct=%s" % (vendorid, productid)
    match_del = "USB disconnect"
    usb_stick = "Mass Storage" in process.getoutput(lsusb_cmd)

    error_context.context("Log into guest", logging.info)
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    session = vm.wait_for_login()

    try:
        usb_dev_verify()
        if usb_stick:
            iozone_test = None
            mount_point = _get_usb_mount_point()
            iozone_test = generate_instance(params, vm, 'iozone')
            _usb_stick_io(mount_point)
        usb_devs = get_usb_host_dev()
        for dev in usb_devs:
            usb_dev_unplug(dev)

        repeat_times = int(params.get("usb_repeat_times", "1"))
        for i in range(repeat_times):
            msg = "Hotplug (iteration %d)" % (i + 1)
            usb_params["id"] = "usbhostdev%s" % i
            if params.get("usb_check_isobufs", "no") == "yes":
                # The value of isobufs could only be in '4, 8, 16'
                isobufs = (2 << (i % 3 + 1))
                usb_params["isobufs"] = isobufs
                msg += ", with 'isobufs' option set to %d." % isobufs
            error_context.context(msg, logging.info)
            usb_dev = qdevices.QDevice("usb-host", usb_params)
            usb_dev_hotplug(usb_dev)
            usb_dev_verify()
            if usb_stick:
                mount_point = _get_usb_mount_point()
                _usb_stick_io(mount_point, bg=True)
            usb_dev_unplug(usb_dev)
    finally:
        if usb_stick and iozone_test:
            iozone_test.clean()
        session.close()
コード例 #18
0
def run(test, params, env):
    """
    Test hotplug/unplug of rng device
    1) Boot up w/o rng device
    2) Hotplug one or more rng devices
    3) Run random read test after hotplug
    4) Unplug rng devices
    5) Repeat step 2 ~ step4 (option)


    :param test: QEMU test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment
    """
    def get_rng_id(vm):
        device_list = []
        for device in vm.devices:
            if isinstance(device, qdevices.QDevice):
                if device.get_param("driver") == "virtio-rng-pci":
                    device_list.append(device)
        return device_list

    def hotplug_rng(vm, dev):
        error_context.context("Hotplug %s" % dev, logging.info)
        output = dev.hotplug(vm.monitor)
        time.sleep(5)

        error_context.context("Check %s from qtree after hotplug" % dev,
                              logging.info)
        qtree_output = dev.verify_hotplug(output, vm.monitor)
        if not qtree_output:
            msg = "no % device in qtree after hotplug" % dev
            raise exceptions.TestFail(msg)
        logging.info("%s is hotpluged successfully" % dev)

    def unplug_rng(vm, dev):
        error_context.context("Hot-unplug %s" % dev, logging.info)
        output = dev.unplug(vm.monitor)
        time.sleep(5)

        error_context.context("Check %s from qtree after unplug" % dev,
                              logging.info)
        qtree_output = dev.verify_unplug(output, vm.monitor)
        if not qtree_output:
            msg = "Still get %s in qtree after unplug" % dev
            raise exceptions.TestFail(msg)
        logging.info("%s is unpluged successfully" % dev)

    def restart_rngd(vm):
        if params.get("restart_rngd"):
            session = vm.wait_for_login()
            error_context.context("Restart rngd service", logging.info)
            status, output = session.cmd_status_output("service rngd restart")
            if status != 0:
                raise exceptions.TestError(output)
            session.close()

    def stop_rngd(vm):
        if params.get("stop_rngd"):
            session = vm.wait_for_login()
            error_context.context("Disable rngd service before unplug",
                                  logging.info)
            status, output = session.cmd_status_output(params.get("stop_rngd"))
            if status != 0:
                raise exceptions.TestError(output)
            session.close()

    login_timeout = int(params.get("login_timeout", 360))
    repeat_times = int(params.get("repeat_times", 1))
    rng_num = int(params.get("rng_num", 1))
    test_before_hotplug = params.get("test_before_hotplug")
    test_after_hotplug = params.get("test_after_hotplug")

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    vm.wait_for_login(timeout=login_timeout)

    if test_before_hotplug:
        restart_rngd(vm)
        error_context.context("Run %s before hotplug" % test_before_hotplug)
        utils_test.run_virt_sub_test(test, params, env, test_before_hotplug)

    # Unplug attached rng device
    device_ids = get_rng_id(vm)
    if device_ids:
        stop_rngd(vm)
        time.sleep(5)
        for device in device_ids:
            unplug_rng(vm, device)

    for i in xrange(repeat_times):
        dev_list = []
        error_context.context(
            "Hotplug/unplug rng devices the %s time" % (i + 1), logging.info)

        for num in xrange(rng_num):
            vm.devices.set_dirty()
            new_dev = qdevices.QDevice("virtio-rng-pci",
                                       {'id': 'virtio-rng-pci-%d' % num})
            hotplug_rng(vm, new_dev)
            dev_list.append(new_dev)

        # Run test after hotplug
        if test_after_hotplug and i == xrange(repeat_times)[-1]:
            restart_rngd(vm)
            error_context.context("Run %s after hotplug" % test_after_hotplug,
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, test_after_hotplug)

        stop_rngd(vm)
        time.sleep(5)
        for dev in dev_list:
            unplug_rng(vm, dev)
コード例 #19
0
ファイル: block_hotplug.py プロジェクト: neuswcjr/tp-qemu
def run(test, params, env):
    """
    Test hotplug of block devices.

    1) Boot up guest with/without block device(s).
    2) Hoplug block device and verify
    3) Do read/write data on hotplug block.
    4) Unplug block device and verify

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :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):
        """
        Find all disks in guest.
        """
        if params.get("os_type") == "linux":
            pattern = params.get("get_disk_pattern", "^/dev/vd[a-z]*$")
        elif params.get("os_type") == "windows":
            pattern = r"^\d+"
            cmd = params.get("get_disk_index", "wmic diskdrive get index")
        else:
            test.cancel("Unsupported OS type '%s'" % params.get("os_type"))

        session = vm.wait_for_login(timeout=timeout)
        output = session.cmd_output_safe(cmd)
        disks = re.findall(pattern, output, re.M)
        session.close()
        return disks

    def get_new_disk(disk1, disk2):
        """
        Get the different disk between disk1 and disk2.
        """
        disk = list(set(disk2).difference(set(disk1)))
        return disk

    def unplug_device(vm, get_disk_cmd, device):
        """
        Unplug device
        """
        disks_before_unplug = find_disk(vm, get_disk_cmd)
        device.unplug(vm.monitor)
        device.verify_unplug("", vm.monitor)
        unplug_status = utils_misc.wait_for(
            lambda: len(
                get_new_disk(find_disk(vm, get_disk_cmd), disks_before_unplug))
            != 0, pause)
        return unplug_status

    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
    pause = float(params.get("virtio_block_pause", 10.0))
    blk_num = int(params.get("blk_num", 1))
    repeat_times = int(params.get("repeat_times", 3))
    timeout = int(params.get("login_timeout", 360))
    disk_op_timeout = int(params.get("disk_op_timeout", 360))
    get_disk_cmd = params.get("get_disk_cmd")
    context_msg = "Running sub test '%s' %s"
    disk_index = params.objects("disk_index")
    disk_letter = params.objects("disk_letter")

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()

    for iteration in range(repeat_times):
        device_list = []
        controller_list = []
        controller_device_dict = {}
        error_context.context(
            "Hotplug block device (iteration %d)" % iteration, logging.info)

        sub_type = params.get("sub_type_before_plug")
        if sub_type:
            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):
            device = qdevices.QDevice(pci_type)
            if params.get("need_plug") == "yes":
                disks_before_plug = find_disk(vm, get_disk_cmd)

                if params.get("need_controller", "no") == "yes":
                    controller_model = params.get("controller_model")
                    controller = qdevices.QDevice(
                        controller_model,
                        params={"id": "hotadded_scsi%s" % num})
                    bus_extra_param = params.get("bus_extra_params_%s" %
                                                 img_list[num + 1])
                    if bus_extra_param:
                        for item in bus_extra_param.split():
                            key, value = item.split("=", 1)
                            qdevice_params = {key: value}
                            controller.params.update(qdevice_params)
                    controller.hotplug(vm.monitor)
                    ver_out = controller.verify_hotplug("", vm.monitor)
                    if not ver_out:
                        err = "%s is not in qtree after hotplug" % controller_model
                        test.fail(err)
                    else:
                        controller_list.append(controller)

                drive = qdevices.QRHDrive("block%d" % num)
                drive.set_param("file", find_image(img_list[num + 1]))
                drive.set_param("format", img_format_type)
                drive_id = drive.get_param("id")
                drive.hotplug(vm.monitor)

                device.set_param("drive", drive_id)
                device.set_param("id", "block%d" % num)
                if params.get("need_controller", "no") == "yes" and bool(
                        random.randrange(2)):
                    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:
                        test.fail("Can't find device '%s' in qtree" %
                                  device.get_param("id"))
            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])
                new_disks = find_disk(vm, get_disk_cmd)

            device_list.append(device)
            if not new_disks:
                test.fail("Cannot find new disk after hotplug.")

            if params.get("need_plug") == "yes":
                disk = new_disks[0]
            else:
                disk = new_disks[num]

            session = vm.wait_for_login(timeout=timeout)
            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")
        if sub_type:
            error_context.context(context_msg % (sub_type, "before unplug"),
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, sub_type)

        error_context.context("Unplug block device (iteration %d)" % iteration,
                              logging.info)
        for controller in controller_list:
            controller_id = controller.get_param("id")
            for device in controller_device_dict.get(controller_id, []):
                unplug_status = unplug_device(vm, get_disk_cmd, device)
                if not unplug_status:
                    test.fail("Failed to unplug disks '%s'" %
                              device.get_param("id"))
                device_list.remove(device)
            controller.unplug(vm.monitor)
        for device in device_list:
            unplug_status = unplug_device(vm, get_disk_cmd, device)
            if not unplug_status:
                test.fail("Failed to unplug disks '%s'" %
                          device.get_param("id"))

        sub_type = params.get("sub_type_after_unplug")
        if sub_type:
            error_context.context(context_msg % (sub_type, "after unplug"),
                                  logging.info)
            utils_test.run_virt_sub_test(test, params, env, sub_type)
コード例 #20
0
ファイル: rng_hotplug.py プロジェクト: yiqianwei/tp-qemu
def run(test, params, env):
    """
    Test hotplug/unplug of rng device
    1) Boot up w/ one rng device
    2) Unplug rng device
    3) reboot/shutdown guest(optional)
    4) Hotplug one or more rng devices
    5) Run random read test after hotplug
    6) Unplug rng devices
    7) Repeat step 4 ~ step 6 (optional)
    8) Hotplug one rng device
    9) Run random read test after hotplug
    10) Reboot/shutdown guest(optional)

    :param test: QEMU test object
    :param params: Dictionary with the test parameters
    :param env: Dictionary with test environment
    """
    def get_rng_id(vm):
        device_list = []
        for device in vm.devices:
            if isinstance(device, qdevices.QDevice):
                if device.get_param("driver") == "virtio-rng-pci":
                    device_list.append(device)
        return device_list

    def hotplug_rng(vm, dev):
        error_context.context("Hotplug %s" % dev, logging.info)
        out, ver_out = vm.devices.simple_hotplug(dev, vm.monitor)
        if not ver_out:
            msg = "no % device in qtree after hotplug" % dev
            raise exceptions.TestFail(msg)
        logging.info("%s is hotpluged successfully", dev)

    def unplug_rng(vm, dev):
        error_context.context("Hot-unplug %s" % dev, logging.info)
        out, ver_out = vm.devices.simple_unplug(dev, vm.monitor)
        if not ver_out:
            msg = "Still get %s in qtree after unplug" % dev
            raise exceptions.TestFail(msg)
        time.sleep(15)
        logging.info("%s is unpluged successfully", dev)

    def restart_rngd(vm):
        if params.get("restart_rngd"):
            session = vm.wait_for_login()
            error_context.context("Restart rngd service", logging.info)
            status, output = session.cmd_status_output("service rngd restart")
            if status != 0:
                raise exceptions.TestError(output)
            session.close()

    def stop_rngd(vm):
        if params.get("stop_rngd"):
            session = vm.wait_for_login()
            error_context.context("Disable rngd service before unplug",
                                  logging.info)
            status, output = session.cmd_status_output(params.get("stop_rngd"))
            if status != 0:
                raise exceptions.TestError(output)
            session.close()

    def run_subtest(sub_test):
        """
        Run subtest(e.g. rng_bat,reboot,shutdown) when it's not None
        :param sub_test: subtest name
        """
        error_context.context("Run %s subtest" % sub_test)
        utils_test.run_virt_sub_test(test, params, env, sub_test)

    login_timeout = int(params.get("login_timeout", 360))
    repeat_times = int(params.get("repeat_times", 1))
    rng_num = int(params.get("rng_num", 1))
    rng_basic_test = params.get("rng_basic_test")
    pm_test_after_plug = params.get("pm_test_after_plug")
    pm_test_after_unplug = params.get("pm_test_after_unplug")

    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    vm.wait_for_login(timeout=login_timeout)

    # run rng test before hot-unplug
    restart_rngd(vm)
    run_subtest(rng_basic_test)

    # Unplug attached rng device
    device_ids = get_rng_id(vm)
    if device_ids:
        stop_rngd(vm)
        time.sleep(5)
        for device in device_ids:
            unplug_rng(vm, device)

    for i in range(repeat_times):
        dev_list = []
        error_context.context(
            "Hotplug/unplug rng devices the %s time" % (i + 1), logging.info)

        for num in range(rng_num):
            vm.devices.set_dirty()
            new_dev = qdevices.QDevice("virtio-rng-pci",
                                       {'id': 'virtio-rng-pci-%d' % num})
            hotplug_rng(vm, new_dev)
            dev_list.append(new_dev)

        # run rng test after hotplug
        restart_rngd(vm)
        run_subtest(rng_basic_test)

        # run reboot/shutdown after hotplug
        if pm_test_after_plug:
            run_subtest(pm_test_after_plug)
            # run rng test after reboot,skip followed test if
            # pm_test_after_plug is shutdown
            if vm.is_alive():
                run_subtest(rng_basic_test)
            else:
                return

        stop_rngd(vm)
        time.sleep(5)
        for dev in dev_list:
            unplug_rng(vm, dev)

        # run reboot/shutdown test after hot-unplug
        if pm_test_after_unplug:
            run_subtest(pm_test_after_unplug)
            if not vm.is_alive():
                return
コード例 #21
0
def run(test, params, env):
    """
    Test hotplug of balloon devices.

    1) Boot up guest w/o balloon device.
    2) Hoplug balloon device and check hotplug successfully or not.
    3) Install balloon service and check its status in windows guests.
    4) Do memory balloon.
    5) Reboot/shutdown guest after hotplug balloon device(option)
    6) Do memory balloon after guest reboot(option)
    7) Unplug balloon device and check unplug successfully or not.
    8) Reboot/shutdown guest after unplug balloon device(option)

    :param test:   QEMU test object.
    :param params: Dictionary with the test parameters.
    :param env:    Dictionary with test environment.
    """

    def run_pm_test(pm_test, plug_type):
        """
        Run pm(reboot/system_reset/shutdown) related test after balloon
        device is hot-plug or hot-unplug
        :param pm_test: power management test name,e.g. reboot/shutdown
        :param plug_type:balloon device plug operation,e.g.hot_plug or hot_unplug
        """
        error_context.context("Run %s test after %s balloon device"
                              % (pm_test, plug_type), logging.info)
        utils_test.run_virt_sub_test(test, params, env, pm_test)

    def enable_balloon_service():
        """
        Install balloon service and check its status in windows guests
        """
        if params['os_type'] != 'windows':
            return
        error_context.context("Install and check balloon service in windows "
                              "guest", logging.info)
        session = vm.wait_for_login()
        driver_name = params.get("driver_name", "balloon")
        session = utils_test.qemu.windrv_check_running_verifier(session,
                                                                vm, test,
                                                                driver_name)
        balloon_test = BallooningTestWin(test, params, env)
        balloon_test.configure_balloon_service(session)

        output = balloon_test.operate_balloon_service(session, "status")
        if not re.search(r"running", output.lower(), re.M):
            test.error("Ballooon service status is not running")
        session.close()

    pause = float(params.get("virtio_balloon_pause", 3.0))
    pm_test_after_plug = params.get("pm_test_after_plug")
    pm_test_after_unplug = params.get("pm_test_after_unplug")
    idx = 0
    err = ""
    vm = env.get_vm(params["main_vm"])
    vm.verify_alive()
    balloon_device = params.get("ballon_device", "virtio-balloon-pci")

    error_context.context("Hotplug and unplug balloon device in a loop",
                          logging.info)
    for i in range(int(params.get("balloon_repeats", 3))):
        vm.devices.set_dirty()
        new_dev = qdevices.QDevice(balloon_device,
                                   {'id': 'balloon%d' % idx},
                                   parent_bus={'aobject': 'pci.0'})

        error_context.context("Hotplug balloon device for %d times" % (i+1),
                              logging.info)
        out = new_dev.hotplug(vm.monitor)
        if out:
            err += "\nHotplug monitor output: %s" % out
        # Pause
        time.sleep(pause)
        ver_out = new_dev.verify_hotplug(out, vm.monitor)
        if not ver_out:
            err += ("\nDevice is not in qtree %ss after hotplug:\n%s"
                    % (pause, vm.monitor.info("qtree")))

        # temporary workaround for migration
        vm.params["balloon"] = "balloon%d" % idx
        vm.params["balloon_dev_devid"] = "balloon%d" % idx
        vm.params["balloon_dev_add_bus"] = "yes"

        enable_balloon_service()

        error_context.context("Check whether balloon device work after hotplug",
                              logging.info)
        balloon_check.run(test, params, env)

        if pm_test_after_plug:
            run_pm_test(pm_test_after_plug, "hot-plug")
            # run balloon test after reboot,skip followed test if
            # pm_test_after_plug is shutdown
            if vm.is_alive():
                balloon_check.run(test, params, env)
            else:
                return

        error_context.context("Unplug balloon device for %d times" % (i+1),
                              logging.info)
        out = new_dev.unplug(vm.monitor)
        if out:
            err += "\nUnplug monitor output: %s" % out
        # Pause
        time.sleep(pause)
        ver_out = new_dev.verify_unplug(out, vm.monitor)
        if not ver_out:
            err += ("\nDevice is still in qtree %ss after unplug:\n%s"
                    % (pause, vm.monitor.info("qtree")))
        if err:
            logging.error(vm.monitor.info("qtree"))
            test.fail("Error occurred while hotpluging "
                      "virtio-pci. Iteration %s, monitor "
                      "output:%s" % (i, err))
        else:
            if params.get("migrate_after_unplug", "no") == "yes":
                error_context.context("Migrate after hotunplug balloon device",
                                      logging.info)
                # temporary workaround for migration
                del vm.params["balloon"]
                del vm.params["balloon_dev_devid"]
                del vm.params["balloon_dev_add_bus"]
                vm.migrate(float(params.get("mig_timeout", "3600")))

            if pm_test_after_unplug:
                run_pm_test(pm_test_after_unplug, "hot-unplug")
                if not vm.is_alive():
                    return

    error_context.context("Verify guest alive!", logging.info)
    vm.verify_kernel_crash()