Skip to content

CNTRLPLANE-3553: feat(nodepool): thread streamName through all platform callers#8834

Draft
sdminonne wants to merge 2 commits into
openshift:mainfrom
sdminonne:CNTRLPLANE-3553-thread-streamName-all-platforms
Draft

CNTRLPLANE-3553: feat(nodepool): thread streamName through all platform callers#8834
sdminonne wants to merge 2 commits into
openshift:mainfrom
sdminonne:CNTRLPLANE-3553-thread-streamName-all-platforms

Conversation

@sdminonne

@sdminonne sdminonne commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Wire the resolved RHEL stream name (streamName) through Azure, PowerVS, OpenStack, and KubeVirt platform resolvers so each platform selects boot image metadata from the correct OS stream (rhel-9 or rhel-10) instead of always using the legacy default StreamMetadata.
  • CAPI paths use c.resolvedRHELStream from ConfigGenerator; condition-setter paths resolve via getRHELStream().
  • All functions that previously accessed releaseImage.StreamMetadata directly now go through releaseImage.StreamForName(streamName).

PR Dependency Graph

#8675 (merged) ─► #8719 (merged) ─► #8730 (open) ─► This PR
                                        │
#8669 (merged) ─► #8699 (merged) ─► #8709 (open) ──┘ (merge conflict resolution needed)
                                        │
                                    #8792 (open)
PR Title Status Relation
#8675 API: add OSImageStream field to NodePool merged grandparent
#8719 API: add GetRHELStream + stream constants merged parent
#8730 feat(nodepool): integrate osImageStream into NodePool controller open direct parent
#8709 feat(nodepool): use stream metadata for platform image resolution open sibling (merge conflict with #8730)
#8792 feat(nodepool): validate osImageStream in webhook open sibling
#8832 feat(nodepool): detect usesRunc from ContainerRuntimeConfig open (draft) sibling (PR A)
This PR feat(nodepool): thread streamName through all platform callers open (draft) PR B

Platforms Updated

Platform Functions changed
Azure defaultAzureNodePoolImage, getAzureMarketplaceMetadata
PowerVS getPowerVSImage, ibmPowerVSMachineTemplateSpec, setPowerVSconditions
OpenStack OpenstackDefaultImage, OpenStackReleaseImage, MachineTemplateSpec, ReconcileOpenStackImageSpec, PrefixedClusterImageName, setOpenStackConditions, reconcileOpenStackImageCR
KubeVirt defaultImage, GetImage, MachineTemplateSpec, setKubevirtConditions

Test plan

  • All existing nodepool package tests pass with "" (empty/default) stream name
  • Verify multi-stream resolution with OSStreams populated on ReleaseImage (integration)
  • Run e2e-aws-upgrade-hypershift-operator to validate no spurious rollouts

Ref: CNTRLPLANE-3553

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Node pools can now detect and report the active OS image stream from running machines.
    • Image selection is now stream-aware across supported platforms, improving alignment with the chosen RHEL stream.
  • Bug Fixes

    • Improved validation so invalid or mismatched OS image stream settings fail fast with clearer errors.
    • Fixed default image and rollout handling to keep updates stable when the default stream is selected, while still triggering changes for non-default streams.

sdminonne and others added 2 commits June 19, 2026 08:59
Wire the osImageStream API field into the NodePool controller:

- Validate spec.osImageStream via GetRHELStream before config generation
  (fail fast on invalid stream/version/runc combinations).
- Return StreamRHEL9 (not "") for implicit pre-5.0 releases so that
  downstream consumers like StreamForName() always receive a concrete
  stream name, avoiding errors when legacy StreamMetadata is removed.
- Normalize rhelStream in rolloutConfig so that setting the default
  stream does not change the config hash (no spurious fleet-wide rollouts).
- Keep resolvedRHELStream on ConfigGenerator (not rolloutConfig) for
  downstream consumers that need a concrete stream name (GCP, AWS AMI,
  token secret).
- Add getRHELStream wrapper and validateOSImageStream in osstream.go,
  both delegating to GetRHELStream from stream.go.
- Write os-stream key to the token secret for future ignition-server
  consumption.
- Infer status.osImageStream from Machine NodeInfo.OSImage using
  majority consensus (rhcosStreamFromOSImage, osImageStreamFromMachines,
  setOSImageStreamStatus in version.go).
