From e4b111b86a9ee628702e8ec05a395be746e3b6af Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Jan 23 2018 13:07:47 +0000 Subject: Allow configuring "'published': False" in the whitelist to rebuild unpublished images --- diff --git a/freshmaker/handlers/__init__.py b/freshmaker/handlers/__init__.py index a58842b..07d7181 100644 --- a/freshmaker/handlers/__init__.py +++ b/freshmaker/handlers/__init__.py @@ -271,13 +271,13 @@ class BaseHandler(object): def match_rule(criteria, rule): for name, value in criteria.items(): value_patterns = rule.get(name, None) - if not value_patterns: + if value_patterns is None: continue if not isinstance(value_patterns, (tuple, list)): - value_patterns = [value_patterns] + value_patterns = [str(value_patterns)] - if not any((re.match(regex, value) for regex in value_patterns)): + if not any((re.match(regex, str(value)) for regex in value_patterns)): return False return True diff --git a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py index e1f9d10..09e0e16 100644 --- a/freshmaker/handlers/errata/errata_advisory_rpms_signed.py +++ b/freshmaker/handlers/errata/errata_advisory_rpms_signed.py @@ -627,6 +627,19 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): cert=conf.lightblue_certificate, private_key=conf.lightblue_private_key) + # 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, + published=True): + published = True + release_category = "Generally Available" + else: + published = None + release_category = None + # For each RPM package in Errata advisory, find Docker images # containing this package and record those images into database. nvrs = errata.get_builds(errata_id) @@ -637,7 +650,8 @@ class ErrataAdvisoryRPMsSignedHandler(ContainerBuildHandler): srpm_name = self._find_build_srpm_name(nvr) batches = lb.find_images_to_rebuild( srpm_name, content_sets, - filter_fnc=self._filter_out_not_allowed_builds) + filter_fnc=self._filter_out_not_allowed_builds, + published=published, release_category=release_category) yield batches def _find_build_srpm_name(self, build_nvr): diff --git a/tests/test_errata_advisory_rpms_signed_handler.py b/tests/test_errata_advisory_rpms_signed_handler.py index c752fb8..1789d58 100644 --- a/tests/test_errata_advisory_rpms_signed_handler.py +++ b/tests/test_errata_advisory_rpms_signed_handler.py @@ -530,3 +530,94 @@ class TestRequestBootISOCompose(unittest.TestCase): result = self.handler._request_boot_iso_compose(self.image) self.assertIsNone(result) + + +class TestErrataAdvisoryRPMsSignedHandler(unittest.TestCase): + + def setUp(self): + self.get_content_set_by_repo_ids_patcher = patch( + 'freshmaker.pulp.Pulp.get_content_set_by_repo_ids') + self.get_content_set_by_repo_ids = self.get_content_set_by_repo_ids_patcher.start() + self.get_content_set_by_repo_ids.return_value = ["content-set-1"] + + self.get_pulp_repository_ids_patcher = patch( + 'freshmaker.errata.Errata.get_pulp_repository_ids') + self.get_pulp_repository_ids = self.get_pulp_repository_ids_patcher.start() + self.get_pulp_repository_ids.return_value = ["pulp_repo_x86_64"] + + self.get_builds_patcher = patch( + 'freshmaker.errata.Errata.get_builds') + self.get_builds = self.get_builds_patcher.start() + self.get_builds.return_value = ["httpd-2.4-11.el7"] + + self.find_build_srpm_name_patcher = patch( + 'freshmaker.handlers.errata.ErrataAdvisoryRPMsSignedHandler.' + '_find_build_srpm_name') + self.find_build_srpm_name = self.find_build_srpm_name_patcher.start() + self.find_build_srpm_name.return_value = "httpd" + + self.find_images_to_rebuild_patcher = patch( + 'freshmaker.lightblue.LightBlue.find_images_to_rebuild') + self.find_images_to_rebuild = self.find_images_to_rebuild_patcher.start() + self.find_images_to_rebuild.return_value = iter([[[]]]) + + self.event = ErrataAdvisoryRPMsSignedEvent( + "123", "RHBA-2017", 123, "", "REL_PREP", "product") + self.handler = ErrataAdvisoryRPMsSignedHandler() + self.handler.event = self.event + + def tearDown(self): + self.get_content_set_by_repo_ids_patcher.stop() + self.get_pulp_repository_ids_patcher.stop() + self.get_builds_patcher.stop() + self.find_build_srpm_name_patcher.stop() + self.find_images_to_rebuild_patcher.stop() + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryRPMsSignedHandler': { + 'image': [{'advisory_name': 'RHBA-*'}] + } + }) + @patch('os.path.exists', return_value=True) + def test_published_unset(self, exists): + for x in self.handler._find_images_to_rebuild(123456): + pass + + self.find_images_to_rebuild.assert_called_once_with( + 'httpd', ['content-set-1'], + filter_fnc=self.handler._filter_out_not_allowed_builds, + published=True, release_category='Generally Available') + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryRPMsSignedHandler': { + 'image': [{'advisory_name': 'RHBA-*', 'published': True, + 'advisory_product_short_name': 'foo'}, + {'advisory_name': 'RHBA-*', 'published': False, + 'advisory_product_short_name': 'product'}] + } + }) + @patch('os.path.exists', return_value=True) + def test_published_false(self, exists): + for x in self.handler._find_images_to_rebuild(123456): + pass + + self.find_images_to_rebuild.assert_called_once_with( + 'httpd', ['content-set-1'], + filter_fnc=self.handler._filter_out_not_allowed_builds, + published=None, release_category=None) + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'ErrataAdvisoryRPMsSignedHandler': { + 'image': [{'advisory_name': 'RHBA-*', + 'published': True}] + } + }) + @patch('os.path.exists', return_value=True) + def test_published_true(self, exists): + for x in self.handler._find_images_to_rebuild(123456): + pass + + self.find_images_to_rebuild.assert_called_once_with( + 'httpd', ['content-set-1'], + filter_fnc=self.handler._filter_out_not_allowed_builds, + published=True, release_category='Generally Available') diff --git a/tests/test_handler.py b/tests/test_handler.py index 30bc5f7..cc6d271 100644 --- a/tests/test_handler.py +++ b/tests/test_handler.py @@ -281,6 +281,37 @@ class TestAllowBuildBasedOnWhitelist(TestCase): ] } }) + def test_rule_not_defined(self): + handler = MyHandler() + allowed = handler.allow_build( + ArtifactType.IMAGE, advisory_state='SHIPPED_LIVE') + self.assertTrue(allowed) + + allowed = handler.allow_build( + ArtifactType.IMAGE, advisory_state='SHIPPED_LIVE', published=True) + self.assertTrue(allowed) + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'MyHandler': { + 'image': [ + {'advisory_state': ['REL_PREP', 'SHIPPED_LIVE'], + 'published': False} + ] + } + }) + def test_boolean_rule(self): + handler = MyHandler() + allowed = handler.allow_build( + ArtifactType.IMAGE, advisory_state='SHIPPED_LIVE', published=True) + self.assertFalse(allowed) + + @patch.object(freshmaker.conf, 'handler_build_whitelist', new={ + 'MyHandler': { + 'image': [ + {'advisory_state': ['REL_PREP', 'SHIPPED_LIVE']} + ] + } + }) def test_not_allow_if_none_passed_rule_is_configured(self): handler = MyHandler() allowed = handler.allow_build(ArtifactType.IMAGE, state='SHIPPED_LIVE')