[PATCH 0/2] *** Sosreport accepts underscore and support for s390x platform ***

From: Megha Smriti <mesmriti@linux.vnet.ibm.com> #748: Sosreport accepts underscore in name #749: Added debug report for plaform s390x along with sosreport Megha Smriti (2): Modified code to parse the output of sosreport command using regular expression which gives the name and location of sosreport present in command output, instead of searching the sosreport file with regular pattern "sosreport-<name>*" in /tmp and /var/tmp Modified code to check platform and if its s390x then collect dbginfo tar along with sosreport and create new tar having both the above tar and move to /var/lib/kimchi/debugreports. Also added i18n error messages required for dbginfo. src/wok/plugins/gingerbase/i18n.py | 9 +- src/wok/plugins/gingerbase/model/debugreports.py | 135 +++++++++++++++++------ 2 files changed, 106 insertions(+), 38 deletions(-) -- 2.4.0

From: Megha Smriti <mesmriti@linux.vnet.ibm.com> --- src/wok/plugins/gingerbase/i18n.py | 7 ++- src/wok/plugins/gingerbase/model/debugreports.py | 67 +++++++++++++----------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/wok/plugins/gingerbase/i18n.py b/src/wok/plugins/gingerbase/i18n.py index 8596f17..01573b0 100644 --- a/src/wok/plugins/gingerbase/i18n.py +++ b/src/wok/plugins/gingerbase/i18n.py @@ -29,14 +29,13 @@ messages = { "GGBDR0001E": _("Debug report %(name)s does not exist"), "GGBDR0002E": _("Debug report tool not found in system"), - "GGBDR0003E": _("Unable to create debug report %(name)s. Details: %(err)s."), - "GGBDR0004E": _("Can not find any debug report with the given name %(name)s"), - "GGBDR0005E": _("Unable to generate debug report %(name)s. Details: %(err)s"), + "GGBDR0003E": _("Unable to create sosreport report %(name)s. Details: %(err)s."), + "GGBDR0004E": _("Can not find any sosreport with the given name %(name)s"), + "GGBDR0005E": _("Unable to generate sosreport %(name)s. Details: %(err)s"), "GGBDR0006E": _("You should give a name for the debug report file."), "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."), - "GGBHOST0001E": _("Unable to shutdown host machine as there are running virtual machines"), "GGBHOST0002E": _("Unable to reboot host machine as there are running virtual machines"), "GGBHOST0005E": _("When specifying CPU topology, each element must be an integer greater than zero."), diff --git a/src/wok/plugins/gingerbase/model/debugreports.py b/src/wok/plugins/gingerbase/model/debugreports.py index 94ab7fe..0bb36fe 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,7 +71,7 @@ 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) @@ -87,38 +87,35 @@ class DebugReportsModel(object): # 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 + sosreport_name = name.replace('_', '') + sosreport_name_regex = '(\s+)(\/\w+\/\w+\/|\/\w+\/)' \ + '(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 reportFile is None: + if sosreport_file 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] + raise OperationFailed('GGBDR0004E', {'name': 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) - wok_log.info(msg) - shutil.move(reportFile, target) - # Deleting md5 - msg = 'Deleting report md5 file: "%s"' % (md5_report_file) + 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) - 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 @@ -143,7 +140,7 @@ class DebugReportsModel(object): # and implement the report generating function # based on the new report command report_tools = ({'cmd': 'sosreport --help', - 'fn': DebugReportsModel.sosreport_generate},) + 'fn': DebugReportsModel.debugreport_generate},) # check if the command can be found by shell one by one for helper_tool in report_tools: @@ -213,3 +210,13 @@ class DebugReportContentModel(object): def lookup(self, name): return self._debugreport.lookup(name) + + +def delete_the_sosreport_md5_file(md5_file): + # Deleting md5 + 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) -- 2.4.0

