createrepo: Allow selecting variants for delta RPMs
The configuration needs to be more granular than a single global option. With this patch each tree can enable deltas separately. Fixes: https://pagure.io/pungi/issue/715 Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com>
This commit is contained in:
parent
90be25c14c
commit
e21a27bdc9
@ -390,8 +390,10 @@ Options
|
|||||||
(*bool*) -- use createrepo_c (True) or legacy createrepo (False)
|
(*bool*) -- use createrepo_c (True) or legacy createrepo (False)
|
||||||
|
|
||||||
**createrepo_deltas** = False
|
**createrepo_deltas** = False
|
||||||
(*bool*) -- generate delta RPMs against an older compose. This needs to be
|
(*list*) -- generate delta RPMs against an older compose. This needs to be
|
||||||
used together with ``--old-composes`` command line argument.
|
used together with ``--old-composes`` command line argument. The value
|
||||||
|
should be a mapping of variants and architectures that should enable
|
||||||
|
creating delta RPMs. Source and debuginfo repos never have deltas.
|
||||||
|
|
||||||
**createrepo_use_xz** = False
|
**createrepo_use_xz** = False
|
||||||
(*bool*) -- whether to pass ``--xz`` to the createrepo command. This will
|
(*bool*) -- whether to pass ``--xz`` to the createrepo command. This will
|
||||||
@ -413,6 +415,12 @@ Example
|
|||||||
::
|
::
|
||||||
|
|
||||||
createrepo_checksum = "sha"
|
createrepo_checksum = "sha"
|
||||||
|
createrepo_deltas = [
|
||||||
|
# All arches for Everything should have deltas.
|
||||||
|
('^Everything$', {'*': True}),
|
||||||
|
# Also Server.x86_64 should have them (but not on other arches).
|
||||||
|
('^Server$', {'x86_64': True}),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
Package Set Settings
|
Package Set Settings
|
||||||
|
@ -681,8 +681,14 @@ def make_schema():
|
|||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
},
|
},
|
||||||
"createrepo_deltas": {
|
"createrepo_deltas": {
|
||||||
"type": "boolean",
|
"anyOf": [
|
||||||
"default": False,
|
# Deprecated in favour of more granular settings.
|
||||||
|
{
|
||||||
|
"type": "boolean",
|
||||||
|
"default": False,
|
||||||
|
},
|
||||||
|
_variant_arch_mapping({"type": "boolean"})
|
||||||
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
"buildinstall_method": {
|
"buildinstall_method": {
|
||||||
|
@ -32,7 +32,7 @@ from kobo.shortcuts import run, relative_path
|
|||||||
from ..wrappers.scm import get_dir_from_scm
|
from ..wrappers.scm import get_dir_from_scm
|
||||||
from ..wrappers.createrepo import CreaterepoWrapper
|
from ..wrappers.createrepo import CreaterepoWrapper
|
||||||
from .base import PhaseBase
|
from .base import PhaseBase
|
||||||
from ..util import find_old_compose, temp_dir
|
from ..util import find_old_compose, temp_dir, get_arch_variant_data
|
||||||
|
|
||||||
import productmd.rpms
|
import productmd.rpms
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ class CreaterepoPhase(PhaseBase):
|
|||||||
except ValueError as exc:
|
except ValueError as exc:
|
||||||
errors = exc.message.split('\n')
|
errors = exc.message.split('\n')
|
||||||
|
|
||||||
if not self.compose.old_composes and self.compose.conf['createrepo_deltas']:
|
if not self.compose.old_composes and self.compose.conf.get('createrepo_deltas'):
|
||||||
errors.append('Can not generate deltas without old compose')
|
errors.append('Can not generate deltas without old compose')
|
||||||
|
|
||||||
if errors:
|
if errors:
|
||||||
@ -120,7 +120,7 @@ def create_variant_repo(compose, arch, variant, pkg_type):
|
|||||||
compose.log_info("[BEGIN] %s" % msg)
|
compose.log_info("[BEGIN] %s" % msg)
|
||||||
|
|
||||||
# We only want delta RPMs for binary repos.
|
# We only want delta RPMs for binary repos.
|
||||||
with_deltas = compose.conf['createrepo_deltas'] and pkg_type == 'rpm'
|
with_deltas = pkg_type == 'rpm' and _has_deltas(compose, variant, arch)
|
||||||
|
|
||||||
rpms = set()
|
rpms = set()
|
||||||
rpm_nevras = set()
|
rpm_nevras = set()
|
||||||
@ -298,3 +298,11 @@ def _find_package_dirs(base):
|
|||||||
# The directory does not exist, so no drpms for you!
|
# The directory does not exist, so no drpms for you!
|
||||||
pass
|
pass
|
||||||
return sorted(buckets)
|
return sorted(buckets)
|
||||||
|
|
||||||
|
|
||||||
|
def _has_deltas(compose, variant, arch):
|
||||||
|
"""Check if delta RPMs are enabled for given variant and architecture."""
|
||||||
|
key = 'createrepo_deltas'
|
||||||
|
if isinstance(compose.conf.get(key), bool):
|
||||||
|
return compose.conf[key]
|
||||||
|
return any(get_arch_variant_data(compose.conf, key, arch, variant))
|
||||||
|
@ -21,6 +21,18 @@ from tests.helpers import DummyCompose, PungiTestCase, copy_fixture, touch
|
|||||||
|
|
||||||
|
|
||||||
class TestCreaterepoPhase(PungiTestCase):
|
class TestCreaterepoPhase(PungiTestCase):
|
||||||
|
@mock.patch('pungi.phases.createrepo.ThreadPool')
|
||||||
|
def test_validates_without_option(self, ThreadPoolCls):
|
||||||
|
compose = DummyCompose(self.topdir, {
|
||||||
|
'createrepo_checksum': 'sha256',
|
||||||
|
})
|
||||||
|
|
||||||
|
phase = CreaterepoPhase(compose)
|
||||||
|
try:
|
||||||
|
phase.validate()
|
||||||
|
except ValueError:
|
||||||
|
self.fail('Missing delta config should not fail validation')
|
||||||
|
|
||||||
@mock.patch('pungi.phases.createrepo.ThreadPool')
|
@mock.patch('pungi.phases.createrepo.ThreadPool')
|
||||||
def test_fails_deltas_without_old_compose(self, ThreadPoolCls):
|
def test_fails_deltas_without_old_compose(self, ThreadPoolCls):
|
||||||
compose = DummyCompose(self.topdir, {
|
compose = DummyCompose(self.topdir, {
|
||||||
@ -34,6 +46,19 @@ class TestCreaterepoPhase(PungiTestCase):
|
|||||||
|
|
||||||
self.assertIn('deltas', str(ctx.exception))
|
self.assertIn('deltas', str(ctx.exception))
|
||||||
|
|
||||||
|
@mock.patch('pungi.phases.createrepo.ThreadPool')
|
||||||
|
def test_fails_deltas_without_old_compose_granular_config(self, ThreadPoolCls):
|
||||||
|
compose = DummyCompose(self.topdir, {
|
||||||
|
'createrepo_checksum': 'sha256',
|
||||||
|
'createrepo_deltas': [('^Everything$', {'*': True})],
|
||||||
|
})
|
||||||
|
|
||||||
|
phase = CreaterepoPhase(compose)
|
||||||
|
with self.assertRaises(ValueError) as ctx:
|
||||||
|
phase.validate()
|
||||||
|
|
||||||
|
self.assertIn('deltas', str(ctx.exception))
|
||||||
|
|
||||||
@mock.patch('pungi.phases.createrepo.ThreadPool')
|
@mock.patch('pungi.phases.createrepo.ThreadPool')
|
||||||
def test_starts_jobs(self, ThreadPoolCls):
|
def test_starts_jobs(self, ThreadPoolCls):
|
||||||
compose = DummyCompose(self.topdir, {})
|
compose = DummyCompose(self.topdir, {})
|
||||||
@ -317,6 +342,110 @@ class TestCreateVariantRepo(PungiTestCase):
|
|||||||
with open(list_file) as f:
|
with open(list_file) as f:
|
||||||
self.assertEqual(f.read(), 'Packages/b/bash-4.3.30-2.fc21.x86_64.rpm\n')
|
self.assertEqual(f.read(), 'Packages/b/bash-4.3.30-2.fc21.x86_64.rpm\n')
|
||||||
|
|
||||||
|
@mock.patch('pungi.phases.createrepo.run')
|
||||||
|
@mock.patch('pungi.phases.createrepo.CreaterepoWrapper')
|
||||||
|
def test_variant_repo_rpms_with_deltas_granular_config(self, CreaterepoWrapperCls, run):
|
||||||
|
compose = DummyCompose(self.topdir, {
|
||||||
|
'createrepo_checksum': 'sha256',
|
||||||
|
'createrepo_deltas': [('^Server$', {'*': True})],
|
||||||
|
})
|
||||||
|
compose.DEBUG = False
|
||||||
|
compose.has_comps = False
|
||||||
|
compose.old_composes = [self.topdir + '/old']
|
||||||
|
touch(os.path.join(self.topdir, 'old', 'test-1.0-20151203.0', 'STATUS'), 'FINISHED')
|
||||||
|
|
||||||
|
repo = CreaterepoWrapperCls.return_value
|
||||||
|
copy_fixture('server-rpms.json', compose.paths.compose.metadata('rpms.json'))
|
||||||
|
|
||||||
|
create_variant_repo(compose, 'x86_64', compose.variants['Server'], 'rpm')
|
||||||
|
|
||||||
|
list_file = self.topdir + '/work/x86_64/repo_package_list/Server.x86_64.rpm.conf'
|
||||||
|
self.assertEqual(CreaterepoWrapperCls.mock_calls[0],
|
||||||
|
mock.call(createrepo_c=True))
|
||||||
|
self.assertItemsEqual(
|
||||||
|
repo.get_createrepo_cmd.mock_calls,
|
||||||
|
[mock.call(self.topdir + '/compose/Server/x86_64/os', checksum='sha256',
|
||||||
|
database=True, groupfile=None, workers=3,
|
||||||
|
outputdir=self.topdir + '/compose/Server/x86_64/os',
|
||||||
|
pkglist=list_file, skip_stat=True, update=True,
|
||||||
|
update_md_path=None, deltas=True,
|
||||||
|
oldpackagedirs=self.topdir + '/old/test-1.0-20151203.0/compose/Server/x86_64/os/Packages',
|
||||||
|
use_xz=False)])
|
||||||
|
self.assertItemsEqual(
|
||||||
|
repo.get_modifyrepo_cmd.mock_calls,
|
||||||
|
[])
|
||||||
|
with open(list_file) as f:
|
||||||
|
self.assertEqual(f.read(), 'Packages/b/bash-4.3.30-2.fc21.x86_64.rpm\n')
|
||||||
|
|
||||||
|
@mock.patch('pungi.phases.createrepo.run')
|
||||||
|
@mock.patch('pungi.phases.createrepo.CreaterepoWrapper')
|
||||||
|
def test_variant_repo_rpms_with_deltas_granular_config_no_match(self, CreaterepoWrapperCls, run):
|
||||||
|
compose = DummyCompose(self.topdir, {
|
||||||
|
'createrepo_checksum': 'sha256',
|
||||||
|
'createrepo_deltas': [('^Everything$', {'x86_64': True})],
|
||||||
|
})
|
||||||
|
compose.DEBUG = False
|
||||||
|
compose.has_comps = False
|
||||||
|
compose.old_composes = [self.topdir + '/old']
|
||||||
|
touch(os.path.join(self.topdir, 'old', 'test-1.0-20151203.0', 'STATUS'), 'FINISHED')
|
||||||
|
|
||||||
|
repo = CreaterepoWrapperCls.return_value
|
||||||
|
copy_fixture('server-rpms.json', compose.paths.compose.metadata('rpms.json'))
|
||||||
|
|
||||||
|
create_variant_repo(compose, 'x86_64', compose.variants['Server'], 'rpm')
|
||||||
|
|
||||||
|
list_file = self.topdir + '/work/x86_64/repo_package_list/Server.x86_64.rpm.conf'
|
||||||
|
self.assertEqual(CreaterepoWrapperCls.mock_calls[0],
|
||||||
|
mock.call(createrepo_c=True))
|
||||||
|
self.assertItemsEqual(
|
||||||
|
repo.get_createrepo_cmd.mock_calls,
|
||||||
|
[mock.call(self.topdir + '/compose/Server/x86_64/os', checksum='sha256',
|
||||||
|
database=True, groupfile=None, workers=3,
|
||||||
|
outputdir=self.topdir + '/compose/Server/x86_64/os',
|
||||||
|
pkglist=list_file, skip_stat=True, update=True,
|
||||||
|
update_md_path=self.topdir + '/work/x86_64/repo',
|
||||||
|
deltas=False, oldpackagedirs=None, use_xz=False)])
|
||||||
|
self.assertItemsEqual(
|
||||||
|
repo.get_modifyrepo_cmd.mock_calls,
|
||||||
|
[])
|
||||||
|
with open(list_file) as f:
|
||||||
|
self.assertEqual(f.read(), 'Packages/b/bash-4.3.30-2.fc21.x86_64.rpm\n')
|
||||||
|
|
||||||
|
@mock.patch('pungi.phases.createrepo.run')
|
||||||
|
@mock.patch('pungi.phases.createrepo.CreaterepoWrapper')
|
||||||
|
def test_variant_repo_rpms_with_deltas_granular_config_no_match_on_arch(
|
||||||
|
self, CreaterepoWrapperCls, run):
|
||||||
|
compose = DummyCompose(self.topdir, {
|
||||||
|
'createrepo_checksum': 'sha256',
|
||||||
|
'createrepo_deltas': [('^Server$', {'s390x': True})],
|
||||||
|
})
|
||||||
|
compose.DEBUG = False
|
||||||
|
compose.has_comps = False
|
||||||
|
compose.old_composes = [self.topdir + '/old']
|
||||||
|
touch(os.path.join(self.topdir, 'old', 'test-1.0-20151203.0', 'STATUS'), 'FINISHED')
|
||||||
|
|
||||||
|
repo = CreaterepoWrapperCls.return_value
|
||||||
|
copy_fixture('server-rpms.json', compose.paths.compose.metadata('rpms.json'))
|
||||||
|
|
||||||
|
create_variant_repo(compose, 'x86_64', compose.variants['Server'], 'rpm')
|
||||||
|
|
||||||
|
list_file = self.topdir + '/work/x86_64/repo_package_list/Server.x86_64.rpm.conf'
|
||||||
|
self.assertEqual(CreaterepoWrapperCls.mock_calls[0],
|
||||||
|
mock.call(createrepo_c=True))
|
||||||
|
self.assertItemsEqual(
|
||||||
|
repo.get_createrepo_cmd.mock_calls,
|
||||||
|
[mock.call(self.topdir + '/compose/Server/x86_64/os', checksum='sha256',
|
||||||
|
database=True, groupfile=None, workers=3,
|
||||||
|
outputdir=self.topdir + '/compose/Server/x86_64/os',
|
||||||
|
pkglist=list_file, skip_stat=True, update=True,
|
||||||
|
update_md_path=self.topdir + '/work/x86_64/repo',
|
||||||
|
deltas=False, oldpackagedirs=None, use_xz=False)])
|
||||||
|
self.assertItemsEqual(
|
||||||
|
repo.get_modifyrepo_cmd.mock_calls,
|
||||||
|
[])
|
||||||
|
with open(list_file) as f:
|
||||||
|
self.assertEqual(f.read(), 'Packages/b/bash-4.3.30-2.fc21.x86_64.rpm\n')
|
||||||
|
|
||||||
@mock.patch('pungi.phases.createrepo.run')
|
@mock.patch('pungi.phases.createrepo.run')
|
||||||
@mock.patch('pungi.phases.createrepo.CreaterepoWrapper')
|
@mock.patch('pungi.phases.createrepo.CreaterepoWrapper')
|
||||||
def test_variant_repo_rpms_with_deltas_hashed_dirs(self, CreaterepoWrapperCls, run):
|
def test_variant_repo_rpms_with_deltas_hashed_dirs(self, CreaterepoWrapperCls, run):
|
||||||
|
Loading…
Reference in New Issue
Block a user