Return Run.uuid in public methods

In the UUID->BIGINT migration, we kept Run.uuid because it is intended
as a stable user-accessible handle for that particular run. We failed
to catch all of the places that leaked the table ID column, so there
are a few places now that are getting ints which can't subsequently
be looked up properly with sql2subunit.

This also fixes some minor issues with the get_run_id_from_uuid()
method that were making the behavior of the function deviate from the
documented and expected behavior.

Change-Id: I19162bf2f2677d86eb7daca49aab6c3cb23fc206
This commit is contained in:
Clint Byrum 2015-11-29 23:41:46 -08:00
parent 57a104ae37
commit 5b9f790b1d
3 changed files with 33 additions and 32 deletions

View File

@ -569,11 +569,11 @@ def get_run_id_from_uuid(uuid, session=None):
:param session: optional session object if one isn't provided a new session
will be acquired for the duration of this operation
:return: The id for the run with the provided uuid
:rtype: str
:rtype: int
"""
session = session or get_session()
run_id = session.query(models.Run.id).filter(
models.Run.uuid == uuid).first()
models.Run.uuid == uuid).first()[0]
return run_id
@ -661,8 +661,8 @@ def get_test_runs_by_test_test_id(test_id, start_date=None, stop_date=None,
def get_test_runs_by_run_id(run_id, session=None):
"""Get all test runs for a specific run.
:param str run_id: The run's uuid (the id column in the run table) which to
get all test runs for
:param str run_id: The run's uuid (the uuid column in the run table) which
to get all test runs for
:param session: optional session object if one isn't provided a new session
will be acquired for the duration of this operation
@ -670,9 +670,10 @@ def get_test_runs_by_run_id(run_id, session=None):
:rtype: subunit2sql.models.TestRun
"""
session = session or get_session()
test_runs = db_utils.model_query(models.TestRun,
session=session).filter_by(
run_id=run_id).all()
test_runs = db_utils.model_query(
models.TestRun, session=session).join(
models.Run).filter(
models.Run.uuid == run_id).all()
return test_runs
@ -734,18 +735,19 @@ def get_tests_run_dicts_from_run_id(run_id, session=None):
"""
session = session or get_session()
query = db_utils.model_query(models.Test, session=session).join(
models.TestRun).filter(models.TestRun.run_id == run_id).outerjoin(
models.TestRunMetadata).order_by(
models.TestRun.start_time,
models.TestRun.start_time_microsecond).values(
models.Test.test_id,
models.TestRun.status,
models.TestRun).join(models.Run).filter(
models.Run.uuid == run_id).outerjoin(
models.TestRunMetadata).order_by(
models.TestRun.start_time,
models.TestRun.start_time_microsecond,
models.TestRun.stop_time,
models.TestRun.stop_time_microsecond,
models.TestRunMetadata.key,
models.TestRunMetadata.value)
models.TestRun.start_time_microsecond).values(
models.Test.test_id,
models.TestRun.status,
models.TestRun.start_time,
models.TestRun.start_time_microsecond,
models.TestRun.stop_time,
models.TestRun.stop_time_microsecond,
models.TestRunMetadata.key,
models.TestRunMetadata.value)
test_runs = collections.OrderedDict()
for test_run in query:
if test_run[0] not in test_runs:
@ -868,7 +870,7 @@ def get_recent_successful_runs(num_runs=10, session=None):
session = session or get_session()
results = db_utils.model_query(models.Run, session).order_by(
models.Run.run_at.desc()).filter_by(fails=0).limit(num_runs).all()
return list(map(lambda x: x.id, results))
return list(map(lambda x: x.uuid, results))
def get_recent_failed_runs(num_runs=10, session=None):
@ -884,7 +886,7 @@ def get_recent_failed_runs(num_runs=10, session=None):
results = db_utils.model_query(models.Run, session).order_by(
models.Run.run_at.desc()).filter(
models.Run.fails > 0).limit(num_runs).all()
return list(map(lambda x: x.id, results))
return list(map(lambda x: x.uuid, results))
def delete_old_runs(expire_age=186, session=None):
@ -1158,7 +1160,7 @@ def get_time_series_runs_by_key_value(key, value, start_date=None,
run_query = db_utils.model_query(models.Run, session).join(
models.RunMetadata).filter(models.Run.id.in_(sub_query))
run_query = _filter_runs_by_date(run_query, start_date, stop_date)
run_query = run_query.values(models.Run.id,
run_query = run_query.values(models.Run.uuid,
models.Run.passes,
models.Run.fails,
models.Run.skips,

View File

@ -70,7 +70,7 @@ class TestDatabaseAPI(base.TestCase):
stop_time = datetime.datetime.utcnow()
api.create_test_run(test_a.id, run.id, 'success',
start_time, stop_time)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.id)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.uuid)
self.assertEqual(1, len(test_run_dict))
self.assertIn('fake_test', test_run_dict)
self.assertEqual(test_run_dict['fake_test']['status'], 'success')
@ -85,7 +85,7 @@ class TestDatabaseAPI(base.TestCase):
stop_time = None
api.create_test_run(test_a.id, run.id, 'success',
start_time, stop_time)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.id)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.uuid)
self.assertEqual(1, len(test_run_dict))
self.assertIn('fake_test', test_run_dict)
self.assertEqual(test_run_dict['fake_test']['status'], 'success')
@ -99,7 +99,7 @@ class TestDatabaseAPI(base.TestCase):
start_time = None
api.create_test_run(test_a.id, run.id, 'success',
start_time, stop_time)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.id)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.uuid)
self.assertEqual(1, len(test_run_dict))
self.assertIn('fake_test', test_run_dict)
self.assertEqual(test_run_dict['fake_test']['status'], 'success')
@ -113,7 +113,7 @@ class TestDatabaseAPI(base.TestCase):
start_time = None
api.create_test_run(test_a.id, run.id, 'success',
start_time, stop_time)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.id)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.uuid)
self.assertEqual(1, len(test_run_dict))
self.assertIn('fake_test', test_run_dict)
self.assertEqual(test_run_dict['fake_test']['status'], 'success')
@ -132,7 +132,7 @@ class TestDatabaseAPI(base.TestCase):
'attrs': 'test,smoke,notatest',
}
api.add_test_run_metadata(run_meta, test_run.id)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.id)
test_run_dict = api.get_tests_run_dicts_from_run_id(run.uuid)
self.assertEqual(3, len(test_run_dict['fake_test']['metadata']))
for meta in run_meta:
self.assertIn(meta, test_run_dict['fake_test']['metadata'])
@ -159,7 +159,7 @@ class TestDatabaseAPI(base.TestCase):
datetime.datetime(1914, 6, 28, 10, 45, 0))
api.create_test_run(test_c.id, run.id, 'success',
datetime.datetime(2014, 8, 26, 20, 00, 00))
test_run_dicts = api.get_tests_run_dicts_from_run_id(run.id)
test_run_dicts = api.get_tests_run_dicts_from_run_id(run.uuid)
self.assertEqual(len(test_run_dicts), 3)
prev = None
for test_run in test_run_dicts:
@ -196,9 +196,9 @@ class TestDatabaseAPI(base.TestCase):
datetime.datetime.utcnow())
testrun_c = api.create_test_run(test_a.id, run_c.id, 'success',
datetime.datetime.utcnow())
test_runs_a = api.get_test_runs_by_run_id(run_a.id)
test_runs_b = api.get_test_runs_by_run_id(run_b.id)
test_runs_c = api.get_test_runs_by_run_id(run_c.id)
test_runs_a = api.get_test_runs_by_run_id(run_a.uuid)
test_runs_b = api.get_test_runs_by_run_id(run_b.uuid)
test_runs_c = api.get_test_runs_by_run_id(run_c.uuid)
self.assertEqual(len(test_runs_a), 1)
self.assertEqual(testrun_a.id, test_runs_a[0].id)
self.assertEqual(testrun_a.status, test_runs_a[0].status)
@ -271,7 +271,7 @@ class TestDatabaseAPI(base.TestCase):
'skip': run_num,
'fail': run_num + 1,
'pass': run_num + 2,
'id': runs[run_num].id,
'id': runs[run_num].uuid,
'run_time': 3.0,
'metadata': {
u'test_key': u'fun',

View File

@ -76,7 +76,6 @@ def write_test(output, start_time, stop_time, status, test_id, metadatas):
def sql2subunit(run_id, output=sys.stdout):
session = api.get_session()
run_id = api.get_run_id_from_uuid(run_id, session)
test_runs = api.get_tests_run_dicts_from_run_id(run_id, session)
session.close()
output = subunit.v2.StreamResultToBytes(output)