Skip to content

CNTRLPLANE-4150: feat: Maintain ingress serving cert for HostedCluster ingress - #9132

Merged
openshift-merge-bot[bot] merged 7 commits into
openshift:mainfrom
deads2k:maintain-ingress-serving-cert
Sep 11, 2026
Merged

CNTRLPLANE-4150: feat: Maintain ingress serving cert for HostedCluster ingress#9132
openshift-merge-bot[bot] merged 7 commits into
openshift:mainfrom
deads2k:maintain-ingress-serving-cert

Conversation

@deads2k

@deads2k deads2k commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Our ingress/router is ~synonymous with OpenShift and is used to serve our webconsole. This places it in a special situation where it must logically exist on newly created clusters. Rather than try to re-orient a successful part of our product in the market, we will instead allow the serving certificate only to be managed by a service provider using the API provided by Hypershift. This change adds a field to specify a default serving certificate and have it injected into the HostedCluster's default ingress namespace.

Summary by CodeRabbit

  • New Features

    • Configure a default TLS certificate for HostedCluster ingress using a Secret reference.
    • Automatically synchronize certificate updates to control plane and hosted cluster ingress components.
    • View synchronization status and clear validation details for invalid certificate Secrets.
  • Bug Fixes

    • Preserve the previously served certificate when a configured certificate is missing or malformed.
    • Continue serving traffic while certificate sources become temporarily unavailable.

@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

@coderabbitai

coderabbitai Bot commented Jul 27, 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

Walkthrough

The API adds IngressOperatorSpec.DefaultCertificate and the IngressDefaultCertificateReference type. Ingress parameter extraction passes the reference to resource reconciliation. HostedCluster reconciliation reads and validates the source Secret, synchronizes valid TLS data to the control-plane Secret, and records status conditions. Missing or malformed sources preserve the existing destination certificate. Unit and end-to-end tests cover propagation, rotation, deletion, fallback, cleanup, and invalid certificates.

Sequence Diagram(s)

sequenceDiagram
  participant HostedClusterReconciler
  participant KubernetesAPI
  participant SourceSecret
  participant ControlPlaneSecret
  HostedClusterReconciler->>KubernetesAPI: Read DefaultCertificate reference
  HostedClusterReconciler->>SourceSecret: Get and annotate configured Secret
  SourceSecret-->>HostedClusterReconciler: Return TLS data or retrieval error
  HostedClusterReconciler->>HostedClusterReconciler: Validate tls.crt and tls.key
  HostedClusterReconciler->>ControlPlaneSecret: Create or update validated TLS data
  HostedClusterReconciler->>KubernetesAPI: Patch IngressDefaultCertificateSynced status
Loading

Suggested reviewers: clebs, devguyio, bryan-cox


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
No-Sensitive-Data-In-Logs ❌ Error New HCCO logging emits raw cpClient.Get errors; vendored REST code formats some failures with the request URL, which may expose an internal control-plane hostname. Log a fixed failure reason and safe resource identifier, or sanitize the client error before logging. Do not emit raw REST errors.
Test Structure And Quality ⚠️ Warning The new Ginkgo lifecycle test has cluster assertions without meaningful messages, including secret Get/Update and HostedCluster/status reads (lines 223, 226, 254, 265), violating requirement 4. Add diagnostic messages to every new Expect/g.Expect assertion, especially resource reads, updates, status reads, request creation, and HTTP status checks.
✅ Passed checks (9 passed)
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 Added Ginkgo titles in the E2E test are static descriptive literals, and added suite names are static; no dynamic runtime values or generated identifiers appear in titles.
Topology-Aware Scheduling Compatibility ✅ Passed The cumulative diff adds certificate Secret synchronization and ingress data-flow changes only; it adds no anti-affinity, topology spread, node targeting, tolerations, replica derivation, or PDB sc...
Ipv6 And Disconnected Network Test Compatibility ✅ Passed Added Ginkgo tests use the cluster-owned canary ingress DNS name over HTTPS; scans found no hardcoded IPv4, IPv4-only parsing, public host, registry, or external API.
No-Weak-Crypto ✅ Passed The PR diff adds only TLS 1.2 CA validation; scans found no MD5, SHA1, DES, RC4, Blowfish, ECB, custom crypto, or production secret/token comparisons. bytes.Equal is test assertion code.
Container-Privileges ✅ Passed The PR adds certificate schema, Secret synchronization, and tests. Diff inspection found no added privileged, hostPID, hostNetwork, hostIPC, SYS_ADMIN, or allowPrivilegeEscalation settings.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main change: maintaining the ingress serving certificate for HostedCluster ingress. The issue reference and feature prefix are relevant and concise.
✨ 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 the area/api Indicates the PR includes changes for the API label Jul 27, 2026
@openshift-ci
openshift-ci Bot requested review from clebs and devguyio July 27, 2026 17:40
@openshift-ci openshift-ci Bot added area/cli Indicates the PR includes changes for CLI 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/testing Indicates the PR includes changes for e2e testing and removed do-not-merge/needs-area labels Jul 27, 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: 4

