From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?B?THVrw6HFoSBEb2t0b3I=?= Subject: Re: [KVM AUTOTEST PATCH] [RFC] KVM test: keep record of supported qemu options Date: Wed, 29 Jul 2009 10:11:09 +0200 Message-ID: <4A70041D.4040600@redhat.com> References: <1248838829-7804-1-git-send-email-lmr@redhat.com> <1248838829-7804-2-git-send-email-lmr@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: autotest@test.kernel.org, kvm@vger.kernel.org, ryanh@us.ibm.com, mgoldish@redhat.com To: Lucas Meneghel Rodrigues Return-path: Received: from mx2.redhat.com ([66.187.237.31]:44434 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751508AbZG2ILV (ORCPT ); Wed, 29 Jul 2009 04:11:21 -0400 In-Reply-To: <1248838829-7804-2-git-send-email-lmr@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: Hello Lucas, I like your patch but I'm not entirely convinced about it necessity.=20 Stable version of KVM should have this fixed and unstable ones are for=20 developers, who are skilled enough to fix this using kvm_test.cfg. On the other hand keep this patch somewhere. Eventually if qemu started= =20 to be naughty, we would have something useful in our pocket. Best regards, Luk=C3=A1=C5=A1 Dne 29.7.2009 05:40, Lucas Meneghel Rodrigues napsal(a): > In order to make it easier to figure out problems and > also to avoid aborting tests prematurely due to > incompatible qemu options, keep record of supported > qemu options, and if extra options are passed to qemu, > verify if they are amongst the supported options. Also, > try to replace known misspelings on options in case > something goes wrong, and be generous logging any problems. > > This first version of the patch gets supported flags from > the output of qemu --help. I thought this would be good > enough for a first start. I am asking for input on whether > this is needed, and if yes, if the approach looks good. > > Signed-off-by: Lucas Meneghel Rodrigues > --- > client/tests/kvm/kvm_vm.py | 79 +++++++++++++++++++++++++++++++++= +++++++++- > 1 files changed, 77 insertions(+), 2 deletions(-) > > diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py > index eba9b84..0dd34c2 100644 > --- a/client/tests/kvm/kvm_vm.py > +++ b/client/tests/kvm/kvm_vm.py > @@ -121,6 +121,7 @@ class VM: > self.qemu_path =3D qemu_path > self.image_dir =3D image_dir > self.iso_dir =3D iso_dir > + self.qemu_supported_flags =3D self.get_qemu_supported_flags(= ) > > > # Find available monitor filename > @@ -258,7 +259,7 @@ class VM: > > extra_params =3D params.get("extra_params") > if extra_params: > - qemu_cmd +=3D " %s" % extra_params > + qemu_cmd +=3D " %s" % self.process_qemu_extra_params(ext= ra_params) > > for redir_name in kvm_utils.get_sub_dict_names(params, "red= irs"): > redir_params =3D kvm_utils.get_sub_dict(params, redir_n= ame) > @@ -751,7 +752,7 @@ class VM: > else: > self.send_key(char) > > - > + > def get_uuid(self): > """ > Catch UUID of the VM. > @@ -762,3 +763,77 @@ class VM: > return self.uuid > else: > return self.params.get("uuid", None) > + > + > + def get_qemu_supported_flags(self): > + """ > + Gets all supported qemu options from qemu-help. This is a us= eful > + procedure to quickly spot problems with incompatible qemu fl= ags. > + """ > + cmd =3D self.qemu_path + ' --help' > + (status, output) =3D kvm_subprocess.run_fg(cmd) > + supported_flags =3D [] > + > + if status: > + logging.error('Process qemu --help ended with exit code = !=3D0. ' > + 'No supported qemu flags will be recorded.= ') > + return supported_flags > + > + for line in output.split('\n'): > + if line and line.startswith('-'): > + flag =3D line.split()[0] > + if flag not in supported_flags: > + supported_flags.append(flag) > + > + return supported_flags > + > + > + def process_qemu_extra_params(self, extra_params): > + """ > + Verifies an extra param passed to qemu to see if it's suppor= ted by the > + current qemu version. If it's not supported, try to find an = appropriate > + replacement on a list of known option misspellings. > + > + @param extra_params: String with a qemu command line option. > + """ > + flag =3D extra_params.split()[0] > + > + if flag not in self.qemu_supported_flags: > + logging.error("Flag %s does not seem to be supported by = the " > + "current qemu version. Looking for a repla= cement...", > + flag) > + supported_flag =3D self.get_qemu_flag_replacement(flag) > + if supported_flag: > + logging.debug("Replacing flag %s with %s", flag, > + supported_flag) > + extra_params =3D extra_params.replace(flag, supporte= d_flag) > + else: > + logging.error("No valid replacement was found for fl= ag %s.", > + flag) > + > + return extra_params > + > + > + def get_qemu_flag_replacement(self, option): > + """ > + Searches on a list of known misspellings for qemu options an= d returns > + a replacement. If no replacement can be found, return None. > + > + @param option: String representing qemu option (such as -mem= ). > + > + @return: Option replacement, or None, if none found. > + """ > + list_mispellings =3D [['-mem-path', '-mempath'],] > + replacement =3D None > + > + for mispellings in list_mispellings: > + if option in mispellings: > + option_position =3D mispellings.index(option) > + replacement =3D mispellings[1 - option_position] > + > + if replacement not in self.qemu_supported_flags: > + logging.error("Replacement %s also does not seem to be a= valid " > + "qemu flag, aborting replacement.", replac= ement) > + return None > + > + return replacement