- Pass resolved stream to defaultNodePoolAMI / setAWSConditions for
  consistent boot image resolution.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wire the resolved RHEL stream name through Azure, PowerVS, OpenStack,
and KubeVirt platform resolvers so that each platform selects boot image
metadata from the correct OS stream (rhel-9 or rhel-10) instead of
always using the legacy default.

CAPI paths use c.resolvedRHELStream from ConfigGenerator. Condition
setter paths resolve the stream via getRHELStream(). All functions that
previously accessed releaseImage.StreamMetadata directly now go through
releaseImage.StreamForName(streamName).

Ref: CNTRLPLANE-3553

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@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 the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label Jun 25, 2026
@openshift-ci

openshift-ci Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

NodePool reconciliation now derives a concrete RHEL stream from NodePool settings, release versions, and machine OS images, stores the observed stream in status, validates configured OS image streams before config generation, and includes the normalized stream in rollout hashing. AWS, Azure, GCP, OpenStack, PowerVS, and KubeVirt image selection paths now pass the resolved stream through helper calls. Tests were updated and expanded for the new stream-aware behavior.

Sequence Diagram(s)

sequenceDiagram
  participant NodePoolReconciler
  participant setOSImageStreamStatus
  participant osImageStreamFromMachines
  participant validMachineConfigCondition
  participant validateOSImageStream
  participant NodePool.Status.OSImageStream

  NodePoolReconciler->>setOSImageStreamStatus: refresh observed stream
  setOSImageStreamStatus->>osImageStreamFromMachines: infer from Machine.Status.NodeInfo.OSImage
  osImageStreamFromMachines-->>setOSImageStreamStatus: StreamRHEL9 or StreamRHEL10
  setOSImageStreamStatus->>NodePool.Status.OSImageStream: set inferred stream
  NodePoolReconciler->>validMachineConfigCondition: build machine config
  validMachineConfigCondition->>validateOSImageStream: check spec.osImageStream.name
  validateOSImageStream-->>validMachineConfigCondition: error or nil