🧹 Nitpick comments (1)
hypershift-operator/controllers/hostedcluster/ingress_default_cert_sync_test.go (1)

20-27: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Add a test case for OperatorConfiguration set but IngressOperator nil.

The two no-op cases (Lines 29-38, 40-52) both exercise the same code path (OperatorConfiguration == nil), since a zero-value HostedClusterSpec already has a nil OperatorConfiguration. The intermediate nil check (hcluster.Spec.OperatorConfiguration.IngressOperator == nil, Line 2101 in hostedcluster_controller.go) is not directly exercised by any case.

♻️ Suggested additional test case
+		{
+			name: "When IngressOperator is nil, it should be a no-op",
+			hcluster: &hyperv1.HostedCluster{
+				ObjectMeta: metav1.ObjectMeta{
+					Name:      "test-cluster",
+					Namespace: "clusters",
+				},
+				Spec: hyperv1.HostedClusterSpec{
+					OperatorConfiguration: &hyperv1.OperatorConfiguration{
+						IngressOperator: nil,
+					},
+				},
+			},
+			expectError: false,
+			expectSync:  false,
+		},
🤖 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/hostedcluster/ingress_default_cert_sync_test.go`
around lines 20 - 27, Add a test case to TestReconcileIngressDefaultCertSync
where HostedCluster.Spec.OperatorConfiguration is initialized but
OperatorConfiguration.IngressOperator is nil, and assert the expected no-op
behavior. Keep the existing nil-OperatorConfiguration case unchanged so the
intermediate IngressOperator nil guard is exercised separately.
🤖 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 `@api/hypershift/v1beta1/operator.go`:
- Line 309: The defaultCertificate field in api/hypershift/v1beta1/operator.go
must use an API CEL rule requiring a non-empty name whenever the reference is
non-nil, with envtest coverage for an empty reference. In
control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go,
update the default-certificate reconciliation logic to return/report an error
for a non-nil reference with an empty name instead of serving the generated
wildcard certificate.

In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go`:
- Around line 321-347: Rename the test case in the ingress parameters table from
“DefaultCertificate set via OperatorConfiguration” to a stable “When … it should
…” description, such as “When DefaultCertificate is configured it should
propagate it to ingress parameters.” Leave the test inputs and expected values
unchanged.

