diff --git a/glare/db/migration/alembic_migrations/versions/002_add_acquired_at_column.py b/glare/db/migration/alembic_migrations/versions/002_add_acquired_at_column.py new file mode 100644 index 0000000..19cc8d0 --- /dev/null +++ b/glare/db/migration/alembic_migrations/versions/002_add_acquired_at_column.py @@ -0,0 +1,51 @@ +# Copyright 2016 OpenStack Foundation. +# +# 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 acquired_at column + +Revision ID: 002 +Revises: 001 +Create Date: 2016-10-05 16:03:43.207147 + +""" + +# revision identifiers, used by Alembic. +revision = '002' +down_revision = '001' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + engine = op.get_bind() + if engine.dialect.dialect_description.startswith('sqlite'): + op.add_column( + 'glare_artifact_locks', + sa.Column( + 'acquired_at', sa.DateTime(), nullable=False, + server_default=sa.text('NOW')) + ) + else: + op.add_column( + 'glare_artifact_locks', + sa.Column( + 'acquired_at', sa.DateTime(), nullable=False, + server_default=sa.text('NOW()')) + ) + + +def downgrade(): + op.drop_column('glare_artifact_locks', 'acquired_at') diff --git a/glare/db/sqlalchemy/models.py b/glare/db/sqlalchemy/models.py index b3b8fb9..4069b0c 100644 --- a/glare/db/sqlalchemy/models.py +++ b/glare/db/sqlalchemy/models.py @@ -242,6 +242,8 @@ class ArtifactLock(BASE, ArtifactBase): __table_args__ = ( {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8'},) id = Column(String(255), primary_key=True, nullable=False) + acquired_at = Column( + DateTime, nullable=False, default=lambda: timeutils.utcnow()) def register_models(engine): diff --git a/glare/tests/unit/db/migrations/test_migrations.py b/glare/tests/unit/db/migrations/test_migrations.py index e6c1600..ab0d6f1 100644 --- a/glare/tests/unit/db/migrations/test_migrations.py +++ b/glare/tests/unit/db/migrations/test_migrations.py @@ -132,6 +132,9 @@ class GlareMigrationsCheckers(object): self.assertRaises(sqlalchemy.exc.NoSuchTableError, db_utils.get_table, engine, 'glare_artifact_blobs') + self.assertRaises(sqlalchemy.exc.NoSuchTableError, + db_utils.get_table, engine, + 'glare_artifact_locks') def _check_001(self, engine, data): artifacts_indices = [('ix_glare_artifact_name_and_version', @@ -207,6 +210,12 @@ class GlareMigrationsCheckers(object): self.assert_table(engine, 'glare_artifact_locks', locks_indices, locks_columns) + def _check_002(self, engine, data): + locks_indices = [] + locks_columns = ['id', 'acquired_at'] + self.assert_table(engine, 'glare_artifact_locks', locks_indices, + locks_columns) + class TestMigrationsMySQL(GlareMigrationsCheckers, WalkVersionsMixin,