Re: [PATCH 1/4] [kvm-autotest] cgroup-kvm: add_*_drive / rm_drive

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

 



This is useful function. This function can be in kvm utils.

----- Original Message -----
> * functions for adding and removal of drive to vm using host-file or
>    host-scsi_debug device.
> 
> Signed-off-by: Lukas Doktor <ldoktor@xxxxxxxxxx>
> ---
>  client/tests/kvm/tests/cgroup.py |  125
>  ++++++++++++++++++++++++++++++++-----
>  1 files changed, 108 insertions(+), 17 deletions(-)
> 
> diff --git a/client/tests/kvm/tests/cgroup.py
> b/client/tests/kvm/tests/cgroup.py
> index b9a10ea..d6418b5 100644
> --- a/client/tests/kvm/tests/cgroup.py
> +++ b/client/tests/kvm/tests/cgroup.py
> @@ -17,6 +17,108 @@ def run_cgroup(test, params, env):
>      vms = None
>      tests = None
>  
> +    # Func
> +    def get_device_driver():
> +        """
> +        Discovers the used block device driver {ide, scsi,
> virtio_blk}
> +        @return: Used block device driver {ide, scsi, virtio}
> +        """
> +        if test.tagged_testname.count('virtio_blk'):
> +            return "virtio"
> +        elif test.tagged_testname.count('scsi'):
> +            return "scsi"
> +        else:
> +            return "ide"
> +
> +
> +    def add_file_drive(vm, driver=get_device_driver(),
> host_file=None):
> +        """
> +        Hot-add a drive based on file to a vm
> +        @param vm: Desired VM
> +        @param driver: which driver should be used (default: same as
> in test)
> +        @param host_file: Which file on host is the image (default:
> create new)
> +        @return: Tupple(ret_file, device)
> +                    ret_file: created file handler (None if not
> created)
> +                    device: PCI id of the virtual disk
> +        """
> +        if not host_file:
> +            host_file =
> tempfile.NamedTemporaryFile(prefix="cgroup-disk-",
> +                                               suffix=".iso")
> +            utils.system("dd if=/dev/zero of=%s bs=1M count=8
> &>/dev/null"
> +                         % (host_file.name))
> +            ret_file = host_file
> +        else:
> +            ret_file = None
> +
> +        out = vm.monitor.cmd("pci_add auto storage
> file=%s,if=%s,snapshot=off,"
> +                             "cache=off" % (host_file.name, driver))
> +        dev = re.search(r'OK domain (\d+), bus (\d+), slot (\d+),
> function \d+',
> +                        out)
> +        if not dev:
> +            raise error.TestFail("Can't add device(%s, %s, %s): %s"
> % (vm,
> +                                                host_file.name,
> driver, out))
> +        device = "%s:%s:%s" % dev.groups()
> +        return (ret_file, device)
> +
> +
> +    def add_scsi_drive(vm, driver=get_device_driver(),
> host_file=None):
> +        """
> +        Hot-add a drive based on scsi_debug device to a vm
> +        @param vm: Desired VM
> +        @param driver: which driver should be used (default: same as
> in test)
> +        @param host_file: Which dev on host is the image (default:
> create new)
> +        @return: Tupple(ret_file, device)
> +                    ret_file: string of the created dev (None if not
> created)
> +                    device: PCI id of the virtual disk
> +        """
> +        if not host_file:
> +            if utils.system_output("lsmod | grep scsi_debug -c") ==
> 0:
> +                utils.system("modprobe scsi_debug dev_size_mb=8
> add_host=0")
> +            utils.system("echo 1 >
> /sys/bus/pseudo/drivers/scsi_debug/add_host")
> +            host_file = utils.system_output("ls /dev/sd* | tail -n
> 1")
> +            # Enable idling in scsi_debug drive
> +            utils.system("echo 1 > /sys/block/%s/queue/rotational" %
> host_file)
> +            ret_file = host_file
> +        else:
> +            # Don't remove this device during cleanup
> +            # Reenable idling in scsi_debug drive (in case it's not)
> +            utils.system("echo 1 > /sys/block/%s/queue/rotational" %
> host_file)
> +            ret_file = None
> +
> +        out = vm.monitor.cmd("pci_add auto storage
> file=%s,if=%s,snapshot=off,"
> +                             "cache=off" % (host_file, driver))
> +        dev = re.search(r'OK domain (\d+), bus (\d+), slot (\d+),
> function \d+',
> +                        out)
> +        if not dev:
> +            raise error.TestFail("Can't add device(%s, %s, %s): %s"
> % (vm,
> +                                                        host_file,
> driver, out))
> +        device = "%s:%s:%s" % dev.groups()
> +        return (ret_file, device)
> +
> +
> +    def rm_drive(vm, host_file, device):
> +        """
> +        Remove drive from vm and device on disk
> +        ! beware to remove scsi devices in reverse order !
> +        """
> +        vm.monitor.cmd("pci_del %s" % device)
> +
> +        if isinstance(host_file, file):     # file
> +            host_file.close()
> +        elif isinstance(host_file, str):    # scsi device
> +            utils.system("echo -1>
> /sys/bus/pseudo/drivers/scsi_debug/add_host")
> +        else:        # custom file, do nothing
> +            pass
> +
> +    def get_all_pids(ppid):
> +        """
> +        Get all PIDs of children/threads of parent ppid
> +        param ppid: parent PID
> +        return: list of PIDs of all children/threads of ppid
> +        """
> +        return (utils.system_output("ps -L --ppid=%d -o lwp" % ppid)
> +
>                                                        .split('\n')[1:])
> +
>      # Tests
>      class _TestBlkioBandwidth:
>          """
> @@ -46,9 +148,8 @@ def run_cgroup(test, params, env):
>              """
>              err = ""
>              try:
> -                for i in range (2):
> -                    vms[i].monitor.cmd("pci_del %s" %
> self.devices[i])
> -                    self.files[i].close()
> +                for i in range(1, -1, -1):
> +                    rm_drive(vms[i], self.files[i], self.devices[i])
>              except Exception, failure_detail:
>                  err += "\nCan't remove PCI drive: %s" %
>                  failure_detail
>              try:
> @@ -89,8 +190,7 @@ def run_cgroup(test, params, env):
>                  if blkio.set_cgroup(self.vms[i].get_shell_pid(),
>                  pwd[i]):
>                      raise error.TestError("Could not set cgroup")
>                  # Move all existing threads into cgroup
> -                for tmp in utils.system_output("ps -L --ppid=%d -o
> lwp"
> -                                %
> self.vms[i].get_shell_pid()).split('\n')[1:]:
> +                for tmp in
> get_all_pids(self.vms[i].get_shell_pid()):
>                      if blkio.set_cgroup(int(tmp), pwd[i]):
>                          raise error.TestError("Could not set
>                          cgroup")
>              if self.blkio.set_property("blkio.weight", 100, pwd[0]):
> @@ -101,18 +201,9 @@ def run_cgroup(test, params, env):
>              # Add dummy drives
>              # TODO: implement also using QMP.
>              for i in range(2):
> -                self.files.append(tempfile.NamedTemporaryFile(
> -                                        prefix="cgroup-disk-",
> -                                        suffix=".iso"))
> -                utils.system("dd if=/dev/zero of=%s bs=1M count=10
> &>/dev/null"
> -                             % (self.files[i].name))
> -                out = vms[i].monitor.cmd("pci_add auto storage
> file=%s,"
> -                                "if=virtio,snapshot=off,cache=off"
> -                                % (self.files[i].name))
> -                out = re.search(r'OK domain (\d+), bus (\d+), slot
> (\d+), '
> -                                 'function \d+', out).groups()
> -                self.devices.append("%s:%s:%s" % out)
> -
> +                (host_file, device) = add_file_drive(vms[i],
> "virtio")
> +                self.files.append(host_file)
> +                self.devices.append(device)
>  
>          def run(self):
>              """
> --
> 1.7.6.2
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


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