Hi Aline,

Please find my comments below.

Regards,
Megha

Subject: Re: [Kimchi-devel] [PATCH] Fixed the comments for debugreports in report tool and removed the check for platform s390x and introduced wok_log errors in log_errors.
Date: Mon, 30 Nov 2015 12:03:46 -0200
From: Aline Manera <alinefm@linux.vnet.ibm.com>
To: mesmriti@linux.vnet.ibm.com, Kimchi Devel <kimchi-devel@ovirt.org>


Almost there! =)

Some comments below

On 19/11/2015 02:56, mesmriti@linux.vnet.ibm.com wrote:
> From: root <root@localhost.localdomain>
>
> Signed-off-by: mesmriti@linux.vnet.ibm.com
> ---
>   src/wok/plugins/gingerbase/i18n.py               |   4 +-
>   src/wok/plugins/gingerbase/model/debugreports.py | 181 ++++++++++++++++++-----
>   2 files changed, 143 insertions(+), 42 deletions(-)
>
> diff --git a/src/wok/plugins/gingerbase/i18n.py b/src/wok/plugins/gingerbase/i18n.py
> index af75c70..6ff783b 100644
> --- a/src/wok/plugins/gingerbase/i18n.py
> +++ b/src/wok/plugins/gingerbase/i18n.py
> @@ -36,7 +36,9 @@ messages = {
>       "GGBDR0007E": _("Debug report name must be a string. Only letters, digits, underscore ('_') and "
>                       "hyphen ('-') are allowed."),
>       "GGBDR0008E": _("The debug report with specified name \"%(name)s\" already exists. Please use another one."),
> -
> +    "GGBDR0009E": _("Unable to create dbginfo report with %(retcode)s. Details: %(err)s"),
> +    "GGBDR0010E": _("Unable to compress the final debug report tar file with %(retcode)s. Details: %(error)s"),
> +    "GGBDR0011E": _("Unable to generate final debug report %(name)s. Details: %(err)s"),
>       "GGBHOST0001E": _("Unable to shutdown host machine as there are running virtual machines"),
>       "GGBHOST0002E": _("Unable to reboot host machine as there are running virtual machines"),
>       "GGBHOST0003E": _("There may be virtual machines running on the host"),
> diff --git a/src/wok/plugins/gingerbase/model/debugreports.py b/src/wok/plugins/gingerbase/model/debugreports.py
> index 94ab7fe..c6b60e8 100644
> --- a/src/wok/plugins/gingerbase/model/debugreports.py
> +++ b/src/wok/plugins/gingerbase/model/debugreports.py
> @@ -19,13 +19,13 @@
>   # License along with this library; if not, write to the Free Software
>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
>
> -import fnmatch
>   import glob
>   import logging
>   import os
>   import shutil
>   import subprocess
>   import time
> +import re
>
>   from wok.exception import InvalidParameter, NotFoundError, OperationFailed
>   from wok.exception import WokException
> @@ -71,54 +71,107 @@ class DebugReportsModel(object):
>           raise OperationFailed("GGBDR0002E")
>
>       @staticmethod
> -    def sosreport_generate(cb, name):
> +    def debugreport_generate(cb, name):
>           def log_error(e):
> -            log = logging.getLogger('Model')
> -            log.warning('Exception in generating debug file: %s', e)
> +            wok_log = logging.getLogger('Model')
> +            wok_log.warning('Exception in generating debug file: %s', e)
>
>           try:
> -            command = ['sosreport', '--batch', '--name=%s' % name]
> +            # Sosreport generation
> +            sosreport_file = sosreport_collection(name)
> +            md5_report_file = sosreport_file + '.md5'
> +            report_file_extension = '.' + sosreport_file.split('.', 1)[1]
> +            # If the platform is a system Z machine.
> +            path_debugreport = '/var/tmp/'
> +            dbgreport_regex = '(\S+\s+)(' + path_debugreport + \
> +                              'DBGINFO-[\d+]{4}-[\d+]{2}' \
> +                              '-[\d+]{2}-[\d+]{2}-[\d+]{2}' \
> +                              '-[\d+]{2}-\w+-\d+\S+)(\s+\S+)'
> +            command = ['/usr/sbin/dbginfo.sh', '-d', path_debugreport]
>               output, error, retcode = run_command(command)
> -
>               if retcode != 0:
> -                raise OperationFailed("GGBDR0003E", {'name': name,
> -                                                     'err': retcode})
> -
> -            # SOSREPORT might create file in /tmp or /var/tmp
> -            # FIXME: The right way should be passing the tar.xz file directory
> -            # though the parameter '--tmp-dir', but it is failing in Fedora 20
> -            patterns = ['/tmp/sosreport-%s-*', '/var/tmp/sosreport-%s-*']
> -            reports = []
> -            reportFile = None
> -            for p in patterns:
> -                reports = reports + [f for f in glob.glob(p % name)]
> -            for f in reports:
> -                if not fnmatch.fnmatch(f, '*.md5'):
> -                    reportFile = f
> +                raise OperationFailed("GGBDR0009E",
> +                                      {'retcode': retcode, 'err': error})

> +            output = output.splitlines()
> +            dbginfo_report = None
> +            for line in output:
> +                line = line.strip()
> +                n = re.match(dbgreport_regex, line)
> +                if n:
> +                    dbginfo_report = n.groups()[1]
>                       break

As you know where dbg report will be created, you can change the 
dbgreport_regex to be a string pattern and use glob.

import glob

file = glob.glob(dgbreport_pattern)
if len(file) == 0:
    # error
 [Megha:] Will incorporate this in my next patch.
I included I more detailed example on how use glob below.

> -            # Some error in sosreport happened
> -            if reportFile is None:
> -                wok_log.error('Debug report file not found. See sosreport '
> -                              'output for detail:\n%s', output)
> -                fname = (patterns[0] % name).split('/')[-1]
> -                raise OperationFailed('GGBDR0004E', {'name': fname})
> -
> -            md5_report_file = reportFile + '.md5'
> -            report_file_extension = '.' + reportFile.split('.', 1)[1]
> +            final_tar_report_name = name + report_file_extension
> +            sosreport_tar = sosreport_file.split('/', 3)[3]
> +            dbginfo_tar = dbginfo_report.split('/', 3)[3]
> +            msg = 'Compressing the sosreport and debug info files into ' \
> +                  'final report file'
> +            wok_log.info(msg)
> +            # Compressing the sosreport and dbginfo reports into one
> +            # tar file
> +            command = ['tar', '-cvzf', '%s' % final_tar_report_name,
> +                       '-C', path_debugreport, dbginfo_tar,
> +                       sosreport_tar]
> +            output, error, retcode = run_command(command)
> +            if retcode != 0:
> +                raise OperationFailed("GGBDR0010E",
> +                                      {'retcode': retcode,
> +                                       'error': error})
>               path = config.get_debugreports_path()
> -            target = os.path.join(path, name + report_file_extension)
> -            # Moving report
> -            msg = 'Moving debug report file "%s" to "%s"' % (reportFile,
> -                                                             target)
> +            dbg_target = os.path.join(path,
> +                                      name + report_file_extension)
> +            # Moving final tar file to debugreports path
> +            msg = 'Moving final debug  report file "%s" to "%s"' % \
> +                  (final_tar_report_name, dbg_target)
> +            wok_log.info(msg)
> +            shutil.move(final_tar_report_name, dbg_target)
> +            # Deleting the sosreport md5 file
> +            delete_the_sosreport_md5_file(md5_report_file)
> +            # Deleting the dbingo report file
> +            msg = 'Deleting the dbginfo file "%s" ' \
> +                  % dbginfo_report
>               wok_log.info(msg)
> -            shutil.move(reportFile, target)
> -            # Deleting md5
> -            msg = 'Deleting report md5 file: "%s"' % (md5_report_file)
> +            os.remove(dbginfo_report)
> +            # Deleting the sosreport file
> +            msg = 'Deleting the sosreport file "%s" ' % sosreport_file
>               wok_log.info(msg)
> -            with open(md5_report_file) as f:
> -                md5 = f.read().strip()
> -                wok_log.info('Md5 file content: "%s"', md5)
> -            os.remove(md5_report_file)
> +            os.remove(sosreport_file)
> +            wok_log.info('The debug report file has been moved')
> +            cb('OK', True)
> +            return
> +

> +        except WokException as e:
> +            log_error(e)
> +            raise
> +
> +        except OSError as e:
> +            log_error(e)
> +            raise
> +

Please, raise an appropriated exception. Otherwise, the user will not be 
able to understand what went wrong.
[Megha]: As far as exceptions are concerned These are the exception I think can be thrown back from the try block and
                      it is also similar to  what is done in sosreport. Please correct me if I any suggestions.
> +        except Exception, e:
> +            # No need to call cb to update the task status here.
> +            # The task object will catch the exception raised here
> +            # and update the task status there
> +            log_error(e)
> +            raise OperationFailed("GGBDR0011E", {'name': name, 'err': e})
> +
> +    @staticmethod
> +    def sosreport_generate(cb, name):
> +        def log_error(e):
> +            wok_log = logging.getLogger('Model')
> +            wok_log.warning('Exception in generating debug file: %s', e)
> +        try:
> +            # Sosreport collection
> +            sosreport_file = sosreport_collection(name)
> +            md5_report_file = sosreport_file + '.md5'
> +            report_file_extension = '.' + sosreport_file.split('.', 1)[1]
> +            path = config.get_debugreports_path()
> +            sosreport_target = os.path.join(path,
> +                                            name + report_file_extension)
> +            msg = 'Moving debug report file "%s" to "%s"' \
> +                  % (sosreport_file, sosreport_target)
> +            wok_log.info(msg)
> +            shutil.move(sosreport_file, sosreport_target)
> +            delete_the_sosreport_md5_file(md5_report_file)
>               cb('OK', True)
>               return
>
> @@ -142,7 +195,9 @@ class DebugReportsModel(object):
>           # Please add new possible debug report command here
>           # and implement the report generating function
>           # based on the new report command
> -        report_tools = ({'cmd': 'sosreport --help',
> +        report_tools = ({'cmd': '/usr/sbin/dbginfo.sh --help',
> +                         'fn': DebugReportsModel.debugreport_generate},
> +                        {'cmd': 'sosreport --help',
>                            'fn': DebugReportsModel.sosreport_generate},)
>
>           # check if the command can be found by shell one by one
> @@ -213,3 +268,47 @@ class DebugReportContentModel(object):
>
>       def lookup(self, name):
>           return self._debugreport.lookup(name)
> +
> +
> +def delete_the_sosreport_md5_file(md5_file):
> +    """
> +    Deleting md5 file and displaying the contents of the same.
> +    """
> +    msg = 'Deleting report md5 file: "%s"' % md5_file
> +    wok_log.info(msg)
> +    with open(md5_file) as f:
> +        md5 = f.read().strip()
> +        wok_log.info('Md5 file content: "%s"', md5)
> +    os.remove(md5_file)
> +
> +
> +def sosreport_collection(name):
> +    """
> +    Code for the collection of sosreport n the path
> +    /var/tmp as specified in the command.
> +    """
> +    path_sosreport = '/var/tmp/'
> +    command = ['sosreport', '--batch', '--name=%s' % name,
> +               '--tmp-dir=%s' % path_sosreport]
> +    output, error, retcode = run_command(command)
> +    if retcode != 0:
> +        raise OperationFailed("GGBDR0003E", {'name': name,
> +                                             'err': retcode})
> +

> +    sosreport_name_regex = '(\s+)(' + path_sosreport + \
> +                           'sosreport-' +\
> +                           name + '-\d+.tar.xz)'
> +    sosreport_file = None
> +    output = output.splitlines()
> +    for line in output:
> +        if line:
> +            matched_name = re.match(sosreport_name_regex, line)
> +            if matched_name:
> +                sosreport_file = matched_name.groups()[1]
> +                break
> +    # Some error in sosreport happened
> +    if sosreport_file is None:
> +        wok_log.error('Debug report file not found. See sosreport '
> +                      'output for detail:\n%s', output)
> +        raise OperationFailed('GGBDR0004E', {'name': name})
> +    return sosreport_file

You know the sosreport file was created under /var/tmp so you don't need 
to query the command output to know the file was created or not.

If you want to confirm the file was created you can use 'glob'

import glob

sosreport_pattern = path_sosreport + 'sosreport-' + name + '.tar.xz'
sosreport_file = glob.glob(sosreport_pattern)

if len(sosreport_file) == 0:
    raise OperationFailed()

return sosreport_file[0]

[Megha]: Will incorporate in my next patch
_______________________________________________
Kimchi-devel mailing list
Kimchi-devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/kimchi-devel