From 409250a9c7ad8294dcd50ca7d2df124bd94cc265 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Dec 15 2017 12:34:57 +0000 Subject: Generate ErrataAdvisoryStateChangedEvent instead of ErrataAdvisoryRPMsSignedEvent in manual trigger handler. --- diff --git a/freshmaker/handlers/errata/errata_advisory_state_changed.py b/freshmaker/handlers/errata/errata_advisory_state_changed.py index 754ea36..6f0922e 100644 --- a/freshmaker/handlers/errata/errata_advisory_state_changed.py +++ b/freshmaker/handlers/errata/errata_advisory_state_changed.py @@ -104,7 +104,8 @@ class ErrataAdvisoryStateChangedHandler(BaseHandler): extra_events = [] - if self.allow_build(ArtifactType.IMAGE, advisory_state=event.state): + if (event.manual or + self.allow_build(ArtifactType.IMAGE, advisory_state=event.state)): extra_events += self.rebuild_if_not_exists(event, errata_id) if state == "SHIPPED_LIVE": diff --git a/freshmaker/handlers/internal/manual_rebuild.py b/freshmaker/handlers/internal/manual_rebuild.py index b74c36b..9c824e5 100644 --- a/freshmaker/handlers/internal/manual_rebuild.py +++ b/freshmaker/handlers/internal/manual_rebuild.py @@ -22,10 +22,10 @@ # Written by Jan Kaluza from freshmaker import db, log -from freshmaker.models import Event, EVENT_TYPES +from freshmaker.models import Event from freshmaker.handlers import ContainerBuildHandler from freshmaker.events import ( - FreshmakerManualRebuildEvent, ErrataAdvisoryRPMsSignedEvent) + FreshmakerManualRebuildEvent, ErrataAdvisoryStateChangedEvent) from freshmaker.errata import Errata from freshmaker.types import EventState @@ -40,57 +40,46 @@ class FreshmakerManualRebuildHandler(ContainerBuildHandler): return False return True - def rebuild_advisory_if_not_exists(self, event, errata_id): + def generate_fake_event(self, manual_rebuild_event): """ - Initiates rebuild of artifacts based on Errata advisory with - `errata_id` id. + Returns fake ErrataAdvisoryStateChangedEvent which will trigger manual + rebuild of artifacts based on Errata advisory `errata_id`. - :rtype: List of ErrataAdvisoryRPMsSignedEvent instances. - :return: List of extra events generated to initiate the rebuild. + :param manual_rebuild_event: FreshmakerManualRebuildEvent instance. + :rtype: ErrataAdvisoryStateChangedEvent + :return: Newly generated ErrataAdvisoryStateChangedEvent. """ - db_event = db.session.query(Event).filter_by( - event_type_id=EVENT_TYPES[ErrataAdvisoryRPMsSignedEvent], - search_key=str(errata_id)).first() - if db_event and db_event.state != EventState.FAILED.value: - msg = ("Ignoring Errata advisory %d - it already exists in " - "Freshmaker db." % errata_id) - self.current_db_event.transition(EventState.SKIPPED, msg) - db.session.commit() - log.info(msg) - return [] - # Get additional info from Errata to fill in the needed data. errata = Errata() - advisories = errata.advisories_from_event(event) + advisories = errata.advisories_from_event(manual_rebuild_event) if not advisories: - msg = "Unknown Errata advisory %d" % errata_id + msg = "Unknown Errata advisory %d" % manual_rebuild_event.errata_id self.current_db_event.transition(EventState.FAILED, msg) db.session.commit() - return [] + return None - log.info("Generating ErrataAdvisoryRPMsSignedEvent for Errata " - "advisory %d - manually triggered rebuild.", errata_id) + log.info("Generating ErrataAdvisoryStateChangedEvent for Errata " + "advisory %d - manually triggered rebuild.", + manual_rebuild_event.errata_id) advisory = advisories[0] - new_event = ErrataAdvisoryRPMsSignedEvent( - event.msg_id + "." + str(advisory.name), advisory.name, - advisory.errata_id, advisory.security_impact, advisory.state) + new_event = ErrataAdvisoryStateChangedEvent( + manual_rebuild_event.msg_id + "." + str(advisory.name), + advisory.errata_id, advisory.state) new_event.manual = True - msg = ("Generated ErrataAdvisoryRPMsSignedEvent (%s) for errata: %s" - % (event.msg_id, errata_id)) + msg = ("Generated ErrataAdvisoryStateChangedEvent (%s) for errata: %s" + % (manual_rebuild_event.msg_id, manual_rebuild_event.errata_id)) self.current_db_event.transition(EventState.COMPLETE, msg) db.session.commit() - return [new_event] + return new_event def handle(self, event): - # for every manual triggered event, we log it in db + # We log every manual trigger event to DB. db_event = Event.get_or_create_from_event(db.session, event) db.session.commit() self.set_context(db_event) - extra_events = [] - - if event.errata_id: - extra_events += self.rebuild_advisory_if_not_exists(event, event.errata_id) - - return extra_events + fake_event = self.generate_fake_event(event) + if not fake_event: + return [] + return [fake_event] diff --git a/tests/test_errata_advisory_state_changed.py b/tests/test_errata_advisory_state_changed.py index 101c881..9dea9d7 100644 --- a/tests/test_errata_advisory_state_changed.py +++ b/tests/test_errata_advisory_state_changed.py @@ -922,6 +922,33 @@ class TestErrataAdvisoryStateChangedHandler(unittest.TestCase): self.assertEqual([], msgs) + @patch('freshmaker.handlers.errata.ErrataAdvisoryStateChangedHandler' + '.rebuild_if_not_exists') + @patch.object(conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryStateChangedHandler': { + 'image': [ + { + 'advisory_state': r'REL_PREP', + } + ] + } + }) + def test_rebuild_if_errata_state_is_not_allowed_but_manual_is_true( + self, rebuild_if_not_exists): + rebuild_if_not_exists.return_value = [Mock()] + + Event.create(db.session, "msg-id-123", "123456", + ErrataAdvisoryRPMsSignedEvent, False) + db.session.commit() + + event = ErrataAdvisoryStateChangedEvent( + 'msg-id-123', 123456, 'SHIPPED_LIVE') + event.manual = True + handler = ErrataAdvisoryStateChangedHandler() + msgs = handler.handle(event) + + self.assertEqual(len(msgs), 1) + class TestRecordBatchesImages(unittest.TestCase): """Test ErrataAdvisoryRPMsSignedHandler._record_batches""" diff --git a/tests/test_freshmaker_manual_rebuild_handler.py b/tests/test_freshmaker_manual_rebuild_handler.py index 5c7f3b0..0d40ad8 100644 --- a/tests/test_freshmaker_manual_rebuild_handler.py +++ b/tests/test_freshmaker_manual_rebuild_handler.py @@ -26,8 +26,7 @@ import unittest from mock import patch from freshmaker.handlers.internal import FreshmakerManualRebuildHandler -from freshmaker.events import ( - FreshmakerManualRebuildEvent, ErrataAdvisoryRPMsSignedEvent) +from freshmaker.events import FreshmakerManualRebuildEvent from freshmaker.errata import ErrataAdvisory from freshmaker import db @@ -59,34 +58,13 @@ class TestFreshmakerManualRebuildHandler(unittest.TestCase): self.assertEqual(len(ret), 1) self.assertEqual(ret[0].errata_id, 123) - self.assertEqual(ret[0].security_impact, "Critical") - self.assertEqual(ret[0].errata_name, "RHSA-2017") + self.assertEqual(ret[0].state, "REL_PREP") + self.assertEqual(ret[0].manual, True) db_event = Event.query.filter_by(message_id=ev.msg_id).first() self.assertEqual(db_event.state, EventState.COMPLETE.value) self.assertEqual(db_event.state_reason, - 'Generated ErrataAdvisoryRPMsSignedEvent (msg123) for errata: 123') - - @patch('freshmaker.errata.Errata.advisories_from_event') - def test_rebuild_if_not_exists_already_exists( - self, advisories_from_event): - handler = FreshmakerManualRebuildHandler() - - Event.create( - db.session, "msg124", "123", ErrataAdvisoryRPMsSignedEvent) - db.session.commit() - - advisories_from_event.return_value = [ - ErrataAdvisory(123, "RHSA-2017", "REL_PREP", "Critical")] - ev = FreshmakerManualRebuildEvent("msg123", errata_id=123) - ret = handler.handle(ev) - - self.assertEqual(len(ret), 0) - - db_event = Event.query.filter_by(message_id=ev.msg_id).first() - self.assertEqual(db_event.state, EventState.SKIPPED.value) - self.assertEqual(db_event.state_reason, - 'Ignoring Errata advisory 123 - it already exists in Freshmaker db.') + 'Generated ErrataAdvisoryStateChangedEvent (msg123) for errata: 123') @patch('freshmaker.errata.Errata.advisories_from_event') def test_rebuild_if_not_exists_unknown_errata_id(