From 98c765d01c1ba804998b0582414ca9c9ff4fd92f Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Jan 02 2020 10:14:53 +0000 Subject: basic zchunk support for dist-repo Fixes: https://pagure.io/koji/issue/1198 --- diff --git a/builder/kojid b/builder/kojid index 9cc959c..8f060c4 100755 --- a/builder/kojid +++ b/builder/kojid @@ -5508,7 +5508,8 @@ class createDistRepoTask(BaseTaskHandler): if oldrepo: oldrepodata = os.path.join(oldrepodir, arch, 'repodata') self.do_createrepo(self.repodir, '%s/pkglist' % self.repodir, - groupdata, oldpkgs=oldpkgs, oldrepodata=oldrepodata) + groupdata, oldpkgs=oldpkgs, oldrepodata=oldrepodata, + zck=opts.get('zck'), zck_dict_dir=opts.get('zck_dict_dir')) for subrepo in self.subrepos: if oldrepo: oldrepodata = os.path.join(oldrepodir, arch, subrepo, 'repodata') @@ -5516,7 +5517,9 @@ class createDistRepoTask(BaseTaskHandler): '%s/%s' % (self.repodir, subrepo), '%s/%s/pkglist' % (self.repodir, subrepo), groupdata, oldpkgs=oldpkgs, oldrepodata=oldrepodata, - logname='createrepo_%s' % subrepo) + logname='createrepo_%s' % subrepo, + zck=opts.get('zck'), + zck_dict_dir=opts.get('zck_dict_dir')) if len(self.kojipkgs) == 0: fn = os.path.join(self.repodir, "repodata", "EMPTY_REPO") with open(fn, 'w') as fp: @@ -5566,7 +5569,7 @@ class createDistRepoTask(BaseTaskHandler): self.session.uploadWrapper(fn, self.uploadpath) def do_createrepo(self, repodir, pkglist, groupdata, oldpkgs=None, - logname=None, oldrepodata=None): + logname=None, oldrepodata=None, zck=False, zck_dict_dir=None): """Run createrepo This is derived from CreaterepoTask.create_local_repo, but adapted to @@ -5577,6 +5580,10 @@ class createDistRepoTask(BaseTaskHandler): cmd = ['/usr/bin/createrepo_c'] else: cmd = ['/usr/bin/createrepo'] + if zck: + raise koji.GenericError("createrepo doesn't support zchunks") + if zck_dict_dir and not zck: + raise koji.GenericError("--zck-dict-dir makes no sense without --zck") cmd.extend(['-vd', '-i', pkglist]) if groupdata and os.path.isfile(groupdata): cmd.extend(['-g', groupdata]) @@ -5599,6 +5606,15 @@ class createDistRepoTask(BaseTaskHandler): cmd.append('--deltas') for op_dir in oldpkgs: cmd.extend(['--oldpackagedirs', op_dir]) + if zck: + cmd.append('--zck') + if zck_dict_dir: + zck_dict_dir = os.path.normpath(zck_dict_dir) + if os.path.isfile(zck_dict_dir): + raise koji.GenericError("zchunk dir path is file: %s" % zck_dict_dir) + if not os.path.isdir(zck_dict_dir): + raise koji.GenericError("zchunk dir path doesn't exist: %s" % zck_dict_dir) + cmd.extend(['--zck-dict-dir', zck_dict_dir]) cmd.append(repodir) if logname is None: diff --git a/cli/koji_cli/commands.py b/cli/koji_cli/commands.py index faca3a9..9c3274d 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -6985,6 +6985,10 @@ def handle_dist_repo(options, session, args): help=_('Do not wait for the task to complete')) parser.add_option('--skip-missing-signatures', action='store_true', default=False, help=_('Skip RPMs not signed with the desired key(s)')) + parser.add_option('--zck', action='store_true', default=False, + help=_('Generate zchunk files as well as the standard repodata')) + parser.add_option('--zck-dict-dir', action='store', default=None, + help=_('Directory containing compression dictionaries for use by zchunk (on builder)')) task_opts, args = parser.parse_args(args) if len(args) < 1: parser.error(_('You must provide a tag to generate the repo from')) @@ -7064,7 +7068,9 @@ def handle_dist_repo(options, session, args): 'multilib': task_opts.multilib, 'split_debuginfo': task_opts.split_debuginfo, 'skip_missing_signatures': task_opts.skip_missing_signatures, - 'allow_missing_signatures': task_opts.allow_missing_signatures + 'allow_missing_signatures': task_opts.allow_missing_signatures, + 'zck': task_opts.zck, + 'zck_dict_dir': task_opts.zck_dict_dir, } task_id = session.distRepo(tag, keys, **opts) print("Creating dist repo for tag " + tag) diff --git a/tests/test_cli/test_dist_repo.py b/tests/test_cli/test_dist_repo.py index f625529..1abeb74 100644 --- a/tests/test_cli/test_dist_repo.py +++ b/tests/test_cli/test_dist_repo.py @@ -274,6 +274,10 @@ Options: --nowait Do not wait for the task to complete --skip-missing-signatures Skip RPMs not signed with the desired key(s) + --zck Generate zchunk files as well as the standard repodata + --zck-dict-dir=ZCK_DICT_DIR + Directory containing compression dictionaries for use + by zchunk (on builder) """ % self.progname)