From 5679813c46a0e66c6ed1eefdeff4764cd4e4e07c Mon Sep 17 00:00:00 2001 From: Chenxiong Qi Date: Aug 21 2017 04:09:34 +0000 Subject: Store compose id for reuse later freshmaker calls ODCS API to request a yum repository to contain required RPMs, but it will not block and wait for ODCS to finish generating the repository. So, created compose id is stored in database, and will be reused later to rebuild contains when repository is done. Signed-off-by: Chenxiong Qi --- diff --git a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py index a461282..896d3c0 100644 --- a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py +++ b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py @@ -164,7 +164,11 @@ class ErrataAdvisoryRPMsSignedHandler(BaseHandler): new_compose = odcs.new_compose(compose_source, 'tag', packages=packages) + compose_id = new_compose['id'] + rebuild_event = Event.get(db.session, db_event.msg_id) + rebuild_event.compose_id = compose_id + db.session.commit() log.info('Waiting for ODCS to finish the compose: %d', compose_id) diff --git a/freshmaker/migrations/versions/31b2c949208c_add_compose_id_to_event.py b/freshmaker/migrations/versions/31b2c949208c_add_compose_id_to_event.py new file mode 100644 index 0000000..0d584ef --- /dev/null +++ b/freshmaker/migrations/versions/31b2c949208c_add_compose_id_to_event.py @@ -0,0 +1,26 @@ +"""Add compose_id to Event + +Revision ID: 31b2c949208c +Revises: 43b3c6580af7 +Create Date: 2017-08-21 12:06:47.366407 + +""" + +# revision identifiers, used by Alembic. +revision = '31b2c949208c' +down_revision = '43b3c6580af7' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('events', sa.Column('compose_id', sa.Integer(), nullable=True)) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_column('events', 'compose_id') + ### end Alembic commands ### diff --git a/freshmaker/models.py b/freshmaker/models.py index e89bb1c..7e3348e 100644 --- a/freshmaker/models.py +++ b/freshmaker/models.py @@ -57,8 +57,12 @@ class FreshmakerBase(db.Model): class Event(FreshmakerBase): __tablename__ = "events" id = db.Column(db.Integer, primary_key=True) - # ID of message generating the rebuild event. - message_id = db.Column(db.String, nullable=False) + + message_id = db.Column( + db.String, + nullable=False, + doc='msg_id of each received message that triggers this event.') + # Searchable key for the event - used when searching for events from the JSON # API. search_key = db.Column(db.String, nullable=False) @@ -74,6 +78,12 @@ class Event(FreshmakerBase): # List of builds associated with this Event. builds = relationship("ArtifactBuild", back_populates="event") + compose_id = db.Column( + db.Integer, + default=None, + doc='Used only for case of rebuilding docker containers for RHSA ' + 'advisory internally.') + @classmethod def create(cls, session, message_id, search_key, event_type, released=True): if event_type in EVENT_TYPES: @@ -88,8 +98,12 @@ class Event(FreshmakerBase): return event @classmethod + def get(cls, session, message_id): + return session.query(cls).filter_by(message_id=message_id).first() + + @classmethod def get_or_create(cls, session, message_id, search_key, event_type, released=True): - instance = session.query(cls).filter_by(message_id=message_id).first() + instance = cls.get(session, message_id) if instance: return instance return cls.create(session, message_id, search_key, event_type, released) diff --git a/tests/test_errata_advisory_state_changed.py b/tests/test_errata_advisory_state_changed.py index 0282961..8df2e37 100644 --- a/tests/test_errata_advisory_state_changed.py +++ b/tests/test_errata_advisory_state_changed.py @@ -360,6 +360,19 @@ class TestGetComposeSource(unittest.TestCase): class TestPrepareYumRepo(unittest.TestCase): """Test ErrataAdvisoryRPMsSignedHandler._prepare_yum_repo""" + def setUp(self): + db.session.remove() + db.drop_all() + db.create_all() + db.session.commit() + + Event.create(db.session, 'msg-id', 'nvr', 100) + + def tearDown(self): + db.session.remove() + db.drop_all() + db.session.commit() + @patch('freshmaker.handlers.errata.errata_advisory_rpms_signed.ODCS') @patch('freshmaker.handlers.errata.errata_advisory_rpms_signed.' 'ErrataAdvisoryRPMsSignedHandler._get_packages_for_compose') @@ -391,10 +404,14 @@ class TestPrepareYumRepo(unittest.TestCase): errata.return_value.get_builds.return_value = set(["httpd-2.4.15-1.f27"]) - event = Mock(search_key=12345) + event = Mock(msg_id='msg-id', search_key=12345) handler = ErrataAdvisoryRPMsSignedHandler() repo_url = handler._prepare_yum_repo(event) + rebuild_event = db.session.query(Event).filter( + Event.message_id == event.msg_id).first() + self.assertEqual(3, rebuild_event.compose_id) + _get_compose_source.assert_called_once_with("httpd-2.4.15-1.f27") _get_packages_for_compose.assert_called_once_with("httpd-2.4.15-1.f27")