From: Megha Smriti <mesmriti@linux.vnet.ibm.com> --- src/wok/plugins/gingerbase/i18n.py | 2 + src/wok/plugins/gingerbase/model/debugreports.py | 80 +++++++++++++++++++++--- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/src/wok/plugins/gingerbase/i18n.py b/src/wok/plugins/gingerbase/i18n.py index 01573b0..e19b997 100644 --- a/src/wok/plugins/gingerbase/i18n.py +++ b/src/wok/plugins/gingerbase/i18n.py @@ -36,6 +36,8 @@ 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 tar the final debug report tar file with %(retcode)s. Details: %(error)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"), "GGBHOST0005E": _("When specifying CPU topology, each element must be an integer greater than zero."), diff --git a/src/wok/plugins/gingerbase/model/debugreports.py b/src/wok/plugins/gingerbase/model/debugreports.py index 0bb36fe..719e460 100644 --- a/src/wok/plugins/gingerbase/model/debugreports.py +++ b/src/wok/plugins/gingerbase/model/debugreports.py @@ -25,6 +25,7 @@ import os import shutil import subprocess import time +import platform import re from wok.exception import InvalidParameter, NotFoundError, OperationFailed @@ -108,16 +109,75 @@ class DebugReportsModel(object): raise OperationFailed('GGBDR0004E', {'name': 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 + # If the platform is a system Z machine. + if platform.machine().startswith('s390'): + dbgreport_regex = '(\S+\s+)(\/\w+\/\w+-[\d+]{4}-[\d+]{2}' \ + '-[\d+]{2}-[\d+]{2}-[\d+]{2}' \ + '-[\d+]{2}-\w+-\d+\S+)(\s+\S+)' + command = ['/usr/sbin/dbginfo.sh'] + output, error, retcode = run_command(command) + if retcode != 0: + raise OperationFailed("GGBDR0009E", + {'retcode': retcode, 'err': error}) + output = output.splitlines() + for line in output: + line = line.strip() + n = re.match(dbgreport_regex, line) + if n: + dbginfo_report = n.groups()[1] + break + pathis = '/var/tmp/' + file_extension_dbginfo = dbginfo_report.split('/', 2)[2] + target_report_file = os.path.join(pathis, + file_extension_dbginfo) + msg = 'Moving the "%s" to "%s"'\ + % (dbginfo_report, target_report_file) + shutil.move(dbginfo_report, target_report_file) + wok_log.info(msg) + 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('/', 2)[2] + msg = 'Zipping the sosreport and debug info files into ' \ + 'final report file' + wok_log.info(msg) + command = ['tar', '-cvzf', '%s' % final_tar_report_name, + '-C', '/var/tmp/', 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 report + 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) + delete_the_sosreport_md5_file(md5_report_file) + msg = 'Deleting the dbginfo file "%s" ' \ + % target_report_file + wok_log.info(msg) + os.remove(target_report_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 + else: + 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 except WokException as e: log_error(e) -- 2.4.0

Please ignore this patch. On 11/2/2015 5:27 PM, archus@linux.vnet.ibm.com wrote:
From: Megha Smriti <mesmriti@linux.vnet.ibm.com>
#748: Sosreport accepts underscore in name #749: Added debug report for plaform s390x along with sosreport
Megha Smriti (2): Modified code to parse the output of sosreport command using regular expression which gives the name and location of sosreport present in command output, instead of searching the sosreport file with regular pattern "sosreport-<name>*" in /tmp and /var/tmp Modified code to check platform and if its s390x then collect dbginfo tar along with sosreport and create new tar having both the above tar and move to /var/lib/kimchi/debugreports. Also added i18n error messages required for dbginfo.
src/wok/plugins/gingerbase/i18n.py | 9 +- src/wok/plugins/gingerbase/model/debugreports.py | 135 +++++++++++++++++------ 2 files changed, 106 insertions(+), 38 deletions(-)
participants (2)
-
Archana Singh
-
archus@linux.vnet.ibm.com