ceph/teuthology/ls.py
Zack Cerza 2a7de82498 Move teuthology-ls's implementation to ls.py
Signed-off-by: Zack Cerza <zack.cerza@inktank.com>
2014-06-06 16:15:15 -05:00

72 lines
2.4 KiB
Python

import os
import yaml
import errno
import re
def main(args):
return ls(args.archive_dir, args.verbose)
def ls(archive_dir, verbose):
for j in get_jobs(archive_dir):
job_dir = os.path.join(archive_dir, j)
summary = {}
try:
with file(os.path.join(job_dir, 'summary.yaml')) as f:
g = yaml.safe_load_all(f)
for new in g:
summary.update(new)
except IOError as e:
if e.errno == errno.ENOENT:
print '%s ' % j,
# pid
try:
pidfile = os.path.join(job_dir, 'pid')
found = False
if os.path.isfile(pidfile):
pid = open(pidfile, 'r').read()
if os.path.isdir("/proc/%s" % pid):
cmdline = open('/proc/%s/cmdline' % pid,
'r').read()
if cmdline.find(archive_dir) >= 0:
print '(pid %s)' % pid,
found = True
if not found:
print '(no process or summary.yaml)',
# tail
tail = os.popen(
'tail -1 %s/%s/teuthology.log' % (archive_dir, j)
).read().rstrip()
print tail,
except IOError as e:
continue
print ''
continue
else:
raise
print "{job} {success} {owner} {desc} {duration}s".format(
job=j,
owner=summary.get('owner', '-'),
desc=summary.get('description', '-'),
success='pass' if summary.get('success', False) else 'FAIL',
duration=int(summary.get('duration', 0)),
)
if verbose and 'failure_reason' in summary:
print ' {reason}'.format(reason=summary['failure_reason'])
def get_jobs(archive_dir):
dir_contents = os.listdir(archive_dir)
def is_job_dir(parent, subdir):
if (os.path.isdir(os.path.join(parent, subdir)) and re.match('\d+$',
subdir)):
return True
return False
jobs = [job for job in dir_contents if is_job_dir(archive_dir, job)]
return sorted(jobs)