From c036dba02b33bf25a88491c0a04bc52435d3a038 Mon Sep 17 00:00:00 2001 From: Matthew Treinish Date: Thu, 28 Aug 2014 23:04:04 -0400 Subject: [PATCH] Add order column to runs table This commit adds a timestamp run_at column to the runs table. This new column is needed to determine the order in which runs are added to the db. Support for this is needed by testrepository repositories since it needs to be able to determine which run is the most recent for some of it's operations. Additionally knowing the order in which the runs occur is something that is generally useful, and worth storing in the db. Change-Id: If3c2251f9c62fc94f2c1716f6091b637c965e610 --- subunit2sql/db/models.py | 3 ++ .../28ac1ba9c3db_add_run_order_column.py | 36 ++++++++++++++++++ .../tests/migrations/test_migrations.py | 37 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py diff --git a/subunit2sql/db/models.py b/subunit2sql/db/models.py index d66ccd8..de2a71b 100644 --- a/subunit2sql/db/models.py +++ b/subunit2sql/db/models.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +import datetime import uuid from oslo.db.sqlalchemy import models # noqa @@ -68,6 +69,8 @@ class Run(BASE, SubunitBase): passes = sa.Column(sa.Integer()) run_time = sa.Column(sa.Float()) artifacts = sa.Column(sa.Text()) + run_at = sa.Column(sa.DateTime, + default=datetime.datetime.utcnow) class TestRun(BASE, SubunitBase): diff --git a/subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py b/subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py new file mode 100644 index 0000000..b97cbba --- /dev/null +++ b/subunit2sql/migrations/versions/28ac1ba9c3db_add_run_order_column.py @@ -0,0 +1,36 @@ +# Copyright 2014 Hewlett-Packard Development Company, L.P. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Add order column + +Revision ID: 28ac1ba9c3db +Revises: 13d819bbb0ff +Create Date: 2014-08-02 21:54:55.634109 + +""" + +# revision identifiers, used by Alembic. +revision = '28ac1ba9c3db' +down_revision = '13d819bbb0ff' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + op.add_column('runs', sa.Column('run_at', sa.DateTime())) + + +def downgrade(): + op.drop_column('runs', 'run_order') diff --git a/subunit2sql/tests/migrations/test_migrations.py b/subunit2sql/tests/migrations/test_migrations.py index 95d3a10..1d5b87e 100644 --- a/subunit2sql/tests/migrations/test_migrations.py +++ b/subunit2sql/tests/migrations/test_migrations.py @@ -406,3 +406,40 @@ class TestWalkMigrations(base.TestCase): def _check_163fd5aa1380(self, engine, data): self.assertColumnExists(engine, 'tests', 'run_time') + + def _pre_upgrade_28ac1ba9c3db(self, engine): + runs = get_table(engine, 'runs') + data = [{'id': 'fake_run.id1', + 'skips': 0, + 'fails': 0, + 'passes': 1, + 'run_time': 1.0, + 'artifacts': 'fake_url'}, + {'id': 'fake_run.id2', + 'skips': 0, + 'fails': 0, + 'passes': 1, + 'run_time': 1.0, + 'artifacts': 'fake_url'}] + for run in data: + runs.insert().values(run).execute() + return data + + def _check_28ac1ba9c3db(self, engine, data): + self.assertColumnExists(engine, 'runs', 'run_at') + runs = get_table(engine, 'runs') + now = datetime.datetime.now().replace(microsecond=0) + time_data = {'id': 'fake_run_with_time.id1', + 'skips': 0, + 'fails': 0, + 'passes': 1, + 'run_time': 1.0, + 'artifacts': 'fake_url', + 'run_at': now} + runs.insert().values(time_data).execute() + runs = get_table(engine, 'runs') + result = runs.select().execute() + run_at = map(lambda x: (x['id'], x['run_at']), result) + for run in data: + self.assertIn((run['id'], None), run_at) + self.assertIn((time_data['id'], now), run_at)