On Wed, Jul 29, 2009 at 5:11 AM, Lukáš Doktor<ldok...@redhat.com> wrote:
> Hello Lucas,
>
> I like your patch but I'm not entirely convinced about it necessity.
> Stable version of KVM should have this fixed and unstable ones are for
> developers, who are skilled enough to fix this using kvm_test.cfg.
>
> On the other hand keep this patch somewhere. Eventually if qemu started
> to be naughty, we would have something useful in our pocket.

Yep, I agree :) Thank you for your input!

> Best regards,
> Lukáš
>
> 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<l...@redhat.com>
>> ---
>>   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 = qemu_path
>>           self.image_dir = image_dir
>>           self.iso_dir = iso_dir
>> +        self.qemu_supported_flags = self.get_qemu_supported_flags()
>>
>>
>>           # Find available monitor filename
>> @@ -258,7 +259,7 @@ class VM:
>>
>>           extra_params = params.get("extra_params")
>>           if extra_params:
>> -            qemu_cmd += " %s" % extra_params
>> +            qemu_cmd += " %s" % self.process_qemu_extra_params(extra_params)
>>
>>           for redir_name in kvm_utils.get_sub_dict_names(params, "redirs"):
>>               redir_params = kvm_utils.get_sub_dict(params, redir_name)
>> @@ -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 useful
>> +        procedure to quickly spot problems with incompatible qemu flags.
>> +        """
>> +        cmd = self.qemu_path + ' --help'
>> +        (status, output) = kvm_subprocess.run_fg(cmd)
>> +        supported_flags = []
>> +
>> +        if status:
>> +            logging.error('Process qemu --help ended with exit code !=0. '
>> +                          'No supported qemu flags will be recorded.')
>> +            return supported_flags
>> +
>> +        for line in output.split('\n'):
>> +            if line and line.startswith('-'):
>> +                flag = 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 supported 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 = 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 
>> replacement...",
>> +                          flag)
>> +            supported_flag = self.get_qemu_flag_replacement(flag)
>> +            if supported_flag:
>> +                logging.debug("Replacing flag %s with %s", flag,
>> +                              supported_flag)
>> +                extra_params = extra_params.replace(flag, supported_flag)
>> +            else:
>> +                logging.error("No valid replacement was found for flag %s.",
>> +                              flag)
>> +
>> +        return extra_params
>> +
>> +
>> +    def get_qemu_flag_replacement(self, option):
>> +        """
>> +        Searches on a list of known misspellings for qemu options and 
>> 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 = [['-mem-path', '-mempath'],]
>> +        replacement = None
>> +
>> +        for mispellings in list_mispellings:
>> +            if option in mispellings:
>> +                option_position = mispellings.index(option)
>> +                replacement = 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.", replacement)
>> +            return None
>> +
>> +        return replacement
>
> _______________________________________________
> Autotest mailing list
> autot...@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>



-- 
Lucas Meneghel
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to