Merge "Add DB API method to get failure rate for jobs by run_metadata"

This commit is contained in:
Jenkins 2016-02-17 21:13:24 +00:00 committed by Gerrit Code Review
commit 4289fbaa79
2 changed files with 41 additions and 0 deletions

View File

@ -1319,6 +1319,36 @@ def get_time_series_runs_by_key_value(key, value, start_date=None,
return runs
def get_run_failure_rate_by_key_value_metadata(key, value, start_date=None,
stop_date=None, session=None):
"""Return the failure percentage of runs with a set of run metadata
:param str key: the metadata key to use for matching the runs
:param str value: the metadata value to use for matching the runs
:param start_date: Optional start date to filter results on
:param str stop_date: Optional stop date to filter results on
:param session: optional session object if one isn't provided a new session
will be acquired for the duration of this operation
:return failure_rate: The percentage of runs that failed, will be None if
no runs are found
:rtype: float
"""
session = session or get_session()
base_query = db_utils.model_query(models.Run, session).join(
models.RunMetadata,
models.Run.id == models.RunMetadata.run_id).filter(
models.RunMetadata.key == key,
models.RunMetadata.value == value)
base_query = _filter_runs_by_date(base_query, start_date, stop_date)
fails = base_query.filter(models.Run.fails >= 1).count()
successes = base_query.filter(models.Run.passes > 0,
models.Run.fails == 0).count()
if fails == 0 and successes == 0:
return None
return (float(fails) / float(successes + fails)) * 100
def add_test_run_attachments(attach_dict, test_run_id, session=None):
"""Add attachments a specific test run.

View File

@ -627,3 +627,14 @@ class TestDatabaseAPI(base.TestCase):
self.assertIn(time_c.date(), [x.date() for x in result.keys()])
self.assertIn(time_a.date(), [x.date() for x in result.keys()])
self.assertEqual(len(result[time_a]['a_value']), 2)
def test_get_run_failure_rate_by_key_value_metadata(self):
run_a = api.create_run(fails=100, passes=0)
run_b = api.create_run()
run_c = api.create_run(passes=100, fails=0)
api.add_run_metadata({'a_key': 'a_value'}, run_a.id)
api.add_run_metadata({'a_key': 'a_value'}, run_c.id)
api.add_run_metadata({'a_key': 'b_value'}, run_b.id)
fail_rate = api.get_run_failure_rate_by_key_value_metadata(
'a_key', 'a_value')
self.assertEqual(50, fail_rate)