Skip to content

NO-JIRA: Fix Azure private/topology CEL validation rules#8490

Draft
enxebre wants to merge 4 commits into
openshift:mainfrom
enxebre:enxebre/fix-azure-private-topology-cel
Draft

NO-JIRA: Fix Azure private/topology CEL validation rules#8490
enxebre wants to merge 4 commits into
openshift:mainfrom
enxebre:enxebre/fix-azure-private-topology-cel

Conversation

@enxebre
Copy link
Copy Markdown
Member

@enxebre enxebre commented May 12, 2026

Description

Fix two CEL validation gaps on Azure AzurePlatformSpec and AzurePrivateSpec:

  1. private was settable without topology: The existing rule !has(self.topology) || (...) short-circuited to true when topology was omitted, allowing private to be set without topology. Fixed to has(self.topology) && (...) ? has(self.private) : !has(self.private) — now correctly forbids private when topology is absent or Public.

  2. privateLink struct not required when type is PrivateLink: Only the negative constraint existed (forbid privateLink when type is not PrivateLink). Added self.type != 'PrivateLink' || has(self.privateLink) to require the struct.

Changes

  • api/hypershift/v1beta1/azure.go: Fix topology/private CEL rule, add privateLink requirement rule
  • Envtest cases: added "private without topology should fail", "private with Public topology should fail", "PrivateLink without privateLink config should fail"; fixed existing tests to include privateLink struct

Test plan

  • make test-envtest-ocp — all 630 specs pass

Summary by CodeRabbit

  • Bug Fixes
    • Azure topology validation tightened: private configuration is now consistently required for Private or PublicAndPrivate topologies and forbidden otherwise, preventing ambiguous or missing private settings.
    • PrivateLink validation strengthened: PrivateLink-specific settings are now required when PrivateLink is selected and disallowed otherwise, reducing misconfiguration risk.

@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-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 12, 2026
@openshift-ci-robot
Copy link
Copy Markdown

@enxebre: This pull request explicitly references no jira issue.

Details

In response to this:

Description

Fix two CEL validation gaps on Azure AzurePlatformSpec and AzurePrivateSpec:

  1. private was settable without topology: The existing rule !has(self.topology) || (...) short-circuited to true when topology was omitted, allowing private to be set without topology. Fixed to has(self.topology) && (...) ? has(self.private) : !has(self.private) — now correctly forbids private when topology is absent or Public.

  2. privateLink struct not required when type is PrivateLink: Only the negative constraint existed (forbid privateLink when type is not PrivateLink). Added self.type != 'PrivateLink' || has(self.privateLink) to require the struct.

Changes

  • api/hypershift/v1beta1/azure.go: Fix topology/private CEL rule, add privateLink requirement rule
  • Envtest cases: added "private without topology should fail", "private with Public topology should fail", "PrivateLink without privateLink config should fail"; fixed existing tests to include privateLink struct

Test plan

  • make test-envtest-ocp — all 630 specs pass

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
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 12, 2026

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

@openshift-ci openshift-ci Bot added do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. do-not-merge/needs-area labels May 12, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 12, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 5c8d71ad-a160-4b80-a912-0b3ec83933fd

📥 Commits

Reviewing files that changed from the base of the PR and between 9cafe87 and ca317d6.

