def action_send_run_comparison(instance_path, run_a_id, run_b_id, database, testsuite, host, from_address, to_address, subject_prefix, dry_run): """send a run-vs-run comparison email""" import contextlib import email.mime.multipart import email.mime.text import lnt.server.reporting.dailyreport import smtplib init_logger(logging.ERROR) # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(instance_path) config = instance.config # Get the database. with contextlib.closing(config.get_database(database)) as db: session = db.make_session() # Get the testsuite. ts = db.testsuite[testsuite] # Lookup the two runs. run_a_id = int(run_a_id) run_b_id = int(run_b_id) run_a = session.query(ts.Run).\ filter_by(id=run_a_id).first() run_b = session.query(ts.Run).\ filter_by(id=run_b_id).first() if run_a is None: logger.error("invalid run ID %r (not in database)" % (run_a_id, )) if run_b is None: logger.error("invalid run ID %r (not in database)" % (run_b_id, )) # Generate the report. data = lnt.server.reporting.runs.generate_run_data( session, run_b, baseurl=config.zorgURL, result=None, compare_to=run_a, baseline=None, aggregation_fn=min) env = lnt.server.ui.app.create_jinja_environment() text_template = env.get_template('reporting/run_report.txt') text_report = text_template.render(data) html_template = env.get_template('reporting/run_report.html') html_report = html_template.render(data) subject = data['subject'] if subject_prefix is not None: subject = "%s %s" % (subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = from_address msg['To'] = to_address msg.attach(email.mime.text.MIMEText(text_report, 'plain')) msg.attach(email.mime.text.MIMEText(html_report, 'html')) # Send the report. if not dry_run: mail_client = smtplib.SMTP(host) mail_client.sendmail(from_address, [to_address], msg.as_string()) mail_client.quit() else: out = sys.stdout out.write("From: %s\n" % from_address) out.write("To: %s\n" % to_address) out.write("Subject: %s\n" % subject) out.write("=== text/plain report\n") out.write(text_report + "\n") out.write("=== html report\n") out.write(html_report + "\n")
def action_send_run_comparison(name, args): """send a run-vs-run comparison email""" import email.mime.multipart import email.mime.text import smtplib import lnt.server.reporting.dailyreport parser = OptionParser("%s [options] <instance path> " "<run A ID> <run B ID>" % (name, )) parser.add_option("", "--database", dest="database", default="default", help="database to use [%default]") parser.add_option("", "--testsuite", dest="testsuite", default="nts", help="testsuite to use [%default]") parser.add_option("", "--host", dest="host", default="localhost", help="email relay host to use [%default]") parser.add_option("", "--from", dest="from_address", default=None, help="from email address (required)") parser.add_option("", "--to", dest="to_address", default=None, help="to email address (required)") parser.add_option("", "--subject-prefix", dest="subject_prefix", help="add a subject prefix") parser.add_option("-n", "--dry-run", dest="dry_run", default=False, action="store_true", help="Don't actually send email." " Used for testing.") (opts, args) = parser.parse_args(args) if len(args) != 3: parser.error("invalid number of arguments") if opts.from_address is None: parser.error("--from argument is required") if opts.to_address is None: parser.error("--to argument is required") path, run_a_id, run_b_id = args # Setup the base LNT logger. logger = logging.getLogger("lnt") logger.setLevel(logging.ERROR) handler = logging.StreamHandler(sys.stderr) handler.setFormatter( logging.Formatter('%(asctime)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S')) logger.addHandler(handler) # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(path) config = instance.config # Get the database. with contextlib.closing(config.get_database(opts.database)) as db: # Get the testsuite. ts = db.testsuite[opts.testsuite] # Lookup the two runs. run_a_id = int(run_a_id) run_b_id = int(run_b_id) run_a = ts.query(ts.Run).\ filter_by(id=run_a_id).first() run_b = ts.query(ts.Run).\ filter_by(id=run_b_id).first() if run_a is None: parser.error("invalid run ID %r (not in database)" % (run_a_id, )) if run_b is None: parser.error("invalid run ID %r (not in database)" % (run_b_id, )) # Generate the report. reports = lnt.server.reporting.runs.generate_run_report( run_b, baseurl=config.zorgURL, only_html_body=False, result=None, compare_to=run_a, baseline=None, aggregation_fn=min) subject, text_report, html_report, _ = reports if opts.subject_prefix is not None: subject = "%s %s" % (opts.subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = opts.from_address msg['To'] = opts.to_address msg.attach(email.mime.text.MIMEText(text_report, 'plain')) msg.attach(email.mime.text.MIMEText(html_report, 'html')) # Send the report. if not opts.dry_run: s = smtplib.SMTP(opts.host) s.sendmail(opts.from_address, [opts.to_address], msg.as_string()) s.quit()
def action_send_daily_report(instance_path, address, database, testsuite, host, from_address, today, subject_prefix, dry_run, days, filter_machine_regex): """send a daily report email""" import contextlib import datetime import email.mime.multipart import email.mime.text import lnt.server.reporting.dailyreport import smtplib # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(instance_path) config = instance.config # Get the database. with contextlib.closing(config.get_database(database)) as db: session = db.make_session() # Get the testsuite. ts = db.testsuite[testsuite] if today: date = datetime.datetime.utcnow() else: # Get a timestamp to use to derive the daily report to generate. latest = session.query(ts.Run).\ order_by(ts.Run.start_time.desc()).limit(1).first() # If we found a run, use it's start time (rounded up to the next # hour, so we make sure it gets included). if latest: date = latest.start_time + datetime.timedelta(hours=1) else: # Otherwise, just use now. date = datetime.datetime.utcnow() # Generate the daily report. logger.info("building report data...") report = lnt.server.reporting.dailyreport.DailyReport( ts, year=date.year, month=date.month, day=date.day, day_start_offset_hours=date.hour, for_mail=True, num_prior_days_to_include=days, filter_machine_regex=filter_machine_regex) report.build(session) logger.info("generating HTML report...") ts_url = "%s/db_%s/v4/%s" \ % (config.zorgURL, database, testsuite) subject = "Daily Report: %04d-%02d-%02d" % (report.year, report.month, report.day) html_report = report.render(ts_url, only_html_body=False) if subject_prefix is not None: subject = "%s %s" % (subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = from_address msg['To'] = address msg.attach(email.mime.text.MIMEText(html_report, "html")) # Send the report. if not dry_run: s = smtplib.SMTP(host) s.sendmail(from_address, [address], msg.as_string()) s.quit() else: out = sys.stdout out.write("From: %s\n" % msg['From']) out.write("To: %s\n" % msg['To']) out.write("Subject: %s\n" % msg['Subject']) out.write("=== html report\n") out.write(html_report + "\n")
def action_send_daily_report(name, args): """send a daily report email""" import datetime import email.mime.multipart import email.mime.text import smtplib import lnt.server.reporting.dailyreport parser = OptionParser("%s [options] <instance path> <address>" % (name, )) parser.add_option("", "--database", dest="database", default="default", help="database to use [%default]") parser.add_option("", "--testsuite", dest="testsuite", default="nts", help="testsuite to use [%default]") parser.add_option("", "--host", dest="host", default="localhost", help="email relay host to use [%default]") parser.add_option("", "--from", dest="from_address", default=None, help="from email address (required)") parser.add_option( "", "--today", dest="today", action="store_true", help="send the report for today (instead of most recent)") parser.add_option("", "--subject-prefix", dest="subject_prefix", help="add a subject prefix") parser.add_option("-n", "--dry-run", dest="dry_run", default=False, action="store_true", help="Don't actually send email." " Used for testing.") parser.add_option("", "--days", dest="days", default=3, type="int", help="Number of days to show in report.") parser.add_option("", "--filter-machine-regex", dest="filter_machine_regex", default=None, help="only show machines that contain the regex.") (opts, args) = parser.parse_args(args) if len(args) != 2: parser.error("invalid number of arguments") if opts.from_address is None: parser.error("--from argument is required") path, to_address = args # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(path) config = instance.config # Get the database. with contextlib.closing(config.get_database(opts.database)) as db: # Get the testsuite. ts = db.testsuite[opts.testsuite] if opts.today: date = datetime.datetime.utcnow() else: # Get a timestamp to use to derive the daily report to generate. latest = ts.query(ts.Run).\ order_by(ts.Run.start_time.desc()).limit(1).first() # If we found a run, use it's start time (rounded up to the next # hour, so we make sure it gets included). if latest: date = latest.start_time + datetime.timedelta(hours=1) else: # Otherwise, just use now. date = datetime.datetime.utcnow() # Generate the daily report. note("building report data...") report = lnt.server.reporting.dailyreport.DailyReport( ts, year=date.year, month=date.month, day=date.day, day_start_offset_hours=date.hour, for_mail=True, num_prior_days_to_include=opts.days, filter_machine_regex=opts.filter_machine_regex) report.build() note("generating HTML report...") ts_url = "%s/db_%s/v4/%s" \ % (config.zorgURL, opts.database, opts.testsuite) subject = "Daily Report: %04d-%02d-%02d" % (report.year, report.month, report.day) html_report = report.render(ts_url, only_html_body=False) if opts.subject_prefix is not None: subject = "%s %s" % (opts.subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = opts.from_address msg['To'] = to_address msg.attach(email.mime.text.MIMEText(html_report, "html")) # Send the report. if not opts.dry_run: s = smtplib.SMTP(opts.host) s.sendmail(opts.from_address, [to_address], msg.as_string()) s.quit()
def action_send_run_comparison(instance_path, run_a_id, run_b_id, database, testsuite, host, from_address, to_address, subject_prefix, dry_run): """send a run-vs-run comparison email""" import contextlib import email.mime.multipart import email.mime.text import lnt.server.reporting.dailyreport import smtplib init_logger(logging.ERROR) # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(instance_path) config = instance.config # Get the database. with contextlib.closing(config.get_database(database)) as db: session = db.make_session() # Get the testsuite. ts = db.testsuite[testsuite] # Lookup the two runs. run_a_id = int(run_a_id) run_b_id = int(run_b_id) run_a = session.query(ts.Run).\ filter_by(id=run_a_id).first() run_b = session.query(ts.Run).\ filter_by(id=run_b_id).first() if run_a is None: logger.error("invalid run ID %r (not in database)" % (run_a_id,)) if run_b is None: logger.error("invalid run ID %r (not in database)" % (run_b_id,)) # Generate the report. data = lnt.server.reporting.runs.generate_run_data( session, run_b, baseurl=config.zorgURL, result=None, compare_to=run_a, baseline=None, aggregation_fn=min) env = lnt.server.ui.app.create_jinja_environment() text_template = env.get_template('reporting/run_report.txt') text_report = text_template.render(data).encode('utf-8') html_template = env.get_template('reporting/run_report.html') html_report = html_template.render(data).encode('utf-8') subject = data['subject'] if subject_prefix is not None: subject = "%s %s" % (subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = from_address msg['To'] = to_address msg.attach(email.mime.text.MIMEText(text_report, 'plain', 'utf-8')) msg.attach(email.mime.text.MIMEText(html_report, 'html', 'utf-8')) # Send the report. if not dry_run: mail_client = smtplib.SMTP(host) mail_client.sendmail( from_address, [to_address], msg.as_string()) mail_client.quit() else: out = sys.stdout out.write("From: %s\n" % from_address) out.write("To: %s\n" % to_address) out.write("Subject: %s\n" % subject) out.write("=== text/plain report\n") out.write(text_report + "\n") out.write("=== html report\n") out.write(html_report + "\n")
def action_send_daily_report(instance_path, address, database, testsuite, host, from_address, today, subject_prefix, dry_run, days, filter_machine_regex): """send a daily report email""" import contextlib import datetime import email.mime.multipart import email.mime.text import lnt.server.reporting.dailyreport import smtplib # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(instance_path) config = instance.config # Get the database. with contextlib.closing(config.get_database(database)) as db: session = db.make_session() # Get the testsuite. ts = db.testsuite[testsuite] if today: date = datetime.datetime.utcnow() else: # Get a timestamp to use to derive the daily report to generate. latest = session.query(ts.Run).\ order_by(ts.Run.start_time.desc()).limit(1).first() # If we found a run, use its start time (rounded up to the next # hour, so we make sure it gets included). if latest: date = latest.start_time + datetime.timedelta(hours=1) else: # Otherwise, just use now. date = datetime.datetime.utcnow() # Generate the daily report. logger.info("building report data...") report = lnt.server.reporting.dailyreport.DailyReport( ts, year=date.year, month=date.month, day=date.day, day_start_offset_hours=date.hour, for_mail=True, num_prior_days_to_include=days, filter_machine_regex=filter_machine_regex) report.build(session) logger.info("generating HTML report...") ts_url = "%s/db_%s/v4/%s" \ % (config.zorgURL, database, testsuite) subject = "Daily Report: %04d-%02d-%02d" % ( report.year, report.month, report.day) html_report = report.render(ts_url, only_html_body=False).encode('utf-8') if subject_prefix is not None: subject = "%s %s" % (subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = from_address msg['To'] = address msg.attach(email.mime.text.MIMEText(html_report, 'html', 'utf-8')) # Send the report. if not dry_run: s = smtplib.SMTP(host) s.sendmail(from_address, [address], msg.as_string()) s.quit() else: out = sys.stdout out.write("From: %s\n" % msg['From']) out.write("To: %s\n" % msg['To']) out.write("Subject: %s\n" % msg['Subject']) out.write("=== html report\n") out.write(html_report + "\n")
def action_send_run_comparison(name, args): """send a run-vs-run comparison email""" import datetime import email.mime.multipart import email.mime.text import smtplib import lnt.server.reporting.dailyreport parser = OptionParser("%s [options] <instance path> " "<run A ID> <run B ID>" % ( name,)) parser.add_option("", "--database", dest="database", default="default", help="database to use [%default]") parser.add_option("", "--testsuite", dest="testsuite", default="nts", help="testsuite to use [%default]") parser.add_option("", "--host", dest="host", default="localhost", help="email relay host to use [%default]") parser.add_option("", "--from", dest="from_address", default=None, help="from email address (required)") parser.add_option("", "--to", dest="to_address", default=None, help="to email address (required)") parser.add_option("", "--today", dest="today", action="store_true", help="send the report for today (instead of most recent)") parser.add_option("", "--subject-prefix", dest="subject_prefix", help="add a subject prefix") parser.add_option("-n", "--dry-run", dest="dry_run", default=False, action="store_true", help="Don't actually send email." " Used for testing.") (opts, args) = parser.parse_args(args) if len(args) != 3: parser.error("invalid number of arguments") if opts.from_address is None: parser.error("--from argument is required") if opts.to_address is None: parser.error("--to argument is required") path, run_a_id, run_b_id = args # Setup the base LNT logger. logger = logging.getLogger("lnt") logger.setLevel(logging.ERROR) handler = logging.StreamHandler(sys.stderr) handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S')) logger.addHandler(handler) # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(path) config = instance.config # Get the database. db = config.get_database(opts.database) # Get the testsuite. ts = db.testsuite[opts.testsuite] # Lookup the two runs. run_a_id = int(run_a_id) run_b_id = int(run_b_id) run_a = ts.query(ts.Run).\ filter_by(id=run_a_id).first() run_b = ts.query(ts.Run).\ filter_by(id=run_b_id).first() if run_a is None: parser.error("invalid run ID %r (not in database)" % (run_a_id,)) if run_b is None: parser.error("invalid run ID %r (not in database)" % (run_b_id,)) # Generate the report. reports = lnt.server.reporting.runs.generate_run_report( run_b, baseurl=config.zorgURL, only_html_body=False, result=None, compare_to=run_a, baseline=None, aggregation_fn=min) subject, text_report, html_report, _ = reports if opts.subject_prefix is not None: subject = "%s %s" % (opts.subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = opts.from_address msg['To'] = opts.to_address msg.attach(email.mime.text.MIMEText(text_report, 'plain')) msg.attach(email.mime.text.MIMEText(html_report, 'html')) # Send the report. if not opts.dry_run: s = smtplib.SMTP(opts.host) s.sendmail(opts.from_address, [opts.to_address], msg.as_string()) s.quit()
def action_send_daily_report(name, args): """send a daily report email""" import datetime import email.mime.multipart import email.mime.text import smtplib import lnt.server.reporting.dailyreport parser = OptionParser("%s [options] <instance path> <address>" % ( name,)) parser.add_option("", "--database", dest="database", default="default", help="database to use [%default]") parser.add_option("", "--testsuite", dest="testsuite", default="nts", help="testsuite to use [%default]") parser.add_option("", "--host", dest="host", default="localhost", help="email relay host to use [%default]") parser.add_option("", "--from", dest="from_address", default=None, help="from email address (required)") parser.add_option("", "--today", dest="today", action="store_true", help="send the report for today (instead of most recent)") parser.add_option("", "--subject-prefix", dest="subject_prefix", help="add a subject prefix") parser.add_option("-n", "--dry-run", dest="dry_run", default=False, action="store_true", help="Don't actually send email." " Used for testing.") (opts, args) = parser.parse_args(args) if len(args) != 2: parser.error("invalid number of arguments") if opts.from_address is None: parser.error("--from argument is required") path, to_address = args # Load the LNT instance. instance = lnt.server.instance.Instance.frompath(path) config = instance.config # Get the database. db = config.get_database(opts.database) # Get the testsuite. ts = db.testsuite[opts.testsuite] if opts.today: date = datetime.datetime.utcnow() else: # Get a timestamp to use to derive the daily report to generate. latest = ts.query(ts.Run).\ order_by(ts.Run.start_time.desc()).limit(1).first() # If we found a run, use it's start time (rounded up to the next hour, # so we make sure it gets included). if latest: date = latest.start_time + datetime.timedelta(hours=1) else: # Otherwise, just use now. date = datetime.datetime.utcnow() # Generate the daily report. note("building report data...") report = lnt.server.reporting.dailyreport.DailyReport( ts, year=date.year, month=date.month, day=date.day, day_start_offset_hours=date.hour, for_mail=True) report.build() note("generating HTML report...") ts_url = "%s/db_%s/v4/%s" % (config.zorgURL, opts.database, opts.testsuite) subject = "Daily Report: %04d-%02d-%02d" % ( report.year, report.month, report.day) html_report = report.render(ts_url, only_html_body=False) if opts.subject_prefix is not None: subject = "%s %s" % (opts.subject_prefix, subject) # Form the multipart email message. msg = email.mime.multipart.MIMEMultipart('alternative') msg['Subject'] = subject msg['From'] = opts.from_address msg['To'] = to_address msg.attach(email.mime.text.MIMEText(html_report, "html")) # Send the report. if not opts.dry_run: s = smtplib.SMTP(opts.host) s.sendmail(opts.from_address, [to_address], msg.as_string()) s.quit()