In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`:
- Around line 1430-1432: Add focused unit tests for the certificate-source
selection logic surrounding sourceCert in the reconciliation flow: verify custom
certificate copying, fallback to the CPO-generated wildcard certificate when no
custom source is provided, and propagation of custom-secret retrieval failures.
Add these cases in the relevant resources controller test suite rather than
relying on params_test.go, which only covers parameter propagation.

In `@hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go`:
- Around line 2094-2137: Update reconcileIngressDefaultCertSync to always sync
the referenced source secret to the fixed
manifests.IngressDefaultIngressControllerCert().Name destination, and handle a
removed or changed DefaultCertificate.Name by deleting the previously synced
control-plane secret so stale TLS private key material does not remain.

---

Nitpick comments:
In
`@hypershift-operator/controllers/hostedcluster/ingress_default_cert_sync_test.go`:
- Around line 20-27: Add a test case to TestReconcileIngressDefaultCertSync
where HostedCluster.Spec.OperatorConfiguration is initialized but
OperatorConfiguration.IngressOperator is nil, and assert the expected no-op
behavior. Keep the existing nil-OperatorConfiguration case unchanged so the
intermediate IngressOperator nil guard is exercised separately.
🪄 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: 3b7f5413-cb5d-48f0-a7f1-76ede80f12a2

📥 Commits

Reviewing files that changed from the base of the PR and between 5e4dd58 and b2e8a89.

⛔ Files ignored due to path filters (40)
  • api/hypershift/v1beta1/zz_generated.deepcopy.go is excluded by !**/zz_generated*.go, !**/zz_generated*
  • 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/EtcdSharding.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/EtcdSharding.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/**
  • client/applyconfiguration/hypershift/v1beta1/ingressoperatorspec.go is excluded by !client/**
  • 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
  • docs/content/reference/aggregated-docs.md is excluded by !docs/content/reference/aggregated-docs.md
  • docs/content/reference/api.md is excluded by !docs/content/reference/api.md
  • vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/operator.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/zz_generated.deepcopy.go is excluded by !vendor/**, !**/vendor/**, !**/zz_generated*.go, !**/zz_generated*
📒 Files selected for processing (9)
  • api/hypershift/v1beta1/operator.go
  • api/hypershift/v1beta1/operator_test.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go
  • hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go
  • hypershift-operator/controllers/hostedcluster/ingress_default_cert_sync_test.go
  • test/e2e/util/util_ingress_operator_configuration.go
  • test/e2e/v2/tests/hosted_cluster_ingress_test.go

Comment thread api/hypershift/v1beta1/operator.go Outdated
@codecov

codecov Bot commented Jul 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 78.41727% with 30 lines in your changes missing coverage. Please review.
✅ Project coverage is 47.43%. Comparing base (082506d) to head (57221be).
⚠️ Report is 45 commits behind head on main.

Files with missing lines Patch % Lines
...trollers/hostedcluster/hostedcluster_controller.go 78.50% 19 Missing and 4 partials ⚠️
...ontrollers/hostedcontrolplane/manifests/ingress.go 0.00% 7 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9132      +/-   ##
==========================================
+ Coverage   47.37%   47.43%   +0.05%     
==========================================
  Files         792      792              
  Lines       99774    99904     +130     
==========================================
+ Hits        47269    47388     +119     
- Misses      49344    49350       +6     
- Partials     3161     3166       +5     
Files with missing lines Coverage Δ
...igoperator/controllers/resources/ingress/params.go 94.23% <100.00%> (+6.47%) ⬆️
...rconfigoperator/controllers/resources/resources.go 57.90% <100.00%> (+0.26%) ⬆️
...ontrollers/hostedcontrolplane/manifests/ingress.go 0.00% <0.00%> (ø)
...trollers/hostedcluster/hostedcluster_controller.go 56.57% <78.50%> (+0.82%) ⬆️
Flag Coverage Δ
cmd-support 40.94% <ø> (ø)
cpo-hostedcontrolplane 50.47% <0.00%> (-0.02%) ⬇️
cpo-other 48.49% <100.00%> (+0.10%) ⬆️
hypershift-operator 57.68% <78.50%> (+0.13%) ⬆️
other 34.70% <ø> (ø)

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.

@deads2k deads2k changed the title Maintain ingress serving cert for HostedCluster ingress feat: Maintain ingress serving cert for HostedCluster ingress Jul 27, 2026
Comment thread api/hypershift/v1beta1/operator.go Outdated
Comment thread hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go Outdated
Comment thread api/hypershift/v1beta1/operator.go Outdated
@bryan-cox

bryan-cox commented Jul 29, 2026

Copy link
Copy Markdown
Member

With respect to https://redhat.atlassian.net/browse/OCPSTRAT-3499, there are a few things missing:

AC3: When set, the IngressController CR uses the specified secret reference
The IngressController CR was not changed. ReconcileDefaultIngressController in ingress/reconcile.go still unconditionally sets spec.defaultCertificate to the hardcoded default-ingress-cert name for all non-IBMCloud platforms. What the PR actually does is change the data source for that secret — in resources.go, it swaps which secret's data gets copied into default-ingress-cert on the guest cluster. The end result is functionally equivalent (the custom cert data reaches the router), but the IngressController CR's spec.defaultCertificate reference never changes. The JIRA says "the IngressController CR uses the specified secret reference," which it does not — it always points to the same fixed name.

Whether this is a real gap or just imprecise acceptance criteria language depends on interpretation. The functional outcome is the same. But it does mean the IngressController CR gives no signal that a custom cert is in use versus the auto-generated one.

AC5: ManagedCA Observer correctly syncs the custom cert's CA chain back to the management cluster
This is completely unaddressed. There are zero changes to configmap_observer.go. The ManagedCA Observer syncs the default-ingress-cert ConfigMap from openshift-managed-config on the guest cluster back to the management cluster. This ConfigMap is populated by the ingress operator based on the router's actual serving certificate CA chain.

When a user provides a custom cert that is NOT signed by the cluster's root CA (the common case for BYO certs — they're signed by an enterprise CA or a public CA like Let's Encrypt), the CA chain observed by the ManagedCA observer will be entirely different from what HyperShift's internal root CA produces. The JIRA explicitly calls out: "Validate the ManagedCA Observer feedback loop works correctly when a custom cert is in use." There is no validation, no testing, and no analysis of this interaction in the PR.

This is the most architecturally significant gap. If the observer breaks or propagates the wrong CA chain, downstream components that depend on the managed CA bundle (like the kube-apiserver trust bundle or OAuth server) could fail.

CORRECTION: AC5 — The test explicitly gets observed-default-ingress-cert from the control plane namespace, checks ca.crt parses as valid PEM, then builds an HTTP client using only that CA and does a TLS handshake against the canary route. It does this for the initial cert AND after rotation. The original comment calling it "completely unaddressed" was wrong.

AC6: E2E test validates the custom cert flow
The PR adds E2E test scaffolding (test/e2e/util/ingress_default_cert.go and a v2 Ginkgo test), but both tests only check that the default-ingress-cert secret in openshift-ingress has tls.crt and tls.key keys and they are non-empty. They do not:

Create a HostedCluster with defaultCertificate set — they skip if the field isn't already configured on the cluster under test
Verify the certificate data in the guest cluster matches the source secret provided by the user
Verify the IngressController is actually serving the custom cert (e.g., TLS handshake against the router)
Test the ManagedCA observer feedback loop with the custom cert's CA chain
Test certificate rotation (updating the source secret and verifying propagation)

  • Test certificate removal (removing defaultCertificate and verifying revert to auto-generated)

The JIRA says "E2E test validates the custom cert flow." These tests validate that a secret exists with expected keys — they don't exercise the actual feature end-to-end.

CORRECTION: AC6 — The test uses Equal(certPEM) and Equal(keyPEM) for byte-for-byte comparison, not just "non-empty" checks. It creates the cert itself, sets defaultCertificate on the HC, does TLS handshakes, and tests rotation. Our original comment saying "they don't exercise the actual feature end-to-end" was wrong. The only thing the test genuinely doesn't cover is removal/revert to auto-generated.

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 29, 2026
@deads2k
deads2k force-pushed the maintain-ingress-serving-cert branch from b2e8a89 to 576ef3c Compare July 30, 2026 19:08
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Jul 30, 2026
@github-actions
github-actions Bot temporarily deployed to docs-preview/pr-9132 July 30, 2026 19:14 Inactive

@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

♻️ Duplicate comments (3)
control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go (1)

320-346: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Test case name still doesn't follow "When ... it should ..." format.

This was flagged in a prior review round and remains unaddressed.

As per coding guidelines, "Always use 'When ... it should ...' format for describing test cases when creating unit tests."

♻️ Proposed fix
-			name: "DefaultCertificate set via OperatorConfiguration",
+			name: "When DefaultCertificate is configured it should propagate it to ingress parameters",
🤖 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
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go`
around lines 320 - 346, Rename the test case in the IngressParams test table
from “DefaultCertificate set via OperatorConfiguration” to a description
following the required “When ... it should ...” format, while leaving the test
setup and assertions unchanged.

