Skip to content

tests: Add cross-consumer staging scenario to loader-entries-source - #2330

Draft
jmarrero wants to merge 4 commits into
bootc-dev:mainfrom
jmarrero:test-cross-consumer-staging
Draft

jmarrero wants to merge 4 commits into
bootc-dev:mainfrom
jmarrero:test-cross-consumer-staging

Conversation

@jmarrero

@jmarrero jmarrero commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Extend the loader-entries set-options-for-source test to cover the case where bootc stages source-tracked kargs and then rpm-ostree re-stages on the same boot (e.g. via 'rpm-ostree kargs --append'). The replacement staged deployment must inherit the x-options-source-* keys from the previously-staged deployment.

This exercises the 'previously-staged fallback' path in ostree's ostree_sysroot_stage_tree_with_options(), fixed by ostreedev/ostree#3611. Without that fix, this test fails because rpm-ostree's re-staging drops the source keys that bootc set.

Done with AI. Draft while ostree PR closes.

@bootc-bot
bootc-bot Bot requested a review from gursewak1997 July 21, 2026 17:30
jmarrero added a commit to jmarrero/ostree that referenced this pull request Aug 5, 2026
Multi-reboot TMT test that exercises the previously-staged fallback
path in ostree_sysroot_stage_tree_with_options().  Verifies that
x-options-source-* keys set by bootc survive when rpm-ostree re-stages
on the same boot.

This is the ostree-side test for the scenario covered by
bootc-dev/bootc#2330.

Related: ostreedev#3611
jmarrero added a commit to jmarrero/ostree that referenced this pull request Aug 5, 2026
Multi-reboot TMT test that exercises the previously-staged fallback
path in ostree_sysroot_stage_tree_with_options().  Verifies that
x-options-source-* keys set by bootc survive when rpm-ostree re-stages
on the same boot.

This is the ostree-side test for the scenario covered by
bootc-dev/bootc#2330.

Related: ostreedev#3611
jmarrero added a commit to jmarrero/ostree that referenced this pull request Aug 5, 2026
Multi-reboot TMT test that exercises the previously-staged fallback
path in ostree_sysroot_stage_tree_with_options().  Verifies that
x-options-source-* keys set by bootc survive when rpm-ostree re-stages
on the same boot.

This is the ostree-side test for the scenario covered by
bootc-dev/bootc#2330.

Related: ostreedev#3611
jmarrero added a commit to jmarrero/ostree that referenced this pull request Aug 5, 2026
Reapply the bootconfig-extra previously-staged fallback (reverted in
PR ostreedev#3610) with a corrected all-or-nothing fallback chain that fixes
the regression reported in ostreedev#3609.

The original 3-way additive merge gave previously-staged data higher
priority than the merge deployment, which broke bootc's
loader-entries set-options-for-source when called multiple times on
the same boot.

The fix uses a 2-tier fallback:
1. Merge deployment's bootconfig (caller may have updated in-memory)
2. Previously staged deployment's bootconfig-extra (cross-consumer
   fallback for unaware consumers like rpm-ostree)

If tier 1 has any extension keys, those are authoritative and
previously-staged data is ignored.  This prevents stale keys from
overriding fresh updates when the same consumer stages repeatedly.

Also adds a multi-reboot TMT integration test covering:
- Cross-consumer staging (bootc then rpm-ostree)
- Triple coexistence (two bootc sources + rpm-ostree local kargs)
- Source replacement while rpm-ostree kargs are active

Closes: ostreedev#3609
Related: bootc-dev/bootc#2330
jmarrero added a commit to jmarrero/ostree that referenced this pull request Aug 5, 2026
Reapply the bootconfig-extra previously-staged fallback (reverted in
PR ostreedev#3610) with a corrected all-or-nothing fallback chain that fixes
the regression reported in ostreedev#3609.

The original 3-way additive merge gave previously-staged data higher
priority than the merge deployment, which broke bootc's
loader-entries set-options-for-source when called multiple times on
the same boot.

The fix uses a 2-tier fallback:
1. Merge deployment's bootconfig (caller may have updated in-memory)
2. Previously staged deployment's bootconfig-extra (cross-consumer
   fallback for unaware consumers like rpm-ostree)

