--- /dev/null
+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)
# https://github.com/ceph/ceph-qa-suite.git
import copy
-import errno
import itertools
import logging
import os
-import re
import subprocess
import sys
import yaml
(os.path.join(args.base, collection), collection)
for collection in args.collections
]
-
+
count = 1
num_jobs = 0
for collection, collection_name in sorted(collections):
return []
-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)
-
-
def get_arch(config):
for yamlfile in config:
y = yaml.safe_load(file(yamlfile))