On Tue, Jun 7, 2011 at 6:42 PM, Cleber Rosa <[email protected]> wrote:
> Hi Jean-Marc,
>
> Here's the link for codereview issue: http://codereview.appspot.com/4547087/
>
> Cheers!

Posted the comments I had on codereview.

Thanks!

> On 06/07/2011 12:54 PM, Jean-Marc Eurin wrote:
>
> Thanks for providing this.  I have a few minor comments, would you mind
> putting this patch in a code review tool
> (like http://codereview.appspot.com/)?
> Thanks
>
> Jean-Marc
>
>
> On Tue, Jun 7, 2011 at 6:55 AM, Cleber Rosa <[email protected]> wrote:
>>
>> This module contains extensions to 'atest' that proved to be useful
>> when doing virtualization testing of multiple KVM versions, on multiple
>> operating system versions (Fedora, RHEL5, RHEL6).
>>
>> This attempts to kick off the sharing of site_*.py files that
>> might be useful to others.
>>
>> Signed-off-by: Cleber Rosa <[email protected]>
>> ---
>>  contrib/virt/site_job.py |  193
>> ++++++++++++++++++++++++++++++++++++++++++++++
>>  1 files changed, 193 insertions(+), 0 deletions(-)
>>  create mode 100644 contrib/virt/site_job.py
>>
>> diff --git a/contrib/virt/site_job.py b/contrib/virt/site_job.py
>> new file mode 100644
>> index 0000000..a062809
>> --- /dev/null
>> +++ b/contrib/virt/site_job.py
>> @@ -0,0 +1,193 @@
>> +import os, re, sys, pwd, time, socket, getpass
>> +import inspect, new, logging, string, tempfile
>> +
>> +from autotest_lib.cli import topic_common, action_common
>> +from autotest_lib.cli import job
>> +from autotest_lib.client.common_lib import logging_config
>> +from autotest_lib.client.virt import virt_utils
>> +
>> +class site_job(job.job):
>> +    pass
>> +
>> +class site_job_create(job.job_create):
>> +    """
>> +    Adds job manipulation including installing packages from brew
>> +    """
>> +
>> +    op_action = 'create'
>> +
>> +    def __init__(self):
>> +        super(site_job_create, self).__init__()
>> +        self.parser.add_option('-T', '--template', action='store_true',
>> +                               help='Control file is actually a
>> template')
>> +        self.parser.add_option('--extra-cartesian-config',
>> +                               help='Add extra configuration to the
>> cartesian '
>> +                               'config file')
>> +        self.parser.add_option('--timestamp', action='store_true',
>> +                               help='Add a timestamp to the name of the
>> job')
>> +        self.parser.add_option('--koji-arch', default='x86_64',
>> +                               help='Default architecture for packages '
>> +                               'that will be fetched from koji build. '
>> +                               'This will be combined with "noarch".'
>> +                               'This option is used to help to validate '
>> +                               'packages from the job submitting
>> machine.')
>> +        self.parser.add_option('--koji-tag', help='Sets a default koji
>> tag '
>> +                               'for koji packages specified with
>> --koji-pkg')
>> +        self.parser.add_option('--koji-pkg', action='append',
>> +                               help='Packages to add to host installation
>> '
>> +                               'based on koji build. This options may be
>> '
>> +                               'specified multiple times.')
>> +        self.koji_client = None
>> +
>> +
>> +    def parse(self):
>> +        '''
>> +        Parse options.
>> +
>> +        If any brew options is specified, instantiate KojiDownloader
>> +        '''
>> +        (self.command_line_options,
>> +         self.command_line_leftover) = super(site_job_create,
>> self).parse()
>> +
>> +        #
>> +        # creating the new control file
>> +        #
>> +        if (self.command_line_options.template and
>> +            self.command_line_options.control_file):
>> +            generated_control_file = self.__generate_control_file()
>> +            self.data['control_file'] =
>> open(generated_control_file).read()
>> +
>> +        if self.command_line_options.koji_pkg:
>> +            if self.koji_client is None:
>> +                self.koji_client = virt_utils.KojiClient()
>> +
>> +        return (self.command_line_options, self.command_line_leftover)
>> +
>> +
>> +    def __process_options(self):
>> +        '''
>> +        Process all options given on command line
>> +        '''
>> +        all_options_valid = True
>> +
>> +        self.__set_koji_tag()
>> +        if not self.__check_koji_packages():
>> +            all_options_valid = False
>> +
>> +        return all_options_valid
>> +
>> +
>> +    def __set_koji_tag(self):
>> +        '''
>> +        Sets the default koji tag.
>> +
>> +        Configuration item on file is: koji_tag
>> +        '''
>> +        if self.command_line_options.koji_tag is not None:
>> +
>>  virt_utils.set_default_koji_tag(self.command_line_options.koji_tag)
>> +
>> +
>> +    def __check_koji_packages(self):
>> +        '''
>> +        Check if packages specification are valid and exist on koji/brew
>> +
>> +        Configuration item on file is: koji_pkgs
>> +        '''
>> +        all_packages_found = True
>> +        if self.command_line_options.koji_pkg is not None:
>> +            logging.debug('Checking koji packages specification')
>> +            for pkg_spec_text in self.command_line_options.koji_pkg:
>> +                pkg_spec = virt_utils.KojiPkgSpec(pkg_spec_text)
>> +
>> +                if not (pkg_spec.is_valid() and
>> +                        self.koji_client.is_pkg_valid(pkg_spec)):
>> +                    logging.error('Koji package spec is not valid,
>> skipping: '
>> +                                  '%s' % pkg_spec)
>> +                    all_packages_found = False
>> +                else:
>> +                    rpms = self.koji_client.get_pkg_rpm_info(
>> +                        pkg_spec,
>> +                        self.command_line_options.koji_arch)
>> +                    for subpackage in pkg_spec.subpackages:
>> +                        if subpackage not in [rpm['name'] for rpm in
>> rpms]:
>> +                            logging.error('Package specified but not
>> found in '
>> +                                          'koji: %s' % subpackage)
>> +                            all_packages_found = False
>> +
>> +                    rpms = ", ".join(rpm['nvr'] for rpm in rpms)
>> +                    logging.debug('Koji package spec is valid')
>> +                    logging.debug('Koji packages to be fetched and
>> installed: '
>> +                                  '%s' % rpms)
>> +
>> +        return all_packages_found
>> +
>> +    def __generate_job_config(self):
>> +        '''
>> +        Converts all options given on the command line to config file
>> syntax
>> +        '''
>> +        extra = []
>> +        if self.command_line_options.extra_cartesian_config:
>> +
>>  extra.append(self.command_line_options.extra_cartesian_config)
>> +
>> +        if self.command_line_options.koji_tag:
>> +            extra.append("koji_tag = %s" %
>> self.command_line_options.koji_tag)
>> +
>> +        if self.command_line_options.koji_pkg:
>> +            koji_pkgs = []
>> +            for koji_pkg in self.command_line_options.koji_pkg:
>> +                koji_pkgs.append('"%s"' % koji_pkg)
>> +            extra.append("koji_pkgs = [%s]" % ', '.join(koji_pkgs))
>> +
>> +        # add quotes...
>> +        extra = ["'%s'" % e for e in extra]
>> +        # ... and return as string that will be eval'd as a Python list
>> +        return "[%s]" % ', '.join(extra)
>> +
>> +
>> +    def __generate_control_file(self):
>> +        '''
>> +        Generates a controle file from a template
>> +        '''
>> +        custom_job_cfg = self.__generate_job_config()
>> +        input_file = self.command_line_options.control_file
>> +        logging.debug('Generating control file from template: %s' %
>> input_file)
>> +        template = string.Template(open(input_file).read())
>> +        output_fd, path = tempfile.mkstemp(prefix='atest_control_',
>> dir='/tmp')
>> +        logging.debug('Generated control file to be saved at: %s' % path)
>> +        parameters_dict = {"custom_job_cfg": custom_job_cfg}
>> +        control_file_text = template.substitute(parameters_dict)
>> +        os.write(output_fd, control_file_text)
>> +        os.close(output_fd)
>> +        return path
>> +
>> +
>> +    def execute(self):
>> +        if not self.__process_options():
>> +            self.generic_error('Some command line options validation
>> failed. '
>> +                               'Aborting job creation.')
>> +            return
>> +
>> +        #
>> +        # add timestamp to the jobname
>> +        #
>> +        if self.command_line_options.timestamp:
>> +            logging.debug("Adding timestamp to jobname")
>> +            timestamp = time.strftime(" %m-%d-%Y %H:%M:%S",
>> time.localtime())
>> +            self.jobname += timestamp
>> +            self.data['name'] = self.jobname
>> +
>> +        execute_results = super(site_job_create, self).execute()
>> +        self.output(execute_results)
>> +
>> +
>> +for cls in [getattr(job, n) for n in dir(job) if not n.startswith("_")]:
>> +    if not inspect.isclass(cls):
>> +        continue
>> +    cls_name = cls.__name__
>> +    site_cls_name = 'site_' + cls_name
>> +    if hasattr(sys.modules[__name__], site_cls_name):
>> +        continue
>> +    bases = (site_job, cls)
>> +    members = {'__doc__': cls.__doc__}
>> +    site_cls = new.classobj(site_cls_name, bases, members)
>> +    setattr(sys.modules[__name__], site_cls_name, site_cls)
>> --
>> 1.7.4.4
>>
>> _______________________________________________
>> Autotest mailing list
>> [email protected]
>> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
>
>
> _______________________________________________
> Autotest mailing list
> [email protected]
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
>



-- 
Lucas
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to