From 064bff8b1d356276030fbd134e2128025870a268 Mon Sep 17 00:00:00 2001 From: sidpremkumar Date: Aug 07 2019 15:48:07 +0000 Subject: Adding support for email to be sent with traceback in case of failure * Add more checks for emails in case usernames are invalid --- diff --git a/sync2jira/downstream.py b/sync2jira/downstream.py index a3c5a7f..065d917 100644 --- a/sync2jira/downstream.py +++ b/sync2jira/downstream.py @@ -227,6 +227,10 @@ def alert_user_of_duplicate_issues(issue, final_result, results_of_query, break if not found: log.warning(' Could not find JIRA user for username %s' % issue.downstream.get('owner')) + if not ret: + message = ' No owner could be found for username %s' % issue.downstream.get('owner') + log.warning(message.strip()) + raise ValueError(message) user = {'name': ret[0].displayName, 'email': ret[0].emailAddress} @@ -238,9 +242,9 @@ def alert_user_of_duplicate_issues(issue, final_result, results_of_query, admins = [] admin_template = [] for admin in config['sync2jira']['admins']: - ret = client.search_users(admin) + ret = client.search_users(admin.keys()[0]) if len(ret) > 1: - log.warning(' Found multiple users for admin %s' % issue.downstream.get('owner')) + log.warning(' Found multiple users for admin %s' % admin.keys()[0]) found = False for person in ret: if person.key == issue.downstream.get('owner'): @@ -248,7 +252,11 @@ def alert_user_of_duplicate_issues(issue, final_result, results_of_query, found = True break if not found: - log.warning(' Could not find JIRA user for admin %s' % issue.downstream.get('owner')) + log.warning(' Could not find JIRA user for admin %s' % admin.keys()[0]) + if not ret: + message = ' No admin could be found for username %s' % admin.keys()[0] + log.warning(message.strip()) + raise ValueError(message) admins.append(ret[0].emailAddress) admin_template.append({'name': ret[0].displayName, 'email': ret[0].emailAddress}) diff --git a/sync2jira/failure_template.jinja b/sync2jira/failure_template.jinja new file mode 100644 index 0000000..3b6ac1f --- /dev/null +++ b/sync2jira/failure_template.jinja @@ -0,0 +1,7 @@ + + +

Looks like Sync2Jira has failed!

+

Here is the full traceback:

+ {{ traceback }} + + \ No newline at end of file diff --git a/sync2jira/mailer.py b/sync2jira/mailer.py index 99a6627..f33d811 100644 --- a/sync2jira/mailer.py +++ b/sync2jira/mailer.py @@ -31,7 +31,8 @@ def send_mail(recipients, subject, text, cc): msg["Subject"] = subject msg["From"] = sender msg["To"] = ", ".join(recipients) - msg['Cc'] = ", ".join(cc) + if cc: + msg['Cc'] = ", ".join(cc) server = smtplib.SMTP(_cfg["server"]) part = MIMEText(text, 'html', 'utf-8') msg.attach(part) diff --git a/sync2jira/main.py b/sync2jira/main.py index 560145e..6e29ce7 100644 --- a/sync2jira/main.py +++ b/sync2jira/main.py @@ -24,16 +24,21 @@ Run with systemd, please. import logging import warnings +import traceback import fedmsg import fedmsg.config +import jinja2 +import jira import sync2jira.upstream as u import sync2jira.downstream as d +from sync2jira.mailer import send_mail log = logging.getLogger('sync2jira.main') remote_link_title = "Upstream issue" +failure_email_subject = "Sync2Jira Has Failed!" handlers = { # Example: https://apps.fedoraproject.org/datagrepper/id?id=2016-895ed21e-5d53-4fde-86ac-64dab36a14ad&is_raw=true&size=extra-large @@ -184,13 +189,42 @@ def main(): logging.basicConfig(level=logging.INFO) warnings.simplefilter("ignore") - if config['sync2jira'].get('initialize'): - initialize(config) - try: - listen(config) - except KeyboardInterrupt: - pass + if config['sync2jira'].get('initialize'): + initialize(config) + + try: + listen(config) + except KeyboardInterrupt: + pass + except: + report_failure(config) + raise + + +def report_failure(config): + """ + Helper function to alert admins in case of failure. + + + :param Dict config: Config dict for JIRA + """ + # Email our admins with the traceback + templateLoader = jinja2.FileSystemLoader(searchpath='sync2jira/') + templateEnv = jinja2.Environment(loader=templateLoader) + template = templateEnv.get_template('failure_template.jinja') + html_text = template.render(traceback=traceback.format_exc()) + + # Get admin information + admins = [] + for admin in config['sync2jira']['admins']: + admins.append(admin.values()[0]) + + # Send mail + send_mail(recipients=admins, + cc=None, + subject=failure_email_subject, + text=html_text) def list_managed():