summaryrefslogtreecommitdiff
path: root/zuul/driver/sql/sqlconnection.py
diff options
context:
space:
mode:
Diffstat (limited to 'zuul/driver/sql/sqlconnection.py')
-rw-r--r--zuul/driver/sql/sqlconnection.py63
1 files changed, 45 insertions, 18 deletions
diff --git a/zuul/driver/sql/sqlconnection.py b/zuul/driver/sql/sqlconnection.py
index 8ab528c39..2d5c39ec3 100644
--- a/zuul/driver/sql/sqlconnection.py
+++ b/zuul/driver/sql/sqlconnection.py
@@ -29,6 +29,7 @@ from zuul.zk.locks import CONNECTION_LOCK_ROOT, locked, SessionAwareLock
BUILDSET_TABLE = 'zuul_buildset'
BUILD_TABLE = 'zuul_build'
+BUILD_EVENTS_TABLE = 'zuul_build_event'
ARTIFACT_TABLE = 'zuul_artifact'
PROVIDES_TABLE = 'zuul_provides'
@@ -307,27 +308,31 @@ class SQLConnection(BaseConnection):
def _migrate(self, revision='head'):
"""Perform the alembic migrations for this connection"""
+ # Note that this method needs to be called with an external lock held.
+ # The reason for this is we retrieve the alembic version and run the
+ # alembic migrations in different database transactions which opens
+ # us to races without an external lock.
with self.engine.begin() as conn:
context = alembic.migration.MigrationContext.configure(conn)
current_rev = context.get_current_revision()
- self.log.debug('Current migration revision: %s' % current_rev)
-
- config = alembic.config.Config()
- config.set_main_option("script_location",
- "zuul:driver/sql/alembic")
- config.set_main_option("sqlalchemy.url",
- self.connection_config.get('dburi').
- replace('%', '%%'))
-
- # Alembic lets us add arbitrary data in the tag argument. We can
- # leverage that to tell the upgrade scripts about the table prefix.
- tag = {'table_prefix': self.table_prefix}
-
- if current_rev is None and not self.force_migrations:
- self.metadata.create_all(self.engine)
- alembic.command.stamp(config, revision, tag=tag)
- else:
- alembic.command.upgrade(config, revision, tag=tag)
+ self.log.debug('Current migration revision: %s' % current_rev)
+
+ config = alembic.config.Config()
+ config.set_main_option("script_location",
+ "zuul:driver/sql/alembic")
+ config.set_main_option("sqlalchemy.url",
+ self.connection_config.get('dburi').
+ replace('%', '%%'))
+
+ # Alembic lets us add arbitrary data in the tag argument. We can
+ # leverage that to tell the upgrade scripts about the table prefix.
+ tag = {'table_prefix': self.table_prefix}
+
+ if current_rev is None and not self.force_migrations:
+ self.metadata.create_all(self.engine)
+ alembic.command.stamp(config, revision, tag=tag)
+ else:
+ alembic.command.upgrade(config, revision, tag=tag)
def onLoad(self, zk_client, component_registry=None):
safe_connection = quote_plus(self.connection_name)
@@ -446,6 +451,15 @@ class SQLConnection(BaseConnection):
session.flush()
return p
+ def createBuildEvent(self, *args, **kw):
+ session = orm.session.Session.object_session(self)
+ e = BuildEventModel(*args, **kw)
+ e.build_id = self.id
+ self.build_events.append(e)
+ session.add(e)
+ session.flush()
+ return e
+
class ArtifactModel(Base):
__tablename__ = self.table_prefix + ARTIFACT_TABLE
id = sa.Column(sa.Integer, primary_key=True)
@@ -464,6 +478,19 @@ class SQLConnection(BaseConnection):
name = sa.Column(sa.String(255))
build = orm.relationship(BuildModel, backref="provides")
+ class BuildEventModel(Base):
+ __tablename__ = self.table_prefix + BUILD_EVENTS_TABLE
+ id = sa.Column(sa.Integer, primary_key=True)
+ build_id = sa.Column(sa.Integer, sa.ForeignKey(
+ self.table_prefix + BUILD_TABLE + ".id"))
+ event_time = sa.Column(sa.DateTime)
+ event_type = sa.Column(sa.String(255))
+ description = sa.Column(sa.TEXT())
+ build = orm.relationship(BuildModel, backref="build_events")
+
+ self.buildEventModel = BuildEventModel
+ self.zuul_build_event_table = self.buildEventModel.__table__
+
self.providesModel = ProvidesModel
self.zuul_provides_table = self.providesModel.__table__