From 4d201ade062aee1ca8e4ee5e7e8d3538b8411382 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Apr 10 2018 07:07:14 +0000 Subject: Use latest Errata API to get advisories and pass ErrataAdvisory directly to Errata related events. --- diff --git a/freshmaker/errata.py b/freshmaker/errata.py index fa71a3f..c70d2eb 100644 --- a/freshmaker/errata.py +++ b/freshmaker/errata.py @@ -26,7 +26,7 @@ import dogpile.cache from requests_kerberos import HTTPKerberosAuth from freshmaker.events import ( - BrewSignRPMEvent, ErrataAdvisoryStateChangedEvent, + BrewSignRPMEvent, ErrataBaseEvent, FreshmakerManualRebuildEvent) from freshmaker import conf, log @@ -37,7 +37,8 @@ class ErrataAdvisory(object): """ def __init__(self, errata_id, name, state, content_types, - security_impact=None, product_short_name=None): + security_impact=None, product_short_name=None, + cve_list=None): """ Initializes the ErrataAdvisory instance. """ @@ -47,18 +48,26 @@ class ErrataAdvisory(object): self.content_types = content_types self.security_impact = security_impact or "" self.product_short_name = product_short_name or "" + self.cve_list = cve_list or [] @classmethod - def from_advisory_json_data(cls, data): + def from_advisory_id(cls, errata, errata_id): """ - Creates new ErrataAdvisory instance from response to - "advisory/%s.json" Errata tool API call. + Creates new ErrataAdvisory instance from the Erratum ID. """ + data = errata._get_advisory(errata_id) + erratum_data = data["errata"].values() + if not erratum_data: + return None + erratum_data = erratum_data[0] + + product_data = errata._get_product(erratum_data["product_id"]) + return ErrataAdvisory( - data["id"], data["advisory_name"], data["status"], - data['content_types'], - data["security_impact"], - data["product"]["short_name"]) + erratum_data["id"], erratum_data["fulladvisory"], erratum_data["status"], + erratum_data['content_types'], erratum_data["security_impact"], + product_data["product"]["short_name"], + data["content"]["content"]["cve"].split(" ")) class Errata(object): @@ -112,8 +121,11 @@ class Errata(object): r.raise_for_status() return r.json() - def get_advisory(self, errata_id): - return self._errata_http_get('advisory/{0}.json'.format(errata_id)) + def _get_advisory(self, errata_id): + return self._errata_rest_get('erratum/{0}'.format(errata_id)) + + def _get_product(self, product_id): + return self._errata_http_get("products/%s.json" % str(product_id)) @region.cache_on_arguments() def _advisories_from_nvr(self, nvr): @@ -127,8 +139,7 @@ class Errata(object): advisories = [] for errata in build["all_errata"]: - data = self.get_advisory(errata["id"]) - advisory = ErrataAdvisory.from_advisory_json_data(data) + advisory = ErrataAdvisory.from_advisory_id(self, errata["id"]) advisories.append(advisory) return advisories @@ -147,10 +158,10 @@ class Errata(object): """ if isinstance(event, BrewSignRPMEvent): return self._advisories_from_nvr(event.nvr) - elif (isinstance(event, ErrataAdvisoryStateChangedEvent) or - isinstance(event, FreshmakerManualRebuildEvent)): - data = self.get_advisory(event.errata_id) - return [ErrataAdvisory.from_advisory_json_data(data)] + elif isinstance(event, ErrataBaseEvent): + return [event.advisory] + elif isinstance(event, FreshmakerManualRebuildEvent): + return [ErrataAdvisory.from_advisory_id(self, event.errata_id)] else: raise ValueError("Unsupported event type") diff --git a/freshmaker/events.py b/freshmaker/events.py index 7871ff2..3a4b5e8 100644 --- a/freshmaker/events.py +++ b/freshmaker/events.py @@ -252,65 +252,32 @@ class KojiTaskStateChangeEvent(BaseEvent): self.task_state = task_state -class ErrataAdvisoryStateChangedEvent(BaseEvent): - """ - Represents change of Errata Advisory status. - """ - - def __init__(self, msg_id, errata_id, state, content_types): - super(ErrataAdvisoryStateChangedEvent, self).__init__(msg_id) - self.errata_id = errata_id - self.state = state - self.content_types = content_types - - @classmethod - def from_errata_advisory(cls, msg_id, advisory): +class ErrataBaseEvent(BaseEvent): + def __init__(self, msg_id, advisory): """ - Creates new ErrataAdvisoryStateChangedEvent from errata.ErrataAdvisory - instances. + Creates new ErrataBaseEvent. - :param ErrataAdvisory advisory: errata.ErrataAdvisory instance. - :rtype: ErrataAdvisoryStateChangedEvent - :return: New ErrataAdvisoryStateChangedEvent instance. + :param str msg_id: Message id. + :param ErrataAdvisory advisory: Errata advisory associated with event. """ + super(ErrataBaseEvent, self).__init__(msg_id) + self.advisory = advisory - return ErrataAdvisoryStateChangedEvent( - msg_id, advisory.errata_id, advisory.state, - advisory.content_types) + @property + def search_key(self): + return str(self.advisory.errata_id) -class ErrataAdvisoryRPMsSignedEvent(BaseEvent): +class ErrataAdvisoryStateChangedEvent(ErrataBaseEvent): """ - Event when all RPMs in Errata advisory are signed. + Represents change of Errata Advisory status. """ - def __init__(self, msg_id, errata_name, errata_id, security_impact, - 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): - """ - Creates new ErrataAdvisoryRPMsSignedEvent from errata.ErrataAdvisory - instances. - - :param ErrataAdvisory advisory: errata.ErrataAdvisory instance. - :rtype: ErrataAdvisoryRPMsSignedEvent - :return: New ErrataAdvisoryRPMsSignedEvent instance. - """ - return ErrataAdvisoryRPMsSignedEvent( - msg_id, advisory.name, advisory.errata_id, - advisory.security_impact, advisory.state, - advisory.product_short_name) - @property - def search_key(self): - return str(self.errata_id) +class ErrataAdvisoryRPMsSignedEvent(ErrataBaseEvent): + """ + Event when all RPMs in Errata advisory are signed. + """ class BrewSignRPMEvent(BaseEvent): diff --git a/freshmaker/handlers/brew/sign_rpm.py b/freshmaker/handlers/brew/sign_rpm.py index 4e7bdcf..3b958db 100644 --- a/freshmaker/handlers/brew/sign_rpm.py +++ b/freshmaker/handlers/brew/sign_rpm.py @@ -96,7 +96,7 @@ class BrewSignRPMHandler(BaseHandler): # ErrataAdvisoryRPMsSignedEvent. new_events = [] for advisory in advisories: - new_event = ErrataAdvisoryRPMsSignedEvent.from_errata_advisory( + new_event = ErrataAdvisoryRPMsSignedEvent( event.msg_id + "." + str(advisory.name), advisory) db_event = Event.create( db.session, new_event.msg_id, new_event.search_key, diff --git a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py index a8d5c93..6fe6bca 100644 --- a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py +++ b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py @@ -91,11 +91,11 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): # Check if we are allowed to build this advisory. if not event.manual and not self.allow_build( ArtifactType.IMAGE, - advisory_name=event.errata_name, - advisory_security_impact=event.security_impact, - advisory_product_short_name=event.product_short_name): + advisory_name=event.advisory.name, + advisory_security_impact=event.advisory.security_impact, + advisory_product_short_name=event.advisory.product_short_name): msg = ("Errata advisory {0} is not allowed by internal policy " - "to trigger rebuilds.".format(event.errata_id)) + "to trigger rebuilds.".format(event.advisory.errata_id)) db_event.transition(EventState.SKIPPED, msg) db.session.commit() self.log_info(msg) @@ -107,7 +107,7 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): builds = self._record_batches(batches, event) if not builds: - msg = 'No container images to rebuild for advisory %r' % event.errata_name + msg = 'No container images to rebuild for advisory %r' % event.advisory.name self.log_info(msg) db_event.transition(EventState.SKIPPED, msg) db.session.commit() @@ -121,7 +121,7 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): db.session.commit() return [] - if event.errata_state != 'SHIPPED_LIVE': + if event.advisory.state != 'SHIPPED_LIVE': # If freshmaker is configured to rebuild images only when advisory # moves to SHIPPED_LIVE state, there is no need to generate new # composes for rebuild as all signed RPMs should already be @@ -137,7 +137,7 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): # Log what we are going to rebuild self._check_images_to_rebuild(db_event, builds) - if event.errata_state == 'SHIPPED_LIVE': + if event.advisory.state == 'SHIPPED_LIVE': # As mentioned above, no need to wait for the event of new compose # is generated in ODCS, so we can start to rebuild the first batch # from here immediately. @@ -671,9 +671,9 @@ 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.errata_name, - advisory_security_impact=self.event.security_impact, - advisory_product_short_name=self.event.product_short_name, + ArtifactType.IMAGE, advisory_name=self.event.advisory.name, + advisory_security_impact=self.event.advisory.security_impact, + advisory_product_short_name=self.event.advisory.product_short_name, published=True): published = True release_category = "Generally Available" diff --git a/freshmaker/handlers/errata/errata_advisory_state_changed.py b/freshmaker/handlers/errata/errata_advisory_state_changed.py index 7881923..cd8496f 100644 --- a/freshmaker/handlers/errata/errata_advisory_state_changed.py +++ b/freshmaker/handlers/errata/errata_advisory_state_changed.py @@ -45,8 +45,8 @@ class ErrataAdvisoryStateChangedHandler(BaseHandler): if not isinstance(event, ErrataAdvisoryStateChangedEvent): return False - if 'rpm' not in event.content_types: - log.info('Skip non-RPM advisory %s.', event.errata_id) + if 'rpm' not in event.advisory.content_types: + log.info('Skip non-RPM advisory %s.', event.advisory.errata_id) return False return True @@ -98,20 +98,20 @@ class ErrataAdvisoryStateChangedHandler(BaseHandler): log.info("Generating ErrataAdvisoryRPMsSignedEvent for Errata " "advisory %d, because its state changed to %s.", errata_id, - event.state) + event.advisory.state) advisory = advisories[0] - db_event = ErrataAdvisoryRPMsSignedEvent.from_errata_advisory( + db_event = ErrataAdvisoryRPMsSignedEvent( event.msg_id + "." + str(advisory.name), advisory) return [db_event] def handle(self, event): - errata_id = event.errata_id - state = event.state + errata_id = event.advisory.errata_id + state = event.advisory.state extra_events = [] if (event.manual or - self.allow_build(ArtifactType.IMAGE, advisory_state=event.state)): + self.allow_build(ArtifactType.IMAGE, advisory_state=event.advisory.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 99483b9..24a31ab 100644 --- a/freshmaker/handlers/internal/manual_rebuild.py +++ b/freshmaker/handlers/internal/manual_rebuild.py @@ -63,7 +63,7 @@ class FreshmakerManualRebuildHandler(ContainerBuildHandler): "advisory %d - manually triggered rebuild.", manual_rebuild_event.errata_id) advisory = advisories[0] - new_event = ErrataAdvisoryStateChangedEvent.from_errata_advisory( + new_event = ErrataAdvisoryStateChangedEvent( manual_rebuild_event.msg_id + "." + str(advisory.name), advisory) new_event.manual = True msg = ("Generated ErrataAdvisoryStateChangedEvent (%s) for errata: %s" diff --git a/freshmaker/parsers/errata/state_change.py b/freshmaker/parsers/errata/state_change.py index c3cb72c..99ada45 100644 --- a/freshmaker/parsers/errata/state_change.py +++ b/freshmaker/parsers/errata/state_change.py @@ -21,7 +21,7 @@ from freshmaker.parsers import BaseParser from freshmaker.events import ErrataAdvisoryStateChangedEvent -from freshmaker.errata import Errata +from freshmaker.errata import Errata, ErrataAdvisory class ErrataAdvisoryStateChangedParser(BaseParser): @@ -38,9 +38,9 @@ class ErrataAdvisoryStateChangedParser(BaseParser): def parse(self, topic, msg): msg_id = msg.get('msg_id') inner_msg = msg.get('msg') - status = inner_msg.get('errata_status') errata_id = int(inner_msg.get('errata_id')) - advisory = Errata().get_advisory(errata_id) + errata = Errata() return ErrataAdvisoryStateChangedEvent( - msg_id, errata_id, status, advisory['content_types']) + msg_id, ErrataAdvisory.from_advisory_id(errata, errata_id) + ) diff --git a/freshmaker/views.py b/freshmaker/views.py index a3be032..60183c5 100644 --- a/freshmaker/views.py +++ b/freshmaker/views.py @@ -34,7 +34,7 @@ from freshmaker.api_utils import filter_events from freshmaker.api_utils import json_error from freshmaker.api_utils import pagination_metadata from freshmaker.auth import login_required, requires_role, require_scopes -from freshmaker.errata import Errata +from freshmaker.errata import Errata, ErrataAdvisory api_v1 = { 'event_types': { @@ -233,8 +233,9 @@ class BuildAPI(MethodView): return json_error( 400, 'Bad Request', 'Missing errata_id in request') - advisory = Errata().get_advisory(data['errata_id']) - if 'rpm' not in advisory['content_types']: + errata = Errata() + advisory = ErrataAdvisory.from_advisory_id(errata, data['errata_id']) + if 'rpm' not in advisory.content_types: return json_error( 400, 'Bad Request', diff --git a/tests/test_brew_sign_rpm_handler.py b/tests/test_brew_sign_rpm_handler.py index 9934b21..d513b11 100644 --- a/tests/test_brew_sign_rpm_handler.py +++ b/tests/test_brew_sign_rpm_handler.py @@ -51,8 +51,8 @@ class TestBrewSignHandler(helpers.ModelsTestCase): ret = handler.handle(event) self.assertTrue(len(ret), 1) - self.assertEqual(ret[0].errata_name, "RHSA-2017") - self.assertEqual(ret[0].errata_id, 123) + self.assertEqual(ret[0].advisory.name, "RHSA-2017") + self.assertEqual(ret[0].advisory.errata_id, 123) @patch('freshmaker.errata.Errata.advisories_from_event') @patch('freshmaker.errata.Errata.builds_signed') diff --git a/tests/test_errata.py b/tests/test_errata.py index 406f74c..fc60ef8 100644 --- a/tests/test_errata.py +++ b/tests/test_errata.py @@ -22,7 +22,7 @@ from mock import patch -from freshmaker.errata import Errata +from freshmaker.errata import Errata, ErrataAdvisory from freshmaker.events import ( BrewSignRPMEvent, GitRPMSpecChangeEvent, ErrataAdvisoryStateChangedEvent) from tests import helpers @@ -80,6 +80,27 @@ class MockedErrataAPI(object): } } + self.advisory_rest_json = { + "errata": { + "rhsa": { + "id": 28484, + "fulladvisory": "RHSA-2017:28484", + "status": "QE", + "content_types": ["rpm"], + "security_impact": "Important", + "product_id": 89, + } + }, + "content": { + "content": { + "cve": "CVE-2015-3253 CVE-2016-6814", + } + } + } + + self.products = {} + self.products[89] = {"product": {"short_name": "product"}} + self.product_versions_json = [ {"product_version": {"name": "PRODUCT1-3.0-NFS", "id": 1}}, {"product_version": {"name": "PRODUCT1-3.1-NFS", "id": 2}}, @@ -97,6 +118,8 @@ class MockedErrataAPI(object): if endpoint.find("build/") != -1: nvr = endpoint.split("/")[-1] return self.builds[nvr] + elif endpoint.find("erratum/") != -1: + return self.advisory_rest_json def errata_http_get(self, endpoint): if endpoint.endswith("builds.json"): @@ -109,6 +132,9 @@ class MockedErrataAPI(object): elif endpoint.find("/product_versions/") != -1: id = int(endpoint.split("/")[-1].replace(".json", "")) return self.product_versions[id] + else: + id = int(endpoint.split("/")[-1].replace(".json", "")) + return self.products[id] class TestErrata(helpers.FreshmakerTestCase): @@ -124,6 +150,13 @@ class TestErrata(helpers.FreshmakerTestCase): advisories = self.errata.advisories_from_event(event) self.assertEqual(len(advisories), 1) self.assertEqual(advisories[0].errata_id, 28484) + self.assertEqual(advisories[0].name, "RHSA-2017:28484") + self.assertEqual(advisories[0].state, "QE") + self.assertEqual(advisories[0].content_types, ["rpm"]) + self.assertEqual(advisories[0].security_impact, "Important") + self.assertEqual(advisories[0].product_short_name, "product") + self.assertEqual(advisories[0].cve_list, + ["CVE-2015-3253", "CVE-2016-6814"]) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") @@ -145,7 +178,8 @@ class TestErrata(helpers.FreshmakerTestCase): def test_advisories_from_event_errata_state_change_event( self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) - event = ErrataAdvisoryStateChangedEvent("msgid", 28484, "SHIPPED_LIVE", ['rpm']) + event = ErrataAdvisoryStateChangedEvent( + "msgid", ErrataAdvisory(28484, "name", "SHIPPED_LIVE", ['rpm'])) advisories = self.errata.advisories_from_event(event) self.assertEqual(len(advisories), 1) self.assertEqual(advisories[0].errata_id, 28484) diff --git a/tests/test_errata_advisory_rpms_signed_handler.py b/tests/test_errata_advisory_rpms_signed_handler.py index b58fa49..6b293e4 100644 --- a/tests/test_errata_advisory_rpms_signed_handler.py +++ b/tests/test_errata_advisory_rpms_signed_handler.py @@ -31,6 +31,7 @@ from freshmaker.handlers.errata import ErrataAdvisoryRPMsSignedHandler from freshmaker.lightblue import ContainerImage from freshmaker.models import Event, Compose from freshmaker.types import EventState +from freshmaker.errata import ErrataAdvisory from tests import helpers @@ -194,6 +195,17 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): [self.image_f] ] + self.rhba_event = ErrataAdvisoryRPMsSignedEvent( + "123", + ErrataAdvisory(123, "RHBA-2017", "REL_PREP", [], + security_impact="", + product_short_name="product")) + self.rhsa_event = ErrataAdvisoryRPMsSignedEvent( + "123", + ErrataAdvisory(123, "RHSA-2017", "REL_PREP", [], + security_impact="", + product_short_name="product")) + def tearDown(self): super(TestErrataAdvisoryRPMsSignedHandler, self).tearDown() self.patcher.unpatch_all() @@ -210,10 +222,8 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): db.session.commit() self.mock_find_images_to_rebuild.return_value = [[]] - event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() - handler.handle(event) + handler.handle(self.rhba_event) db_event = Event.get(db.session, message_id='123') self.assertEqual(db_event.state, EventState.SKIPPED.value) @@ -230,10 +240,8 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): db.session.commit() self.mock_find_images_to_rebuild.return_value = [[]] - event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() - handler.handle(event) + handler.handle(self.rhba_event) self.assertEqual(ErrataAdvisoryRPMsSignedHandler._FAKE_COMPOSE_ID, 5) @@ -244,10 +252,8 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): }) def test_event_state_updated_when_no_images_to_rebuild(self): self.mock_find_images_to_rebuild.return_value = [[]] - event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() - handler.handle(event) + handler.handle(self.rhba_event) db_event = Event.get(db.session, message_id='123') self.assertEqual(db_event.state, EventState.SKIPPED.value) @@ -264,10 +270,8 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): self.image_a['error'] = "foo" self.mock_find_images_to_rebuild.return_value = [ [self.image_a]] - event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP", "product") handler = ErrataAdvisoryRPMsSignedHandler() - handler.handle(event) + handler.handle(self.rhba_event) db_event = Event.get(db.session, message_id='123') self.assertEqual(db_event.state, EventState.COMPLETE.value) @@ -284,15 +288,13 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): def test_rebuild_if_errata_state_is_prior_to_SHIPPED_LIVE( self, start_to_build_images, prepare_yum_repos_for_rebuilds, allow_build): - event = ErrataAdvisoryRPMsSignedEvent( - 'msg-id-123', 'RHSA-2017', 123, '', 'REL_PREP', 'product') handler = ErrataAdvisoryRPMsSignedHandler() - handler.handle(event) + handler.handle(self.rhsa_event) prepare_yum_repos_for_rebuilds.assert_called_once() start_to_build_images.assert_not_called() - db_event = Event.get(db.session, event.msg_id) + db_event = Event.get(db.session, self.rhsa_event.msg_id) self.assertEqual(EventState.BUILDING.value, db_event.state) @patch('freshmaker.handlers.errata.ErrataAdvisoryRPMsSignedHandler.' @@ -306,7 +308,10 @@ class TestErrataAdvisoryRPMsSignedHandler(helpers.ModelsTestCase): 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', 'product') + 'msg-id-123', + ErrataAdvisory(123, "RHSA-2017", "SHIPPED_LIVE", [], + security_impact="", + product_short_name="product")) handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -541,7 +546,10 @@ class TestFindImagesToRebuild(helpers.FreshmakerTestCase): return_value=[[]]) self.event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHBA-2017", 123, "", "REL_PREP", "product") + "123", + ErrataAdvisory(123, "RHBA-2017", "REL_PREP", [], + security_impact="", + product_short_name="product")) self.handler = ErrataAdvisoryRPMsSignedHandler() self.handler.event = self.event diff --git a/tests/test_errata_advisory_state_changed.py b/tests/test_errata_advisory_state_changed.py index 5c894a9..1167078 100644 --- a/tests/test_errata_advisory_state_changed.py +++ b/tests/test_errata_advisory_state_changed.py @@ -77,7 +77,11 @@ class TestAllowBuild(helpers.ModelsTestCase): """ Tests that allow_build filters out advisories based on advisory_name. """ - event = ErrataAdvisoryRPMsSignedEvent("123", "RHBA-2017", 123, "", "REL_PREP", "product") + event = ErrataAdvisoryRPMsSignedEvent( + "123", + ErrataAdvisory(123, "RHBA-2017", "REL_PREP", [], + security_impact="", + product_short_name="product")) handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -94,7 +98,10 @@ class TestAllowBuild(helpers.ModelsTestCase): advisory_name. """ event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "", "REL_PREP", "product") + "123", + ErrataAdvisory(123, "RHSA-2017", "REL_PREP", [], + security_impact="", + product_short_name="product")) handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -123,7 +130,10 @@ class TestAllowBuild(helpers.ModelsTestCase): advisory_security_impact. """ event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "Important", "REL_PREP", "product") + "123", + ErrataAdvisory(123, "RHSA-2017", "REL_PREP", [], + security_impact="Important", + product_short_name="product")) handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -150,7 +160,10 @@ class TestAllowBuild(helpers.ModelsTestCase): advisory_security_impact. """ event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "None", "REL_PREP", "product") + "123", + ErrataAdvisory(123, "RHSA-2017", "REL_PREP", [], + security_impact="None", + product_short_name="product")) handler = ErrataAdvisoryRPMsSignedHandler() handler.handle(event) @@ -174,7 +187,10 @@ class TestAllowBuild(helpers.ModelsTestCase): handler = ErrataAdvisoryRPMsSignedHandler() handler.event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "None", "REL_PREP", "product") + "123", + ErrataAdvisory(123, "RHSA-2017", "REL_PREP", [], + security_impact="None", + product_short_name="product")) image = {"brew": {"build": "foo-1-2.3"}} ret = handler._filter_out_not_allowed_builds(image) @@ -211,7 +227,10 @@ class TestAllowBuild(helpers.ModelsTestCase): handler = ErrataAdvisoryRPMsSignedHandler() handler.event = ErrataAdvisoryRPMsSignedEvent( - "123", "RHSA-2017", 123, "None", "REL_PREP", "product") + "123", + ErrataAdvisory(123, "RHSA-2017", "REL_PREP", [], + security_impact="None", + product_short_name="product")) image = {"brew": {"build": "foo-1-2.3"}} ret = handler._filter_out_not_allowed_builds(image) @@ -587,13 +606,14 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): for state in ["REL_PREP", "PUSH_READY", "IN_PUSH", "SHIPPED_LIVE"]: advisories_from_event.return_value = [ ErrataAdvisory(123, "RHSA-2017", state, ["rpm"], "Critical")] - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, state, ['rpm']) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, "RHSA-2017", state, ['rpm'])) ret = handler.handle(ev) 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].advisory.errata_id, 123) + self.assertEqual(ret[0].advisory.security_impact, "Critical") + self.assertEqual(ret[0].advisory.name, "RHSA-2017") @patch('freshmaker.errata.Errata.advisories_from_event') @patch.object(conf, 'handler_build_whitelist', new={ @@ -612,7 +632,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): for state in ["NEW_FILES", "QE", "UNKNOWN"]: advisories_from_event.return_value = [ ErrataAdvisory(123, "RHSA-2017", state, ["rpm"], "Critical")] - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, state, ['rpm']) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, 'RHSA-2017', state, ['rpm'])) ret = handler.handle(ev) self.assertEqual(len(ret), 0) @@ -634,7 +655,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): for state in ["REL_PREP", "PUSH_READY", "IN_PUSH", "SHIPPED_LIVE"]: advisories_from_event.return_value = [ ErrataAdvisory(123, "RHSA-2017", state, ["rpm"], "Critical")] - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, state, ['rpm']) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, 'RHSA-2017', state, ['rpm'])) ret = handler.handle(ev) if db_event_state == EventState.FAILED: @@ -649,7 +671,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): handler = ErrataAdvisoryStateChangedHandler() for state in ["REL_PREP", "PUSH_READY", "IN_PUSH", "SHIPPED_LIVE"]: - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, state, ['rpm']) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, 'RHSA-2017', state, ['rpm'])) ret = handler.handle(ev) self.assertEqual(len(ret), 0) @@ -661,7 +684,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): self.assertEqual(db_event.released, False) - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, "SHIPPED_LIVE", ["rpm"]) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, "name", "SHIPPED_LIVE", ["rpm"])) handler = ErrataAdvisoryStateChangedHandler() handler.handle(ev) @@ -675,7 +699,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): db.session.commit() for state in ["NEW_FILES", "QE", "REL_PREP", "PUSH_READY", "IN_PUSH"]: - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, state, ['rpm']) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, "name", state, ['rpm'])) handler = ErrataAdvisoryStateChangedHandler() handler.handle(ev) @@ -685,7 +710,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): @patch('freshmaker.errata.Errata.advisories_from_event') def test_mark_as_released_unknown_event(self, advisories_from_event): - ev = ErrataAdvisoryStateChangedEvent("msg123", 123, "SHIPPED_LIVE", ["rpm"]) + ev = ErrataAdvisoryStateChangedEvent( + "msg123", ErrataAdvisory(123, "name", "SHIPPED_LIVE", ["rpm"])) handler = ErrataAdvisoryStateChangedHandler() handler.handle(ev) @@ -710,7 +736,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): db.session.commit() event = ErrataAdvisoryStateChangedEvent( - 'msg-id-123', 123456, 'SHIPPED_LIVE', ['rpm']) + 'msg-id-123', + ErrataAdvisory(123456, 'name', 'SHIPPED_LIVE', ['rpm'])) handler = ErrataAdvisoryStateChangedHandler() msgs = handler.handle(event) @@ -736,7 +763,8 @@ class TestErrataAdvisoryStateChangedHandler(helpers.ModelsTestCase): db.session.commit() event = ErrataAdvisoryStateChangedEvent( - 'msg-id-123', 123456, 'SHIPPED_LIVE', ['rpm']) + 'msg-id-123', + ErrataAdvisory(123456, "name", 'SHIPPED_LIVE', ['rpm'])) event.manual = True handler = ErrataAdvisoryStateChangedHandler() msgs = handler.handle(event) @@ -1238,12 +1266,13 @@ class TestSkipNonRPMAdvisory(helpers.FreshmakerTestCase): def test_ensure_to_handle_rpm_adivsory(self): event = ErrataAdvisoryStateChangedEvent( - 'msg-id-1', 123, 'REL_PREP', ['rpm', 'jar', 'pom']) + 'msg-id-1', + ErrataAdvisory(123, 'name', 'REL_PREP', ['rpm', 'jar', 'pom'])) handler = ErrataAdvisoryStateChangedHandler() self.assertTrue(handler.can_handle(event)) def test_not_handle_non_rpm_advisory(self): event = ErrataAdvisoryStateChangedEvent( - 'msg-id-1', 123, 'REL_PREP', ['docker']) + 'msg-id-1', ErrataAdvisory(123, 'name', 'REL_PREP', ['docker'])) handler = ErrataAdvisoryStateChangedHandler() self.assertFalse(handler.can_handle(event)) diff --git a/tests/test_freshmaker_manual_rebuild_handler.py b/tests/test_freshmaker_manual_rebuild_handler.py index ff8bcfc..a62490c 100644 --- a/tests/test_freshmaker_manual_rebuild_handler.py +++ b/tests/test_freshmaker_manual_rebuild_handler.py @@ -44,8 +44,8 @@ class TestFreshmakerManualRebuildHandler(helpers.ModelsTestCase): ret = handler.handle(ev) self.assertEqual(len(ret), 1) - self.assertEqual(ret[0].errata_id, 123) - self.assertEqual(ret[0].state, "REL_PREP") + self.assertEqual(ret[0].advisory.errata_id, 123) + self.assertEqual(ret[0].advisory.state, "REL_PREP") self.assertEqual(ret[0].manual, True) db_event = Event.query.filter_by(message_id=ev.msg_id).first() diff --git a/tests/test_views.py b/tests/test_views.py index f08e170..2afa1c8 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -29,6 +29,7 @@ from mock import patch from freshmaker import app, db, events, models, login_manager from freshmaker.types import ArtifactType, ArtifactBuildState, EventState +from freshmaker.errata import ErrataAdvisory import freshmaker.auth from tests import helpers @@ -455,10 +456,10 @@ class TestManualTriggerRebuild(helpers.ModelsTestCase): self.client = app.test_client() @patch('freshmaker.messaging.publish') - @patch('freshmaker.views.Errata') - def test_manual_rebuild(self, Errata, publish): - errata = Errata.return_value - errata.get_advisory.return_value = {'content_types': ['rpm']} + @patch('freshmaker.views.ErrataAdvisory.from_advisory_id') + def test_manual_rebuild(self, from_advisory_id, publish): + from_advisory_id.return_value = ErrataAdvisory( + 123, 'name', 'REL_PREP', ['rpm']) resp = self.client.post('/api/1/builds/', data=json.dumps({'errata_id': 1}), @@ -468,10 +469,10 @@ class TestManualTriggerRebuild(helpers.ModelsTestCase): self.assertEqual(data["errata_id"], 1) publish.assert_called_once_with('manual.rebuild', {u'errata_id': 1}) - @patch('freshmaker.views.Errata') - def test_not_rebuild_nonrpm_advisory(self, Errata): - errata = Errata.return_value - errata.get_advisory.return_value = {'content_types': ['docker']} + @patch('freshmaker.views.ErrataAdvisory.from_advisory_id') + def test_not_rebuild_nonrpm_advisory(self, from_advisory_id): + from_advisory_id.return_value = ErrataAdvisory( + 123, 'name', 'REL_PREP', ['docker']) resp = self.client.post('/api/1/builds/', data=json.dumps({'errata_id': 1}),