Add back uuid column for runs table

When we converted the runs table to use an auto-incrementing integer as
the primary key column we dropped the uuid. However, in doing this we
would be deleting the only user facing identifier for a run. This
commit corrects the oversight by renaming the old id column as a
non-primary key column that can be used for an user input or output
regarding runs. This also adds a new api method and calls it in
sql2subunit to maintain backwards compatibility after the migration.

Change-Id: Idab32bb3449559285f9d45b6132b1c07c1260e7c
This commit is contained in:
Matthew Treinish 2015-11-20 18:22:08 -05:00
parent 6e461277ad
commit d1239b246a
No known key found for this signature in database
GPG Key ID: FD12A0F214C9E177
5 changed files with 35 additions and 11 deletions

View File

@ -172,7 +172,7 @@ def create_run(skips=0, fails=0, passes=0, run_time=0, artifacts=None,
"""
run = models.Run()
if id:
run.id = id
run.uuid = id
if run_at:
run.run_at = run_at
run.skips = skips
@ -562,10 +562,25 @@ def get_test_by_test_id(test_id, session=None):
return test
def get_run_by_id(id, session=None):
"""Get an individual run by it's uuid.
def get_run_id_from_uuid(uuid, session=None):
"""Get the id for a run by it's uuid
:param str id: The uuid for the run (the id field in the DB)
:param str uuid: The uuid for the run
: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
"""
session = session or get_session()
run_id = session.query(models.Run.id).filter(
models.Run.uuid == uuid).first()
return run_id
def get_run_by_id(id, session=None):
"""Get an individual run by it's id.
:param str id: The id for the run
:param session: optional session object if one isn't provided a new session
will be acquired for the duration of this operation
@ -578,9 +593,9 @@ def get_run_by_id(id, session=None):
def get_test_run_by_id(test_run_id, session=None):
"""Get an individual test run by it's uuid.
"""Get an individual test run by it's id.
:param str test_run_id: The uuid for the test run (the id field in the DB)
:param str test_run_id: The id for the test run
:param session: optional session object if one isn't provided a new session
will be acquired for the duration of this operation

View File

@ -13,8 +13,10 @@
# under the License.
import datetime
import uuid
from oslo_db.sqlalchemy import models # noqa
import six
import sqlalchemy as sa
from sqlalchemy.ext import declarative
@ -58,6 +60,8 @@ class Test(BASE, SubunitBase):
class Run(BASE, SubunitBase):
__tablename__ = 'runs'
uuid = sa.Column(sa.String(36),
default=lambda: six.text_type(uuid.uuid4()))
id = sa.Column(sa.BigInteger, primary_key=True)
skips = sa.Column(sa.Integer())
fails = sa.Column(sa.Integer())

View File

@ -209,7 +209,8 @@ def upgrade():
op.drop_column('tests_new', 'id')
op.alter_column('tests_new', 'new_id',
new_column_name='id')
op.drop_column('runs_new', 'id')
op.alter_column('runs_new', 'id',
new_column_name='uuid')
op.alter_column('runs_new', 'new_id',
new_column_name='id')
else:
@ -270,7 +271,8 @@ def upgrade():
existing_type=new_id_type,
autoincrement=True)
with op.batch_alter_table("runs_new") as batch_op:
batch_op.drop_column('id')
batch_op.alter_column('id', new_column_name='uuid',
existing_type=sa.VARCHAR(36))
batch_op.alter_column('new_id', new_column_name='id',
primary_key=True,
existing_type=new_id_type,
@ -331,6 +333,7 @@ def upgrade():
['test_id', 'start_time'])
op.create_unique_constraint('uq_test_runs', 'test_runs',
['test_id', 'run_id'])
op.create_index('ix_run_uuid', 'runs', ['uuid'])
op.create_index('ix_tests_test_id', 'tests', ['test_id'], mysql_length=30)
op.create_index('ix_test_runs_test_id', 'test_runs', ['test_id'])
op.create_index('ix_test_runs_run_id', 'test_runs', ['run_id'])

View File

@ -522,7 +522,7 @@ class TestWalkMigrations(base.TestCase):
# Check all the new ids match
runs_t = get_table(engine, 'runs')
run_ids = [x[0] for x in runs_t.select().execute()]
run_ids = [x[1] for x in runs_t.select().execute()]
run_metadatas_t = get_table(engine, 'run_metadata')
tests_t = get_table(engine, 'tests')
test_metadatas_t = get_table(engine, 'test_metadata')
@ -547,10 +547,11 @@ class TestWalkMigrations(base.TestCase):
# Check run
run_row = list(runs_t.select().where(
runs_t.c.id == test_run_row[2]).execute())[0]
self.assertEqual(data['run']['artifacts'], run_row[5])
self.assertEqual(data['run']['artifacts'], run_row[6])
self.assertEqual(data['run']['id'], run_row[0])
# Check run metadata
run_metadata_row = list(run_metadatas_t.select().where(
run_metadatas_t.c.run_id == run_row[0]).execute())[0]
run_metadatas_t.c.run_id == run_row[1]).execute())[0]
self.assertEqual(data['run_metadata']['key'], run_metadata_row[1])
self.assertEqual(data['run_metadata']['value'], run_metadata_row[2])
# Check test metadata

View File

@ -76,6 +76,7 @@ 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)