From 29c18a08336b79f96e52569dac0fdd625e46661f Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Jan 18 2018 13:39:38 +0000 Subject: Set _FAKE_COMPOSE_ID to proper value in DRY_RUN mode to keep the odcs_compose_ids unique and increasing. --- diff --git a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py index 82d1e57..9c76c27 100644 --- a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py +++ b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py @@ -67,6 +67,13 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): advisory. """ + # In case we run in DRY_RUN mode, we need to initialize + # FAKE_COMPOSE_ID to the id of last ODCS compose to give the IDs + # increasing and unique even between Freshmaker restarts. + if conf.dry_run: + ErrataAdvisoryRPMsSignedHandler._FAKE_COMPOSE_ID = \ + Compose.get_highest_compose_id(db.session) + 1 + self.event = event # Generate the Database representation of `event`, it can be diff --git a/freshmaker/models.py b/freshmaker/models.py index 964d3da..4bc5c2e 100644 --- a/freshmaker/models.py +++ b/freshmaker/models.py @@ -564,6 +564,18 @@ class Compose(FreshmakerBase): return 'done' == create_odcs_client().get_compose( self.odcs_compose_id)['state_name'] + @classmethod + def get_highest_compose_id(cls, session): + """ + Returns the highest odcs_compose_id. If there is no compose, + returns 0. + """ + compose = session.query(Compose).order_by( + Compose.odcs_compose_id.desc()).first() + if not compose: + return 0 + return compose.odcs_compose_id + Index('idx_odcs_compose_id', Compose.odcs_compose_id, unique=True) diff --git a/tests/test_errata_advisory_rpms_signed_handler.py b/tests/test_errata_advisory_rpms_signed_handler.py index 98ec79b..6f4d992 100644 --- a/tests/test_errata_advisory_rpms_signed_handler.py +++ b/tests/test_errata_advisory_rpms_signed_handler.py @@ -30,7 +30,7 @@ from freshmaker import db from freshmaker.events import ErrataAdvisoryRPMsSignedEvent from freshmaker.handlers.errata import ErrataAdvisoryRPMsSignedHandler from freshmaker.lightblue import ContainerImage -from freshmaker.models import Event +from freshmaker.models import Event, Compose from freshmaker.types import EventState @@ -211,6 +211,25 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): 'image': [{'advisory_name': 'RHBA-2017'}] } }) + @patch.object(freshmaker.conf, 'dry_run', new=True) + def test_setting_fake_compose_id_dry_run_mode(self): + compose_4 = Compose(odcs_compose_id=4) + db.session.add(compose_4) + db.session.commit() + + self.mock_find_images_to_rebuild.return_value = iter([[[]]]) + event = ErrataAdvisoryRPMsSignedEvent( + "123", "RHBA-2017", 123, "", "REL_PREP") + handler = ErrataAdvisoryRPMsSignedHandler() + handler.handle(event) + + self.assertEqual(ErrataAdvisoryRPMsSignedHandler._FAKE_COMPOSE_ID, 5) + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryRPMsSignedHandler': { + 'image': [{'advisory_name': 'RHBA-2017'}] + } + }) def test_event_state_updated_when_no_images_to_rebuild(self): self.mock_find_images_to_rebuild.return_value = iter([[[]]]) event = ErrataAdvisoryRPMsSignedEvent( diff --git a/tests/test_models.py b/tests/test_models.py index bf38422..ec2245b 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -319,6 +319,10 @@ class TestArtifactBuildComposesRel(unittest.TestCase): db.drop_all() db.session.commit() + def test_get_highest_compose_id(self): + compose_id = Compose.get_highest_compose_id(db.session) + self.assertEqual(compose_id, 4) + def test_build_composes(self): self.assertEqual(3, len(self.build_1.composes)) self.assertEqual(