Source: Coding guidelines

control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go (1)

1430-1446: 📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win

Unit test coverage for source-selection/fallback/error paths still appears missing.

This was already flagged in a prior review round; the tests added in this PR round (ingress_default_cert_sync_test.go) cover a different function (the hosted-cluster-side secret sync), not this custom-cert vs. generated-wildcard selection/fallback logic in reconcileIngressController.

As per coding guidelines, "Unit test any code changes and additions."

🤖 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
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`
around lines 1430 - 1446, Add unit tests for the source-selection logic in
reconcileIngressController, covering custom default certificate selection,
generated wildcard certificate fallback, successful control-plane retrieval, and
retrieval errors for both paths. Verify the selected source certificate and
accumulated error behavior, including sourceCert being nil after a failed
lookup; do not rely on ingress_default_cert_sync_test.go, which exercises a
different function.

Source: Coding guidelines

hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go (1)

2094-2131: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Stale synced ingress TLS secret is never cleaned up when the reference is removed or changed.

reconcileIngressDefaultCertSync no-ops when DefaultCertificate.Name is empty (line 2100-2104), but it never deletes a previously-synced ServiceProviderDefaultIngressServingCert secret from the control-plane namespace. If a user removes or changes the reference, the old secret — including private key material — remains behind indefinitely in the CP namespace, even though resources.go's fallback logic no longer reads it.

This mirrors a concern raised in a prior review round ("Delete stale synced ingress TLS secrets when the source reference changes" / muraee: "clean it up when the reference is removed from the API"). The fixed destination name (addressing the earlier "sync to a fixed secret name" ask) is now in place, but the deletion-on-removal behavior is still missing.

🔒 Proposed fix sketch
 	if hcluster.Spec.OperatorConfiguration == nil ||
 		hcluster.Spec.OperatorConfiguration.IngressOperator == nil ||
 		len(hcluster.Spec.OperatorConfiguration.IngressOperator.DefaultCertificate.Name) == 0 {
-		return nil
+		dest := cpomanifests.ServiceProviderDefaultIngressServingCert(controlPlaneNamespace)
+		if _, err := k8sutil.DeleteIfNeeded(ctx, r.Client, dest); err != nil {
+			return fmt.Errorf("failed to delete stale ingress default certificate secret: %w", err)
+		}
+		return nil
 	}
🤖 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/hostedcluster/hostedcluster_controller.go`
around lines 2094 - 2131, Update reconcileIngressDefaultCertSync to delete the
fixed ServiceProviderDefaultIngressServingCert secret when DefaultCertificate is
unset, and before syncing a changed reference, so stale TLS data and private
keys are removed. Preserve the existing source validation and sync behavior when
a valid reference is present, using the existing client and
controlPlaneNamespace.
🧹 Nitpick comments (1)
control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go (1)

1446-1453: 🧹 Nitpick | 🔵 Trivial

IngressController still references a fixed cert secret regardless of custom-certificate configuration.

Per the PR's acceptance-criteria review, the IngressController resource always points at the same IngressDefaultIngressControllerCert() secret name; only the contents copied into it change based on p.DefaultCertificate. This makes it impossible to tell from the IngressController resource alone whether a custom certificate is configured — functionally equivalent, but an observability/traceability gap noted as still open.

