Skip to content

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

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

tests: Add cross-consumer staging scenario to loader-entries-source#2330
jmarrero wants to merge 2 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 from acaab26 to 7eb2029 Compare September 13, 2026 21:01
Re-applying a source whose options had not changed still staged a new
deployment whenever anything followed them on the options line:
compute_merged_options removed the old options and appended the new
ones at the end, so the line changed and the idempotency check failed.
That happens as soon as a second source is added or another tool such
as rpm-ostree appends a karg, which is exactly the situation TuneD
re-applying its profile runs into.

Replace the source's options at the position of the first old one
instead.  That also keeps the relative order of kernel arguments
stable, which matters for parameters where the last occurrence wins.

Generated-by: AI
I am knowledgeable in this problem domain and reviewed it carefully.
Cover the case where bootc stages source-tracked kargs and then
rpm-ostree re-stages on the same boot (e.g. `rpm-ostree kargs
--append`).  The replacement staged deployment must inherit the
x-options-source-* keys from the previously staged one, which is the
fallback path fixed in ostreedev/ostree#3611; without it the keys are
dropped and the source can no longer be diffed or removed.

Two fixes to the test along the way: read the source keys from the
entry whose options line carries the booted ostree= karg rather than
whichever entry sorts last, and expect a removed source to leave an
empty tombstone key behind, since set-options-for-source never deletes
keys.

Generated-by: AI
I am knowledgeable in this problem domain and reviewed it carefully.
@jmarrero
jmarrero force-pushed the test-cross-consumer-staging branch from 7eb2029 to 868dec4 Compare September 13, 2026 22:09
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.

1 participant