Skip to content

CNTRLPLANE-4811: trigger rollout on trust bundle ConfigMap content changes - #9007

Open
alokstech wants to merge 2 commits into
openshift:mainfrom
alokstech:feat/rfe-8751-trust-bundle-rollout
Open

alokstech wants to merge 2 commits into
openshift:mainfrom
alokstech:feat/rfe-8751-trust-bundle-rollout

Conversation

@alokstech

@alokstech alokstech commented Jul 14, 2026 •

Copy link
Copy Markdown

Summary

Implements Phase 1 of RFE-8751: roll NodePools when ca-bundle.crt content changes in ConfigMaps referenced by HostedCluster.spec.additionalTrustBundle or HostedCluster.spec.configuration.proxy.trustedCA.

  • Watch referenced ConfigMaps and include CA content in the rollout decision.
  • Build on the rollout/effective-bootstrap state machine introduced by #9818, with a versioned trust-bundle rollout baseline. This supersedes the earlier implementation of the versioned-hash proposal; the old CAPI migration-skip helper is no longer the implementation.
  • Seed nodePoolCurrentRolloutConfigV2 and record nodePoolConfigHashVersion=v2 without replacing existing workers solely because the hash formula changed. Preserve completed payload hashes and bootstrap Secret references.
  • Preserve legitimate configuration/release rollouts and refresh retained bootstrap tokens. Karpenter persists a separate content baseline on its durable NodeClass while retaining bootstrap/drift identity during formula-only migration.
  • Validate the actual rendered trust bundle before caching ignition payloads, and detect capabilities from the selected CPO image.
  • Include regression tests, E2E coverage, and rollout documentation.

In-place pull-secret edits remain outside the rollout trigger. Switching additionalTrustBundle to another ConfigMap with identical content does not itself trigger a rollout. For proxy.trustedCA, reference-name changes remain rollout-relevant through proxy configuration.

Upgrade behavior and requirements

On the first reconcile after migration, current CA content is absorbed into the versioned rollout baseline, including CA edits made under the same ConfigMap name before upgrading HO. This does not rewrite the completed payload identity or propagate a new bootstrap Secret reference solely for migration.

Subsequent CA-content changes trigger an intended rollout. Management-only image changes do not themselves trigger a rollout; other rollout-relevant configuration or release changes still do. In-progress rollouts retain their deployed target, while a newer release request can supersede it. These guarantees concern formula-only migration, not a promise that every cluster upgrade is rollout-free.

Trust-bundle reconciliation requires a CPO/ignition-server image advertising io.openshift.hypershift.control-plane-operator-manages.rendered-trust-bundle-validation. Updating HO alone is insufficient with an unsupported CPO. Older CPOs require the validation backport and capability label. Unsupported configurations stop trust-bundle reconciliation before bootstrap changes or old-token cleanup.

See docs/content/reference/nodepool-rollouts.md for the current behavior.

Latest manual AWS validation — October 26, 2026