🤖 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
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`
around lines 1446 - 1453, Update the IngressController resource
construction/reconciliation alongside the sourceCert handling so its
certificate-secret reference reflects whether a custom certificate is
configured, rather than always using
manifests.IngressDefaultIngressControllerCert(). Preserve the existing default
secret reference when sourceCert is absent and use the
custom-certificate-specific reference when it is present.
🤖 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 `@api/hypershift/v1beta1/operator.go`:
- Around line 313-320: Update the Name field in
IngressDefaultCertificateReference to include omitempty in its JSON tag,
preserving the existing field name and validation markers.

---

Duplicate comments:
In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go`:
- Around line 320-346: Rename the test case in the IngressParams test table from
“DefaultCertificate set via OperatorConfiguration” to a description following
the required “When ... it should ...” format, while leaving the test setup and
assertions unchanged.

In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`:
- Around line 1430-1446: Add unit tests for the source-selection logic in
reconcileIngressController, covering custom default certificate selection,
generated wildcard certificate fallback, successful control-plane retrieval, and
retrieval errors for both paths. Verify the selected source certificate and
accumulated error behavior, including sourceCert being nil after a failed
lookup; do not rely on ingress_default_cert_sync_test.go, which exercises a
different function.

In `@hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go`:
- Around line 2094-2131: Update reconcileIngressDefaultCertSync to delete the
fixed ServiceProviderDefaultIngressServingCert secret when DefaultCertificate is
unset, and before syncing a changed reference, so stale TLS data and private
keys are removed. Preserve the existing source validation and sync behavior when
a valid reference is present, using the existing client and
controlPlaneNamespace.

---

Nitpick comments:
In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`:
- Around line 1446-1453: Update the IngressController resource
construction/reconciliation alongside the sourceCert handling so its
certificate-secret reference reflects whether a custom certificate is
configured, rather than always using
manifests.IngressDefaultIngressControllerCert(). Preserve the existing default
secret reference when sourceCert is absent and use the
custom-certificate-specific reference when it is present.
🪄 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: a9ca151c-6d2a-45e8-8e71-60ac908f2545

📥 Commits

Reviewing files that changed from the base of the PR and between b2e8a89 and 576ef3c.

⛔ Files ignored due to path filters (40)
  • api/hypershift/v1beta1/zz_generated.deepcopy.go is excluded by !**/zz_generated*.go, !**/zz_generated*
  • 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/EtcdSharding.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/NetworkObservabilityInstall.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/EtcdSharding.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/NetworkObservabilityInstall.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/**
  • client/applyconfiguration/hypershift/v1beta1/ingressdefaultcertificatereference.go is excluded by !client/**
  • client/applyconfiguration/hypershift/v1beta1/ingressoperatorspec.go is excluded by !client/**
  • client/applyconfiguration/utils.go is excluded by !client/**
  • 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
  • docs/content/reference/aggregated-docs.md is excluded by !docs/content/reference/aggregated-docs.md
  • docs/content/reference/api.md is excluded by !docs/content/reference/api.md
📒 Files selected for processing (9)
  • api/hypershift/v1beta1/operator.go
  • api/hypershift/v1beta1/operator_test.go
  • control-plane-operator/controllers/hostedcontrolplane/manifests/ingress.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go
  • hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go
  • hypershift-operator/controllers/hostedcluster/ingress_default_cert_sync_test.go
  • hypershift-operator/controllers/hostedcluster/reconcile_legacy.go

Comment thread api/hypershift/v1beta1/operator.go
@deads2k
deads2k force-pushed the maintain-ingress-serving-cert branch from 576ef3c to b1e0575 Compare July 30, 2026 20:31
@github-actions
github-actions Bot temporarily deployed to docs-preview/pr-9132 July 30, 2026 20:33 Inactive

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

♻️ Duplicate comments (2)
control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go (1)

320-346: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Test case name still doesn't follow the required format.

This was flagged in a prior review round but the name wasn't updated. As per path instructions, "Always use 'When ... it should ...' format for describing test cases when creating unit tests."

🐛 Proposed fix
-			name: "DefaultCertificate set via OperatorConfiguration",
+			name: "When DefaultCertificate is configured it should propagate it to ingress parameters",
🤖 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
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go`
around lines 320 - 346, The test case named “DefaultCertificate set via
OperatorConfiguration” in the IngressParams test table must follow the required
“When ... it should ...” naming format. Rename only this case to clearly
describe that setting DefaultCertificate via OperatorConfiguration produces the
expected ingress parameters.

Source: Path instructions

hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go (1)

2094-2131: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Stale synced certificate secret is never cleaned up when the reference is removed.

The destination secret name is now fixed (cpomanifests.ServiceProviderDefaultIngressServingCert), addressing part of the earlier feedback, but when DefaultCertificate.Name is cleared (reverting to the auto-generated wildcard cert), this function just returns nil at line 2103 without deleting the previously-synced secret. The old private key material remains in the control-plane namespace indefinitely even though it's no longer referenced anywhere.

🔒 Proposed fix
 	if hcluster.Spec.OperatorConfiguration == nil ||
 		hcluster.Spec.OperatorConfiguration.IngressOperator == nil ||
 		len(hcluster.Spec.OperatorConfiguration.IngressOperator.DefaultCertificate.Name) == 0 {
-		return nil
+		dest := cpomanifests.ServiceProviderDefaultIngressServingCert(controlPlaneNamespace)
+		if _, err := util.DeleteIfNeeded(ctx, r.Client, dest); err != nil {
+			return fmt.Errorf("failed to delete stale ingress default certificate secret: %w", err)
+		}
+		return nil
 	}

This mirrors the still-open thread from muraee/deads2k on this exact function.

🤖 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/hostedcluster/hostedcluster_controller.go`
around lines 2094 - 2131, Update reconcileIngressDefaultCertSync so that when
DefaultCertificate is unset, it deletes the fixed destination secret returned by
ServiceProviderDefaultIngressServingCert in controlPlaneNamespace before
returning. Preserve the no-op behavior when ingress configuration is absent, and
treat a not-found deletion as successful while propagating other deletion
errors.
🧹 Nitpick comments (2)
api/hypershift/v1beta1/operator.go (1)

307-307: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Redundant omitempty alongside omitzero on a struct field.

omitempty has no effect on non-pointer struct fields (Go's isEmptyValue doesn't handle Struct kind), so only omitzero actually omits DefaultCertificate here. As per coding guidelines, "Use omitempty for scalar fields, slices, and maps, and use omitzero for struct fields because omitempty does not omit non-pointer structs."

♻️ Proposed fix
-	DefaultCertificate IngressDefaultCertificateReference `json:"defaultCertificate,omitzero,omitempty"`
+	DefaultCertificate IngressDefaultCertificateReference `json:"defaultCertificate,omitzero"`
🤖 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 `@api/hypershift/v1beta1/operator.go` at line 307, Remove the redundant
omitempty option from the DefaultCertificate field in the operator API type,
leaving omitzero to control omission of the non-pointer
IngressDefaultCertificateReference struct while preserving the existing JSON
field name.

Source: Path instructions

control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go (1)

1420-1429: 📐 Maintainability & Code Quality | 🔵 Trivial

IngressController resource still doesn't indicate whether a custom certificate is configured.

ingress.ReconcileDefaultIngressController is called without any parameter reflecting p.DefaultCertificate; only the secret's data is swapped underneath. Functionally the guest cert is served correctly, but as flagged in review, the IngressController resource gives no signal (annotation/label/status) that a custom default certificate is in effect, which is a debuggability gap for operators/SREs inspecting the resource directly.

🤖 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
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`
around lines 1420 - 1429, The reconcileIngressController flow must propagate
p.DefaultCertificate to the IngressController resource so the resource visibly
indicates when a custom default certificate is configured. Update the relevant
ingress reconciliation symbols, including ReconcileDefaultIngressController or
the resource metadata/status handling, to set the established annotation, label,
or status signal while preserving existing certificate behavior.
🤖 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.

Duplicate comments:
In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go`:
- Around line 320-346: The test case named “DefaultCertificate set via
OperatorConfiguration” in the IngressParams test table must follow the required
“When ... it should ...” naming format. Rename only this case to clearly
describe that setting DefaultCertificate via OperatorConfiguration produces the
expected ingress parameters.

In `@hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go`:
- Around line 2094-2131: Update reconcileIngressDefaultCertSync so that when
DefaultCertificate is unset, it deletes the fixed destination secret returned by
ServiceProviderDefaultIngressServingCert in controlPlaneNamespace before
returning. Preserve the no-op behavior when ingress configuration is absent, and
treat a not-found deletion as successful while propagating other deletion
errors.

---

Nitpick comments:
In `@api/hypershift/v1beta1/operator.go`:
- Line 307: Remove the redundant omitempty option from the DefaultCertificate
field in the operator API type, leaving omitzero to control omission of the
non-pointer IngressDefaultCertificateReference struct while preserving the
existing JSON field name.

In
`@control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go`:
- Around line 1420-1429: The reconcileIngressController flow must propagate
p.DefaultCertificate to the IngressController resource so the resource visibly
indicates when a custom default certificate is configured. Update the relevant
ingress reconciliation symbols, including ReconcileDefaultIngressController or
the resource metadata/status handling, to set the established annotation, label,
or status signal while preserving existing certificate behavior.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: c6322acf-e798-4267-b0d8-c08f9064ef17

📥 Commits

Reviewing files that changed from the base of the PR and between 576ef3c and b1e0575.

⛔ Files ignored due to path filters (50)
  • api/hypershift/v1beta1/zz_generated.deepcopy.go is excluded by !**/zz_generated*.go, !**/zz_generated*
  • 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/EtcdSharding.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/ExternalOIDCExternalClaimsSourcing.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/IngressComponentRouteLabels.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/KMSEncryption.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkObservabilityInstall.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/hostedclusters.hypershift.openshift.io/TLSGroupPreferences.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/EtcdSharding.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/ExternalOIDCExternalClaimsSourcing.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/IngressComponentRouteLabels.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/KMSEncryption.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkObservabilityInstall.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/**
  • api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/TLSGroupPreferences.yaml is excluded by !**/zz_generated.featuregated-crd-manifests/**
  • client/applyconfiguration/hypershift/v1beta1/ingressdefaultcertificatereference.go is excluded by !client/**
  • client/applyconfiguration/hypershift/v1beta1/ingressoperatorspec.go is excluded by !client/**
  • client/applyconfiguration/utils.go is excluded by !client/**
  • 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
  • docs/content/reference/aggregated-docs.md is excluded by !docs/content/reference/aggregated-docs.md
  • docs/content/reference/api.md is excluded by !docs/content/reference/api.md
  • vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/operator.go is excluded by !vendor/**, !**/vendor/**
  • vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/zz_generated.deepcopy.go is excluded by !vendor/**, !**/vendor/**, !**/zz_generated*.go, !**/zz_generated*
📒 Files selected for processing (11)
  • api/hypershift/v1beta1/operator.go
  • api/hypershift/v1beta1/operator_test.go
  • control-plane-operator/controllers/hostedcontrolplane/manifests/ingress.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/ingress/params_test.go
  • control-plane-operator/hostedclusterconfigoperator/controllers/resources/resources.go
  • hypershift-operator/controllers/hostedcluster/hostedcluster_controller.go
  • hypershift-operator/controllers/hostedcluster/ingress_default_cert_sync_test.go
  • hypershift-operator/controllers/hostedcluster/reconcile_legacy.go
  • test/e2e/util/util_ingress_operator_configuration.go
  • test/e2e/v2/tests/hosted_cluster_ingress_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • control-plane-operator/controllers/hostedcontrolplane/manifests/ingress.go

@bryan-cox

Copy link
Copy Markdown
Member

/test e2e-v2-aws

@openshift-ci-robot openshift-ci-robot removed the verified Signifies that the PR passed pre-merge verification criteria label Sep 9, 2026
@openshift-ci openshift-ci Bot removed 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. labels Sep 9, 2026
@bryan-cox

Copy link
Copy Markdown
Member

/lgtm
/verified by v2-e2e-aws test

Putting these back on from rebase

@openshift-ci-robot

Copy link
Copy Markdown

@bryan-cox: This PR has been marked as verified by v2-e2e-aws test.

Details

In response to this:

/lgtm
/verified by v2-e2e-aws test

Putting these back on from rebase

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

deads2k and others added 3 commits September 9, 2026 11:26
- Add a v2 lifecycle test covering propagation, rotation, TLS handshake, the
  IngressDefaultCertificateSynced condition, source-secret deletion, revert to
  the wildcard, and a malformed-source negative case. Wire it into the Azure
  public group and skip it on Azure until the ingress endpoint is reachable from
  the build farm.
- Add envtest cases for the defaultCertificate name (CEL, MinLength, MaxLength).
- Add an IngressOperatorSpec serialization round-trip test and move
  GenerateCustomCertificate to test/e2e/v2/util to satisfy the e2eutilallowlist.

Signed-off-by: David Eads <deads@redhat.com>
Commit-Message-Assisted-by: Claude (via Claude Code)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Regenerate the API reference and aggregated docs for the defaultCertificate
field and the IngressDefaultCertificateSynced condition.

Signed-off-by: David Eads <deads@redhat.com>
Commit-Message-Assisted-by: Claude (via Claude Code)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… disabled

Assert that both destination secrets and the synced condition remain absent
 after configuring a valid source certificate. Skip the enabled-ingress
 lifecycle tests safely when ingress is disabled.

Signed-off-by: David Eads <deads@redhat.com>
@openshift-ci

openshift-ci Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

New changes are detected. LGTM label has been removed.

@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

@deads2k

deads2k commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

simple lint fix. reapplied labels.

@bryan-cox

Copy link
Copy Markdown
Member

/lgtm
/verified by v2-e2e-aws test

Putting these back on from lint fix

@openshift-ci-robot

Copy link
Copy Markdown

@bryan-cox: This PR has been marked as verified by v2-e2e-aws test.

Details

In response to this:

/lgtm
/verified by v2-e2e-aws test

Putting these back on from lint fix

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-merge-bot

Copy link
Copy Markdown
Contributor

/retest-required

Remaining retests: 0 against base HEAD c56bbe4 and 2 for PR HEAD 57221be in total

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/retest-required

Remaining retests: 0 against base HEAD 1a15c96 and 1 for PR HEAD 57221be in total

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/retest-required

