lorax: Add --skip-branding cmdline argument

Also document how branding currently works. See docs/lorax.rst

Resolves: rhbz#1826479
(cherry picked from commit c9c1283c56)
This commit is contained in:
Brian C. Lane 2020-04-21 15:31:00 -07:00
parent 6a521624f8
commit 8045a95c63
6 changed files with 60 additions and 6 deletions

View File

@ -54,6 +54,40 @@ Under ``./results/`` will be the release tree files: .discinfo, .treeinfo, every
goes onto the boot.iso, the pxeboot directory, and the boot.iso under ``./images/``.
Branding
--------
By default lorax will search for the first package that provides ``system-release``
that doesn't start with ``generic-`` and will install it. It then selects a
corresponding logo package by using the first part of the system-release package and
appending ``-logos`` to it. eg. fedora-release and fedora-logos.
Variants
~~~~~~~~
If a ``variant`` is passed to lorax it will select a ``system-release`` package that
ends with the variant name. eg. Passing ``--variant workstation`` will select the
``fedora-release-workstation`` package if it exists. It will select a logo package
the same way it does for non-variants. eg. ``fedora-logos``.
If there is no package ending with the variant name it will fall back to using the
first non-generic package providing ``system-release``.
Custom Branding
~~~~~~~~~~~~~~~
If ``--skip-branding`` is passed to lorax it will skip selecting the
``system-release``, and logos packages and leave it up to the user to pass any
branding related packages to lorax using ``--installpkgs``. When using
``skip-branding`` you must make sure that you provide all of the expected files,
otherwise Anaconda may not work as expected. See the contents of ``fedora-release``
and ``fedora-logos`` for examples of what to include.
Note that this does not prevent something else in the dependency tree from
causing these packages to be included. Using ``--excludepkgs`` may help if they
are unexpectedly included.
Running inside of mock
----------------------

View File

@ -183,7 +183,8 @@ class Lorax(BaseLoraxClass):
add_arch_template_vars=None,
verify=True,
user_dracut_args=None,
squashfs_only=False):
squashfs_only=False,
skip_branding=False):
assert self._configured
@ -263,7 +264,8 @@ class Lorax(BaseLoraxClass):
installpkgs=installpkgs,
excludepkgs=excludepkgs,
add_templates=add_templates,
add_template_vars=add_template_vars)
add_template_vars=add_template_vars,
skip_branding=skip_branding)
logger.info("installing runtime packages")
rb.install()

View File

@ -111,6 +111,8 @@ def lorax_parser(dracut_default=""):
help="Enable a DNF plugin by name/glob, or * to enable all of them.")
optional.add_argument("--squashfs-only", action="store_true", default=False,
help="Use a plain squashfs filesystem for the runtime.")
optional.add_argument("--skip-branding", action="store_true", default=False,
help="Disable automatic branding package selection. Use --installpkgs to add custom branding.")
# dracut arguments
dracut_group = parser.add_argument_group("dracut arguments: (default: %s)" % dracut_default)

View File

@ -71,7 +71,8 @@ class RuntimeBuilder(object):
def __init__(self, product, arch, dbo, templatedir=None,
installpkgs=None, excludepkgs=None,
add_templates=None,
add_template_vars=None):
add_template_vars=None,
skip_branding=False):
root = dbo.conf.installroot
# use a copy of product so we can modify it locally
product = product.copy()
@ -87,6 +88,7 @@ class RuntimeBuilder(object):
self._excludepkgs = excludepkgs or []
self._runner.defaults = self.vars
self.dbo.reset()
self._skip_branding = skip_branding
def _install_branding(self):
"""Select the branding from the available 'system-release' packages
@ -96,6 +98,9 @@ class RuntimeBuilder(object):
- If variant is set look for a package ending with lower(variant) and use that
- If there are one or more non-generic packages, use the first one after sorting
"""
if self._skip_branding:
return
release = None
q = self.dbo.sack.query()
a = q.available()

View File

@ -213,7 +213,8 @@ def main():
add_arch_template_vars=parsed_add_arch_template_vars,
remove_temp=True, verify=opts.verify,
user_dracut_args=user_dracut_args,
squashfs_only=opts.squashfs_only)
squashfs_only=opts.squashfs_only,
skip_branding=opts.skip_branding)
# Release the lock on the tempdir
os.close(dir_fd)

View File

@ -62,7 +62,7 @@ def makeFakeRPM(repo_dir, name, epoch, version, release, files=None, provides=No
class InstallBrandingTestCase(unittest.TestCase):
def install_branding(self, repo_dir, variant=None):
def install_branding(self, repo_dir, variant=None, skip_branding=False):
"""Run the _install_branding and return the names of the installed packages"""
with tempfile.TemporaryDirectory(prefix="lorax.test.") as root_dir:
dbo = get_dnf_base_object(root_dir, ["file://"+repo_dir], enablerepos=[], disablerepos=[])
@ -71,7 +71,7 @@ class InstallBrandingTestCase(unittest.TestCase):
product = DataHolder(name="Fedora", version="33", release="33",
variant=variant, bugurl="http://none", isfinal=True)
arch = ArchData(os.uname().machine)
rb = RuntimeBuilder(product, arch, dbo)
rb = RuntimeBuilder(product, arch, dbo, skip_branding=skip_branding)
rb._install_branding()
dbo.resolve()
self.assertTrue(dbo.transaction is not None)
@ -134,3 +134,13 @@ class InstallBrandingTestCase(unittest.TestCase):
# Test with a variant set, but not available
pkgs = self.install_branding(repo_dir, variant="server")
self.assertEqual(pkgs, ["fedora-logos", "fedora-release"])
def test_skip_branding(self):
"""Test disabled branding"""
with tempfile.TemporaryDirectory(prefix="lorax.test.repo.") as repo_dir:
makeFakeRPM(repo_dir, "fedora-release", 0, "33", "1", ["/etc/system-release"], ["system-release"])
makeFakeRPM(repo_dir, "fedora-logos", 0, "33", "1")
os.system("createrepo_c " + repo_dir)
pkgs = self.install_branding(repo_dir, skip_branding=True)
self.assertEqual(pkgs, [])