If tier 1 has any extension keys, those are authoritative and
previously-staged data is ignored.  This prevents stale keys from
overriding fresh updates when the same consumer stages repeatedly.

Also adds a multi-reboot TMT integration test covering:
- Cross-consumer staging (bootc then rpm-ostree)
- Triple coexistence (two bootc sources + rpm-ostree local kargs)
- Source replacement while rpm-ostree kargs are active

Closes: ostreedev#3609
Related: bootc-dev/bootc#2330
jmarrero added a commit to jmarrero/ostree that referenced this pull request Aug 5, 2026
Reapply the bootconfig-extra previously-staged fallback (reverted in
PR ostreedev#3610) with a corrected all-or-nothing fallback chain that fixes
the regression reported in ostreedev#3609.

The original 3-way additive merge gave previously-staged data higher
priority than the merge deployment, which broke bootc's
loader-entries set-options-for-source when called multiple times on
the same boot.

The fix uses a 2-tier fallback:
1. Merge deployment's bootconfig (caller may have updated in-memory)
2. Previously staged deployment's bootconfig-extra (cross-consumer
   fallback for unaware consumers like rpm-ostree)

If tier 1 has any extension keys, those are authoritative and
previously-staged data is ignored.  This prevents stale keys from
overriding fresh updates when the same consumer stages repeatedly.

Also adds a multi-reboot TMT integration test covering:
- Cross-consumer staging (bootc then rpm-ostree)
- Triple coexistence (two bootc sources + rpm-ostree local kargs)
- Source replacement while rpm-ostree kargs are active

Closes: ostreedev#3609
Related: bootc-dev/bootc#2330
@jmarrero
jmarrero force-pushed the test-cross-consumer-staging branch 4 times, most recently from 0756a65 to 9adbe03 Compare September 14, 2026 00:35
@github-actions github-actions Bot added the area/documentation Updates to the documentation label Sep 14, 2026
Re-applying an unchanged source staged a new deployment whenever other
kargs followed its own on the options line: the old options were
removed and the new ones appended at the end, so the line changed.
That happens as soon as a second source or e.g. `rpm-ostree kargs`
adds something after it, which is TuneD re-applying its profile.

Replace the options where the old ones were.  This also keeps kernel
argument order stable, which matters where the last occurrence wins.

Generated-by: AI
I am knowledgeable in this problem domain and reviewed it carefully.
Signed-off-by: Joseph Marrero Corchado <jmarrero@redhat.com>
Upgrade and switch computed kargs from the booted deployment, so a
change that was only staged (`loader-entries set-options-for-source`,
`rpm-ostree kargs`) was silently dropped when the staged deployment
was replaced -- e.g. TuneD applying a profile and an automatic
`bootc upgrade` running before the reboot.  rpm-ostree deliberately
builds on the pending deployment so operations chain; do the same.

Image-provided kargs are unaffected, since the kargs.d diff is applied
relative to whichever deployment we build on.

Generated-by: AI
I am knowledgeable in this problem domain and reviewed it carefully.
Signed-off-by: Joseph Marrero Corchado <jmarrero@redhat.com>
Cover bootc staging source-tracked kargs and rpm-ostree re-staging on
the same boot: the x-options-source-* keys must survive, which is the
fallback fixed in ostreedev/ostree#3611.  Also cover the two bootc
fixes before this: re-applying an unchanged source is a no-op, and a
`bootc switch` on top of a staged source removal keeps the removal.

Along the way, find the booted BLS entry by its ostree= karg instead of
taking the last one, and expect a removed source to leave an empty
tombstone key, since set-options-for-source never deletes keys.

Generated-by: AI
I am knowledgeable in this problem domain and reviewed it carefully.
Signed-off-by: Joseph Marrero Corchado <jmarrero@redhat.com>
kernel-arguments.md still said bootc has no API for per-machine kernel
arguments.  Describe `loader-entries set-options-for-source`: the
ownership keys, how a call is processed, how upgrade/switch and
rpm-ostree interact with it, and what TuneD does with it, with a link
to the ostree documentation for how the keys survive staging.

Generated-by: AI
I am knowledgeable in this problem domain and reviewed it carefully.

Signed-off-by: Joseph Marrero Corchado <jmarrero@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/documentation Updates to the documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant