Reviewed-by: Aline Manera <alinefm(a)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(a)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: