From 3802fb21445dc3432ab795a5b438b27658bd0b3b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Jan 23 2018 08:17:36 +0000 Subject: Allow whitelisting containers to build based on a Errata advisory product. --- diff --git a/freshmaker/errata.py b/freshmaker/errata.py index 966fb6e..fa71a3f 100644 --- a/freshmaker/errata.py +++ b/freshmaker/errata.py @@ -37,7 +37,7 @@ class ErrataAdvisory(object): """ def __init__(self, errata_id, name, state, content_types, - security_impact=None): + security_impact=None, product_short_name=None): """ Initializes the ErrataAdvisory instance. """ @@ -46,6 +46,19 @@ class ErrataAdvisory(object): self.state = state self.content_types = content_types self.security_impact = security_impact or "" + self.product_short_name = product_short_name or "" + + @classmethod + def from_advisory_json_data(cls, data): + """ + Creates new ErrataAdvisory instance from response to + "advisory/%s.json" Errata tool API call. + """ + return ErrataAdvisory( + data["id"], data["advisory_name"], data["status"], + data['content_types'], + data["security_impact"], + data["product"]["short_name"]) class Errata(object): @@ -114,12 +127,8 @@ class Errata(object): advisories = [] for errata in build["all_errata"]: - extra_data = self._errata_http_get( - "advisory/%s.json" % str(errata["id"])) - advisory = ErrataAdvisory( - errata["id"], errata["name"], errata["status"], - extra_data['content_types'], - extra_data["security_impact"]) + data = self.get_advisory(errata["id"]) + advisory = ErrataAdvisory.from_advisory_json_data(data) advisories.append(advisory) return advisories @@ -141,11 +150,7 @@ class Errata(object): elif (isinstance(event, ErrataAdvisoryStateChangedEvent) or isinstance(event, FreshmakerManualRebuildEvent)): data = self.get_advisory(event.errata_id) - advisory = ErrataAdvisory( - data["id"], data["advisory_name"], data["status"], - data['content_types'], - data["security_impact"]) - return [advisory] + return [ErrataAdvisory.from_advisory_json_data(data)] else: raise ValueError("Unsupported event type") diff --git a/freshmaker/events.py b/freshmaker/events.py index 79be0ca..7871ff2 100644 --- a/freshmaker/events.py +++ b/freshmaker/events.py @@ -284,12 +284,13 @@ class ErrataAdvisoryRPMsSignedEvent(BaseEvent): Event when all RPMs in Errata advisory are signed. """ def __init__(self, msg_id, errata_name, errata_id, security_impact, - errata_state): + errata_state, product_short_name): super(ErrataAdvisoryRPMsSignedEvent, self).__init__(msg_id) self.errata_name = errata_name self.errata_id = errata_id self.security_impact = security_impact self.errata_state = errata_state + self.product_short_name = product_short_name @classmethod def from_errata_advisory(cls, msg_id, advisory): @@ -304,7 +305,8 @@ class ErrataAdvisoryRPMsSignedEvent(BaseEvent): return ErrataAdvisoryRPMsSignedEvent( msg_id, advisory.name, advisory.errata_id, - advisory.security_impact, advisory.state) + advisory.security_impact, advisory.state, + advisory.product_short_name) @property def search_key(self): diff --git a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py index ad79d58..e1f9d10 100644 --- a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py +++ b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py @@ -89,7 +89,8 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): if not event.manual and not self.allow_build( ArtifactType.IMAGE, advisory_name=event.errata_name, - advisory_security_impact=event.security_impact): + advisory_security_impact=event.security_impact, + advisory_product_short_name=event.product_short_name): msg = ("Errata advisory {0} is not allowed by internal policy " "to trigger rebuilds.".format(event.errata_id)) db_event.transition(EventState.SKIPPED, msg) diff --git a/tests/test_errata.py b/tests/test_errata.py index e043834..d133bbe 100644 --- a/tests/test_errata.py +++ b/tests/test_errata.py @@ -76,7 +76,8 @@ class MockedErrataAPI(object): "content_types": ["rpm"], "security_impact": "Important", "product": { - "id": 89 + "id": 89, + "short_name": "product", } } diff --git a/tests/test_errata_advisory_rpms_signed_handler.py b/tests/test_errata_advisory_rpms_signed_handler.py index 68e13aa..c752fb8 100644 --- a/tests/test_errata_advisory_rpms_signed_handler.py +++ b/tests/test_errata_advisory_rpms_signed_handler.py @@ -208,6 +208,26 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ 'ErrataAdvisoryRPMsSignedHandler': { + 'image': [{'product_short_name': 'foo'}] + } + }) + @patch.object(freshmaker.conf, 'dry_run', new=True) + def test_allow_build_by_product_short_name(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", "product") + handler = ErrataAdvisoryRPMsSignedHandler() + handler.handle(event) + + db_event = Event.get(db.session, message_id='123') + self.assertEqual(db_event.state, EventState.SKIPPED.value) + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryRPMsSignedHandler': { 'image': [{'advisory_name': 'RHBA-2017'}] } }) @@ -219,7 +239,7 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): self.mock_find_images_to_rebuild.return_value = iter([[[]]]) event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP") + "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -233,7 +253,7 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): def test_event_state_updated_when_no_images_to_rebuild(self): self.mock_find_images_to_rebuild.return_value = iter([[[]]]) event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP") + "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -256,7 +276,7 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): ] ]) event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP") + "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -276,7 +296,7 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): self, start_to_build_images, prepare_yum_repos_for_rebuilds, allow_build): event = ErrataAdvisoryRPMsSignedEvent( - 'msg-id-123', 'RHSA-2017', 123, '', 'REL_PREP') + 'msg-id-123', 'RHSA-2017', 123, '', 'REL_PREP', 'product') handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -297,7 +317,7 @@ class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): self, get_image_builds_in_first_batch, start_to_build_images, prepare_yum_repos_for_rebuilds, allow_build): event = ErrataAdvisoryRPMsSignedEvent( - 'msg-id-123', 'RHSA-2017', 123, '', 'SHIPPED_LIVE') + 'msg-id-123', 'RHSA-2017', 123, '', 'SHIPPED_LIVE', 'product') handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) diff --git a/tests/test_errata_advisory_state_changed.py b/tests/test_errata_advisory_state_changed.py index 8578bee..00d7904 100644 --- a/tests/test_errata_advisory_state_changed.py +++ b/tests/test_errata_advisory_state_changed.py @@ -109,7 +109,7 @@ class TestAllowBuild(unittest.TestCase): """ Tests that allow_build filters out advisories based on advisory_name. """ - event = ErrataAdvisoryRPMsSignedEvent("123", "RHBA-2017", 123, "", "REL_PREP") + event = ErrataAdvisoryRPMsSignedEvent("123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -126,7 +126,7 @@ class TestAllowBuild(unittest.TestCase): advisory_name. """ event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "", "REL_PREP") + "123", "RHSA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -155,7 +155,7 @@ class TestAllowBuild(unittest.TestCase): advisory_security_impact. """ event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "Important", "REL_PREP") + "123", "RHSA-2017", 123, "Important", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -182,7 +182,7 @@ class TestAllowBuild(unittest.TestCase): advisory_security_impact. """ event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "None", "REL_PREP") + "123", "RHSA-2017", 123, "None", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -206,7 +206,7 @@ class TestAllowBuild(unittest.TestCase): handler = ErrataAdvisoryRPMsSignedHandler() handler.event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "None", "REL_PREP") + "123", "RHSA-2017", 123, "None", "REL_PREP", "product") image = {"brew": {"build": "foo-1-2.3"}} ret = handler._filter_out_not_allowed_builds(image) @@ -243,7 +243,7 @@ class TestAllowBuild(unittest.TestCase): handler = ErrataAdvisoryRPMsSignedHandler() handler.event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "None", "REL_PREP") + "123", "RHSA-2017", 123, "None", "REL_PREP", "product") image = {"brew": {"build": "foo-1-2.3"}} ret = handler._filter_out_not_allowed_builds(image)