def test_get_jobs(self, m_listdir, m_isdir): m_listdir.return_value = ["1", "a", "3"] m_isdir.return_value = True results = ls.get_jobs("some/archive/dir") assert results == ["1", "3"]
def build_email_body(name, archive_dir): failed = {} hung = {} passed = {} for job in ls.get_jobs(archive_dir): job_dir = os.path.join(archive_dir, job) summary_file = os.path.join(job_dir, 'summary.yaml') # Every job gets a link to e.g. pulpito's pages info_url = misc.get_results_url(name, job) if info_url: info_line = email_templates['info_url_templ'].format(info=info_url) else: info_line = '' # Unfinished jobs will have no summary.yaml if not os.path.exists(summary_file): info_file = os.path.join(job_dir, 'info.yaml') desc = '' if os.path.exists(info_file): with file(info_file) as f: info = yaml.safe_load(f) desc = info['description'] hung[job] = email_templates['hung_templ'].format( job_id=job, desc=desc, info_line=info_line, ) continue with file(summary_file) as f: summary = yaml.safe_load(f) if get_status(summary) == 'pass': passed[job] = email_templates['pass_templ'].format( job_id=job, desc=summary.get('description'), time=int(summary.get('duration', 0)), info_line=info_line, ) else: log = misc.get_http_log_path(archive_dir, job) if log: log_line = email_templates['fail_log_templ'].format(log=log) else: log_line = '' # Transitioning from sentry_events -> sentry_event sentry_events = summary.get('sentry_events') if sentry_events: sentry_event = sentry_events[0] else: sentry_event = summary.get('sentry_event', '') if sentry_event: sentry_line = email_templates['fail_sentry_templ'].format( sentry_event=sentry_event) else: sentry_line = '' # 'fill' is from the textwrap module and it collapses a given # string into multiple lines of a maximum width as specified. We # want 75 characters here so that when we indent by 4 on the next # line, we have 79-character exception paragraphs. reason = fill(summary.get('failure_reason'), 75) reason = '\n'.join((' ') + line for line in reason.splitlines()) failed[job] = email_templates['fail_templ'].format( job_id=job, desc=summary.get('description'), time=int(summary.get('duration', 0)), reason=reason, info_line=info_line, log_line=log_line, sentry_line=sentry_line, ) maybe_comma = lambda s: ', ' if s else ' ' subject = '' fail_sect = '' hung_sect = '' pass_sect = '' if failed: subject += '{num_failed} failed{sep}'.format(num_failed=len(failed), sep=maybe_comma( hung or passed)) fail_sect = email_templates['sect_templ'].format(title='Failed', jobs=''.join( failed.values())) if hung: subject += '{num_hung} hung{sep}'.format( num_hung=len(hung), sep=maybe_comma(passed), ) hung_sect = email_templates['sect_templ'].format( title='Hung', jobs=''.join(hung.values()), ) if passed: subject += '%s passed ' % len(passed) pass_sect = email_templates['sect_templ'].format( title='Passed', jobs=''.join(passed.values()), ) body = email_templates['body_templ'].format( name=name, info_root=misc.get_results_url(name), log_root=misc.get_http_log_path(archive_dir), fail_count=len(failed), hung_count=len(hung), pass_count=len(passed), fail_sect=fail_sect, hung_sect=hung_sect, pass_sect=pass_sect, ) subject += 'in {suite}'.format(suite=name) return (subject.strip(), body.strip())
def build_email_body(name, archive_dir, timeout): failed = {} hung = {} passed = {} for job in ls.get_jobs(archive_dir): job_dir = os.path.join(archive_dir, job) summary_file = os.path.join(job_dir, 'summary.yaml') # Every job gets a link to e.g. pulpito's pages info_url = misc.get_results_url(name, job) if info_url: info_line = email_templates['info_url_templ'].format(info=info_url) else: info_line = '' # Unfinished jobs will have no summary.yaml if not os.path.exists(summary_file): info_file = os.path.join(job_dir, 'info.yaml') desc = '' if os.path.exists(info_file): with file(info_file) as f: info = yaml.safe_load(f) desc = info['description'] hung[job] = email_templates['hung_templ'].format( job_id=job, desc=desc, info_line=info_line, ) continue with file(summary_file) as f: summary = yaml.safe_load(f) if summary['success']: passed[job] = email_templates['pass_templ'].format( job_id=job, desc=summary.get('description'), time=int(summary.get('duration', 0)), info_line=info_line, ) else: log = misc.get_http_log_path(archive_dir, job) if log: log_line = email_templates['fail_log_templ'].format(log=log) else: log_line = '' # Transitioning from sentry_events -> sentry_event sentry_events = summary.get('sentry_events') if sentry_events: sentry_event = sentry_events[0] else: sentry_event = summary.get('sentry_event', '') if sentry_event: sentry_line = email_templates['fail_sentry_templ'].format( sentry_event=sentry_event) else: sentry_line = '' # 'fill' is from the textwrap module and it collapses a given # string into multiple lines of a maximum width as specified. We # want 75 characters here so that when we indent by 4 on the next # line, we have 79-character exception paragraphs. reason = fill(summary.get('failure_reason'), 75) reason = '\n'.join((' ') + line for line in reason.splitlines()) failed[job] = email_templates['fail_templ'].format( job_id=job, desc=summary.get('description'), time=int(summary.get('duration', 0)), reason=reason, info_line=info_line, log_line=log_line, sentry_line=sentry_line, ) maybe_comma = lambda s: ', ' if s else ' ' subject = '' fail_sect = '' hung_sect = '' pass_sect = '' if failed: subject += '{num_failed} failed{sep}'.format( num_failed=len(failed), sep=maybe_comma(hung or passed) ) fail_sect = email_templates['sect_templ'].format( title='Failed', jobs=''.join(failed.values()) ) if hung: subject += '{num_hung} hung{sep}'.format( num_hung=len(hung), sep=maybe_comma(passed), ) hung_sect = email_templates['sect_templ'].format( title='Hung', jobs=''.join(hung.values()), ) if passed: subject += '%s passed ' % len(passed) pass_sect = email_templates['sect_templ'].format( title='Passed', jobs=''.join(passed.values()), ) body = email_templates['body_templ'].format( name=name, info_root=misc.get_results_url(name), log_root=misc.get_http_log_path(archive_dir), fail_count=len(failed), hung_count=len(hung), pass_count=len(passed), fail_sect=fail_sect, hung_sect=hung_sect, pass_sect=pass_sect, ) subject += 'in {suite}'.format(suite=name) return (subject.strip(), body.strip())