Fresh AWS HostedClusters in ap-south-1, release 5.0.0-rc.7-x86_64, each with one two-worker NodePool and additionalTrustBundle configured:

  1. clusters/rfe8751-legacy-rc7: legacy pre-CNTRLPLANE-3632: Predictable NodePool rollout control #9818 HO → PR HO.
  2. clusters-upstream/rfe8751-upstream-rc7: upstream HO at 6cc7c191a4 (containing CNTRLPLANE-3632: Predictable NodePool rollout control #9818) → PR HO.

For each path:

  1. Create workers with CA A on the baseline HO.
  2. Edit the existing ConfigMap to CA B without changing its name, before upgrading HO.
  3. Upgrade to the PR HO and verify V2 baseline seeding, unchanged Machine UIDs/EC2 IDs and MachineDeployment/MachineSet bootstrap references, and UpdatingConfig=False.
  4. Edit the same ConfigMap to CA C after migration and verify both original workers are replaced.
  5. Verify two healthy, up-to-date workers, UpdatingConfig=False, UpdatingVersion=False, and a Completed/Available HostedCluster.

Both paths passed. For the post-#9818 path, EC2 instances i-0184a7fa94a3253f0 and i-01f158ab86e735a5f survived migration; only the subsequent CA edit replaced them with i-04e52e3a07101cb32 and i-06abfc83b30f84540.

Live tests used feature source 2aad9d372b. The subsequent rebase produced 28f837e92e; git range-diff confirmed the feature patch was unchanged. Targeted NodePool, ignition-server, and Karpenter tests passed after rebasing.

Compatibility caveat: these live tests used a test-only CPO adjustment omitting machine-approver's unsupported --tls-curve-preferences flag on rc.7, tracked by OCPBUGS-129486. Other TLS arguments were retained. This workaround is not included in this PR. The tests validate trust-bundle behavior with that adjustment, not an entirely unmodified CPO/release combination. No manual CSR approval was used to complete the replacements.

Test plan and evidence scope

  • Current targeted unit/regression suites: NodePool, ignition-server, and Karpenter ignition controllers.
  • Latest manual AWS: legacy pre-CNTRLPLANE-3632: Predictable NodePool rollout control #9818 HO → PR HO preserves workers despite a pre-upgrade in-place CA edit.
  • Latest manual AWS: post-CNTRLPLANE-3632: Predictable NodePool rollout control #9818 upstream HO → PR HO preserves workers despite a pre-upgrade in-place CA edit.
  • Latest manual AWS: a subsequent CA-content edit replaces both workers on each path; both NodePools finish healthy.
  • E2E trust-bundle content-change coverage is included in the PR. Earlier execution evidence is historical, as described below.
  • Required CI: pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator on the current revision. Manual testing does not replace this presubmit.
  • Complete the remaining image-pipeline and E2E CI checks. Failed image builds are not successful E2E validation.

The latest two-cluster run exercised regular AWS NodePools with additionalTrustBundle; it does not claim fresh live coverage of every proxy, Karpenter, pull-secret, or failure-recovery scenario after the implementation refactor.

Historical validation — earlier implementations

The following results were recorded on earlier revisions. They are retained for context, not presented as fresh validation of the current #9818-based implementation:

  • rfe8751-upgnoroll, image rollout-fix-2: migration preserved instance i-0662f531572cf1e87; a later content edit rolled to i-0609945fceacfd9f6.
  • rfe8751-legacy-pre, image rfe8751-squash-test: a pre-upgrade CA edit plus HO upgrade preserved i-0761141a949fe27f2; a post-migration edit rolled to i-026a47dd5cee4a78c. An in-place pull-secret edit did not roll that worker.
  • rfe8751-e2e: the earlier NodePoolTrustBundleTest run (label nodepool-trust-bundle) exercised an in-place CA edit and rollout.
  • rfe8751-test: earlier review-fix testing covered Karpenter/AutoNode migration identity preservation, regular NodePool no-roll migration, a legitimate global proxy configuration change, continued reconciliation of retained bootstrap Secret pairs, and ignition rejection of mismatched content followed by serving the new CA. The earlier Karpenter identity was 0c371586; the served new CA fingerprint was 07:9D:FC:B1:F6:8A:C9:64:FB:F4:4F:6A:A0:9E:84:BE:A9:76:C1:B3:80:60:44:20:84:15:C4:52:43:96:A6:21.

Historical skip-log messages and annotation-rewrite descriptions apply to those earlier revisions, not the current implementation.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: LGTM mode

@openshift-ci openshift-ci Bot added do-not-merge/needs-area needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. labels Jul 14, 2026
@openshift-ci
openshift-ci Bot requested review from Nirshal and devguyio July 14, 2026 15:39
@openshift-ci openshift-ci Bot added needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. area/documentation Indicates the PR includes changes for documentation labels Jul 14, 2026
@openshift-ci

openshift-ci Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Hi @alokstech. Thanks for your PR.

I'm waiting for a openshift member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work.

Tip

We noticed you've done this a few times! Consider joining the org to skip this step and gain /lgtm and other bot rights. We recommend asking approvers on your previous PRs to sponsor you.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci openshift-ci Bot added area/hypershift-operator Indicates the PR includes changes for the hypershift operator and API - outside an OCP release and removed do-not-merge/needs-area labels Jul 14, 2026
@coderabbitai

coderabbitai Bot commented Jul 14, 2026 •

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
Walkthrough

NodePool rollout configuration now hashes ca-bundle.crt content from referenced additional-trust-bundle and proxy trusted-CA ConfigMaps. ConfigMap events enqueue matching NodePools. Migration seeds content-based hashes without an immediate rollout. Trust-bundle errors update NodePool conditions without retry backoff. Secret propagation and cleanup preserve migration behavior. Tests and documentation cover the updated behavior.

Sequence Diagram(s)

sequenceDiagram
  participant ConfigMap
  participant NodePoolController
  participant HostedCluster
  participant NodePool
  participant ConfigGenerator
  ConfigMap->>NodePoolController: update referenced trust bundle
  NodePoolController->>HostedCluster: inspect trust-bundle references
  HostedCluster-->>NodePoolController: identify matching NodePools
  NodePoolController->>NodePool: enqueue reconciliation
  NodePool->>ConfigGenerator: generate rollout configuration
  ConfigGenerator->>ConfigMap: read ca-bundle.crt
  ConfigMap-->>ConfigGenerator: return bundle content
  ConfigGenerator->>NodePool: calculate rollout hash
Loading

Possibly related PRs

Suggested reviewers: devguyio, csrwng, bryan-cox

Pre-merge checks: Passed 11
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Stable And Deterministic Test Names Passed The aggregate PR diff adds no Ginkgo title calls; NodePool tests use static Go Test names and literal t.Run case names, with no dynamic identifiers.
Test Structure And Quality Passed The changed tests use standard testing.T subtests with Gomega, not Ginkgo Describe/It suites; they use in-memory fake clients and contain no cluster waits requiring timeouts or cleanup.
Topology-Aware Scheduling Compatibility Passed The changed production code only updates rollout hashing, ConfigMap watching, and secret migration; no new scheduling constraints, replica derivation, selectors, tolerations, affinity, spread, or P...
Ipv6 And Disconnected Network Test Compatibility Passed The PR adds only standard Go unit tests under nodepool; it adds no Ginkgo e2e tests, IPv4 assumptions, or external connectivity requirements.
No-Weak-Crypto Passed The PR adds no MD5, SHA-1, DES, RC4, Blowfish, ECB, custom cryptography, or secret/token comparisons; it uses existing non-cryptographic FNV-1a for rollout hashes.
Container-Privileges Passed The PR changes no YAML, Dockerfile, or Containerfile manifests. Added-line and AST searches found no privileged, host namespace, SYS_ADMIN, root, or allowPrivilegeEscalation settings.
No-Sensitive-Data-In-Logs Passed Changed logs record resource names, hashes, release image, and wrapped ConfigMap errors; review found no logging of Secret data, CA-bundle content, passwords, tokens, or API keys.
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the main change: triggering NodePool rollouts when trust bundle ConfigMap content changes.
✨ Finishing Touches: 💡 1
⚔️ Resolve merge conflicts: 💡
  • Resolve merge conflict in branch feat/rfe-8751-trust-bundle-rollout
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@hypershift-jira-solve-ci

Copy link
Copy Markdown
Contributor

I now have a complete picture. Here is the analysis:

Test Failure Analysis Complete

Job Information

Test Failure Analysis

Error

tide: Not mergeable. PR has a merge conflict.
mergeable: CONFLICTING | mergeable_state: dirty | rebaseable: false

Summary

No CI tests ran. The PR branch (feat/rfe-8751-trust-bundle-rollout, last committed 2026-07-12) has git merge conflicts with the current main branch, caused by two commits that landed on main on 2026-07-09 and 2026-07-13 modifying the same ConfigGenerator.Hash() / HashWithoutVersion() functions in config.go. Tide correctly blocks the merge and all CI test jobs remain in "pending — Waiting for pipeline condition to trigger" because the branch cannot be cleanly merged. All 10 CI presubmit jobs (e2e-aks, e2e-aws, e2e-v2-aws, etc.) are gated behind tide and will not start until the conflicts are resolved.

Root Cause

The root cause is git merge conflicts in two files, not a product bug or test failure:

  1. hypershift-operator/controllers/nodepool/config.go — 2 conflict regions:

    • Hash() function (line ~177): The PR replaces cg.additionalTrustBundleName with cg.additionalTrustBundleHash + cg.proxyTrustedCAHash (to hash ConfigMap content instead of names). Meanwhile, commit ef295ce77f on main (2026-07-13, by Salvatore Dario Minonne) added + cg.rhelStream to the same hash expression. Both changes modify the same line.
    • HashWithoutVersion() function (line ~189): Same conflict pattern — the PR adds trust bundle hash fields and new helper functions (rolloutTrustBundleHashes, configMapCABundleHash, hostedClusterReferencesConfigMap), while main added cg.rhelStream.
  2. hypershift-operator/controllers/nodepool/config_test.go — 1 conflict region:

    • Test case expected hashes (line ~402): The "When additionalTrustBundle is specified" test case has different expected hash values because the hash inputs changed differently on each branch (PR: "1ec69ac9"/"7b5702f4" vs main: "632801f8"/"71375893").

Conflicting commits on main:

  • b1b0e9acdd (2026-07-09): "feat(nodepool): integrate osImageStream into NodePool controller" — added osImageStream concept to config generation
  • ef295ce77f (2026-07-13): "feat(nodepool): thread streamName and wire usesRunc detection into RHEL stream resolution" — added cg.rhelStream to the config hash

The PR branch was last committed on 2026-07-12, so it missed commit ef295ce77f which landed on 2026-07-13 — one day before the PR was opened (2026-07-14).

Recommendations
  1. Rebase the PR branch onto current main to resolve the merge conflicts:

    git fetch upstream main
    git rebase upstream/main
  2. Resolve the conflicts in config.go by combining both changes — the Hash() and HashWithoutVersion() functions need to include both the new cg.rhelStream field (from main) and the cg.additionalTrustBundleHash + cg.proxyTrustedCAHash fields (from the PR), replacing cg.additionalTrustBundleName. The merged Hash() should look like:

    return supportutil.HashSimple(cg.mcoRawConfig + cg.releaseImage.Version() + cg.pullSecretName + cg.additionalTrustBundleHash + cg.proxyTrustedCAHash + cg.globalConfig + cg.rhelStream)
  3. Update test expected hashes in config_test.go — after merging the hash inputs, the expected hash values will change. Recompute them by running the tests locally after resolving conflicts.

  4. Force-push the rebased branch and wait for CI to trigger the full presubmit suite.

Evidence
Evidence Detail
Tide status Not mergeable. PR has a merge conflict.
GitHub merge state mergeable: false, mergeable_state: dirty, rebaseable: false
Conflicting file 1 hypershift-operator/controllers/nodepool/config.go — 2 conflict regions at lines ~177 and ~189 (Hash() and HashWithoutVersion() functions)
Conflicting file 2 hypershift-operator/controllers/nodepool/config_test.go — 1 conflict region at line ~402 (expected hash values)
Conflicting commit (main) ef295ce77f (2026-07-13, Salvatore Dario Minonne): "feat(nodepool): thread streamName and wire usesRunc detection into RHEL stream resolution" — added cg.rhelStream to hash
Earlier related commit (main) b1b0e9acdd (2026-07-09): "feat(nodepool): integrate osImageStream into NodePool controller"
PR branch last commit 51b6ae94 (2026-07-12) — one day before the conflicting commit landed on main
CI presubmit jobs All 10 jobs (e2e-aks, e2e-aws, e2e-v2-aws, etc.) stuck in pending — Waiting for pipeline condition to trigger
Nature of conflict Both branches modify the same hash expression in ConfigGenerator.Hash() — PR adds trust bundle content hashing, main adds RHEL stream to the hash

@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 14, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
hypershift-operator/controllers/nodepool/token.go (1)

57-62: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Clarify the scope of these hashes These values are written to the token Secret for change detection, not to the NodePool rollout hash. pullSecretHash still tracks pull-secret content separately from the rollout path, so this wording implies rollout behavior that the code does not have.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hypershift-operator/controllers/nodepool/token.go` around lines 57 - 62,
Update the comment above pullSecretHash, additionalTrustBundleHash, and
globalConfigHash to state that these hashes are written to the token Secret for
change detection, not included in the NodePool rollout config hash. Clarify that
pullSecretHash tracks pull-secret content separately, and remove the inaccurate
claim that these values trigger NodePool rollouts.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@hypershift-operator/controllers/nodepool/config.go`:
- Around line 137-163: Update rolloutTrustBundleHashes and configMapCABundleHash
so missing or malformed trust-bundle ConfigMaps are represented as a degraded
HostedCluster condition rather than propagated as a hard NodePool reconciliation
error. Preserve successful hash calculation, and ensure NewConfigGenerator or
its caller records the degraded state while allowing reconciliation to continue
through transient delete/recreate windows.

---

Outside diff comments:
In `@hypershift-operator/controllers/nodepool/token.go`:
- Around line 57-62: Update the comment above pullSecretHash,
additionalTrustBundleHash, and globalConfigHash to state that these hashes are
written to the token Secret for change detection, not included in the NodePool
rollout config hash. Clarify that pullSecretHash tracks pull-secret content
separately, and remove the inaccurate claim that these values trigger NodePool
rollouts.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Enterprise

Run ID: b8ad4e64-1086-4660-99e7-3eb0dff885ce

📥 Commits

Reviewing files that changed from the base of the PR and between a84834f and 51b6ae9.

⛔ Files ignored due to path filters (1)
  • docs/content/reference/aggregated-docs.md is excluded by !docs/content/reference/aggregated-docs.md
📒 Files selected for processing (7)
  • docs/content/reference/nodepool-rollouts.md
  • hypershift-operator/controllers/nodepool/config.go
  • hypershift-operator/controllers/nodepool/config_test.go
  • hypershift-operator/controllers/nodepool/config_trustbundle_test.go
  • hypershift-operator/controllers/nodepool/nodepool_controller.go
  • hypershift-operator/controllers/nodepool/token.go
  • hypershift-operator/controllers/nodepool/token_test.go

Comment thread hypershift-operator/controllers/nodepool/config.go
Comment thread hypershift-operator/controllers/nodepool/token.go Outdated
Comment thread hypershift-operator/controllers/nodepool/config.go Outdated
Comment thread hypershift-operator/controllers/nodepool/nodepool_controller.go
Comment thread hypershift-operator/controllers/nodepool/token.go Outdated
Comment thread hypershift-operator/controllers/nodepool/config.go Outdated
Comment thread hypershift-operator/controllers/nodepool/nodepool_controller.go
@Nirshal

Nirshal commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

/ok-to-test

@openshift-ci openshift-ci Bot added ok-to-test Indicates a non-member PR verified by an org member that is safe to test. and removed needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Aug 4, 2026
@codecov

codecov Bot commented Aug 4, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 78.80000% with 53 lines in your changes missing coverage. Please review.
✅ Project coverage is 52.40%. Comparing base (364a78f) to head (c5d1df7).
⚠️ Report is 2 commits behind head on main.

Files with missing lines Patch % Lines
hypershift-operator/controllers/nodepool/config.go 87.23% 9 Missing and 3 partials ⚠️
...erator/controllers/nodepool/nodepool_controller.go 72.97% 8 Missing and 2 partials ⚠️
...rshift-operator/controllers/nodepool/conditions.go 73.07% 7 Missing ⚠️
hypershift-operator/controllers/nodepool/token.go 81.08% 5 Missing and 2 partials ⚠️
karpenter-operator/main.go 0.00% 7 Missing ⚠️
.../karpenterignition/karpenterignition_controller.go 71.42% 4 Missing and 2 partials ⚠️
...ition-server/controllers/local_ignitionprovider.go 66.66% 2 Missing ⚠️
ignition-server/cmd/run_local_ignitionprovider.go 0.00% 1 Missing ⚠️
...ition-server/controllers/tokensecret_controller.go 95.23% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9007      +/-   ##
==========================================
+ Coverage   52.31%   52.40%   +0.08%     
==========================================
  Files         826      826              
  Lines      105380   105583     +203     
==========================================
+ Hits        55130    55327     +197     
+ Misses      46728    46720       -8     
- Partials     3522     3536      +14     
Files with missing lines Coverage Δ
ignition-server/controllers/cache.go 100.00% <ø> (ø)
ignition-server/cmd/run_local_ignitionprovider.go 0.00% <0.00%> (ø)
...ition-server/controllers/tokensecret_controller.go 69.48% <95.23%> (+1.65%) ⬆️
...ition-server/controllers/local_ignitionprovider.go 43.09% <66.66%> (+0.22%) ⬆️
.../karpenterignition/karpenterignition_controller.go 66.19% <71.42%> (+0.55%) ⬆️
...rshift-operator/controllers/nodepool/conditions.go 73.00% <73.07%> (+0.68%) ⬆️
hypershift-operator/controllers/nodepool/token.go 87.75% <81.08%> (-0.57%) ⬇️
karpenter-operator/main.go 0.00% <0.00%> (ø)
...erator/controllers/nodepool/nodepool_controller.go 60.38% <72.97%> (+2.46%) ⬆️
hypershift-operator/controllers/nodepool/config.go 83.08% <87.23%> (+0.48%) ⬆️
Flag Coverage Δ
cmd-support 46.67% <ø> (ø)
cpo-hostedcontrolplane 54.69% <ø> (ø)
cpo-other 56.94% <ø> (ø)
hypershift-operator 60.70% <81.44%> (+0.23%) ⬆️
other 39.56% <69.64%> (+0.16%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 7, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@hypershift-operator/controllers/nodepool/config_hash_migration_test.go`:
- Around line 54-128: Add a table-driven case in the config hash migration tests
using an empty additional trust bundle and a nonempty proxyTrustedCAHash, with
matching legacy annotations. Verify migration seeds both current-config
annotations with hashes incorporating the proxy trusted-CA value and confirm
UpdatingConfig remains unset.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: dc476609-2b7d-489a-a361-adb4a366a991

📥 Commits

Reviewing files that changed from the base of the PR and between 04bdfc8 and a5afe55.

⛔ Files ignored due to path filters (1)
  • docs/content/reference/aggregated-docs.md is excluded by !docs/content/reference/aggregated-docs.md
📒 Files selected for processing (7)
  • docs/content/reference/nodepool-rollouts.md
  • hypershift-operator/controllers/nodepool/capi.go
  • hypershift-operator/controllers/nodepool/conditions.go
  • hypershift-operator/controllers/nodepool/config_hash_migration.go
  • hypershift-operator/controllers/nodepool/config_hash_migration_test.go
  • hypershift-operator/controllers/nodepool/nodepool_controller.go
  • hypershift-operator/controllers/nodepool/secret_janitor.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • hypershift-operator/controllers/nodepool/conditions.go

Comment thread hypershift-operator/controllers/nodepool/config_hash_migration_test.go Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
hypershift-operator/controllers/nodepool/nodepool_controller.go (1)

976-977: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Handle HostedCluster lookup failures in the ConfigMap mapper.

In enqueueNodePoolsForConfig, any r.Get error on the HostedCluster lookup skips that NodePool, including transient cache/API failures during in-place trust-bundle updates. Also return a reconcilation error for non-NotFound failures here so the ConfigMap event does not get silently dropped.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hypershift-operator/controllers/nodepool/nodepool_controller.go` around lines
976 - 977, Update enqueueNodePoolsForConfig so HostedCluster lookup errors are
handled explicitly: continue skipping the NodePool for NotFound, but return the
non-NotFound error so transient cache or API failures propagate as
reconciliation errors instead of being silently dropped.

Source: Path instructions

🧹 Nitpick comments (1)
hypershift-operator/controllers/nodepool/nodepool_controller.go (1)

969-972: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Rename the shadowing ok variable.

Line 970 shadows the ok variable from the ConfigMap type assertion. Use a name such as seenAlready.

Proposed fix
-		if _, ok := seen[req.String()]; ok {
+		if _, seenAlready := seen[req.String()]; seenAlready {

As per coding guidelines, **/*.go says “Avoid variable shadowing.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@hypershift-operator/controllers/nodepool/nodepool_controller.go` around lines
969 - 972, Rename the `ok` result in the `seen` map lookup within the nodepool
reconciliation loop to a non-shadowing name such as `seenAlready`, and update
the conditional to use it while preserving the existing continue behavior.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@hypershift-operator/controllers/nodepool/nodepool_controller.go`:
- Around line 976-977: Update enqueueNodePoolsForConfig so HostedCluster lookup
errors are handled explicitly: continue skipping the NodePool for NotFound, but
return the non-NotFound error so transient cache or API failures propagate as
reconciliation errors instead of being silently dropped.

---

Nitpick comments:
In `@hypershift-operator/controllers/nodepool/nodepool_controller.go`:
- Around line 969-972: Rename the `ok` result in the `seen` map lookup within
the nodepool reconciliation loop to a non-shadowing name such as `seenAlready`,
and update the conditional to use it while preserving the existing continue
behavior.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Central YAML (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 61d3b347-f492-45c1-8788-ea0dcf13868a

📥 Commits

Reviewing files that changed from the base of the PR and between a5afe55 and 601fb0a.

📒 Files selected for processing (4)
  • hypershift-operator/controllers/nodepool/config.go
  • hypershift-operator/controllers/nodepool/config_hash_migration_test.go
  • hypershift-operator/controllers/nodepool/nodepool_controller.go
  • hypershift-operator/controllers/nodepool/token.go
🚧 Files skipped from review as they are similar to previous changes (2)
  • hypershift-operator/controllers/nodepool/config_hash_migration_test.go
  • hypershift-operator/controllers/nodepool/config.go

@alokstech
alokstech force-pushed the feat/rfe-8751-trust-bundle-rollout branch from 601fb0a to b4a7c40 Compare August 7, 2026 15:44
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Aug 7, 2026
@alokstech
alokstech requested a review from Nirshal August 11, 2026 07:00

@Nirshal Nirshal left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Took another look at the test coverage after the migration changes. The new pure-function tests are solid. A few areas could use additional coverage:

Comment thread hypershift-operator/controllers/nodepool/secret_janitor.go Outdated
Comment thread hypershift-operator/controllers/nodepool/config_hash_migration_test.go Outdated
Comment thread hypershift-operator/controllers/nodepool/capi.go Outdated
Comment thread hypershift-operator/controllers/nodepool/config_trustbundle_test.go
@alokstech
alokstech requested a review from Nirshal August 12, 2026 15:23
@Nirshal

Nirshal commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

/lgtm

@sdminonne

Copy link
Copy Markdown
Contributor

The duplicate reconcileConfigHashAnnotations concern from my Oct 1 comment was addressed — it's now called once in reconcile() before updatingConfigCondition and CAPI. However, a similar pattern remains:

updatingConfigCondition (conditions.go:478) calls r.token() to rebuild a full Token (which internally creates a new ConfigGenerator, fetches Secrets, ConfigMaps, release image metadata) just to compute token.HashWithoutVersion(). But reconcile() already has both token and configGenerator at the point where updatingConfigCondition is now called explicitly (line ~477 of nodepool_controller.go).

Before this PR, updatingConfigCondition lived in the generic conditions loop with signature func(ctx, nodePool, hcluster), so it had to be self-contained. Now that it's called inline in reconcile() — after the token is already built — threading the pre-computed targetConfigHash through would avoid the redundant rebuild.

Not blocking, but worth addressing in a follow-up.

For AI agents: in nodepool_controller.go, reconcile() already computes targetConfigHash via token.HashWithoutVersion() at line ~473. Pass this value into updatingConfigCondition (changing its signature to accept targetConfigHash string) instead of having it call r.token() internally. Remove the r.token() call and the token.HashWithoutVersion() computation from updatingConfigCondition in conditions.go. Note that updatingConfigCondition is no longer in the generic signalConditions loop, so the signature change does not break any other call site. Update any tests that call updatingConfigCondition directly to pass the pre-computed hash.

@alokstech
alokstech force-pushed the feat/rfe-8751-trust-bundle-rollout branch 2 times, most recently from 58d1cf2 to 7c6d698 Compare October 7, 2026 13:15
@github-actions
github-actions Bot temporarily deployed to docs-preview/pr-9007 October 7, 2026 13:18 Inactive
@openshift-ci openshift-ci Bot added area/control-plane-operator Indicates the PR includes changes for the control plane operator - in an OCP release area/karpenter-operator Indicates the PR includes changes related to the Karpenter operator labels Oct 7, 2026
@alokstech

Copy link
Copy Markdown
Author

/retest

@red-hat-konflux

Copy link
Copy Markdown
Contributor

All PipelineRuns for this commit have already succeeded. Use /retest <pipeline-name> to re-run a specific pipeline or /test to re-run all pipelines.

@alokstech
alokstech force-pushed the feat/rfe-8751-trust-bundle-rollout branch from 7c6d698 to 25d4761 Compare October 13, 2026 16:08
@github-actions
github-actions Bot temporarily deployed to docs-preview/pr-9007 October 13, 2026 16:11 Inactive
@alokstech
alokstech force-pushed the feat/rfe-8751-trust-bundle-rollout branch from 25d4761 to 75ae906 Compare October 13, 2026 16:17
@github-actions
github-actions Bot temporarily deployed to docs-preview/pr-9007 October 13, 2026 16:21 Inactive
@celebdor celebdor changed the title feat(nodepool): trigger rollout on trust bundle ConfigMap content changes CNTRLPLANE-4811: trigger rollout on trust bundle ConfigMap content changes Oct 26, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Oct 26, 2026
@openshift-ci-robot

openshift-ci-robot commented Oct 26, 2026 •

Copy link
Copy Markdown

@alokstech: This pull request references CNTRLPLANE-4811 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "5.1.0" version, but no target version was set.

Details

In response to this:

Summary

Fixes RFE-8751 (Phase 1): NodePool rollouts now react to in-place changes of ca-bundle.crt content in ConfigMaps referenced by HostedCluster.spec.additionalTrustBundle and HostedCluster.spec.configuration.proxy.trustedCA, not only reference name changes.

  • Hash trust-bundle ConfigMap content in the NodePool rollout config hash
  • Watch HC-referenced ConfigMaps and enqueue NodePools on in-place updates
  • Soft-fail missing/malformed trust-bundle ConfigMaps as ValidMachineConfig=False (no hard reconcile loop failure)
  • Introduce versioned NodePool config hash (nodePoolConfigHashVersion v1→v2) so HO upgrade from name-based to content-based trust-bundle hashing does not roll Nodes
  • Wire configHashReconcileOutcome into CAPI so user-data Secret propagation is skipped only after version migration or when config+version already match the baseline
  • Update rollout documentation
  • Add unit tests

Pull secret behavior is unchanged: in-place pull secret edits still do not trigger a NodePool rollout.

Implementation follows the versioned config hash approach in csrwng's proposal.

HyperShift Operator upgrade — no node roll on hash formula change

This change replaces the rollout hash input for trust bundles from ConfigMap name to ConfigMap content hash. Fleets that already reference a trust bundle would otherwise see a hash delta and roll Nodes even when PEM bytes are unchanged.

Scenario Node rollout?
HO upgrade on clusters without additionalTrustBundle / proxy.trustedCA No — hash inputs remain empty
First HO upgrade on clusters with trust-bundle references (CA content unchanged) No — controller migrates config hash v1→v2 and rewrites current-config annotations as the new baseline
First HO upgrade on clusters where ca-bundle.crt was edited in place on legacy HO (same ConfigMap name, content differs from nodes) No — stored v1 annotations still match the v1 (name-only) formula; migration to v2 rewrites baseline without UpdatingConfig
Subsequent HO image upgrades (same content-hash logic, no new trust-bundle change) No
In-place edit of ca-bundle.crt after migration to this HO Yes (intended RFE-8751 behavior)

Migration details (see docs/content/reference/nodepool-rollouts.md and config_hash_version.go):

  1. reconcileConfigHashAnnotations compares the NodePool's stored hash against the hash computed at the stored formula version (nodePoolConfigHashVersion)
  2. Version-only change (v1→v2) rewrites annotations to the current formula without setting UpdatingConfig
  3. shouldSkipUserDataSecretPropagation (via SetConfigHashReconcileOutcome in CAPI) suppresses user-data Secret name updates when config+version already match the baseline after migration
  4. liveBootstrapSecretNames janitor preserves live MachineDeployment/MachineSet bootstrap Secrets until a real config change moves DataSecretName forward

e2e-aws-upgrade-hypershift-operator covers HO upgrade without spurious rolls on default test clusters (no trust bundle). Trust-bundle content rollout is covered by e2e v2 NodePoolTrustBundleTest (in-place ca-bundle.crt change), unit tests, and the manual AWS validation below.

Manual testing (AWS)

Mgmt cluster kubeconfig: AWS ap-south-1, OIDC bucket alosingh-hcp-oidc.

1) HO upgrade / formula migration → no roll (rfe8751-upgnoroll)

Cluster created on stock HO with additionalTrustBundle, then upgraded to PR HO image rollout-fix-2:

  • nodePoolConfigHashVersion stayed v2; UpdatingConfig=False
  • Same worker instance (i-0662f531572cf1e87) before and after upgrade
  • HO logs showed skip user-data Secret propagation

2) Legacy in-place bundle edit, then HO upgrade → no roll (required fleet scenario)

Validates existing NodePools that already had trust-bundle content changed without a ConfigMap name change while on stock HO (legacy behavior: no rollout, annotations still v1/name-based):

  1. On stock HO: HostedCluster with additionalTrustBundle; NodePool Ready.
  2. Patch ca-bundle.crt in the referenced ConfigMap in place (same ConfigMap name / HC reference).
  3. Confirm no rollout: UpdatingConfig=False, same Machine/provider ID, NodePool config annotations unchanged.
  4. Upgrade management cluster to this PR HO.
  5. Confirm still no rollout: nodePoolConfigHashVersion → v2, annotations rewritten to content-based baseline, UpdatingConfig=False, same Machines.
  6. Only a new in-place ca-bundle.crt edit after step 4 should roll Nodes.

Validated (rfe8751-legacy-pre, PR HO rfe8751-squash-test): steps 1–5 — no roll on i-0761141a949fe27f2 (hash a295fa11→9764e5e5, v2); step 6 — roll to i-026a47dd5cee4a78c (ecba48a1).

3) Content change after migration → roll (rfe8751-upgnoroll)

In-place patch of user-ca-bundle ca-bundle.crt after PR HO is running:

  • UpdatingConfig=True → new worker instance (i-0609945fceacfd9f6)
  • Config hash f5efa13c → 357b3e19; settled with UpdatingConfig=False

4) P1 review-fix validation (Karpenter/AutoNode + ignition-server, rfe8751-test)

Follow-up fixes for 4 P1 issues raised in review on the v1→v2 config-hash migration, live-validated end-to-end on a fresh AWS HostedCluster (rfe8751-test, Karpenter/AutoNode enabled, additionalTrustBundle configured, regular + Karpenter-managed NodePools):

Fix 1 — Karpenter formula-migration pinning. Upgraded the HostedCluster Operator from a simulated pre-fix (v1-only) image to this PR's fixed (v2-aware) image. The OpenshiftEC2NodeClass's nodeClassCurrentConfigVersion annotation stayed byte-identical (0c371586) across the upgrade despite the underlying hash formula changing, and karpenter-operator logs showed "result":"unchanged" for the affected token/user-data Secrets and "op":"unchanged" for the EC2NodeClass itself — confirming the formula-only migration does not cause spurious Karpenter Node/EC2NodeClass drift.

Fix 1 (regular-NodePool analogue). Same HO upgrade against the non-Karpenter NodePool: the config-hash-version annotation flipped v1→v2 and the version-hash annotation changed, but the underlying CAPI Machine objects were not replaced (unchanged age, MachineDeployment stayed RollingOut=False/MachinesUpToDate=True).

Fix 3 — globalConfig-only change must not be skipped. Patched spec.configuration.proxy.httpProxy/httpsProxy (a change that affects globalConfig but not additionalTrustBundleHash/proxyTrustedCAHash). HO logs correctly transitioned from "Skipping user-data Secret propagation; config and version unchanged" (expected for the earlier formula-only migration) to "New user data Secret has been generated" (expected for this genuine content change) — confirming the migration-skip condition doesn't over-match and swallow real globalConfig-only changes.

Fix 2 — keep refreshing the legacy, still-referenced bootstrap Secret pair. Across the migration window, the legacy (pre-migration hash) token/user-data Secret pair continued to be actively reconciled (44 "unchanged" + 2 "created" results over many reconcile cycles) rather than being neglected once a newer target hash existed.

Fix 4 — ignition-server must not serve a stale cached trust-bundle payload. Changed the user-ca-bundle ConfigMap content (same ConfigMap name, new CA cert CN=rfe8751-test-ca-v2). Observed two layers of evidence: (a) fail-closed detection — ignition-server correctly errored (additionalTrustBundle does not match hash) rather than silently serving mismatched content for Secrets whose stored hash predated the change; (b) once the NodePool controller generated a fresh Secret matching the new content's hash, fetched its ignition payload directly over HTTP and confirmed the served /etc/pki/ca-trust/source/anchors/openshift-config-user-ca-bundle.crt file's SHA-256 fingerprint (07:9D:FC:B1:F6:8A:C9:64:FB:F4:4F:6A:A0:9E:84:BE:A9:76:C1:B3:80:60:44:20:84:15:C4:52:43:96:A6:21) exactly matched the new CA cert, not a stale cached one.

Test plan

  • Unit tests (TestReconcileConfigHashAnnotations, TestShouldSkipUserDataSecretPropagation, trust-bundle hashing, enqueue, soft-fail ValidMachineConfig, CAPI skip propagation, janitor)
  • Unit tests: v1 annotations still match stored formula when only trust-bundle content changed (name unchanged) → version migration without ConfigActuallyChanged
  • Manual AWS: in-place additionalTrustBundle content edit after PR HO triggers NodePool rollout
  • Manual AWS: v1→v2 config hash migration on HO upgrade does not replace Machines
  • Manual AWS: legacy in-place trust-bundle content edit on stock HO (name unchanged), then HO upgrade — no rollout on existing NodePools (steps in §2 above; validated rfe8751-legacy-pre: stock patch + upgrade kept i-0761141a949fe27f2, post-migration edit rolled to i-026a47dd5cee4a78c)
  • pull-ci-openshift-hypershift-main-e2e-aws-upgrade-hypershift-operator (CI presubmit)
  • Pull secret in-place edit regression (should not roll nodes) — validated on rfe8751-legacy-pre: in-place .dockerconfigjson patch, no roll (i-026a47dd5cee4a78c, hash ecba48a1)
  • e2e v2: NodePoolTrustBundleTest in-place ca-bundle.crt content change triggers NodePool rollout (validated on rfe8751-e2e, label nodepool-trust-bundle)
  • Manual AWS (Karpenter/AutoNode, rfe8751-test): v1→v2 config-hash migration leaves Karpenter OpenshiftEC2NodeClass.nodeClassCurrentConfigVersion byte-identical and causes no Node/EC2NodeClass drift (§4, Fix 1)
  • Manual AWS (rfe8751-test): same HO upgrade does not replace CAPI Machines on the regular (non-Karpenter) NodePool (§4, Fix 1)
  • Manual AWS (rfe8751-test): globalConfig-only change (proxy httpProxy/httpsProxy) is not skipped and correctly generates a new user-data Secret (§4, Fix 3)
  • Manual AWS (rfe8751-test): legacy still-referenced bootstrap token/user-data Secret pair keeps being refreshed/reconciled during the migration skip window, instead of going stale (§4, Fix 2)
  • Manual AWS (rfe8751-test): ignition-server fails closed on a trust-bundle content/hash mismatch and, once a fresh Secret is generated, serves the updated CA bundle content (verified via fingerprint match) rather than a stale cached payload (§4, Fix 4)

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 26, 2026
@alokstech
alokstech force-pushed the feat/rfe-8751-trust-bundle-rollout branch from 75ae906 to 28f837e Compare October 26, 2026 16:53
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Oct 26, 2026
@openshift-ci

openshift-ci Bot commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: csrwng

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@github-actions
github-actions Bot temporarily deployed to docs-preview/pr-9007 October 26, 2026 16:58 Inactive
@alokstech

Copy link
Copy Markdown
Author

/retest

Watch additional and proxy trust-bundle ConfigMaps and version config
hashes to preserve existing nodes during operator upgrades. Persist
content baselines for NodePools and Karpenter so later CA edits roll out.

Refresh retained bootstrap tokens, preserve ignition reachability, and
validate rendered CA content before caching ignition payloads. Detect
capabilities from the selected CPO and retain legitimate global-config
rollouts. Add regression tests, focused e2e coverage, and documentation.

Assisted-by: LLM
Signed-off-by: alokstech <alok@redhat.com>
@alokstech
alokstech force-pushed the feat/rfe-8751-trust-bundle-rollout branch from 28f837e to d4095b5 Compare October 28, 2026 15:15
Reduce test complexity by 98 lines while maintaining coverage and clarify allowlist configuration.
@openshift-ci

openshift-ci Bot commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

@alokstech: The following test failed, say /retest to rerun all failed tests or /retest-required to rerun all mandatory failed tests:

Test name Commit Details Required Rerun command
ci/prow/images c5d1df7 link true /test images

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@alokstech

Copy link
Copy Markdown
Author

/retest

@red-hat-konflux

Copy link
Copy Markdown
Contributor

All PipelineRuns for this commit have already succeeded. Use /retest <pipeline-name> to re-run a specific pipeline or /test to re-run all pipelines.


func (t *Token) Reconcile(ctx context.Context) error {
log := ctrl.LoggerFrom(ctx)
if err := t.validateTrustBundleCapabilities(ctx); err != nil {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Blocker: for an older CPO without the rendered-trust-bundle-validation label, this returns an error whenever a trust bundle is in use. reconcile() then exits before capi.Reconcile, so the NodePool stops applying replica, release and config changes. Older payload CPOs don't have the label, so existing HostedClusters that use trust bundles break on HO upgrade. Today those clusters work with name-based rollouts.

Please fall back to v1 (name-based) hashing when the CPO lacks the capability (hashAtVersion(ConfigHashVersionV1) already exists), and add a test for it.

@csrwng

csrwng commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

/pipeline required

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

Scheduling tests matching the pipeline_run_if_changed or not excluded by pipeline_skip_if_only_changed parameters:
/test e2e-aks-5-0
/test e2e-aws-5-0
/test e2e-aks
/test e2e-aws
/test e2e-aws-upgrade-hypershift-operator
/test e2e-kubevirt-aws-ovn-reduced
/test e2e-v2-aws
/test e2e-v2-azure-self-managed
/test e2e-v2-gke

This branch was successfully deployed

1 active deployment
docs-preview/pr-9007 — c5d1df72 Deployed Oct 28, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. area/ci-tooling Indicates the PR includes changes for CI or tooling area/control-plane-operator Indicates the PR includes changes for the control plane operator - in an OCP release area/documentation Indicates the PR includes changes for documentation area/hypershift-operator Indicates the PR includes changes for the hypershift operator and API - outside an OCP release area/karpenter-operator Indicates the PR includes changes related to the Karpenter operator area/testing Indicates the PR includes changes for e2e testing do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. ok-to-test Indicates a non-member PR verified by an org member that is safe to test.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants