From 8743b70e28131c053ca15dbf5989370f0b6971d0 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Aug 03 2018 11:43:52 +0000 Subject: Add BaseEvent.is_allowed method to check if the event passes configured whitelist/blacklist. --- diff --git a/freshmaker/events.py b/freshmaker/events.py index ce33727..2928f42 100644 --- a/freshmaker/events.py +++ b/freshmaker/events.py @@ -24,6 +24,7 @@ import itertools from freshmaker import conf +from freshmaker.types import ArtifactType try: from inspect import signature @@ -134,6 +135,21 @@ class BaseEvent(object): """ return self.msg_id + def is_allowed(self, handler, artifact_type, **kwargs): + """ + Returns True if whitelist/blacklist allows handling this event. + Calls `handler.allow_build()` to find the answer. + + :param BaseHandler handler: Handler currently handling the event. + :param ArtifactType artifact_type: Type of artifact to build as part + of event. + :param args: Extra args to be passed to `handler.allow_build()`. + :param kwargs: Extra kwargs to be passed to `handler.allow_build()`. + """ + return handler.allow_build( + artifact_type, dry_run=self.dry_run, + manual=self.manual, **kwargs) + class MBSModuleStateChangeEvent(BaseEvent): """ A class that inherits from BaseEvent to provide an event @@ -269,6 +285,17 @@ class ErrataBaseEvent(BaseEvent): def search_key(self): return str(self.advisory.errata_id) + def is_allowed(self, handler, **kwargs): + return super(ErrataBaseEvent, self).is_allowed( + handler, ArtifactType.IMAGE, + advisory_state=self.advisory.state, + advisory_name=self.advisory.name, + advisory_security_impact=self.advisory.security_impact, + advisory_highest_cve_severity=self.advisory.highest_cve_severity, + advisory_product_short_name=self.advisory.product_short_name, + advisory_has_hightouch_bug=self.advisory.has_hightouch_bug, + **kwargs) + class ErrataAdvisoryStateChangedEvent(ErrataBaseEvent): """ diff --git a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py index 00198ea..e0f6328 100644 --- a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py +++ b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py @@ -92,14 +92,7 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): self.set_context(db_event) # Check if we are allowed to build this advisory. - if not self.allow_build( - ArtifactType.IMAGE, - advisory_name=event.advisory.name, - advisory_security_impact=event.advisory.security_impact, - advisory_highest_cve_severity=event.advisory.highest_cve_severity, - advisory_product_short_name=event.advisory.product_short_name, - advisory_has_hightouch_bug=event.advisory.has_hightouch_bug, - dry_run=self.dry_run): + if not self.event.is_allowed(self): msg = ("Errata advisory {0} is not allowed by internal policy " "to trigger rebuilds.".format(event.advisory.errata_id)) db_event.transition(EventState.SKIPPED, msg) @@ -618,8 +611,7 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): image_name = koji.parse_NVR(image["brew"]["build"])['name'] - if not self.allow_build( - ArtifactType.IMAGE, image_name=image_name): + if not self.event.is_allowed(self, image_name=image_name): self.log_info("Skipping rebuild of image %s, not allowed by " "configuration", image_name) return True @@ -659,13 +651,7 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): # Check if we are allowed to rebuild unpublished images and clear # published and release_category if so. - if self.allow_build( - ArtifactType.IMAGE, advisory_name=self.event.advisory.name, - advisory_security_impact=self.event.advisory.security_impact, - advisory_highest_cve_severity=self.event.advisory.highest_cve_severity, - advisory_product_short_name=self.event.advisory.product_short_name, - advisory_has_hightouch_bug=self.event.advisory.has_hightouch_bug, - published=True, dry_run=self.dry_run): + if self.event.is_allowed(self, published=True): published = True release_category = "Generally Available" else: diff --git a/freshmaker/handlers/errata/errata_advisory_state_changed.py b/freshmaker/handlers/errata/errata_advisory_state_changed.py index 3fd83ea..7abf90e 100644 --- a/freshmaker/handlers/errata/errata_advisory_state_changed.py +++ b/freshmaker/handlers/errata/errata_advisory_state_changed.py @@ -25,7 +25,7 @@ from freshmaker.events import ( from freshmaker.models import Event, EVENT_TYPES from freshmaker.handlers import BaseHandler, fail_event_on_handler_exception from freshmaker.errata import Errata -from freshmaker.types import EventState, ArtifactType +from freshmaker.types import EventState class ErrataAdvisoryStateChangedHandler(BaseHandler): @@ -113,8 +113,7 @@ class ErrataAdvisoryStateChangedHandler(BaseHandler): extra_events = [] - if (event.manual or - self.allow_build(ArtifactType.IMAGE, advisory_state=event.advisory.state)): + if event.is_allowed(self): extra_events += self.rebuild_if_not_exists(event, errata_id) if state == "SHIPPED_LIVE": diff --git a/tests/test_errata_advisory_state_changed.py b/tests/test_errata_advisory_state_changed.py index c1e40dd..8f8be5c 100644 --- a/tests/test_errata_advisory_state_changed.py +++ b/tests/test_errata_advisory_state_changed.py @@ -640,6 +640,13 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): self.assertEqual(len(ret), 0) @patch('freshmaker.errata.Errata.advisories_from_event') + @patch.object(conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryStateChangedHandler': { + 'image': { + 'advisory_state': '.*', + } + } + }) def test_rebuild_if_not_exists_already_exists( self, advisories_from_event): handler = ErrataAdvisoryStateChangedHandler() @@ -767,7 +774,7 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): @patch.object(conf, 'handler_build_whitelist', new={ 'ErrataAdvisoryStateChangedHandler': { 'image': { - 'advisory_state': r'REL_PREP', + 'advisory_state': r'SHIPPED_LIVE', } } })