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