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

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

 



 * 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


[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