On Mon, Nov 5, 2012 at 8:27 AM, <[email protected]> wrote: > From: Yunping Zheng <[email protected]> > > Using this patch you can enable or disable pci msi before test. > if you want to disable pci msi before test,just set: > pci_msi_sensitive = yes > disable_pci_msi = yes > in subtests.cfg. > when disable_pci_msi =yes, will modify the kernel params in grub.conf > and append "pci=nomsi." > when you using, you need sure you python support guestfs. > > chang_log: > V2 from V1 > using python guestfs lib.
This looks much better. I still have some comments, though. Considering this is all small stuff, I'm going to fix it myself, test and then commit. > Signed-off-by: Yunping Zheng <[email protected]> > --- > virttest/env_process.py | 53 ++++++++++++++++++++--- > virttest/utils_disk.py | 109 > ++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 156 insertions(+), 6 deletions(-) > > diff --git a/virttest/env_process.py b/virttest/env_process.py > index 0b3bd4e..1f89b82 100644 > --- a/virttest/env_process.py > +++ b/virttest/env_process.py > @@ -3,7 +3,7 @@ from autotest.client import utils > from autotest.client.shared import error > import aexpect, kvm_monitor, ppm_utils, test_setup, virt_vm, kvm_vm > import libvirt_vm, video_maker, utils_misc, storage, kvm_storage > -import remote, ovirt > +import remote, ovirt, utils_disk > > try: > import PIL.Image > @@ -17,7 +17,7 @@ _screendump_thread = None > _screendump_thread_termination_event = None > > > -def preprocess_image(test, params, image_name): > +def preprocess_image(test, params, env, image_name): > """ > Preprocess a single QEMU image according to the instructions in params. > > @@ -44,6 +44,14 @@ def preprocess_image(test, params, image_name): > if not image.create(params): > raise error.TestError("Could not create image") > > + #if you want set "pci=nomsi" before test, set "disable_pci_msi = yes" > + #and pci_msi_sensitive = "yes" > + if params.get("pci_msi_sensitive", "no") == "yes": > + disable_pci_msi = params.get("disable_pci_msi", "no") > + enable_disable_pci_msi(test, params, env, image_filename, > + disable_pci_msi) > + > + > > def preprocess_vm(test, params, env, name): > """ > @@ -111,7 +119,7 @@ def preprocess_vm(test, params, env, name): > vm.params = params > > > -def postprocess_image(test, params, image_name): > +def postprocess_image(test, params, env, image_name): > """ > Postprocess a single QEMU image according to the instructions in params. > > @@ -225,14 +233,14 @@ def process(test, params, env, image_func, vm_func, > vm_first=False): > if vm is not None and vm.is_alive(): > vm.pause() > try: > - image_func(test, image_params, image_name) > + image_func(test, image_params, env, image_name) > finally: > if vm is not None and vm.is_alive(): > vm.resume() > else: > for image_name in params.objects("images"): > image_params = params.object_params(image_name) > - image_func(test, image_params, image_name) > + image_func(test, image_params, env, image_name) > > if not vm_first: > _call_image_func() > @@ -588,3 +596,38 @@ def _take_screendumps(test, params, env): > _screendump_thread_termination_event = None > break > _screendump_thread_termination_event.wait(delay) > + > +def enable_disable_pci_msi(test, params, env, image_filename, > disable_pci_msi): > + """ > + Add or delete "pci=nomsi" in the kernel config line, before guest is > start. > + > + @Parm image_filename: image you want to modify. Typo, @Param > + @Param disable_pci_msi: flag of if disable pci msi.if disable_pci_msi is > + True will add pci=nomsi in kernel config line. > + """ > + > + grub_file = params.get("grub_file", "/boot/grub/grub.conf") > + kernel_cfg_pos_reg = params.get("kernel_cfg_pos_reg", > + "\s*kernel\s*\/vmlinuz-\d+.*") > + msi_keyword = params.get("msi_keyword", " pci=nomsi") > + > + f = utils_disk.Guest_Disk(image_filename) > + kernel_config_ori = f.read_file(grub_file) > + kernel_config_line = re.findall(kernel_cfg_pos_reg, kernel_config_ori)[0] > + kernel_need_modify = False > + > + if disable_pci_msi == "yes": > + if not re.findall(msi_keyword, kernel_config_line): > + kernel_config_set = kernel_config_line + msi_keyword > + kernel_need_modify = True > + elif disable_pci_msi == "no": > + if re.findall(msi_keyword, kernel_config_line): > + kernel_config_set = re.sub(msi_keyword, "", kernel_config_line) > + kernel_need_modify = True > + if kernel_need_modify: > + for vm in env.get_all_vms(): > + if vm.is_alive(): > + vm.destroy() > + time.sleep(1) > + f.replace_image_file_content(grub_file, kernel_config_line, > + kernel_config_set) > \ No newline at end of file > diff --git a/virttest/utils_disk.py b/virttest/utils_disk.py > index bc9ae25..0cd7dab 100644 > --- a/virttest/utils_disk.py > +++ b/virttest/utils_disk.py > @@ -4,7 +4,7 @@ Virtualization test - Virtual disk related utility functions > @copyright: Red Hat Inc. > """ > > -import os, glob, shutil, tempfile, logging, ConfigParser > +import os, glob, shutil, tempfile, logging, ConfigParser, guestfs, re > from autotest.client import utils > from autotest.client.shared import error > > @@ -74,6 +74,113 @@ class Disk(object): > cleanup(self.mount) > logging.debug("Disk %s successfuly set", self.path) > > +class Guest_Disk(object): > + """ > + class of guest disk using guestfs lib to do some operation(like > read/write) > + on guest disk: > + """ > + > + def __init__(self, disk, readonly=False, need_check=False): > + self.g = guestfs.GuestFS () Don't use spaces between the class/function name and the parenthesis, this style goes against PEP8. > + # Attach the disk image read-only to libguestfs. > + logging.info("Add guest disk %s -- writable" % disk) > + self.g.add_drive_opts(disk, readonly) > + # Run the libguestfs back-end. > + logging.info("Launch the guest disk %s, maybe take some time..." % > disk) > + self.g.launch () > + > + # Ask libguestfs to inspect for operating systems. > + if need_check: > + self.roots = self.g.inspect_os () > + if len (self.roots) == 0: the above could be simply if not self.roots > + raise (Error ("inspect_vm: no operating systems found")) > + > + def mount_all(self): > + > + def compare (a, b): > + if len(a[0]) > len(b[0]): > + return 1 > + elif len(a[0]) == len(b[0]): > + return 0 > + else: > + return -1 > + > + roots = self.g.inspect_os () > + if len (roots) != 0: > + for root in roots: > + mps = self.g.inspect_get_mountpoints (root) > + # Mount up the disks, like guestfish -i. > + #Sort keys by length, shortest first, so that we end up > + # mounting the filesystems in the correct order. > + mps.sort (compare) > + for mp_dev in mps: > + try: > + logging.info("Mount device '%s' partitions '%s' to > '%s'" > + % (root, mp_dev[1], mp_dev[0])) > + self.g.mount (mp_dev[1], mp_dev[0]) > + except RuntimeError as msg: > + logging.info("%s (ignored)" % msg) > + else: > + raise (Error ("inspect_vm: no operating systems found")) > + > + def umount_all (self): > + logging.info("Umount all device partitions") > + self.g.umount_all() > + > + def read_file(self,file_name): > + """ > + read file from the guest disk, return the content of the file > + @Param file_name: the file you want to read. > + """ > + > + self.mount_all() > + try: > + o = self.g.cat(file_name) > + if o : > + return o > + else: > + raise error.TestError("can't read file '%s' or it is empty" > + % file_name) > + finally: > + self.umount_all() > + > + def write_to_image_file(self, file_name, content, w_append=False): > + """ > + wirte content to the file on the guest disk. ^ typo, Write > + when using this method all the original content will be overriding. when using this method, all the original file contents will be overwritten. > + if you don't hope your original data be override using w_append=True If you don't want the data to be overwritten, use w_append=True > + > + @Param file_name: the file you want to write > + @Param content: the content you want to write. > + @w_append append the content or override > + """ > + > + self.mount_all() > + try: > + if w_append: > + self.g.write_append(file_name, content) > + else: > + self.g.write(file_name, content) > + except Exception: Would be better to choose a less generic exception class here... > + raise error.TestError("write '%s' to file '%s' error!" > + % (content, file_name )) Error writing '%s' into file '%s'. > + finally: > + self.umount_all() > + > + def replace_image_file_content(self, file_name, find_con, rep_con): > + """ > + replace file content matchs in the filename with rep_con. typo, matches > + suport using Regular expression > + @Param file_name: the file you want to replace > + @Param find_con: the orign content you want to replace. > + @Param rep_con: the replace content you want. > + """ > + > + file_content = self.read_file(file_name) > + file_content_after_replace = re.sub(find_con, rep_con, file_content ) > + if file_content != file_content_after_replace : > + self.write_to_image_file(file_name, file_content_after_replace) > + > > class FloppyDisk(Disk): > """ > -- > 1.7.9.5 > > _______________________________________________ > Autotest-kernel mailing list > [email protected] > https://www.redhat.com/mailman/listinfo/autotest-kernel -- Lucas _______________________________________________ Autotest-kernel mailing list [email protected] https://www.redhat.com/mailman/listinfo/autotest-kernel