Loading
🚥 Pre-merge checks | ✅ 11
✅ Passed checks (11 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
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 No Ginkgo titles were added; changed tests use static string-literal table cases, and the renamed MachineDeployment case is a fixed descriptive string.
Test Structure And Quality ✅ Passed PASS: The touched tests are plain table-driven Go unit tests, not Ginkgo specs; no Eventually/Consistently, BeforeEach/AfterEach, or cluster resources were added.
Topology-Aware Scheduling Compatibility ✅ Passed No new topology-sensitive scheduling constraints were added; changes only thread streamName through image-resolution/validation paths, and the KubeVirt topologySpread comment is pre-existing.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed The commit only changes nodepool controller/unit-test files; no e2e files or new Ginkgo It/Describe/Context/When blocks were added.
No-Weak-Crypto ✅ Passed No MD5/SHA1/DES/RC4/3DES/Blowfish/ECB or secret-comparison code was added; the only "des" hit is a test fixture name.
Container-Privileges ✅ Passed PR changes only Go controllers/tests; no K8s/container manifests were modified, so no new privilege flags were introduced.
No-Sensitive-Data-In-Logs ✅ Passed No new log statements expose secrets/PII/internal hosts; added logging is generic, and new errors/statuses don’t surface sensitive values in logs.
Title check ✅ Passed The title clearly describes the main change: threading the resolved stream name through platform-specific nodepool callers.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@openshift-ci openshift-ci Bot added area/hypershift-operator Indicates the PR includes changes for the hypershift operator and API - outside an OCP release area/platform/aws PR/issue for AWS (AWSPlatform) platform labels Jun 25, 2026
@openshift-ci

openshift-ci Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: sdminonne
Once this PR has been reviewed and has the lgtm label, please assign awels, enxebre, nunnatsa for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found 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

@openshift-ci openshift-ci Bot added area/platform/azure PR/issue for Azure (AzurePlatform) platform area/platform/gcp PR/issue for GCP (GCPPlatform) platform area/platform/kubevirt PR/issue for KubeVirt (KubevirtPlatform) platform area/platform/openstack PR/issue for OpenStack (OpenStackPlatform) platform area/platform/powervs PR/issue for PowerVS (PowerVSPlatform) platform and removed do-not-merge/needs-area labels Jun 25, 2026
@codecov

codecov Bot commented Jun 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 56.63265% with 85 lines in your changes missing coverage. Please review.
✅ Project coverage is 42.05%. Comparing base (adccbd6) to head (ee9c4de).
⚠️ Report is 119 commits behind head on main.

Files with missing lines Patch % Lines
...ypershift-operator/controllers/nodepool/powervs.go 21.42% 10 Missing and 1 partial ⚠️
hypershift-operator/controllers/nodepool/aws.go 50.00% 9 Missing and 1 partial ⚠️
...rshift-operator/controllers/nodepool/conditions.go 0.00% 10 Missing ⚠️
...ershift-operator/controllers/nodepool/openstack.go 0.00% 10 Missing ⚠️
hypershift-operator/controllers/nodepool/config.go 57.14% 6 Missing and 3 partials ⚠️
...operator/controllers/nodepool/kubevirt/kubevirt.go 36.36% 6 Missing and 1 partial ⚠️
...erator/controllers/nodepool/openstack/openstack.go 63.15% 5 Missing and 2 partials ⚠️
...pershift-operator/controllers/nodepool/kubevirt.go 0.00% 6 Missing ⚠️
...erator/controllers/nodepool/nodepool_controller.go 50.00% 2 Missing and 2 partials ⚠️
hypershift-operator/controllers/nodepool/azure.go 62.50% 1 Missing and 2 partials ⚠️
... and 4 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8834      +/-   ##
==========================================
+ Coverage   41.86%   42.05%   +0.18%     
==========================================
  Files         759      770      +11     
  Lines       94101    96987    +2886     
==========================================
+ Hits        39392    40784    +1392     
- Misses      51949    53379    +1430     
- Partials     2760     2824      +64     
Files with missing lines Coverage Δ
hypershift-operator/controllers/nodepool/stream.go 100.00% <100.00%> (ø)
hypershift-operator/controllers/nodepool/gcp.go 66.21% <75.00%> (-0.30%) ⬇️
hypershift-operator/controllers/nodepool/token.go 82.70% <83.33%> (+0.10%) ⬆️
hypershift-operator/controllers/nodepool/azure.go 88.46% <62.50%> (+0.05%) ⬆️
...pershift-operator/controllers/nodepool/osstream.go 82.35% <82.35%> (ø)
...ypershift-operator/controllers/nodepool/version.go 94.11% <92.68%> (-0.97%) ⬇️
...erator/controllers/nodepool/nodepool_controller.go 44.25% <50.00%> (+1.07%) ⬆️
...pershift-operator/controllers/nodepool/kubevirt.go 0.00% <0.00%> (ø)
...operator/controllers/nodepool/kubevirt/kubevirt.go 69.01% <36.36%> (-0.45%) ⬇️
...erator/controllers/nodepool/openstack/openstack.go 73.07% <63.15%> (-3.16%) ⬇️
... and 5 more

... and 48 files with indirect coverage changes

Flag Coverage Δ
cmd-support 35.63% <ø> (+0.49%) ⬆️
cpo-hostedcontrolplane 44.88% <ø> (+0.73%) ⬆️
cpo-other 44.94% <ø> (+1.49%) ⬆️
hypershift-operator 50.22% <56.63%> (-1.84%) ⬇️
other 31.69% <ø> (+0.13%) ⬆️

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.

@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.

🧹 Nitpick comments (2)
hypershift-operator/controllers/nodepool/openstack/openstack_test.go (1)

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

Consider adding a named-stream test case.

All updated call sites pass "", which routes through the legacy StreamMetadata fallback in StreamForName. The new OSStreams/named-stream branch (e.g. "rhel-9"/"rhel-10") — the actual purpose of this PR — isn't exercised here. A table entry that populates OSStreams and passes a concrete stream name would close that gap.

Also applies to: 358-358, 472-472

🤖 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/openstack/openstack_test.go` at line
293, Add a table-driven named-stream test case for OpenstackDefaultImage so the
new OSStreams path is covered instead of only the legacy StreamMetadata
fallback. Update the relevant test cases in openstack_test.go to populate
OSStreams and pass a concrete stream name like “rhel-9” or “rhel-10” through
OpenstackDefaultImage / StreamForName, and keep the existing empty-string cases
as fallback coverage. Ensure the added case exercises the branch introduced by
this PR at the updated call sites.
hypershift-operator/controllers/nodepool/config.go (1)

98-121: 📐 Maintainability & Code Quality | 🔵 Trivial

Factor out the default-stream derivation.

config.go re-parses the release version and recomputes the default RHEL stream with GetRHELStream("", version, false), duplicating the same version-aware logic used by getRHELStream. A shared helper, or returning the default alongside the resolved stream, would keep hash normalization and stream selection aligned if usesRunc handling changes later.

🤖 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/config.go` around lines 98 - 121,
The config hash normalization in config.go duplicates the version-based default
RHEL stream logic by re-parsing the release version and calling
GetRHELStream("", version, false) separately from getRHELStream. Refactor this
so the default stream is derived through a shared helper or returned together
with the resolved stream from getRHELStream, and update the normalization logic
in the same Config function to use that shared result so hash behavior stays
aligned if usesRunc handling changes.
🤖 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.

Nitpick comments:
In `@hypershift-operator/controllers/nodepool/config.go`:
- Around line 98-121: The config hash normalization in config.go duplicates the
version-based default RHEL stream logic by re-parsing the release version and
calling GetRHELStream("", version, false) separately from getRHELStream.
Refactor this so the default stream is derived through a shared helper or
returned together with the resolved stream from getRHELStream, and update the
normalization logic in the same Config function to use that shared result so
hash behavior stays aligned if usesRunc handling changes.

In `@hypershift-operator/controllers/nodepool/openstack/openstack_test.go`:
- Line 293: Add a table-driven named-stream test case for OpenstackDefaultImage
so the new OSStreams path is covered instead of only the legacy StreamMetadata
fallback. Update the relevant test cases in openstack_test.go to populate
OSStreams and pass a concrete stream name like “rhel-9” or “rhel-10” through
OpenstackDefaultImage / StreamForName, and keep the existing empty-string cases
as fallback coverage. Ensure the added case exercises the branch introduced by
this PR at the updated call sites.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 28adccd3-0671-4206-ac2d-917bb3007eb9

📥 Commits

Reviewing files that changed from the base of the PR and between 4c582e0 and ee9c4de.

📒 Files selected for processing (27)
  • hypershift-operator/controllers/nodepool/aws.go
  • hypershift-operator/controllers/nodepool/aws_test.go
  • hypershift-operator/controllers/nodepool/azure.go
  • hypershift-operator/controllers/nodepool/azure_test.go
  • hypershift-operator/controllers/nodepool/capi_test.go
  • hypershift-operator/controllers/nodepool/conditions.go
  • hypershift-operator/controllers/nodepool/config.go
  • hypershift-operator/controllers/nodepool/config_test.go
  • hypershift-operator/controllers/nodepool/gcp.go
  • hypershift-operator/controllers/nodepool/gcp_test.go
  • hypershift-operator/controllers/nodepool/kubevirt.go
  • hypershift-operator/controllers/nodepool/kubevirt/kubevirt.go
  • hypershift-operator/controllers/nodepool/kubevirt/kubevirt_test.go
  • hypershift-operator/controllers/nodepool/nodepool_controller.go
  • hypershift-operator/controllers/nodepool/openstack.go
  • hypershift-operator/controllers/nodepool/openstack/openstack.go
  • hypershift-operator/controllers/nodepool/openstack/openstack_test.go
  • hypershift-operator/controllers/nodepool/osstream.go
  • hypershift-operator/controllers/nodepool/osstream_test.go
  • hypershift-operator/controllers/nodepool/powervs.go
  • hypershift-operator/controllers/nodepool/powervs_test.go
  • hypershift-operator/controllers/nodepool/stream.go
  • hypershift-operator/controllers/nodepool/stream_test.go
  • hypershift-operator/controllers/nodepool/token.go
  • hypershift-operator/controllers/nodepool/token_test.go
  • hypershift-operator/controllers/nodepool/version.go
  • hypershift-operator/controllers/nodepool/version_test.go

@sdminonne sdminonne changed the title feat(nodepool): thread streamName through all platform callers CNTRLPLANE-3553: feat(nodepool): thread streamName through all platform callers Jun 25, 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 Jun 25, 2026
@openshift-ci-robot

openshift-ci-robot commented Jun 25, 2026

Copy link
Copy Markdown

@sdminonne: This pull request references CNTRLPLANE-3553 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.0.0" version, but no target version was set.

Details

In response to this:

Summary

  • Wire the resolved RHEL stream name (streamName) through Azure, PowerVS, OpenStack, and KubeVirt platform resolvers so each platform selects boot image metadata from the correct OS stream (rhel-9 or rhel-10) instead of always using the legacy default StreamMetadata.
  • CAPI paths use c.resolvedRHELStream from ConfigGenerator; condition-setter paths resolve via getRHELStream().
  • All functions that previously accessed releaseImage.StreamMetadata directly now go through releaseImage.StreamForName(streamName).

PR Dependency Graph

#8675 (merged) ─► #8719 (merged) ─► #8730 (open) ─► This PR
                                       │
#8669 (merged) ─► #8699 (merged) ─► #8709 (open) ──┘ (merge conflict resolution needed)
                                       │
                                   #8792 (open)
PR Title Status Relation
#8675 API: add OSImageStream field to NodePool merged grandparent
#8719 API: add GetRHELStream + stream constants merged parent
#8730 feat(nodepool): integrate osImageStream into NodePool controller open direct parent
#8709 feat(nodepool): use stream metadata for platform image resolution open sibling (merge conflict with #8730)
#8792 feat(nodepool): validate osImageStream in webhook open sibling
#8832 feat(nodepool): detect usesRunc from ContainerRuntimeConfig open (draft) sibling (PR A)
This PR feat(nodepool): thread streamName through all platform callers open (draft) PR B

Platforms Updated

Platform Functions changed
Azure defaultAzureNodePoolImage, getAzureMarketplaceMetadata
PowerVS getPowerVSImage, ibmPowerVSMachineTemplateSpec, setPowerVSconditions
OpenStack OpenstackDefaultImage, OpenStackReleaseImage, MachineTemplateSpec, ReconcileOpenStackImageSpec, PrefixedClusterImageName, setOpenStackConditions, reconcileOpenStackImageCR
KubeVirt defaultImage, GetImage, MachineTemplateSpec, setKubevirtConditions

Test plan

  • All existing nodepool package tests pass with "" (empty/default) stream name
  • Verify multi-stream resolution with OSStreams populated on ReleaseImage (integration)
  • Run e2e-aws-upgrade-hypershift-operator to validate no spurious rollouts

Ref: CNTRLPLANE-3553

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

  • Node pools can now detect and report the active OS image stream from running machines.

  • Image selection is now stream-aware across supported platforms, improving alignment with the chosen RHEL stream.

  • Bug Fixes

  • Improved validation so invalid or mismatched OS image stream settings fail fast with clearer errors.

  • Fixed default image and rollout handling to keep updates stable when the default stream is selected, while still triggering changes for non-default streams.

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 Jun 28, 2026
@openshift-ci

openshift-ci Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

PR needs rebase.

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.

@hypershift-jira-solve-ci

Copy link
Copy Markdown

Now I have the full picture. Let me compile the final analysis.

Test Failure Analysis Complete

Job Information

  • Prow Job: tide (openshift-merge-bot)
  • Build ID: N/A — no Prow CI job was triggered
  • PR: #8834CNTRLPLANE-3553: feat(nodepool): thread streamName through all platform callers
  • Branch: CNTRLPLANE-3553-thread-streamName-all-platforms
  • Head SHA: ee9c4de4f29c7a0fd4453948f7895ffbc94aa153
  • Status: error — "Not mergeable. PR has a merge conflict."

Test Failure Analysis

Error

tide: Not mergeable. PR has a merge conflict.
GitHub mergeability: CONFLICTING (mergeStateStatus: DIRTY, rebaseable: false)
Labels: needs-rebase, do-not-merge/work-in-progress

Summary

No Prow CI jobs ran. The tide status is in error state because the PR branch has unresolvable merge conflicts with the main branch. The PR (created Jun 25) modifies 27 files across hypershift-operator/controllers/nodepool/, and at least two PRs merged to main after the branch point touch overlapping files: PR #8687 (CAPO/ORC dep bump, merged Jun 26 — modifies openstack.go, openstack/openstack.go, openstack/openstack_test.go) and PR #8821 (stale conversion data fix, merged Jun 25 — modifies nodepool_controller.go, capi_test.go). GitHub has applied the needs-rebase label and reports the PR as non-rebaseable. Additionally, the PR carries do-not-merge/work-in-progress and is marked as a draft, indicating the author has not finalized it. All 9 Prow presubmit e2e jobs (e2e-aws, e2e-aks, e2e-v2-aws, etc.) remain in pending state with "Waiting for pipeline condition to trigger this job" — they will not execute until the merge conflict is resolved.

Root Cause

The tide error state is caused by a git merge conflict between PR #8834's branch and the current main branch. This is not a test failure or infrastructure issue — it is a source control conflict.

Conflicting PRs merged to main after the branch point:

  1. PR OSASINFRA-4368, OCPBUGS-84114: Update CAPO to latest stable release #8687 (shiftstack/capo-bump — "chore(deps): Update CAPO, ORC to latest version") — merged Jun 26, modifies:

    • hypershift-operator/controllers/nodepool/openstack.go
    • hypershift-operator/controllers/nodepool/openstack/openstack.go
    • hypershift-operator/controllers/nodepool/openstack/openstack_test.go
  2. PR OCPBUGS-92013: fix NodePool stuck in UpdatingVersion/UpdatingConfig due to stale conversion-data annotation #8821 (csrwng/fix/ocpbugs-92013-stale-conversion-data) — merged Jun 25, modifies:

    • hypershift-operator/controllers/nodepool/nodepool_controller.go
    • hypershift-operator/controllers/nodepool/capi_test.go

PR #8834 touches all of these files as part of threading streamName through all platform callers. The overlapping modifications in openstack.go, openstack/openstack.go, nodepool_controller.go, and capi_test.go produce merge conflicts that GitHub cannot auto-resolve.

Additional blocking factors:

  • The do-not-merge/work-in-progress label is present (applied because the PR is a draft)
  • The needs-rebase label was automatically applied by the merge bot
  • The PR is in draft state, signaling the author hasn't finalized it

Because of the merge conflict, tide cannot merge the PR and all Prow presubmit jobs remain gated in pending — they never executed.

Recommendations
  1. Rebase the branch onto current main — resolve conflicts in openstack.go, openstack/openstack.go, openstack/openstack_test.go (from the CAPO/ORC bump in OSASINFRA-4368, OCPBUGS-84114: Update CAPO to latest stable release #8687) and nodepool_controller.go, capi_test.go (from the stale-conversion-data fix in OCPBUGS-92013: fix NodePool stuck in UpdatingVersion/UpdatingConfig due to stale conversion-data annotation #8821). Thread streamName through the updated OpenStack and nodepool controller code.

  2. Mark PR as ready for review — once the rebase is complete and conflicts resolved, un-draft the PR to remove the do-not-merge/work-in-progress label. The needs-rebase label will be automatically removed once the branch is conflict-free.

  3. No action needed on CI — the 9 pending Prow presubmit jobs (e2e-aws, e2e-aks, e2e-v2-aws, e2e-v2-gke, e2e-azure-v2-self-managed, e2e-kubevirt-aws-ovn-reduced, e2e-aws-upgrade-hypershift-operator, e2e-aws-4-22, e2e-aks-4-22) will be automatically triggered once the rebase is pushed and GitHub reports the branch as mergeable.

Evidence
Evidence Detail
Tide status error — "Not mergeable. PR has a merge conflict." (updated 2026-06-28T09:54:52Z)
GitHub mergeability mergeable: false, mergeable_state: dirty, rebaseable: false
Labels needs-rebase, do-not-merge/work-in-progress
PR state Draft (isDraft: true)
Conflicting PR #8687 Merged Jun 26 — updates CAPO/ORC deps, modifies openstack.go, openstack/openstack.go, openstack/openstack_test.go
Conflicting PR #8821 Merged Jun 25 — fixes stale conversion data, modifies nodepool_controller.go, capi_test.go
Prow presubmit jobs All 9 jobs in pending state — "Waiting for pipeline condition to trigger this job"
PR #8834 scope 27 files in hypershift-operator/controllers/nodepool/ — threads streamName through AWS, Azure, GCP, OpenStack, PowerVS, KubeVirt platform callers
GitHub Actions CI All passing (lint, verify, unit tests, codespell, gitlint) — GitHub Actions run independently of tide merge status

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/hypershift-operator Indicates the PR includes changes for the hypershift operator and API - outside an OCP release area/platform/aws PR/issue for AWS (AWSPlatform) platform area/platform/azure PR/issue for Azure (AzurePlatform) platform area/platform/gcp PR/issue for GCP (GCPPlatform) platform area/platform/kubevirt PR/issue for KubeVirt (KubevirtPlatform) platform area/platform/openstack PR/issue for OpenStack (OpenStackPlatform) platform area/platform/powervs PR/issue for PowerVS (PowerVSPlatform) platform do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants