On 09/18/2012 05:12 PM, [email protected] wrote:
From: Yunping Zheng <[email protected]>
Hi Yunping,Besides the python-libguestfs problem mentioned by Lucas, still want to see some other improving in next version as below.
using this patch you can enable or disable pci msi before test. if you want to disable pci msi before test,just set: disable_pci_msi = yes in subtests.cfg this patch also support modify image file before test using libguestfs. Signed-off-by: Yunping Zheng <[email protected]> --- client/tests/virt/virttest/env_process.py | 14 ++++-- client/tests/virt/virttest/utils_disk.py | 83 ++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 6 deletions(-) diff --git a/client/tests/virt/virttest/env_process.py b/client/tests/virt/virttest/env_process.py index 6f9f7da..bbcc5f7 100644 --- a/client/tests/virt/virttest/env_process.py +++ b/client/tests/virt/virttest/env_process.py @@ -2,7 +2,7 @@ import os, time, commands, re, logging, glob, threading, shutil 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 libvirt_vm, video_maker, utils_disk, utils_misc, storage, kvm_storage import remote, ovirttry:@@ -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,10 @@ 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"+ disable_pci_msi = params.get("disable_pci_msi", "no") + utils_disk.enable_disable_pci_msi(test, params, env, image_filename, + disable_pci_msi)def preprocess_vm(test, params, env, name):""" @@ -114,7 +118,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.@@ -228,14 +232,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() diff --git a/client/tests/virt/virttest/utils_disk.py b/client/tests/virt/virttest/utils_disk.py index bc9ae25..356e416 100644 --- a/client/tests/virt/virttest/utils_disk.py +++ b/client/tests/virt/virttest/utils_disk.py @@ -4,9 +4,10 @@ Virtualization test - Virtual disk related utility functions @copyright: Red Hat Inc. """-import os, glob, shutil, tempfile, logging, ConfigParser+import os, time, re, glob, shutil, tempfile, logging, ConfigParser from autotest.client import utils from autotest.client.shared import error +import utils_misc# Whether to print all shell commands called@@ -47,6 +48,86 @@ def clean_old_image(image): utils.run('umount %s' % image, verbose=DEBUG) os.remove(image)+def enable_disable_pci_msi(test, params, env, image_filename, disable_pci_msi):+ """ + Modify kernel config "pci=nomsi", before the guest is start. + + @Parm image_filename: image you want to modify.
typo here. And the params are not all include in docstring.
+ @Param disable_pci_msi: flag of if disable pci msi.
+ """
+ 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")
+
+ kernel_config_ori = read_file_from_image(image_filename, 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 key in env.keys():
+ vm = env[key]
+ if not utils_misc.is_vm(vm):
+ continue
+ if vm.is_alive():
+ vm.destroy()
+ time.sleep(1)
destroy() already check the status of guest. why we still need sleep 1s
here?
+ replace_image_file_content(image_filename, grub_file, + kernel_config_line, kernel_config_set)
Can you make a base function for changing the kernel cmd line in guest with guestfs? And this function can call that base function. So we are enable to update the kernel cmd line without boot up guest later for other cases.
+ +def read_file_from_image(image_filename, file_name): + """ + read image file, return the content of the file + + @Param image_filename: image you want to modify. + @Param file_name: the file you want to read. + """ + cmd = "guestfish --rw -a %s -i " % image_filename + cmd_read = "cat %s" % file_name + o = utils.system_output(cmd + cmd_read) + if o: + return o + else: + raise error.TestError("can't read file %s or it is empty" % file_name) + +def write_to_image_file(image_filename, file_name, content): + """ + wirte content to image file + + @Param image_filename: image you want to modify. + @Param file_name: the file you want to write + @Param content: the content you want to write. + """ + cmd = "guestfish --rw -a %s -i " % image_filename + cmd_write = "write %s '%s'" % (file_name, content) + s = utils.system(cmd + cmd_write) + if s == 0: + return True + else: + return False + +def replace_image_file_content(image_filename, file_name, find_con, rep_con): + """ + replace file in the image content. + + @Param image_filename: image you want to modify. + @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 = read_file_from_image(image_filename, file_name) + file_content_after_replace = re.sub(find_con, rep_con, file_content ) + if file_content != file_content_after_replace : + return write_to_image_file(image_filename, file_name, + file_content_after_replace)class Disk(object):"""
_______________________________________________ Autotest-kernel mailing list [email protected] https://www.redhat.com/mailman/listinfo/autotest-kernel
