[Kimchi-devel] [PATCH] Dbginfo report generation

mesmriti at linux.vnet.ibm.com mesmriti at linux.vnet.ibm.com
Tue Nov 17 22:05:50 UTC 2015


From: root <root at localhost.localdomain>

Signed-off-by: root <root at localhost.localdomain>
---
 src/wok/plugins/gingerbase/i18n.py               |   4 +-
 src/wok/plugins/gingerbase/model/debugreports.py | 212 ++++++++++++++++++-----
 2 files changed, 167 insertions(+), 49 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..927e173 100644
--- a/src/wok/plugins/gingerbase/model/debugreports.py
+++ b/src/wok/plugins/gingerbase/model/debugreports.py
@@ -19,13 +19,14 @@
 # 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 platform
+import re
 
 from wok.exception import InvalidParameter, NotFoundError, OperationFailed
 from wok.exception import WokException
@@ -71,54 +72,109 @@ 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)
 
         try:
-            command = ['sosreport', '--batch', '--name=%s' % name]
-            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
-                    break
-            # 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]
+            # 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.
+            if platform.machine().startswith('s390'):
+                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("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
+                final_tar_report_name = name + report_file_extension
+                if dbginfo_report is not None:
+                    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()
+                    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)
+                    os.remove(dbginfo_report)
+                    # Deleting the sosreport file
+                    msg = 'Deleting the sosreport file "%s" ' % sosreport_file
+                    wok_log.info(msg)
+                    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
+
+        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):
+            log = logging.getLogger('Model')
+            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()
-            target = os.path.join(path, name + report_file_extension)
-            # Moving report
-            msg = 'Moving debug report file "%s" to "%s"' % (reportFile,
-                                                             target)
+            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(reportFile, target)
-            # Deleting md5
-            msg = 'Deleting report md5 file: "%s"' % (md5_report_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)
+            shutil.move(sosreport_file, sosreport_target)
+            delete_the_sosreport_md5_file(md5_report_file)
             cb('OK', True)
             return
 
@@ -142,17 +198,27 @@ 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
         for helper_tool in report_tools:
             try:
-                retcode = subprocess.call(helper_tool['cmd'], shell=True,
-                                          stdout=subprocess.PIPE,
-                                          stderr=subprocess.PIPE)
-                if retcode == 0:
-                    return helper_tool['fn']
+                if 'cmd' == '/usr/sbin/dbginfo.sh --help':
+                    retcode = subprocess.call(helper_tool['cmd'], shell=True,
+                                              stdout=subprocess.PIPE,
+                                              stderr=subprocess.PIPE)
+                    if retcode == 0:
+                        return helper_tool['fn']
+                else:
+
+                    retcode = subprocess.call(helper_tool['cmd'], shell=True,
+                                              stdout=subprocess.PIPE,
+                                              stderr=subprocess.PIPE)
+                    if retcode == 0:
+                        return helper_tool['fn']
             except Exception, e:
                 wok_log.info('Exception running command: %s', e)
 
@@ -213,3 +279,53 @@ 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 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
+    sosreport_name = name.replace('_', '')
+    sosreport_name_regex = '(\s+)(' + path_sosreport + \
+                           ')(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:
+                path = matched_name.groups()[1]
+                fname = matched_name.groups()[2]
+                sosreport_file = path + fname
+                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
-- 
2.4.3




More information about the Kimchi-devel mailing list