Reuse arch pkgset repos

JIRA: COMPOSE-4217
Signed-off-by: Haibo Lin <hlin@redhat.com>
This commit is contained in:
Haibo Lin 2020-03-25 17:02:25 +08:00
parent 63ec1adc22
commit 65251d983a
2 changed files with 107 additions and 2 deletions

View File

@ -22,7 +22,12 @@ from kobo.threads import run_in_threads
from pungi.arch import get_valid_arches
from pungi.wrappers.createrepo import CreaterepoWrapper
from pungi.util import is_arch_multilib, PartialFuncWorkerThread, PartialFuncThreadPool
from pungi.util import (
copy_all,
is_arch_multilib,
PartialFuncWorkerThread,
PartialFuncThreadPool,
)
from pungi.module_util import Modulemd, collect_module_defaults
from pungi.phases.createrepo import add_modular_metadata
@ -85,8 +90,9 @@ def run_create_global_repo(compose, cmd, logfile):
def create_arch_repos(compose, path_prefix, paths, pkgset, mmds):
reuse = getattr(pkgset, "reuse", None)
run_in_threads(
_create_arch_repo,
_create_arch_repo if reuse is None else _reuse_arch_repo,
[
(
compose,
@ -150,6 +156,19 @@ def _create_arch_repo(worker_thread, args, task_num):
compose.log_info("[DONE ] %s", msg)
def _reuse_arch_repo(worker_thread, args, task_num):
"""Reuse a single pkgset repo for given arch."""
compose, arch, _, paths, pkgset, _ = args
repo_dir = compose.paths.work.pkgset_repo(pkgset.name, arch=arch)
paths[arch] = repo_dir
old_repo_dir = compose.paths.old_compose_path(repo_dir)
msg = "Copying repodata for reuse: %s" % old_repo_dir
compose.log_info("[BEGIN] %s", msg)
copy_all(old_repo_dir, repo_dir)
compose.log_info("[DONE ] %s", msg)
class MaterializedPackageSet(object):
"""A wrapper for PkgsetBase object that represents the package set created
as repos on the filesystem.

View File

@ -114,3 +114,89 @@ class TestMaterializedPkgsetCreate(helpers.PungiTestCase):
os.path.join(self.topdir, "logs/x86_64/arch_repo_modulemd.foo.x86_64.log"),
)
cmd.return_value.add_module_stream.assert_called_once_with(mmd["x86_64"][0])
class TestCreateArchRepos(helpers.PungiTestCase):
def setUp(self):
super(TestCreateArchRepos, self).setUp()
self.compose = helpers.DummyCompose(self.topdir, {})
self.prefix = "/prefix"
self.paths = {}
self.pkgset = mock.Mock()
self.pkgset.reuse = None
self.pkgset.name = "foo"
@mock.patch("pungi.phases.pkgset.common._create_arch_repo")
def test_call_create_arch_repo(self, mock_create):
common.create_arch_repos(
self.compose, self.prefix, self.paths, self.pkgset, None
)
mock_create.assert_has_calls(
[
mock.call(
mock.ANY,
(self.compose, "amd64", self.prefix, self.paths, self.pkgset, None),
1,
),
mock.call(
mock.ANY,
(
self.compose,
"x86_64",
self.prefix,
self.paths,
self.pkgset,
None,
),
2,
),
]
)
@mock.patch("pungi.phases.pkgset.common._reuse_arch_repo")
def test_call_reuse_arch_repo(self, mock_reuse):
self.pkgset.reuse = "/path/to/old/global/repo"
common.create_arch_repos(
self.compose, self.prefix, self.paths, self.pkgset, None
)
mock_reuse.assert_has_calls(
[
mock.call(
mock.ANY,
(self.compose, "amd64", self.prefix, self.paths, self.pkgset, None),
1,
),
mock.call(
mock.ANY,
(
self.compose,
"x86_64",
self.prefix,
self.paths,
self.pkgset,
None,
),
2,
),
]
)
@mock.patch("pungi.phases.pkgset.common.copy_all")
def test_reuse_arch_repo(self, mock_copy_all):
self.pkgset.reuse = "/path/to/old/global/repo"
old_repo = "/path/to/old/repo"
self.compose.paths.old_compose_path = mock.Mock(return_value=old_repo)
common._reuse_arch_repo(
mock.Mock(),
(self.compose, "x86_64", self.prefix, self.paths, self.pkgset, None),
1,
)
mock_copy_all.assert_called_once_with(
old_repo, os.path.join(self.compose.topdir, "work/x86_64/repo/foo")
)
self.compose.log_info.assert_has_calls(
[
mock.call("[BEGIN] %s", "Copying repodata for reuse: %s" % old_repo),
mock.call("[DONE ] %s", "Copying repodata for reuse: %s" % old_repo),
]
)