Table of Contents |
---|
Intent
Goals:
Modular packages MUST install correctly from the SIMP ISO or the local mirror created from the SIMP ISO
On systems with modular packages installed from the SIMP ISO that are configured to use the packages' original modular repositories or complete mirrors:
ISO-installed modular packages MUST upgrade correctly
ISO-installed modules and streams MUST integrate seamlessly
ISO build process SHOULD continue to only include the packages it needs
Caveats:
If necessary, the SIMP 6.6.0 ISO MAY mirror the entire base OS’s DVD
AppStream/
repository if it would avoid delays to the SIMP 6.6.0 build process.However, the ISO MUST NOT mirror entire third-party modular repositories (like
epel-modular
) just to provide a few necessary packages from single streams (e.g.,389-directory-server:stable
)The SIMP project’s RPMs/tarball MUST NOT require modularity for the SIMP 6.6.0 release (and probably never).
Constraints:
SIMP 6.6.0 will require RPMs from at least one module stream in the
epel-modular
repository:389-directory-server:stable
, in order to support 389ds.DNF will refuse to install an RPM with a
ModularityLabel
header unless it can be associated with modular metadata from an available repo.Building/rebuilding repos with the old
createrepo
command will destroy a repo’s modular metadata and make any modular RPMs unable to install
Conclusions:
In order to build SIMP ISOs that distribute modular RPMs:
The ISO build process MUST distribute modular RPMs as “slim” subset of their original upstream repository’s module/streams.
If feasible, the “slimming” process SHOULD be generalized enough to apply to packages from external sources like
epel-modular
AND the base OS’s DVDAppStream/
repository.Each “slim” modular streams' subsets MUST use the same name + stream + version + context + architecture (N:S:V:C:A) as their upstream sources, in order to maintain seamless interoperability.
The old
createrepo
command MUST NOT EVER be run on a repo with modular packages/modulemd metadata. This applies to both the ISO’s build process and post-installation local tooling on SIMP systems.
The ISO’s modular repositories MUST be built with modularity-aware tools, likeStatus colour Purple title TODO createrepo_c
orcreatrerepo_mod
from modulemd-tools.
Once built, SIMP ISO “slim” repos' modulemd metadata MUST remain available to install their modular packages. The repos MUST NOT be mirrored or rebuilt without it:
Local SIMP tooling that mirrors modular repositories MUST preserve modulemd metadata (e.g.,Status colour Purple title TODO dnf reposync --download-metadata
)
Local SIMP tooling MUST be changed to NEVER rebuild modular repositories withStatus colour Purple title TODO createrepo
. This includes:
At least two sections of the ISO’s ksStatus colour Purple title TODO auto.cfg
in simp-core (EL8 only; not yet created)
UpdateOsYumRepositoriesAction#apply() inStatus colour Purple title TODO simp config
The update_yum_repo() method inStatus colour Purple title TODO unpack_dvd
A “slim” subset for a reoi
enables the ISO to distribute installable epel-modular
packages without distributing epel-modular
's entire collection of modules x streams x packages.
Creating a modular repository with “slim” stream mirrors
Overview
At the same time each modular RPM is acquired, save its source repo’s modulemd metadata.
Use unique N:S:V:C:A combinations from the resulting modular RPMs to determine which “slim” module streams to reconstruct.
For each unique “slim” modular stream: generate modulemd metadata for all relevant RPMs
Combine all “slim” modules' modulemd data into a single data structure and write it to
modules.yaml
Rebuild the modular repository using
createrepo_c
(orcreaterepo_mod
) with the newmodules.yaml
file
Implementing slim modular repos
...
Creating “slim” stream mirrors of modular RPM packages enables the SIMP ISO to support modularity while still mix/matching specific RPMs from various sources. For instance, it permits adding a few epel-modular
packages without distributing epel-modular
's entire collection of modules x streams x packages.
See https://simp-project.atlassian.net/wiki/pages/resumedraft.action?draftId=2193326084 for a summary of motivating challenges and requirements .
Process
The “slim” mirroring process must happen during/before the ISO build process.
At the same time each modular RPM is acquired, save its source repo’s modulemd metadata.
Use unique N:S:V:C:A combinations from the resulting modular RPMs to determine which “slim” module streams to reconstruct.
For each unique “slim” modular stream: generate modulemd metadata for all relevant RPMs
Combine all “slim” modules' modulemd data into a single data structure and write it to
modules.yaml
Rebuild the modular repository using
createrepo_c
(orcreaterepo_mod
) with the newmodules.yaml
file
Implementing slim modular repos
...
Note |
---|
XML root is namespaced; causes XPath trouble
|
Modular RPM data/metadata to get/record/cache
At a minimum, a new field (only required for modular RPMs) that specifies the N:S (module:stream) for modular packages should be added to the build’s packages.yaml
.
...
Problems that are probably solved
yumdownloader
can’t see RPMs in modules/streams that aren’t enabled
Add an optional field toStatus colour Purple title TODO packages.yaml
entries to specify the N:S: for each modular RPM
Identify and enable all unique N: fromStatus colour Purple title TODO packages.yaml
(fail if there are conflicting S:)Status colour Purple title TODO dnf module enable
each N:S: before beginning to useyumdownloader
IndividualStatus colour Purple title TODO yumdownloader
runs can change repository mirrors, which may be out of sync with each other and have different modulemd data.Status colour Purple title TODO
(When using theStatus colour Red title unsolved? yumdownloader
) the modulemd metadata must be fetched at the same time as the RPM is downloaded, in order to preserve the precise state of that RPM’s modular metadata.
A single RPM could be part of multiple streams in an upstream repository
Nothing in the modulemd data prevents this, so we need a way to determine the correct stream.
...
Most BaseOS EL8 modules have a default stream; use that if it existsStatus colour Purple title TODO
We could also default to the only stream.Status colour Purple title TODO
This is hacky, but it will work for EL8.3—Base OS (i.e., AppStream) modules without a default stream are currently very rare, and at the moment all of them have a single stream:Code Block # dnf module --disablerepo=\* --enablerepo=appstream list | grep -v '\[d\]' CentOS Linux 8 - AppStream Name Stream Profiles Summary 389-ds 1.4 389 Directory Server (base) libselinux-python 2.8 common Python 2 bindings for libselinux mod_auth_openidc 2.3 Apache module suporting OpenID Connect authentication parfait 0.5 common Parfait Module pki-core 10.6 PKI Core module for PKI 10.6 or later pki-deps 10.6 PKI Dependencies module for PKI 10.6 or later
Status colour Blue title NOT IN 6.6.0
This leaves open the future edge-case where we include RPMs that will fail when we need an RPM from one of the Base OS modules above that have multiple streams but don’t have a default stream (current population: 0).Status colour Red title unsolved
We should probably have a way of formally declaring N:S forStatus colour Blue title NOT IN 6.6.0 *pkglist.txt
Base OS RPMs in the future. Some possibilities:A separate
*pkglist.modularity.txt
fileN:S-declaring directives in the comments of
*pkglist.txt
Could this be combined with
packages.yaml
? (not without a major rewrite)
Unsolved problems
What are the “Fetch RPM” flow differences between Base OS (prune_packages
) & External (yumdownloader
) packages?
When running yumdownloader
, how can we get the RPM’s source repo’s modulemd data?
This is easy to do by hand for an individual package, but I’m not sure how to automate it yet. Here are some options:
Option 1: see if
yumdownloader
can be convinced to display it, like--urls
(haven’t found it yet)Option 2: walk up the dir tree until we find metadata (hacky, expensive)
Option 3: find/define the DNF cache and somehow fish out the modulemd data for that specific package
Separate yumdownloader
runs may result in RPMs for the same N:S having different N:S:V:C:A
Different RPMs could be sourced from different versions (V:) of the same module stream if yumdownloader
pulls them from different repo mirrors that are out of sync with each other. Using the heuristic of a “slim” module stream per unique N:S:V:C:A , this would result in multiple module streams instead of one.
...
There’s a (staggeringly) remote change that the newer stream version dropped package(s) or one of its packages has a new dependency
The slim repo will use one N:S:V or the other, but neither upstream precisely matches its RPMs. After re-integrating with the full upstream repo or mirror, DNF might miss an update by deciding it already know the stream version resolve using the wrong stream version for some of the packages, to the wrong versions, miss updates
There may be other reasons to do with inter-modular dependencies.
TL;DR: Not sure if failing is the best way forward—input welcome.
Are there conditions where streams don’t provide C:A information when packages are noarch?
No. By the time they are built, they will have a context and arch.
Undecided
[Should/how to] persist cached modulemd metadata for already-downloaded RPMs between builds?
The current yumdownloader
process
True or false: “Any mirrored “slim” module MUST NOT have multiple streams”
This sounds reasonable, but is it actually true?
It’s impossible to install multiple streams on a single SIMP server, but do we think we’d need to package multiple “slim” module streams for agents?
My current inclination is to assume “no.” Given our approach toward modularity in general, that seems like a really edgy edge case.
...