Skip to content

fix(xcat-dep): no openSUSE dep target can be built - #95

Merged
dhilst merged 8 commits into
xcat2:masterfrom
VersatusHPC:feat/dep-opensuse-targets
Oct 23, 2026
Merged

dhilst merged 8 commits into
xcat2:masterfrom
VersatusHPC:feat/dep-opensuse-targets

Conversation

@dhilst

@dhilst dhilst commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

mockbuild-all.pl --target opensuse-leap-15.6-x86_64 dies with Could not parse EL release from target 'opensuse-leap-15.6-x86_64'. target_profile resolves a target through openEuler, then the forcearch table, then /epel-(\d+)-/, and dies on anything else. The CI has run that command since the SUSE cells were added, so neither openSUSE dep cell reaches its first build step and neither has published a package.

The capability is not new. It was written on the feature/uftp-suse branch of the VersatusHPC fork, where a real run built seven packages for Leap 15.6, and it was never proposed here. This carries over only the part that drives a target and leaves UFTP alone. target_profile and the forcearch table move into MockBuildUtils and gain a cell key, an openSUSE arm maps a Leap release to the SLE family it serves, and dep_repo_baseurl and dep_repo_label pick the channel a cell advertises, because xcat.org serves Leap from sles and everything else from yum. derive_target_from_repo_path maps a sles<N> directory back to its chroot and the cross-arch finalize globs sles* beside rh*, so the completeness and signature gates no longer skip a SUSE cell in silence.

It also builds the sles12 cell, which nothing built before:

  • %LEAP_SLE_MAJOR maps Leap 42.3 to SLE 12, 15.6 to 15 and 16.0 to 16. The SLE major is not the Leap major, so a cell derived from the Leap major published 42.3 as sles42. A Leap release the table does not name now fails instead of guessing.
  • mock-configs/opensuse-leap-42.3-x86_64.cfg is the chroot. Leap 42.3 is end of life, so the openSUSE discontinued archive serves it, with the rpm-md metadata under repo/oss/suse/ rather than repo/oss/.
  • No openSUSE manifest section pins xCAT-genesis-base, because openSUSE ships no legacy Genesis, or uftp, because UFTP 5 for Leap needs its own spec change.

t/opensuse_dep_target.t is new and fails before each of the two fixes

The pipeline runs mockbuild-all.pl --target opensuse-leap-15.6-x86_64, and
target_profile falls through to /epel-(\d+)-/ and dies with "Could not parse EL
release". No openSUSE dep cell on this lineage has ever completed a real build.

The test asks MockBuildUtils for the build plan of each openSUSE target, for the
channel a cell advertises, and for the manifest section the completeness gate
reads. It fails 4 of 8 on this commit: MockBuildUtils has no target_profile, no
dep_repo_baseurl and no dep_repo_label, and packages-manifest.conf has no
openSUSE section.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
target_profile resolved a target through openEuler, the forcearch table, then
/epel-(\d+)-/, and died on anything else. The pipeline has run
mockbuild-all.pl --target opensuse-leap-15.6-x86_64 since the SUSE cells were
added, so both openSUSE dep cells stop before the first build step.

The capability is not new. It was written on feature/uftp-suse, where
xcat-dep-build-opensuse15-x86_64 build 42 ran it and built seven packages, and
it was never proposed upstream. This carries over only the part that drives a
target: target_profile and the forcearch table move into MockBuildUtils and
gain a cell key, an openSUSE arm maps opensuse-leap-<major>.<minor> to
sles<major>/<arch>, and dep_repo_baseurl and dep_repo_label pick the channel a
cell advertises, because xcat.org serves Leap from sles and everything else
from yum. target_cell and write_dep_repo_metadata read the cell instead of
composing rh<rel> themselves.

derive_target_from_repo_path maps a sles<N> directory back to its chroot through
%SUSE_BUILD_TARGET, and the cross-arch finalize globs sles* beside rh*. Without
both, the completeness and signature gates are handed a SUSE cell, derive
nothing, and the cell publishes a missing or unsigned package in silence.

packages-manifest.conf gains the two Leap 15.6 sections. Neither pins
xCAT-genesis-base: openSUSE ships no legacy Genesis, so no openSUSE target
builds the payload, and the gate is zero tolerance. Neither pins uftp either,
because UFTP 5 for Leap needs its own spec change that this branch does not
carry; t/mockbuild-all.t excludes the Leap sections from that assertion and says
why.

t/opensuse_dep_target.t fails 4 of 8 on the parent commit. prove -j4 t/ passes:
28 files, 1299 tests.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
cells.tsv gives the opensuse12 cell the subpath sles12/x86_64, and nothing
builds it. The openSUSE arm derives the cell from the Leap major, which is
right for 15.x by coincidence, so Leap 42.3 resolves to sles42.

The test names the Leap 42.3 target, the sles12 directory the gates must map
back to it, the manifest section the completeness gate reads, and the mock
configuration install_mock_cfg copies. It also asserts that no openSUSE section
pins xCAT-genesis-base, with an EL section as the control.

It fails on this commit: 42.3 yields sles42, /repo/sles12/x86_64 derives
nothing, and neither the manifest section nor the chroot exists.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
cells.tsv gives the opensuse12 cell the subpath sles12/x86_64 and nothing builds
it, so xcat-dep-build-opensuse12-x86_64 has never produced a package. The
openSUSE arm derived the cell from the Leap major, which is correct for 15.x by
coincidence, so Leap 42.3 resolved to sles42 and the completeness gate then
stopped on a missing manifest section.

%LEAP_SLE_MAJOR maps a Leap release to the SLE family its packages serve: 42.3
to 12, 15.6 to 15, 16.0 to 16. Leap 42.3 carries SLE 12 SP3's base -- rpm
4.11.2, perl 5.18.2, glibc 2.22. %SUSE_BUILD_TARGET is derived from that one
table, so the forward and reverse answers cannot disagree. A Leap release the
table does not name now dies instead of publishing into sles<leap major>.

mock-configs/opensuse-leap-42.3-x86_64.cfg is the chroot. Leap 42.3 is end of
life, so mock ships no configuration for it and the openSUSE discontinued
archive serves the tree, with the rpm-md metadata under repo/oss/suse/ rather
than repo/oss/ -- the live mirror answers 404 for 42.3. 42.3 packages no
python3-dnf, so mock cannot build a bootstrap chroot and the config installs
straight into the chroot. install_mock_cfg needs no change: it already copies
mock-configs/<target>.cfg and refuses a host copy that differs.

The manifest section omits xCAT-genesis-base, because openSUSE ships no legacy
Genesis, and omits uftp, because UFTP 5 for Leap needs its own spec change.

t/opensuse_dep_target.t and t/mockbuild-all.t fail on the parent commit.
prove -j4 t/ passes: 28 files, 1301 tests.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
@dhilst
dhilst requested a review from viniciusferrao October 23, 2026 02:36
Moving target_profile into MockBuildUtils carried the dep_builders lists with
it, and openEuler came away without uftp while every openEuler manifest section
still pins uftp=5.0.4. A build then skips the package and the completeness gate
fails afterwards, naming the manifest rather than the plan.

The test holds every target's dep_builders and required sets down package by
package, at the values mockbuild-all.pl carried before the move, and asserts
that a target pins uftp exactly when it builds it. It covers EL native and
cross-built, openEuler x86_64 and ppc64le, and both openSUSE releases, because
one list moved and any entry could have been lost.

It fails on this commit for the two openEuler targets.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
Moving target_profile into MockBuildUtils took the lists from a branch that
predates the openEuler UFTP work, so the openEuler build plan lost uftp while
every openEuler manifest section still pins uftp=5.0.4. A clean openEuler build
skips the package, and the completeness gate then stops the deploy naming the
manifest. native/uftp-openeuler.t fails 2 of 15 on the parent commit.

uftp is restored to the openEuler dep_builders. The exclusion stays where it
was meant to be: openSUSE, whose uftp.spec change is not in this tree.

t/target_build_plan.t fails on the parent commit for both openEuler targets and
passes for EL, the forcearch target and both openSUSE releases, so uftp was the
only entry the move lost. prove -j4 t/ and prove -j4 native/ both pass: 29 and
9 files, 1304 and 873 tests.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
The cross-arch Genesis finalize requires every OS directory to carry both
architectures and each one to hold its own xCAT-genesis-base rpm, before it
reaches the SUSE verification loop. Both demands are wrong for a SUSE cell:
cells.tsv gives the sles12 cell x86_64 alone, so its ppc64le peer will never
exist, and openSUSE ships no legacy Genesis, so no openSUSE target builds a
payload.

The test adds a one-arch SUSE cell with no peer and a two-arch SUSE cell with no
Genesis, beside the EL cases that must keep dying for both reasons, and puts a
SUSE cell into the mixed-roots tree so a valid EL finalize is not stopped by one.

It fails 3 of 235 on this commit: the two new cases die on the peer and the
Genesis requirement, and the mixed-roots finalize dies on the SUSE cell.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
The cross-arch Genesis finalize collected every OS directory except openEuler,
then demanded that each one carry both architectures and that each architecture
hold its own xCAT-genesis-base rpm. A SUSE cell satisfies neither: cells.tsv
gives the sles12 cell x86_64 alone, so its ppc64le peer will never exist, and
openSUSE ships no legacy Genesis, so no openSUSE target builds a payload. So
sles12/x86_64 failed for a missing peer and a two-arch sles15 failed for an
absent payload, and a SUSE cell beside a valid EL pair stopped the whole
finalize.

A sles* directory is now collected like an openeuler* one: outside the cross-arch
copy and outside the peer and payload requirements. The skip line names the
directories it passed over, so a cell left out is visible rather than implied.

What still runs for a SUSE cell: the repository cell lock, and the manifest
completeness and repomd signature gate, which mockbuild-all.pl applies to every
finalized cell and already globs sles* beside rh*. What no longer runs: the
foreign-architecture Genesis copy, the peer requirement and the payload
requirement, none of which a family without a legacy payload can satisfy.

The EL cases keep dying for both reasons, which the cases beside the new ones
assert. native/openeuler-srpm.t asserted the old skip message; it now asserts
that the message names the skipped directory and the skip, which is the stronger
claim.

t/mockbuild-all.t fails 3 of 235 on the parent commit. prove -j4 t/ and
prove -j4 native/ pass: 29 and 9 files, 1308 and 874 tests.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>

@viniciusferrao viniciusferrao left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@dhilst
dhilst merged commit 084bee3 into xcat2:master Oct 23, 2026
1 check passed
dhilst added a commit that referenced this pull request Oct 26, 2026
One conflict in MockBuildUtils.pm, and both sides end INSIDE a sub and share the
single closing brace that follows: this branch adds the perl BuildRequires
compat helpers, ending in perl_mock_cfg_text, and master added the forcearch
target table, target_profile and dep_repo_label from xcat-dep/#95. Resolved as
the union with master's block first and its own closing brace, so the shared
brace closes perl_mock_cfg_text. Every sub is defined exactly once.

prove -j4 t/ passes 33 files and 1341 tests.

Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants