hybrid: Remove modules not listed by fus

It's possible we ask to include module X, but it's in lookaside and as
such it should not be in the output. Therefore we need to remove it from
the variant.

Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
This commit is contained in:
Lubomír Sedlář 2018-10-03 12:19:33 +02:00
parent 1a161982c0
commit 3fea217b9c
4 changed files with 55 additions and 15 deletions

View File

@ -171,7 +171,8 @@ class GatherMethodHybrid(pungi.phases.gather.method.GatherMethodBase):
expand_groups(self.compose, arch, variant, groups, set_pkg_arch=False) expand_groups(self.compose, arch, variant, groups, set_pkg_arch=False)
) )
nvrs = self.run_solver(variant, arch, packages, platform) nvrs, out_modules = self.run_solver(variant, arch, packages, platform)
filter_modules(variant, arch, out_modules)
return expand_packages( return expand_packages(
self._get_pkg_map(arch), self._get_pkg_map(arch),
variant.arch_mmds.get(arch, {}), variant.arch_mmds.get(arch, {}),
@ -214,7 +215,7 @@ class GatherMethodHybrid(pungi.phases.gather.method.GatherMethodBase):
env = os.environ.copy() env = os.environ.copy()
env["G_MESSAGES_PREFIXED"] = "" env["G_MESSAGES_PREFIXED"] = ""
run(cmd, logfile=logfile, show_cmd=True, env=env) run(cmd, logfile=logfile, show_cmd=True, env=env)
output = fus.parse_output(logfile) output, out_modules = fus.parse_output(logfile)
new_multilib = self.add_multilib(variant, arch, output) new_multilib = self.add_multilib(variant, arch, output)
if new_multilib: if new_multilib:
input_packages.extend( input_packages.extend(
@ -230,7 +231,7 @@ class GatherMethodHybrid(pungi.phases.gather.method.GatherMethodBase):
# Nothing new was added, we can stop now. # Nothing new was added, we can stop now.
break break
return output return output, out_modules
def add_multilib(self, variant, arch, nvrs): def add_multilib(self, variant, arch, nvrs):
added = set() added = set()
@ -452,3 +453,13 @@ def expand_packages(nevra_to_pkg, variant_modules, lookasides, nvrs):
debuginfo.add(pkg.file_path) debuginfo.add(pkg.file_path)
return _mk_pkg_map(_make_result(rpms), _make_result(srpms), _make_result(debuginfo)) return _mk_pkg_map(_make_result(rpms), _make_result(srpms), _make_result(debuginfo))
def filter_modules(variant, arch, nsvcs_to_keep):
"""Remove any arch-specific module metadata from the module if it's not
listed in the list to keep. This will ultimately cause the module to not be
included in the final repodata and module metadata.
"""
for nsvc in list(variant.arch_mmds.get(arch, {}).keys()):
if nsvc not in nsvcs_to_keep:
del variant.arch_mmds[arch][nsvc]

View File

@ -70,6 +70,7 @@ def parse_output(output):
(NVR, arch, flags) and a set of module NSVCs. (NVR, arch, flags) and a set of module NSVCs.
""" """
packages = set() packages = set()
modules = set()
with open(output) as f: with open(output) as f:
for line in f: for line in f:
if " " in line or "@" not in line: if " " in line or "@" not in line:
@ -82,4 +83,7 @@ def parse_output(output):
flags.add("modular") flags.add("modular")
name = name[1:] name = name[1:]
packages.add((name, arch, frozenset(flags))) packages.add((name, arch, frozenset(flags)))
return packages else:
name, arch = nevra.rsplit(".", 1)
modules.add(name.split(":", 1)[1])
return packages, modules

View File

@ -78,21 +78,30 @@ class TestParseOutput(unittest.TestCase):
def test_skips_debug_line(self): def test_skips_debug_line(self):
touch(self.file, "debug line\n") touch(self.file, "debug line\n")
packages = fus.parse_output(self.file) packages, modules = fus.parse_output(self.file)
self.assertItemsEqual(packages, []) self.assertItemsEqual(packages, [])
self.assertItemsEqual(modules, [])
def test_separates_arch(self): def test_separates_arch(self):
touch(self.file, "pkg-1.0-1.x86_64@repo-0\npkg-1.0-1.i686@repo-0\n") touch(self.file, "pkg-1.0-1.x86_64@repo-0\npkg-1.0-1.i686@repo-0\n")
packages = fus.parse_output(self.file) packages, modules = fus.parse_output(self.file)
self.assertItemsEqual( self.assertItemsEqual(
packages, packages,
[("pkg-1.0-1", "x86_64", frozenset()), ("pkg-1.0-1", "i686", frozenset())], [("pkg-1.0-1", "x86_64", frozenset()), ("pkg-1.0-1", "i686", frozenset())],
) )
self.assertItemsEqual(modules, [])
def test_marks_modular(self): def test_marks_modular(self):
touch(self.file, "*pkg-1.0-1.x86_64@repo-0\n") touch(self.file, "*pkg-1.0-1.x86_64@repo-0\n")
packages = fus.parse_output(self.file) packages, modules = fus.parse_output(self.file)
self.assertItemsEqual( self.assertItemsEqual(
packages, packages,
[("pkg-1.0-1", "x86_64", frozenset(["modular"]))], [("pkg-1.0-1", "x86_64", frozenset(["modular"]))],
) )
self.assertItemsEqual(modules, [])
def test_extracts_modules(self):
touch(self.file, "module:mod:master:20181003:cafebeef.x86_64@repo-0\n")
packages, modules = fus.parse_output(self.file)
self.assertItemsEqual(packages, [])
self.assertItemsEqual(modules, ["mod:master:20181003:cafebeef"])

View File

@ -32,7 +32,7 @@ class TestMethodHybrid(helpers.PungiTestCase):
def test_call_method(self, cmr, ep, eg, glr, CW): def test_call_method(self, cmr, ep, eg, glr, CW):
compose = helpers.DummyCompose(self.topdir, {}) compose = helpers.DummyCompose(self.topdir, {})
m = hybrid.GatherMethodHybrid(compose) m = hybrid.GatherMethodHybrid(compose)
m.run_solver = mock.Mock() m.run_solver = mock.Mock(return_value=(mock.Mock(), mock.Mock()))
pkg = MockPkg( pkg = MockPkg(
name="pkg", name="pkg",
version="1", version="1",
@ -63,7 +63,7 @@ class TestMethodHybrid(helpers.PungiTestCase):
{"pkg-3:1-2.x86_64": pkg}, {"pkg-3:1-2.x86_64": pkg},
{}, {},
glr.return_value, glr.return_value,
m.run_solver.return_value, m.run_solver.return_value[0],
) )
], ],
) )
@ -435,7 +435,7 @@ class TestRunSolver(HelperMixin, helpers.PungiTestCase):
def test_with_langpacks(self, run, gc, po): def test_with_langpacks(self, run, gc, po):
self.phase.langpacks = {"pkg": set(["pkg-en"])} self.phase.langpacks = {"pkg": set(["pkg-en"])}
final = [("pkg-1.0-1", "x86_64", []), ("pkg-en-1.0-1", "noarch", [])] final = [("pkg-1.0-1", "x86_64", []), ("pkg-en-1.0-1", "noarch", [])]
po.side_effect = [[("pkg-1.0-1", "x86_64", [])], final] po.side_effect = [([("pkg-1.0-1", "x86_64", [])], set()), (final, [])]
res = self.phase.run_solver( res = self.phase.run_solver(
self.compose.variants["Server"], self.compose.variants["Server"],
@ -444,7 +444,7 @@ class TestRunSolver(HelperMixin, helpers.PungiTestCase):
platform=None, platform=None,
) )
self.assertEqual(res, final) self.assertEqual(res, (final, []))
self.assertEqual( self.assertEqual(
po.call_args_list, [mock.call(self.logfile1), mock.call(self.logfile2)] po.call_args_list, [mock.call(self.logfile1), mock.call(self.logfile2)]
) )
@ -500,7 +500,8 @@ class TestRunSolver(HelperMixin, helpers.PungiTestCase):
("pkg-devel-1.0-1", "i686", []), ("pkg-devel-1.0-1", "i686", []),
] ]
po.side_effect = [ po.side_effect = [
[("pkg-devel-1.0-1", "x86_64", []), ("foo-1.0-1", "x86_64", [])], final ([("pkg-devel-1.0-1", "x86_64", []), ("foo-1.0-1", "x86_64", [])], []),
(final, []),
] ]
res = self.phase.run_solver( res = self.phase.run_solver(
@ -510,7 +511,7 @@ class TestRunSolver(HelperMixin, helpers.PungiTestCase):
platform=None, platform=None,
) )
self.assertEqual(res, final) self.assertEqual(res, (final, []))
self.assertEqual( self.assertEqual(
po.call_args_list, [mock.call(self.logfile1), mock.call(self.logfile2)] po.call_args_list, [mock.call(self.logfile1), mock.call(self.logfile2)]
) )
@ -597,7 +598,8 @@ class TestRunSolver(HelperMixin, helpers.PungiTestCase):
("foo-1.0-1", "i686", []), ("foo-1.0-1", "i686", []),
] ]
po.side_effect = [ po.side_effect = [
[("pkg-devel-1.0-1", "x86_64", []), ("foo-1.0-1", "x86_64", [])], final ([("pkg-devel-1.0-1", "x86_64", []), ("foo-1.0-1", "x86_64", [])], []),
(final, []),
] ]
res = self.phase.run_solver( res = self.phase.run_solver(
@ -607,7 +609,7 @@ class TestRunSolver(HelperMixin, helpers.PungiTestCase):
platform=None, platform=None,
) )
self.assertEqual(res, final) self.assertEqual(res, (final, []))
self.assertEqual( self.assertEqual(
po.call_args_list, [mock.call(self.logfile1), mock.call(self.logfile2)] po.call_args_list, [mock.call(self.logfile1), mock.call(self.logfile2)]
) )
@ -801,3 +803,17 @@ class TestExpandPackages(helpers.PungiTestCase):
) )
self.assertEqual(res, {"rpm": [], "srpm": [], "debuginfo": []}) self.assertEqual(res, {"rpm": [], "srpm": [], "debuginfo": []})
class TestFilterModules(helpers.PungiTestCase):
def test_remove_one(self):
self.compose = helpers.DummyCompose(self.topdir, {})
self.variant = self.compose.variants["Server"]
self.variant.arch_mmds["x86_64"] = {
"mod:1": MockModule("mod", platform="f29"),
"mod:2": MockModule("mod", platform="f30"),
}
hybrid.filter_modules(self.variant, "x86_64", ["mod:1"])
self.assertItemsEqual(self.variant.arch_mmds["x86_64"].keys(), ["mod:1"])