def prepare_yum_repo(self, db_event): """ Request a compose from ODCS for builds included in Errata advisory Run a compose in ODCS to contain required RPMs for rebuilding images later. :param Event db_event: current event being handled that contains errata advisory to get builds containing updated RPMs. :return: a mapping returned from ODCS that represents the request compose. :rtype: dict """ errata_id = int(db_event.search_key) packages = [] errata = Errata() builds = errata.get_srpm_nvrs(errata_id) compose_source = None for nvr in builds: packages += self._get_packages_for_compose(nvr) source = self._get_compose_source(nvr) if compose_source and compose_source != source: # TODO: Handle this by generating two ODCS composes db_event.builds_transition( ArtifactBuildState.FAILED.value, "Packages for errata " "advisory %d found in multiple different tags." % (errata_id)) return else: compose_source = source if compose_source is None: db_event.builds_transition( ArtifactBuildState.FAILED.value, 'None of builds %s of ' 'advisory %d is the latest build in its candidate tag.' % (builds, errata_id)) return self.handler.log_info( 'Generating new compose for rebuild: ' 'source: %s, source type: %s, packages: %s', compose_source, 'tag', packages) if not self.handler.dry_run: new_compose = create_odcs_client().new_compose( compose_source, 'tag', packages=packages, sigkeys=conf.odcs_sigkeys, flags=["no_deps"]) else: new_compose = self._fake_odcs_new_compose(compose_source, 'tag', packages=packages) return new_compose
class TestErrata(helpers.FreshmakerTestCase): def setUp(self): super(TestErrata, self).setUp() self.errata = Errata("https://localhost/") def tearDown(self): super(TestErrata, self).tearDown() @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_advisories_from_event(self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) event = BrewSignRPMEvent("msgid", "libntirpc-1.4.3-4.el7rhgs") 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"]) self.assertEqual(advisories[0].has_hightouch_bug, True) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_advisories_from_event_empty_cve(self, errata_http_get, errata_rest_get): mocked_errata = MockedErrataAPI(errata_rest_get, errata_http_get) mocked_errata.advisory_rest_json["content"]["content"]["cve"] = "" event = BrewSignRPMEvent("msgid", "libntirpc-1.4.3-4.el7rhgs") advisories = self.errata.advisories_from_event(event) self.assertEqual(len(advisories), 1) self.assertEqual(advisories[0].cve_list, []) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_advisories_from_event_no_bugs(self, errata_http_get, errata_rest_get): mocked_errata = MockedErrataAPI(errata_rest_get, errata_http_get) mocked_errata.bugs = [] event = BrewSignRPMEvent("msgid", "libntirpc-1.4.3-4.el7rhgs") advisories = self.errata.advisories_from_event(event) self.assertEqual(len(advisories), 1) self.assertEqual(advisories[0].has_hightouch_bug, False) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_advisories_from_event_empty_bug_flags(self, errata_http_get, errata_rest_get): mocked_errata = MockedErrataAPI(errata_rest_get, errata_http_get) for bug in mocked_errata.bugs: bug["flags"] = "" event = BrewSignRPMEvent("msgid", "libntirpc-1.4.3-4.el7rhgs") advisories = self.errata.advisories_from_event(event) self.assertEqual(len(advisories), 1) self.assertEqual(advisories[0].has_hightouch_bug, False) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_advisories_from_event_missing_all_errata(self, errata_http_get, errata_rest_get): mocked_errata = MockedErrataAPI(errata_rest_get, errata_http_get) del mocked_errata.builds["libntirpc-1.4.3-4.el7rhgs"]["all_errata"] event = BrewSignRPMEvent("msgid", "libntirpc-1.4.3-4.el7rhgs") advisories = self.errata.advisories_from_event(event) self.assertEqual(len(advisories), 0) def test_advisories_from_event_unsupported_event(self): event = GitRPMSpecChangeEvent("msgid", "libntirpc", "master", "foo") with self.assertRaises(ValueError): self.errata.advisories_from_event(event) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") 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", 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) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_builds_signed_all_signed(self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) self.assertTrue(self.errata.builds_signed(28484)) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_builds_signed_some_unsigned(self, errata_http_get, errata_rest_get): mocked_errata = MockedErrataAPI(errata_rest_get, errata_http_get) mocked_errata.builds["libntirpc-1.4.3-4.el7rhgs"][ "rpms_signed"] = False self.assertFalse(self.errata.builds_signed(28484)) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_builds_signed_missing_data(self, errata_http_get, errata_rest_get): mocked_errata = MockedErrataAPI(errata_rest_get, errata_http_get) mocked_errata.builds["libntirpc-1.4.3-4.el7rhgs"] = {} self.assertFalse(self.errata.builds_signed(28484)) @patch('freshmaker.errata.requests.get') def test_get_errata_repo_ids(self, get): get.return_value.json.return_value = { 'rhel-6-server-eus-source-rpms__6_DOT_7__x86_64': [], 'rhel-6-server-eus-optional-debug-rpms__6_DOT_7__i386': [ '/path/to/package.rpm', '/path/to/package1.rpm', '/path/to/package2.rpm', ], 'rhel-6-server-eus-rpms__6_DOT_7__x86_64': [], } repo_ids = self.errata.get_pulp_repository_ids(25718) self.assertEqual( set([ 'rhel-6-server-eus-source-rpms__6_DOT_7__x86_64', 'rhel-6-server-eus-optional-debug-rpms__6_DOT_7__i386', 'rhel-6-server-eus-rpms__6_DOT_7__x86_64' ]), set(repo_ids)) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_rhel_release_from_product_version(self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) ret = self.errata._rhel_release_from_product_version( 28484, "PRODUCT1-3.2-NFS") self.assertEqual(ret, "RHEL-6-foobar") @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_rhel_release_from_product_version_unknown_product_ver( self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) with self.assertRaises(ValueError): self.errata._rhel_release_from_product_version( 28484, "PRODUCT1-2.9-NFS") @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_get_nvrs(self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) srpms = self.errata.get_srpm_nvrs(28484, "") binary_rpms = self.errata.get_binary_rpm_nvrs(28484) self.assertEqual( set(srpms), set(['libntirpc-1.4.3-4.el7rhgs', 'libntirpc-1.4.3-4.el6rhs'])) self.assertEqual( set(binary_rpms), set([ 'libntirpc-devel-1.4.3-4.el6rhs', 'libntirpc-devel-1.4.3-4.el7rhgs' ])) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_get_binary_rpms_rhel_7(self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) ret = self.errata.get_binary_rpm_nvrs(28484, "RHEL-7") self.assertEqual(ret, ['libntirpc-devel-1.4.3-4.el7rhgs']) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_get_srpm_nvrs_empty(self, errata_http_get, errata_rest_get): api = MockedErrataAPI(errata_rest_get, errata_http_get) api.builds_json = { "PRODUCT1": [{ "libntirpc-1.4.3-4.el7rhgs": { "PRODUCT2-3.2-NFS": { "x86_64": ["libntirpc-devel-1.4.3-4.el7rhgs.x86_64.rpm"] } } }] } ret = self.errata.get_srpm_nvrs(28484, "") self.assertEqual(ret, []) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_get_binary_nvrs_empty(self, errata_http_get, errata_rest_get): api = MockedErrataAPI(errata_rest_get, errata_http_get) api.builds_json = { "PRODUCT1": [{ "libntirpc-1.4.3-4.el7rhgs": { "PRODUCT2-3.2-NFS": { "SRPMS": ["libntirpc-devel-1.4.3-4.el7rhgs.x86_64.rpm"] } } }] } ret = self.errata.get_binary_rpm_nvrs(28484, "") self.assertEqual(ret, []) @patch.object(Errata, "_errata_rest_get") @patch.object(Errata, "_errata_http_get") def test_errata_get_cve_affected_rpm_nvrs(self, errata_http_get, errata_rest_get): MockedErrataAPI(errata_rest_get, errata_http_get) ret = self.errata.get_cve_affected_rpm_nvrs(28484) self.assertEqual(ret, ['libntirpc-1.4.3-4.el6rhs']) def test_get_docker_repo_tags(self): with patch.object(self.errata, "xmlrpc") as xmlrpc: xmlrpc.get_advisory_cdn_docker_file_list.return_value = { 'foo-container-1-1': { 'docker': { 'target': { 'repos': { 'foo-526': { 'tags': ['5.26', 'latest'] } } } } } } repo_tags = self.errata.get_docker_repo_tags(28484) expected = {'foo-container-1-1': {'foo-526': ['5.26', 'latest']}} self.assertEqual(repo_tags, expected) def test_get_docker_repo_tags_xmlrpc_exception(self): with patch.object(self.errata, "xmlrpc") as xmlrpc: xmlrpc.get_advisory_cdn_docker_file_list.side_effect = ValueError( "Expected XMLRPC test exception") repo_tags = self.errata.get_docker_repo_tags(28484) self.assertEqual(repo_tags, None) def test_get_docker_repo_tags_xmlrpc_non_returned(self): with patch.object(self.errata, "xmlrpc") as xmlrpc: xmlrpc.get_advisory_cdn_docker_file_list.return_value = None repo_tags = self.errata.get_docker_repo_tags(28484) self.assertEqual(repo_tags, None)
#!/usr/bin/python3 from __future__ import print_function import os import sys from pprint import pprint # Allow imports from parent directory. sys.path.insert(1, os.path.join(sys.path[0], '..')) # Set the FRESHMAKER_DEVELOPER_ENV variable. os.environ["FRESHMAKER_DEVELOPER_ENV"] = "1" from freshmaker.errata import Errata from freshmaker import conf if len(sys.argv) != 2: print("Template for testing freshmaker.Errata class") print("Usage: ./errata.py ERRATA_TOOL_SERVER_URL") sys.exit(1) conf.errata_tool_server_url = sys.argv[1] errata = Errata() # Example usage: data = errata.get_srpm_nvrs(42515) pprint(data)