diff --git a/pungi/phases/gather/__init__.py b/pungi/phases/gather/__init__.py index 6520c806..01a2c5ef 100644 --- a/pungi/phases/gather/__init__.py +++ b/pungi/phases/gather/__init__.py @@ -14,33 +14,34 @@ # along with this program; if not, see . -import json import glob +import json import os import shutil import threading -from six.moves import cPickle as pickle from kobo.rpmlib import parse_nvra from kobo.shortcuts import run from productmd.rpms import Rpms +from six.moves import cPickle as pickle try: from queue import Queue except ImportError: from Queue import Queue -from pungi.wrappers.scm import get_file_from_scm -from .link import link_files -from ...wrappers.createrepo import CreaterepoWrapper import pungi.wrappers.kojiwrapper - -from pungi.compose import get_ordered_variant_uids from pungi.arch import get_compatible_arches, split_name_arch -from pungi.phases.base import PhaseBase -from pungi.util import get_arch_data, get_arch_variant_data, get_variant_data, makedirs +from pungi.compose import get_ordered_variant_uids from pungi.module_util import Modulemd, collect_module_defaults +from pungi.phases.base import PhaseBase from pungi.phases.createrepo import add_modular_metadata +from pungi.util import (get_arch_data, get_arch_variant_data, get_variant_data, + makedirs) +from pungi.wrappers.scm import get_file_from_scm + +from ...wrappers.createrepo import CreaterepoWrapper +from .link import link_files def get_gather_source(name): @@ -81,10 +82,11 @@ class GatherPhase(PhaseBase): if variant.modules: errors.append("Modular compose requires libmodulemd package.") - # check whether variants from configuration value - # 'variant_as_lookaside' are correct variant_as_lookaside = self.compose.conf.get("variant_as_lookaside", []) all_variants = self.compose.all_variants + + # check whether variants from configuration value + # 'variant_as_lookaside' are correct for (requiring, required) in variant_as_lookaside: if requiring in all_variants and required not in all_variants: errors.append( @@ -92,6 +94,15 @@ class GatherPhase(PhaseBase): "required by %r" % (required, requiring) ) + # check whether variants from configuration value + # 'variant_as_lookaside' have same architectures + for (requiring, required) in variant_as_lookaside: + if requiring in all_variants and required in all_variants and \ + sorted(all_variants[requiring].arches) \ + != sorted(all_variants[required].arches): + errors.append("variant_as_lookaside: variant \'%s\' doesn't have same " + "architectures as \'%s\'" % (requiring, required)) + if errors: raise ValueError("\n".join(errors)) @@ -641,16 +652,21 @@ def _make_lookaside_repo(compose, variant, arch, pkg_map, package_sets=None): path_prefix = prefixes[compose.conf["pkgset_source"]]() package_list = set() for pkg_arch in pkg_map.keys(): - for pkg_type, packages in pkg_map[pkg_arch][variant.uid].items(): - # We want all packages for current arch, and SRPMs for any - # arch. Ultimately there will only be one source repository, so - # we need a union of all SRPMs. - if pkg_type == "srpm" or pkg_arch == arch: - for pkg in packages: - pkg = pkg["path"] - if path_prefix and pkg.startswith(path_prefix): - pkg = pkg[len(path_prefix) :] - package_list.add(pkg) + try: + for pkg_type, packages in pkg_map[pkg_arch][variant.uid].items(): + # We want all packages for current arch, and SRPMs for any + # arch. Ultimately there will only be one source repository, so + # we need a union of all SRPMs. + if pkg_type == "srpm" or pkg_arch == arch: + for pkg in packages: + pkg = pkg["path"] + if path_prefix and pkg.startswith(path_prefix): + pkg = pkg[len(path_prefix) :] + package_list.add(pkg) + except KeyError: + raise RuntimeError("Variant \'%s\' does not have architecture " + "\'%s\'!" % (variant, pkg_arch)) + pkglist = compose.paths.work.lookaside_package_list(arch=arch, variant=variant) with open(pkglist, "w") as f: for pkg in sorted(package_list): diff --git a/tests/test_gather_phase.py b/tests/test_gather_phase.py index 4c41e682..71c5a1ea 100644 --- a/tests/test_gather_phase.py +++ b/tests/test_gather_phase.py @@ -2,9 +2,10 @@ import copy import json -import mock import os +import mock + try: import unittest2 as unittest except ImportError: @@ -13,8 +14,8 @@ except ImportError: import six from pungi.phases import gather -from pungi.phases.pkgset.common import MaterializedPackageSet from pungi.phases.gather import _mk_pkg_map +from pungi.phases.pkgset.common import MaterializedPackageSet from tests import helpers from tests.helpers import MockPackageSet, MockPkg @@ -1581,6 +1582,24 @@ class TestGatherPhase(helpers.PungiTestCase): phase = gather.GatherPhase(compose, pkgset_phase) phase.validate() + def test_validates_variants_architecture_mismatch(self): + pkgset_phase = mock.Mock() + compose = helpers.DummyCompose( + self.topdir, {"variant_as_lookaside": [("Everything", "Client")]} + ) + phase = gather.GatherPhase(compose, pkgset_phase) + with self.assertRaises(ValueError) as ctx: + phase.validate() + self.assertIn("'Everything' doesn't have", str(ctx.exception)) + + def test_validates_variants_architecture_match(self): + pkgset_phase = mock.Mock() + compose = helpers.DummyCompose( + self.topdir, {"variant_as_lookaside": [("Everything", "Everything")]} + ) + phase = gather.GatherPhase(compose, pkgset_phase) + phase.validate() + class TestGetPackagesToGather(helpers.PungiTestCase): def setUp(self):