From fccb61c5182c4a36f525215c8148f898e7944690 Mon Sep 17 00:00:00 2001 From: Qixiang Wan Date: Jun 16 2017 06:16:09 +0000 Subject: [PATCH 1/2] Rename dep_of to dep_on The name of 'dep_of' is different with its meaning, change to 'dep_on' which is more accurate. --- diff --git a/freshmaker/api_utils.py b/freshmaker/api_utils.py index bfc1cbd..d9b1e34 100644 --- a/freshmaker/api_utils.py +++ b/freshmaker/api_utils.py @@ -85,7 +85,7 @@ def filter_artifact_builds(flask_request): else: raise ValueError('An invalid state was supplied') - for key in ['name', 'event_id', 'dep_of_id', 'build_id']: + for key in ['name', 'event_id', 'dep_on_id', 'build_id']: if flask_request.args.get(key, None): search_query[key] = flask_request.args[key] diff --git a/freshmaker/handlers/__init__.py b/freshmaker/handlers/__init__.py index cdfaf9b..e995ca0 100644 --- a/freshmaker/handlers/__init__.py +++ b/freshmaker/handlers/__init__.py @@ -96,7 +96,7 @@ class BaseHandler(object): namespace=namespace, scratch=conf.koji_container_scratch_build) - def record_build(self, event, name, artifact_type, build_id, dep_of=None): + def record_build(self, event, name, artifact_type, build_id, dep_on=None): """ Record build in db. @@ -108,7 +108,7 @@ class BaseHandler(object): """ ev = models.Event.get_or_create(db.session, event.msg_id, event.search_key, event.__class__) - models.ArtifactBuild.create(db.session, ev, name, artifact_type.name.lower(), build_id, dep_of) + models.ArtifactBuild.create(db.session, ev, name, artifact_type.name.lower(), build_id, dep_on) db.session.commit() def allow_build(self, artifact_type, name, branch): diff --git a/freshmaker/handlers/mbs/module_state_change.py b/freshmaker/handlers/mbs/module_state_change.py index ddd8982..6d2678e 100644 --- a/freshmaker/handlers/mbs/module_state_change.py +++ b/freshmaker/handlers/mbs/module_state_change.py @@ -75,7 +75,7 @@ class MBSModuleStateChangeHandler(BaseHandler): if module_build: # we have this build recorded in DB, check to prevent # cyclic build loop - root_dep = module_build.get_root_dep_of() + root_dep = module_build.get_root_dep_on() if root_dep and root_dep.name == module_name: log.info("Skipping the rebuild triggered by %s:%s as it will" "result in cyclic build loop.", module_name, module_stream) @@ -98,6 +98,6 @@ class MBSModuleStateChangeHandler(BaseHandler): rev = utils.bump_distgit_repo('modules', name, branch=version, commit_msg=commit_msg, logger=log) new_build_id = self.build_module(name, version, rev) if new_build_id is not None: - self.record_build(event, name, ArtifactType.MODULE, new_build_id, dep_of=module_build) + self.record_build(event, name, ArtifactType.MODULE, new_build_id, dep_on=module_build) return [] diff --git a/freshmaker/models.py b/freshmaker/models.py index df6516f..d66ad7e 100644 --- a/freshmaker/models.py +++ b/freshmaker/models.py @@ -113,8 +113,8 @@ class ArtifactBuild(FreshmakerBase): # Link to the Artifact on which this one depends and which triggered # the rebuild of this Artifact. - dep_of_id = db.Column(db.Integer, db.ForeignKey('artifact_builds.id')) - dep_of = relationship('ArtifactBuild', remote_side=[id]) + dep_on_id = db.Column(db.Integer, db.ForeignKey('artifact_builds.id')) + dep_on = relationship('ArtifactBuild', remote_side=[id]) # Event associated with this Build event_id = db.Column(db.Integer, db.ForeignKey('events.id')) @@ -124,7 +124,7 @@ class ArtifactBuild(FreshmakerBase): build_id = db.Column(db.Integer) @classmethod - def create(cls, session, event, name, type, build_id, dep_of=None): + def create(cls, session, event, name, type, build_id, dep_on=None): now = datetime.utcnow() build = cls( name=name, @@ -133,7 +133,7 @@ class ArtifactBuild(FreshmakerBase): state="build", build_id=build_id, time_submitted=now, - dep_of=dep_of + dep_on=dep_on ) session.add(build) return build @@ -171,12 +171,12 @@ class ArtifactBuild(FreshmakerBase): "build_id": self.build_id, } - def get_root_dep_of(self): - dep_of = self.dep_of - while dep_of: - dep = dep_of.dep_of + def get_root_dep_on(self): + dep_on = self.dep_on + while dep_on: + dep = dep_on.dep_on if dep: - dep_of = dep + dep_on = dep else: break - return dep_of + return dep_on diff --git a/tests/test_mbs_module_state_change_handler.py b/tests/test_mbs_module_state_change_handler.py index d893fef..dcf32f1 100644 --- a/tests/test_mbs_module_state_change_handler.py +++ b/tests/test_mbs_module_state_change_handler.py @@ -212,7 +212,7 @@ class MBSModuleStateChangeHandlerTest(helpers.FreshmakerTestCase): handler = MBSModuleStateChangeHandler() # Assume we have build of module1 recorded in DB already, it doesn't has - # any dep_of as it was initial triggered by an event which is not + # any dep_on as it was initial triggered by an event which is not # associated with any build in our DB. event = models.Event.create(db.session, "initial_msg_id", "test", events.TestingEvent) models.ArtifactBuild.create(db.session, event, "module1", "module", '123') diff --git a/tests/test_models.py b/tests/test_models.py index 853a188..0d21ba0 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -55,15 +55,15 @@ class TestModels(unittest.TestCase): self.assertEqual(e.builds[0].type, 2) self.assertEqual(e.builds[0].state, 0) self.assertEqual(e.builds[0].build_id, 1234) - self.assertEqual(e.builds[0].dep_of, None) + self.assertEqual(e.builds[0].dep_on, None) self.assertEqual(e.builds[1].name, "mksh") self.assertEqual(e.builds[1].type, 2) self.assertEqual(e.builds[1].state, 0) self.assertEqual(e.builds[1].build_id, 1235) - self.assertEqual(e.builds[1].dep_of.name, "ed") + self.assertEqual(e.builds[1].dep_on.name, "ed") - def test_get_root_dep_of(self): + def test_get_root_dep_on(self): event = Event.create(db.session, "test_msg_id", "test", events.TestingEvent) build1 = ArtifactBuild.create(db.session, event, "ed", "module", 1234) build2 = ArtifactBuild.create(db.session, event, "mksh", "module", 1235, build1) @@ -71,7 +71,7 @@ class TestModels(unittest.TestCase): build4 = ArtifactBuild.create(db.session, event, "perl-runtime", "module", 1237, build3) db.session.commit() db.session.expire_all() - self.assertEqual(build1.get_root_dep_of(), None) - self.assertEqual(build2.get_root_dep_of(), build1) - self.assertEqual(build3.get_root_dep_of(), build1) - self.assertEqual(build4.get_root_dep_of(), build1) + self.assertEqual(build1.get_root_dep_on(), None) + self.assertEqual(build2.get_root_dep_on(), build1) + self.assertEqual(build3.get_root_dep_on(), build1) + self.assertEqual(build4.get_root_dep_on(), build1) From 7e72b2f7b009f010d4915245d08e83a25ecb3607 Mon Sep 17 00:00:00 2001 From: Qixiang Wan Date: Jun 16 2017 06:16:09 +0000 Subject: [PATCH 2/2] Re-initialize database The migration of 85906960545_event_search_key_and_type.py doesn't provide an approach for altering existing records to add new columns which don't allow NULL value, thus db upgrade fails when we do 'db upgrade', this blocks us to generate any future migration. Since there is no Freshmaker instance is deployed by now, we have no real data to be maintained, and with the existing schema we can't give reasonable 'search_key' and 'event_type', re-initialize the database is an easy solution to workaround this (compare to changing 'search_key' and 'event_type' to be nullable). --- diff --git a/freshmaker/migrations/versions/1529069af28e_initial_db.py b/freshmaker/migrations/versions/1529069af28e_initial_db.py deleted file mode 100644 index 865b259..0000000 --- a/freshmaker/migrations/versions/1529069af28e_initial_db.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Initial database - -Revision ID: 1529069af28e -Revises: None -Create Date: 2017-04-28 13:43:23.340055 - -""" - -# revision identifiers, used by Alembic. -revision = '1529069af28e' -down_revision = None - -from alembic import op -import sqlalchemy as sa - - -def upgrade(): - op.create_table('events', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('message_id', sa.String(), nullable=False), - sa.PrimaryKeyConstraint('id') - ) - op.create_table('artifact_builds', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('name', sa.String(), nullable=False), - sa.Column('type', sa.Integer(), nullable=True), - sa.Column('state', sa.Integer(), nullable=False), - sa.Column('time_submitted', sa.DateTime(), nullable=False), - sa.Column('time_completed', sa.DateTime(), nullable=True), - sa.Column('dep_of_id', sa.Integer(), nullable=True), - sa.Column('event_id', sa.Integer(), nullable=True), - sa.Column('build_id', sa.Integer(), nullable=True), - sa.ForeignKeyConstraint(['dep_of_id'], ['artifact_builds.id'], ), - sa.ForeignKeyConstraint(['event_id'], ['events.id'], ), - sa.PrimaryKeyConstraint('id') - ) - - -def downgrade(): - op.drop_table('artifact_builds') - op.drop_table('events') diff --git a/freshmaker/migrations/versions/85906960545_event_search_key_and_type.py b/freshmaker/migrations/versions/85906960545_event_search_key_and_type.py deleted file mode 100644 index 92fe49b..0000000 --- a/freshmaker/migrations/versions/85906960545_event_search_key_and_type.py +++ /dev/null @@ -1,28 +0,0 @@ -"""Add search_key and event_type_id to events - -Revision ID: 85906960545 -Revises: 1529069af28e -Create Date: 2017-06-01 08:09:30.207251 - -""" - -# revision identifiers, used by Alembic. -revision = '85906960545' -down_revision = '1529069af28e' - -from alembic import op -import sqlalchemy as sa - - -def upgrade(): - ### commands auto generated by Alembic - please adjust! ### - op.add_column('events', sa.Column('event_type_id', sa.Integer(), nullable=False)) - op.add_column('events', sa.Column('search_key', sa.String(), nullable=False)) - ### end Alembic commands ### - - -def downgrade(): - ### commands auto generated by Alembic - please adjust! ### - op.drop_column('events', 'search_key') - op.drop_column('events', 'event_type_id') - ### end Alembic commands ### diff --git a/freshmaker/migrations/versions/8d2e9cd99c54_initial_db.py b/freshmaker/migrations/versions/8d2e9cd99c54_initial_db.py new file mode 100644 index 0000000..945e521 --- /dev/null +++ b/freshmaker/migrations/versions/8d2e9cd99c54_initial_db.py @@ -0,0 +1,49 @@ +"""initial db + +Revision ID: 8d2e9cd99c54 +Revises: +Create Date: 2017-06-14 23:07:18.679502 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8d2e9cd99c54' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('events', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('message_id', sa.String(), nullable=False), + sa.Column('search_key', sa.String(), nullable=False), + sa.Column('event_type_id', sa.Integer(), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('artifact_builds', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=False), + sa.Column('type', sa.Integer(), nullable=True), + sa.Column('state', sa.Integer(), nullable=False), + sa.Column('time_submitted', sa.DateTime(), nullable=False), + sa.Column('time_completed', sa.DateTime(), nullable=True), + sa.Column('dep_on_id', sa.Integer(), nullable=True), + sa.Column('event_id', sa.Integer(), nullable=True), + sa.Column('build_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['dep_on_id'], ['artifact_builds.id'], ), + sa.ForeignKeyConstraint(['event_id'], ['events.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('artifact_builds') + op.drop_table('events') + # ### end Alembic commands ###