⛔ Files ignored due to path filters (34)
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterUpdateAcceptRisks.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/GCPPlatform.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HCPEtcdBackup.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ImageStreamImportMode.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/KMSEncryptionProvider.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/TLSAdherence.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ClusterUpdateAcceptRisks.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/GCPPlatform.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HCPEtcdBackup.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ImageStreamImportMode.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/KMSEncryptionProvider.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/TLSAdherence.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • cmd/install/assets/crds/hypershift-operator/tests/hostedclusters.hypershift.openshift.io/stable.hostedclusters.azure.testsuite.yaml is excluded by !cmd/install/assets/**/*.yaml
  • cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-CustomNoUpgrade.crd.yaml is excluded by !**/zz_generated.crd-manifests/**, !cmd/install/assets/**/*.yaml
  • cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-Default.crd.yaml is excluded by !**/zz_generated.crd-manifests/**, !cmd/install/assets/**/*.yaml
  • cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-TechPreviewNoUpgrade.crd.yaml is excluded by !**/zz_generated.crd-manifests/**, !cmd/install/assets/**/*.yaml
  • cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Hypershift-CustomNoUpgrade.crd.yaml is excluded by !**/zz_generated.crd-manifests/**, !cmd/install/assets/**/*.yaml
  • cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Hypershift-Default.crd.yaml is excluded by !**/zz_generated.crd-manifests/**, !cmd/install/assets/**/*.yaml
  • cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Hypershift-TechPreviewNoUpgrade.crd.yaml is excluded by !**/zz_generated.crd-manifests/**, !cmd/install/assets/**/*.yaml
  • vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/azure.go is excluded by !vendor/**, !**/vendor/**
📒 Files selected for processing (1)
  • api/hypershift/v1beta1/azure.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • api/hypershift/v1beta1/azure.go

📝 Walkthrough

Walkthrough

Kubebuilder XValidation rules were tightened for two Azure API types in api/hypershift/v1beta1/azure.go. AzurePlatformSpec now requires topology to be present before evaluating whether private must be set (Private or PublicAndPrivate requires private; other values forbid it). AzurePrivateSpec now requires privateLink when type == 'PrivateLink' and forbids it otherwise.

🚥 Pre-merge checks | ✅ 12
✅ Passed checks (12 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: fixing CEL validation rules for Azure private/topology fields, which is the primary focus of the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 All Ginkgo test names in Azure test files are stable and deterministic. The 21 test names contain no dynamic content and clearly describe what each test validates.
Test Structure And Quality ✅ Passed Three new Azure tests meet all quality criteria: single responsibility, proper setup/cleanup, timeouts, and codebase consistency. Pre-existing framework assertion gaps don't apply to YAML specs.
Microshift Test Compatibility ✅ Passed New Ginkgo tests are envtest-based CEL validation tests for HyperShift CRDs. No references to OpenShift-specific APIs or MicroShift-incompatible features.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The PR adds envtest API validation tests (YAML-based, not Ginkgo e2e), not e2e tests. These tests validate CRD schema and CEL rules at the API level without assuming multi-node topology.
Topology-Aware Scheduling Compatibility ✅ Passed Changes to Azure API type validation rules only. No deployment manifests, pod scheduling constraints, affinity rules, or topology-aware scheduling configurations introduced.
Ote Binary Stdout Contract ✅ Passed PR modifies only API type definitions and YAML test specs. No process-level code, no stdout writes. Not applicable to OTE Binary Stdout Contract check.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed PR does not add Ginkgo e2e tests. Changes consist of: (1) CEL validation rule updates in azure.go, and (2) YAML-based envtest validation specs. Ginkgo e2e test check not applicable.

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

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@openshift-ci openshift-ci Bot added area/api Indicates the PR includes changes for the API area/cli Indicates the PR includes changes for CLI area/platform/azure PR/issue for Azure (AzurePlatform) platform approved Indicates a PR has been approved by an approver from all required OWNERS files. and removed do-not-merge/needs-area labels May 12, 2026
@codecov
Copy link
Copy Markdown

codecov Bot commented May 12, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 40.00%. Comparing base (b7c62b0) to head (ca317d6).
⚠️ Report is 95 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8490      +/-   ##
==========================================
+ Coverage   39.85%   40.00%   +0.14%     
==========================================
  Files         751      751              
  Lines       92556    92838     +282     
==========================================
+ Hits        36888    37137     +249     
- Misses      52994    53014      +20     
- Partials     2674     2687      +13     

see 27 files with indirect coverage changes

Flag Coverage Δ
cmd-support 34.09% <ø> (+0.05%) ⬆️
cpo-hostedcontrolplane 40.56% <ø> (+0.04%) ⬆️
cpo-other 40.14% <ø> (+0.05%) ⬆️
hypershift-operator 50.53% <ø> (+0.15%) ⬆️
other 31.54% <ø> (+0.84%) ⬆️

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.

Copy link
Copy Markdown
Member

@bryan-cox bryan-cox left a comment

Choose a reason for hiding this comment

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

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 12, 2026
@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
/test e2e-aws
/test e2e-aws-upgrade-hypershift-operator
/test e2e-azure-self-managed
/test e2e-kubevirt-aws-ovn-reduced
/test e2e-v2-aws

The existing CEL rule on AzurePlatformSpec allowed setting the
private field even when topology was not set, because
`!has(self.topology)` short-circuited to true. Fix the rule to
correctly forbid private when topology is absent or Public.

Also add a CEL rule on AzurePrivateSpec to require the privateLink
struct when type is PrivateLink — previously only the negative
constraint (forbid privateLink when type is not PrivateLink)
existed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@enxebre enxebre force-pushed the enxebre/fix-azure-private-topology-cel branch from 59e049c to 9cafe87 Compare May 12, 2026 11:58
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label May 12, 2026
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@enxebre enxebre force-pushed the enxebre/fix-azure-private-topology-cel branch from 9cafe87 to 723185b Compare May 12, 2026 12:53
Copy link
Copy Markdown
Member

@bryan-cox bryan-cox left a comment

Choose a reason for hiding this comment

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

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 12, 2026
@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
/test e2e-aws
/test e2e-aws-upgrade-hypershift-operator
/test e2e-azure-self-managed
/test e2e-kubevirt-aws-ovn-reduced
/test e2e-v2-aws

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 12, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: bryan-cox, enxebre

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

//
// +kubebuilder:validation:XValidation:rule="self.type != 'PrivateLink' ? !has(self.privateLink) : true",message="privateLink is forbidden when type is not PrivateLink"
// +kubebuilder:validation:XValidation:rule="self.type != 'PrivateLink' || has(self.privateLink)",message="privateLink is required when type is PrivateLink"
// +union
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.

can't those 2 rules be combined?

// +kubebuilder:validation:XValidation:rule="(self.type == 'PrivateLink') == has(self.privateLink)",message="privateLink must be set if and only if type is PrivateLink"

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

sgtm, @JoelSpeed is there any preference / convention for this? what's the impact on budget?

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.

The one we typically use for this is

// +kubebuilder:validation:XValidation:rule="self.type == 'PrivateLink' ? has(self.privateLink) : !has(self.privateLink)",message="privateLink is required when type is PrivateLink, and forbidden otherwise"

@cwbotbot
Copy link
Copy Markdown

cwbotbot commented May 12, 2026

Test Results

e2e-aks

e2e-aws

@hypershift-jira-solve-ci
Copy link
Copy Markdown

AI Test Failure Analysis

Job: pull-ci-openshift-hypershift-main-e2e-aws | Build: 2054184559926317056 | Cost: $2.5378969999999996 | Failed step: hypershift-aws-run-e2e-nested

View full analysis report


Generated by hypershift-analyze-e2e-failure post-step using Claude claude-opus-4-6

enxebre and others added 2 commits May 13, 2026 10:32
… rule

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@openshift-ci openshift-ci Bot removed the lgtm Indicates that a PR is ready to be merged. label May 13, 2026
@enxebre
Copy link
Copy Markdown
Member Author

enxebre commented May 13, 2026

/label tide/merge-method-squash

@openshift-ci openshift-ci Bot added the tide/merge-method-squash Denotes a PR that should be squashed by tide when it merges. label May 13, 2026
@enxebre enxebre removed tide/merge-method-squash Denotes a PR that should be squashed by tide when it merges. do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. labels May 13, 2026
@bryan-cox
Copy link
Copy Markdown
Member

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 13, 2026
@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
/test e2e-aws
/test e2e-aws-upgrade-hypershift-operator
/test e2e-azure-self-managed
/test e2e-kubevirt-aws-ovn-reduced
/test e2e-v2-aws
/test e2e-v2-gke

@JoelSpeed
Copy link
Copy Markdown
Contributor

/lgtm

@enxebre
Copy link
Copy Markdown
Member Author

enxebre commented May 18, 2026

/verified by e2e @enxebre

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label May 18, 2026
@openshift-ci-robot
Copy link
Copy Markdown

@enxebre: This PR has been marked as verified by e2e @enxebre.

Details

In response to this:

/verified by e2e @enxebre

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.

@enxebre
Copy link
Copy Markdown
Member Author

enxebre commented May 20, 2026

/retest

@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 20, 2026

@enxebre: all tests passed!

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.

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label May 21, 2026
@openshift-ci
Copy link
Copy Markdown
Contributor

openshift-ci Bot commented May 21, 2026

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 complete picture. Here's the analysis:

Test Failure Analysis Complete

Job Information

  • Prow Job: tide (merge controller)
  • Build ID: N/A (tide is a merge controller, not a CI test job)
  • PR: #8490NO-JIRA: Fix Azure private/topology CEL validation rules
  • Branch: enxebre/fix-azure-private-topology-celmain
  • Author: enxebre
  • All Prow CI test jobs passed: ✅ e2e-aks, e2e-aws, e2e-aws-upgrade-hypershift-operator, e2e-azure-self-managed, e2e-kubevirt-aws-ovn-reduced, e2e-v2-aws, e2e-v2-gke, images, security, verify-deps

Test Failure Analysis

Error

tide: Not mergeable. PR has a merge conflict.
Label "needs-rebase" added by openshift-ci[bot] at 2026-05-21T08:27:09Z.
PR mergeable_state: "dirty" (CONFLICTING)

Summary

No CI tests actually failed — all Prow e2e and presubmit jobs passed successfully. The tide ERROR state is caused by a merge conflict between this PR's branch and main. The PR was created on 2026-05-12 and modifies api/hypershift/v1beta1/azure.go along with generated CRD manifests. Since then, commit 3f801ea6 ("feat(api): support both managed and self-managed KMS authentication" by Bryan Cox, merged 2026-05-19) modified the same azure.go file on main, creating a conflict. The openshift-ci[bot] detected the conflict and added the needs-rebase label, which causes tide to exclude the PR from its merge pool (the tide query requires -label:needs-rebase). Two Konflux enterprise-contract checks also show as FAILURE, but these are a separate repo-wide issue affecting multiple open PRs and are not blocking the merge.

Root Cause

The root cause is a git merge conflict between the PR branch and the main branch, not a test failure.

Conflict origin: PR #8490 modifies api/hypershift/v1beta1/azure.go (Azure CEL validation rules) and its generated CRD manifests. After the PR was created (2026-05-12), the following commits landed on main that touch overlapping files:

  1. 3f801ea6 (2026-05-19) — "feat(api): support both managed and self-managed KMS authentication" — Modified api/hypershift/v1beta1/azure.go directly, creating a conflict with this PR's changes to the same file.
  2. 9a216101 (2026-05-19) — "chore(api): regenerate CRDs, clients, deepcopy, and vendor" — Regenerated CRD manifests that this PR also modifies.
  3. be263214 (2026-05-18) — "fix(hypershift-operator): reject Azure HostedClusters with shadowing service hostnames" — Also modifies Azure-related CRD manifests.
  4. 1d348802 (2026-05-21) — Merge of PR OCPBUGS-85351: fix(azure): prevent externalDNSDomain from shadowing cluster apps domain #8480 "azure-external-dns-validation" — Further CRD changes.

The openshift-ci[bot] detected the conflict at 2026-05-21T08:27:09Z and added the needs-rebase label. Tide's merge pool query for openshift/hypershift on main includes -label:needs-rebase, so the PR is excluded from the merge pool entirely, resulting in the ERROR state.

Regarding the Konflux enterprise-contract failures: These are a separate, repo-wide issue — the same two checks (hypershift-operator-enterprise-contract and hypershift-operator-main-enterprise-contract) are also failing on other open PRs (e.g., #8556, #8555). They are not caused by this PR's changes and are not required by tide for merging.

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

    git fetch origin
    git rebase origin/main
    # Resolve conflicts in api/hypershift/v1beta1/azure.go
    # Regenerate CRDs: make generate
    git push --force-with-lease
  2. Resolve conflict in azure.go carefully — the main conflict is between this PR's CEL validation rule changes and the new KMS authentication fields added by commit 3f801ea6. Both changes need to coexist.

  3. Regenerate CRD manifests after resolving the Go source conflict (make generate or equivalent), since the generated zz_generated.*.yaml files will need to reflect both sets of changes.

  4. No action needed for Konflux EC failures — these are a repo-wide issue unrelated to this PR. They should be tracked separately by the team if they become blocking.

  5. After rebasing, the needs-rebase label will be automatically removed by openshift-ci[bot], and tide will re-evaluate the PR for merging.

Evidence
Evidence Detail
PR mergeable state CONFLICTING / dirty (GitHub API)
Tide error message Not mergeable. PR has a merge conflict.
Blocking label needs-rebase (added by openshift-ci[bot] at 2026-05-21T08:27:09Z)
Conflicting file api/hypershift/v1beta1/azure.go
Conflicting commit 3f801ea6 — "feat(api): support both managed and self-managed KMS authentication" (Bryan Cox, 2026-05-19)
Additional CRD conflicts 4 commits to generated CRD manifests since PR creation (2026-05-12 to 2026-05-21)
Prow CI tests All 10 Prow jobs PASSED (e2e-aks, e2e-aws, e2e-v2-aws, etc.)
Konflux EC failures Repo-wide issue — same checks fail on PRs #8555, #8556; not PR-specific
Tide merge query Requires -label:needs-rebase; PR has the label, so excluded from merge pool

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/api Indicates the PR includes changes for the API area/cli Indicates the PR includes changes for CLI area/platform/azure PR/issue for Azure (AzurePlatform) platform jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants