blob: e7afc342706c8ed0399f47fe989811d67059b9eb [file]
#!/usr/bin/python2
import os
import sys
from datetime import datetime
from pygresql import pg
## Constants for interacting with refdb
RESULTS_LOG_FILE = os.environ.get('RESULTS_LOG_FILE')
RESULTS_DATABASE_HOST = os.environ.get('RESULTS_DATABASE_HOST')
RESULTS_DATABASE_USER = os.environ.get('RESULTS_DATABASE_USER')
RESULTS_DATABASE_NAME = os.environ.get('RESULTS_DATABASE_NAME')
RESULTS_DATABASE_PASSWORD = os.environ.get('RESULTS_DATABASE_PASSWORD')
GPDB_VERSION = os.environ.get('GPDB_VERSION').replace("gpstart version ", "")
GPB_VERSION = os.environ.get('GPB_VERSION').replace("gpbackup version ", "")
def parse_runtime(logline):
runtime = int(float(logline.replace("TEST RUNTIME: ", "").replace("\n", "").replace("\r", "")))
return runtime
def parse_log():
"""Extract required info from log file"""
log_dict = {}
with open(RESULTS_LOG_FILE, 'r') as fp:
log_lines = fp.readlines()
for line in log_lines:
if line.startswith('TEST RUNTIME'):
runtime = parse_runtime(line)
log_dict['test_runtime'] = runtime
return log_dict
def get_test_id(test_name):
conn = pg.connect(
dbname=RESULTS_DATABASE_NAME,
host=RESULTS_DATABASE_HOST,
user=RESULTS_DATABASE_USER,
passwd=RESULTS_DATABASE_PASSWORD
)
select_string = """
SELECT
tn.test_id
FROM
prod.test_names tn
WHERE
tn.test_name = '{}'
;
""".format(test_name)
query = conn.query(select_string)
result = query.getresult()
result = result[0] # unpack list of single tuple
conn.close()
test_id = result[0]
return test_id
def get_stats(test_name):
"""Retrieve stats for given test name from provided postgres database"""
stats_dict = {}
conn = pg.connect(
dbname=RESULTS_DATABASE_NAME,
host=RESULTS_DATABASE_HOST,
user=RESULTS_DATABASE_USER,
passwd=RESULTS_DATABASE_PASSWORD
)
select_string = """
SELECT
tn.test_id,
tn.test_name,
ts.test_runs_included,
ts.test_runtime_avg,
ts.test_runtime_var,
ts.test_limit_report,
ts.test_limit_fail
FROM
prod.test_names tn
LEFT JOIN prod.test_stats ts
ON ts.test_id = tn.test_id
WHERE
tn.test_name = '{}'
;
""".format(test_name)
query = conn.query(select_string)
result = query.getresult()
conn.close()
if result:
result = result[0] # unpack list of single tuple
stats_dict['test_id'] = result[0]
stats_dict['test_name'] = result[1]
stats_dict['test_runs_included'] = result[2] or 0
stats_dict['test_runtime_avg'] = result[3] or 0
stats_dict['test_runtime_var'] = result[4] or 0
stats_dict['test_limit_report'] = result[5] or 99999
stats_dict['test_limit_fail'] = result[6] or 99999
return stats_dict
def analyze_stats(run_stats, summary_stats, test_name):
"""
Possible result values are: "pass" "fail" "report"
"""
run_stats['was_failed'] = "false"
run_stats['was_reported'] = "false"
if (
summary_stats.get('test_runs_included', 0) >= 10
and run_stats.get('test_runtime') >= summary_stats.get('test_limit_fail')
):
run_stats['was_failed'] = "true"
if run_stats.get('was_failed') == "true":
result_string = "Failed"
else:
result_string = "Passed"
report_string = """
############################################################
Test Name: {test_name}
Runtime: {run_time}
Compared against: {summary_stats}
Comparison result: {comp_result}
############################################################
""".format(
test_name = test_name,
run_time = run_stats.get('test_runtime'),
summary_stats = summary_stats,
comp_result = result_string
)
print report_string
return
def store_stats(run_stats, test_id, test_name):
now_ts = datetime.now()
now_ts_str = datetime.strftime(now_ts, "%Y-%m-%d-%H-%M-%S")
conn = pg.connect(
dbname=RESULTS_DATABASE_NAME,
host=RESULTS_DATABASE_HOST,
user=RESULTS_DATABASE_USER,
passwd=RESULTS_DATABASE_PASSWORD
)
insert_qry_string = """
INSERT INTO prod.test_runs(test_id, run_timestamp, test_runtime, gpbackup_version, gpdb_version, was_reported, was_failed)
VALUES
({id}, '{ts}', {runtime}, '{gpbver}', '{gpdbver}', {reported}, {failed})
;
""".format(
id=test_id,
ts=now_ts_str,
gpbver=GPB_VERSION,
gpdbver=GPDB_VERSION,
runtime=run_stats.get('test_runtime', 0),
reported=run_stats.get('was_reported', False),
failed=run_stats.get('was_failed', True)
)
summ_func_qry_string = """
SELECT prod.summarize_runs('{}');
""".format(test_name)
conn.query(insert_qry_string)
conn.query(summ_func_qry_string)
# conn.commit()
conn.close()
return
def main():
try:
TEST_NAME = sys.argv[1]
run_stats = parse_log()
test_id = get_test_id(TEST_NAME)
summary_stats = get_stats(TEST_NAME)
analyze_stats(run_stats, summary_stats, TEST_NAME)
store_stats(run_stats, test_id, TEST_NAME)
return
except Exception as e:
print "Python script errored: {}".format(e)
return
if __name__ == "__main__":
main()