[Kimchi-devel] [PATCH V4] Fix host debug report for Fedora 20
Aline Manera
alinefm at linux.vnet.ibm.com
Thu Feb 13 23:45:51 UTC 2014
Reviewed-by: Aline Manera <alinefm at linux.vnet.ibm.com>
On 02/13/2014 06:28 PM, Rodrigo Trujillo wrote:
> The tool sosreport does not save the report file in /tmp in F20, this
> causes a error in Kimchi, which has /tmp hardcoded. This fixes this
> problem searching report files in /var/tmp too.
> Notice that is possible to pass --tmp-dir as the directory to save the
> report file, but this option is crashing in Fedora 20, so the code is
> not using it.
> This patch also improves the logging and uses new i18n translation
> system for exception error messages.
>
> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
> ---
> src/kimchi/i18n.py | 2 +-
> src/kimchi/model/debugreports.py | 58 +++++++++++++++++++++++++---------------
> 2 files changed, 37 insertions(+), 23 deletions(-)
>
> diff --git a/src/kimchi/i18n.py b/src/kimchi/i18n.py
> index 03d1052..cd06264 100644
> --- a/src/kimchi/i18n.py
> +++ b/src/kimchi/i18n.py
> @@ -164,7 +164,7 @@ messages = {
> "KCHDR0001E": _("Debug report %(name)s does not exist"),
> "KCHDR0002E": _("Debug report tool not found in system"),
> "KCHDR0003E": _("Unable to create debug report %(name)s. Details: %(err)s."),
> - "KCHDR0004E": _("Can not find generated debug report named %(name)s"),
> + "KCHDR0004E": _("Can not find any generated debug report matching name %(name)s"),
> "KCHDR0005E": _("Unable to generate debug report %(name)s. Details: %(err)s"),
>
> "KCHSR0001E": _("Storage server %(server)s was not used by Kimchi"),
> diff --git a/src/kimchi/model/debugreports.py b/src/kimchi/model/debugreports.py
> index 2c5b13a..dc27eee 100644
> --- a/src/kimchi/model/debugreports.py
> +++ b/src/kimchi/model/debugreports.py
> @@ -32,6 +32,7 @@ from kimchi import config
> from kimchi.exception import NotFoundError, OperationFailed
> from kimchi.model.tasks import TaskModel
> from kimchi.utils import add_task, kimchi_log
> +from kimchi.utils import run_command
>
>
> class DebugReportsModel(object):
> @@ -63,38 +64,51 @@ class DebugReportsModel(object):
>
> @staticmethod
> def sosreport_generate(cb, name):
> - command = 'sosreport --batch --name "%s"' % name
> try:
> - retcode = subprocess.call(command, shell=True,
> - stdout=subprocess.PIPE)
> + command = ['sosreport', '--batch', '--name=%s' % name]
> + output, error, retcode = run_command(command)
> +
> if retcode < 0:
> raise OperationFailed("KCHDR0003E", {'name': name,
> 'err': retcode})
> elif retcode > 0:
> raise OperationFailed("KCHDR0003E", {'name': name,
> 'err': retcode})
> - pattern = '/tmp/sosreport-%s-*' % name
> - for reportFile in glob.glob(pattern):
> - if not fnmatch.fnmatch(reportFile, '*.md5'):
> - output = reportFile
> +
> + # 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
> - else:
> - # sosreport tends to change the name mangling rule and
> - # compression file format between different releases.
> - # It's possible to fail to match a report file even sosreport
> - # runs successfully. In future we might have a general name
> - # mangling function in kimchi to format the name before passing
> - # it to sosreport. Then we can delete this exception.
> - raise OperationFailed("KCHDR0004E", {'name': pattern})
> -
> - ext = output.split('.', 1)[1]
> + # Some error in sosreport happened
> + if reportFile is None:
> + kimchi_log.error('Debug report file not found. See sosreport '
> + 'output for detail:\n%s', output)
> + raise OperationFailed('KCHDR0004E',
> + {'name': (patterns[0] % name).split('/')[-1]})
> +
> + md5_report_file = reportFile + '.md5'
> + report_file_extension = '.' + reportFile.split('.', 1)[1]
> path = config.get_debugreports_path()
> - target = os.path.join(path, name)
> - target_file = '%s.%s' % (target, ext)
> - shutil.move(output, target_file)
> - os.remove('%s.md5' % output)
> + target = os.path.join(path, name + report_file_extension)
> + # Moving report
> + msg = 'Moving debug report file "%s" to "%s"' % (reportFile, target)
> + kimchi_log.info(msg)
> + shutil.move(reportFile, target)
> + # Deleting md5
> + msg = 'Deleting report md5 file: "%s"' % (md5_report_file)
> + kimchi_log.info(msg)
> + md5 = open(md5_report_file).read().strip()
> + kimchi_log.info('Md5 file content: "%s"', md5)
> + os.remove(md5_report_file)
> cb('OK', True)
> -
> return
>
> except OSError:
More information about the Kimchi-devel
mailing list