From 6d2e4bbffa6277a3f1d3ed9f22d0187a029bc5bd Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Aug 09 2018 13:16:13 +0000 Subject: Fix filters generation --- diff --git a/module_build_service/builder/KojiModuleBuilder.py b/module_build_service/builder/KojiModuleBuilder.py index 549ed9a..ac26097 100644 --- a/module_build_service/builder/KojiModuleBuilder.py +++ b/module_build_service/builder/KojiModuleBuilder.py @@ -1071,6 +1071,17 @@ chmod 644 %buildroot/etc/rpm/macros.zz-modules return weights + @classmethod + def get_built_rpms_in_module_build(cls, build): + """ + :param ModuleBuild build: Module build to get the built RPMs from. + :return: list of NVRs + """ + koji_session = KojiModuleBuilder.get_session(conf, None) + rpms = koji_session.listTaggedRPMS(build.koji_tag, latest=True)[0] + nvrs = set(kobo.rpmlib.make_nvr(rpm, force_epoch=True) for rpm in rpms) + return list(nvrs) + def finalize(self): # Only import to koji CG if the module is "done". if self.config.koji_enable_content_generator and self.module.state == 3: diff --git a/module_build_service/builder/base.py b/module_build_service/builder/base.py index c80e469..ecf3600 100644 --- a/module_build_service/builder/base.py +++ b/module_build_service/builder/base.py @@ -337,6 +337,14 @@ class GenericBuilder(six.with_metaclass(ABCMeta)): raise NotImplementedError() @classmethod + def get_built_rpms_in_module_build(cls, build): + """ + :param ModuleBuild build: Module build to get the built RPMs from. + :return: list of NVRs + """ + raise NotImplementedError() + + @classmethod def recover_orphaned_artifact(cls, component_build): """ Searches for a complete build of an artifact belonging to the module and sets the diff --git a/module_build_service/resolver/DBResolver.py b/module_build_service/resolver/DBResolver.py index 89be834..6cf2581 100644 --- a/module_build_service/resolver/DBResolver.py +++ b/module_build_service/resolver/DBResolver.py @@ -20,6 +20,9 @@ # SOFTWARE. # # Written by Matt Prahl +# Jan Kaluza + +import kobo.rpmlib from module_build_service import log from module_build_service.resolver.base import GenericResolver @@ -177,6 +180,7 @@ class DBResolver(GenericResolver): :param requires: a dictionary with the module name as the key and the stream as the value :return: a dictionary """ + from module_build_service.builder import GenericBuilder new_requires = {} with models.make_session(self.config) as session: for nsvc in requires: @@ -236,9 +240,12 @@ class DBResolver(GenericResolver): # Find out the particular NVR of filtered packages rpm_filter = mmd.get_rpm_filter() if rpm_filter and rpm_filter.get(): - for rpm in build.component_builds: - if rpm.package in rpm_filter.get(): - filtered_rpms.append(rpm.nvr) + rpm_filter = rpm_filter.get() + built_nvrs = GenericBuilder.get_built_rpms_in_module_build(build) + for nvr in built_nvrs: + parsed_nvr = kobo.rpmlib.parse_nvr(nvr) + if parsed_nvr["name"] in rpm_filter: + filtered_rpms.append(nvr) new_requires[module_name] = { 'ref': commit_hash, diff --git a/tests/test_builder/test_koji.py b/tests/test_builder/test_koji.py index da47c9e..0ce9e4f 100644 --- a/tests/test_builder/test_koji.py +++ b/tests/test_builder/test_koji.py @@ -510,3 +510,23 @@ class TestKojiBuilder: else: expected_calls = [] assert session.packageListBlock.mock_calls == expected_calls + + @patch('module_build_service.builder.KojiModuleBuilder.KojiModuleBuilder.get_session') + def test_get_built_rpms_in_module_build(self, get_session): + session = MagicMock() + session.listTaggedRPMS.return_value = ([ + {'build_id': 735939, 'name': 'tar', 'extra': None, 'arch': 'ppc64le', + 'buildtime': 1533299221, 'id': 6021394, 'epoch': 2, 'version': '1.30', + 'metadata_only': False, 'release': '4.el8+1308+551bfa71', + 'buildroot_id': 4321122, 'payloadhash': '0621ab2091256d21c47dcac868e7fc2a', + 'size': 878684}, + {'build_id': 735939, 'name': 'bar', 'extra': None, 'arch': 'ppc64le', + 'buildtime': 1533299221, 'id': 6021394, 'epoch': 2, 'version': '1.30', + 'metadata_only': False, 'release': '4.el8+1308+551bfa71', + 'buildroot_id': 4321122, 'payloadhash': '0621ab2091256d21c47dcac868e7fc2a', + 'size': 878684}], []) + get_session.return_value = session + + ret = KojiModuleBuilder.get_built_rpms_in_module_build(self.module) + assert set(ret) == set( + ['bar-2:1.30-4.el8+1308+551bfa71', 'tar-2:1.30-4.el8+1308+551bfa71']) diff --git a/tests/test_resolver/test_db.py b/tests/test_resolver/test_db.py index 97a38b7..05ca9d4 100644 --- a/tests/test_resolver/test_db.py +++ b/tests/test_resolver/test_db.py @@ -120,6 +120,37 @@ class TestDBModule: ] assert set(result) == set(expected) + @patch("module_build_service.builder.base.GenericBuilder.get_built_rpms_in_module_build") + def test_resolve_requires(self, built_rpms): + build = models.ModuleBuild.query.get(2) + mmd = build.mmd() + filter_list = Modulemd.SimpleSet() + filter_list.add("foo") + filter_list.add("bar") + mmd.set_rpm_filter(filter_list) + build.modulemd = mmd.dumps() + db.session.commit() + + built_rpms.return_value = [ + "foo-0:2.4.48-3.el8+1308+551bfa71", + "foo-debuginfo-0:2.4.48-3.el8+1308+551bfa71", + "bar-0:2.5.48-3.el8+1308+551bfa71", + "bar-debuginfo-0:2.5.48-3.el8+1308+551bfa71", + "x-0:2.5.48-3.el8+1308+551bfa71", + "x-debuginfo-0:2.5.48-3.el8+1308+551bfa71"] + + resolver = mbs_resolver.GenericResolver.create(tests.conf, backend='db') + result = resolver.resolve_requires([":".join([ + build.name, build.stream, build.version, build.context])]) + + assert result == { + 'testmodule': { + 'stream': 'master', 'version': '20170109091357', 'context': u'78e4a6fd', + 'ref': 'ff1ea79fc952143efeed1851aa0aa006559239ba', + 'filtered_rpms': [ + 'foo-0:2.4.48-3.el8+1308+551bfa71', + 'bar-0:2.5.48-3.el8+1308+551bfa71']}} + def test_resolve_profiles(self): """ Tests that the profiles get resolved recursively