From 754f9cb5b8383361dcfe38d924b5f27e5d620a60 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Fri, 8 Jan 2016 23:18:01 -0500 Subject: [PATCH] Add DB API method to get failure rate for jobs by run_metadata This commit adds a new DB API method to return the failure rate as a percentage for all runs with a provided key value run_metadata pair. Change-Id: I4d611d8606f89a66e09c9aaf01c2dfd7b29b2265 --- subunit2sql/db/api.py | 30 ++++++++++++++++++++++++++++++ subunit2sql/tests/db/test_api.py | 11 +++++++++++ 2 files changed, 41 insertions(+) diff --git a/subunit2sql/db/api.py b/subunit2sql/db/api.py index a3fff20..df70d36 100644 --- a/subunit2sql/db/api.py +++ b/subunit2sql/db/api.py @@ -1307,6 +1307,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. diff --git a/subunit2sql/tests/db/test_api.py b/subunit2sql/tests/db/test_api.py index 759682d..f4ee880 100644 --- a/subunit2sql/tests/db/test_api.py +++ b/subunit2sql/tests/db/test_api.py @@ -610,3 +610,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)