Remaining retests: 0 against base HEAD eccc3ed and 0 for PR HEAD 57221be in total

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/hold

Revision 57221be was retested 3 times: holding

@bryan-cox

Copy link
Copy Markdown
Member

/hold cancel

@bryan-cox

Copy link
Copy Markdown
Member

/test e2e-aws

I'm tempted to override this if it fails again. It looks like the last three failures were all different and unrelated.

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/retest-required

Remaining retests: 0 against base HEAD 7789930 and 2 for PR HEAD 57221be in total

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/retest-required

Remaining retests: 0 against base HEAD 2f8ff64 and 1 for PR HEAD 57221be in total

@bryan-cox

Copy link
Copy Markdown
Member

/test e2e-aws

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/retest-required

Remaining retests: 0 against base HEAD 3f8578d and 0 for PR HEAD 57221be in total

@openshift-merge-bot

Copy link
Copy Markdown
Contributor

/hold

Revision 57221be was retested 3 times: holding

@bryan-cox

Copy link
Copy Markdown
Member

/hold cancel

@bryan-cox

Copy link
Copy Markdown
Member

/override ci/prow/e2e-aws

This test is failing on this PR over different issues each time. Moving this PR on so we can start the backporting process.

@openshift-ci

openshift-ci Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

@bryan-cox: Overrode contexts on behalf of bryan-cox: ci/prow/e2e-aws

Details

In response to this:

/override ci/prow/e2e-aws

This test is failing on this PR over different issues each time. Moving this PR on so we can start the backporting process.

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 commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

@deads2k: 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-cherrypick-robot

Copy link
Copy Markdown

@deads2k: #9132 failed to apply on top of branch "release-5.0":

Applying: feat(api): add ingress defaultCertificate field and synced condition
Using index info to reconstruct a base tree...
M	api/hypershift/v1beta1/hostedcluster_conditions.go
M	api/hypershift/v1beta1/operator.go
M	api/hypershift/v1beta1/zz_generated.deepcopy.go
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterUpdateAcceptRisks.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/EtcdSharding.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCExternalClaimsSourcing.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/GCPPlatform.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HCPEtcdBackup.yaml
A	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HCPUserFacingOperatorLogs.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ImageStreamImportMode.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/IngressComponentRouteLabels.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/KMSEncryption.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkObservabilityInstall.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/TLSAdherence.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/TLSGroupPreferences.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ClusterUpdateAcceptRisks.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/EtcdSharding.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCExternalClaimsSourcing.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/GCPPlatform.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HCPEtcdBackup.yaml
A	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HCPUserFacingOperatorLogs.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ImageStreamImportMode.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/IngressComponentRouteLabels.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/KMSEncryption.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkObservabilityInstall.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/TLSAdherence.yaml
M	api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/TLSGroupPreferences.yaml
Falling back to patching base and 3-way merge...
Auto-merging api/hypershift/v1beta1/hostedcluster_conditions.go
CONFLICT (content): Merge conflict in api/hypershift/v1beta1/hostedcluster_conditions.go
Auto-merging api/hypershift/v1beta1/operator.go
Auto-merging api/hypershift/v1beta1/zz_generated.deepcopy.go
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/AAA_ungated.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterUpdateAcceptRisks.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/EtcdSharding.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDC.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCExternalClaimsSourcing.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/GCPPlatform.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HCPEtcdBackup.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/ImageStreamImportMode.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/IngressComponentRouteLabels.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/KMSEncryption.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/NetworkObservabilityInstall.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/OpenStack.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/TLSAdherence.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedclusters.hypershift.openshift.io/TLSGroupPreferences.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/AAA_ungated.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ClusterUpdateAcceptRisks.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ClusterVersionOperatorConfiguration.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/EtcdSharding.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDC.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCExternalClaimsSourcing.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCWithUIDAndExtraClaimMappings.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ExternalOIDCWithUpstreamParity.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/GCPPlatform.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HCPEtcdBackup.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/HyperShiftOnlyDynamicResourceAllocation.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/ImageStreamImportMode.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/IngressComponentRouteLabels.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/KMSEncryption.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/NetworkObservabilityInstall.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/OpenStack.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/TLSAdherence.yaml
Auto-merging api/hypershift/v1beta1/zz_generated.featuregated-crd-manifests/hostedcontrolplanes.hypershift.openshift.io/TLSGroupPreferences.yaml
Auto-merging cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedclusters-Hypershift-Default.crd.yaml
Auto-merging cmd/install/assets/crds/hypershift-operator/zz_generated.crd-manifests/hostedcontrolplanes-Hypershift-Default.crd.yaml
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"
Patch failed at 0001 feat(api): add ingress defaultCertificate field and synced condition

Details

In response to this:

/cherry-pick release-5.0

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.

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/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/platform/azure PR/issue for Azure (AzurePlatform) platform area/testing Indicates the PR includes changes for e2e testing 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. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants