Skip to content

CNTRLPLANE-3381: CPO: Surface cloud resource deletion timeout as a status condition - #8426

Merged
openshift-merge-bot[bot] merged 3 commits into
openshift:mainfrom
csrwng:cntrlplane-3381-cpo-deletion-timeout
May 6, 2026
Merged

CNTRLPLANE-3381: CPO: Surface cloud resource deletion timeout as a status condition#8426
openshift-merge-bot[bot] merged 3 commits into
openshift:mainfrom
csrwng:cntrlplane-3381-cpo-deletion-timeout

Conversation

@csrwng

@csrwng csrwng commented May 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add CloudResourcesDeletionTimedOutReason constant to the API
  • Set CloudResourcesDestroyed condition to False with reason CloudResourcesDeletionTimedOut when the CPO deletion timeout is exceeded, including elapsed time and last known status in the message
  • Handle the new reason in the cleanup-skipped check so the CPO does not re-enter cleanup after a timeout

Context

When the CPO gives up on deleting cloud resources after a timeout, it only emits a log message. This behavior is not exposed through any status condition, making it invisible to users and to the hypershift-operator unless someone is actively tailing CPO logs. This change surfaces the timeout as a first-class condition for automated monitoring and OCM integration.

Identified during a debugging session investigating cluster deletion issues in the managed Azure service (ARO HCP).

Jira

https://issues.redhat.com/browse/CNTRLPLANE-3381

Test plan

  • Verify CloudResourcesDestroyed condition is set to False with reason CloudResourcesDeletionTimedOut when deletion times out
  • Verify condition message includes timeout duration and last known status
  • Verify subsequent reconciles treat the timed-out state the same as cleanup-skipped
  • make test passes
  • make build passes

Summary by CodeRabbit

  • Improvements
    • Treats cloud resource deletion timeouts as a completed/skipped cleanup case, records a clear timeout status message (including prior status when available), and ensures related controllers are scaled down during cleanup.
  • Tests
    • Added unit tests covering timeout handling, skipped/done status transitions, scaling behavior, and status message composition.

@openshift-ci

openshift-ci Bot commented May 5, 2026

Copy link
Copy Markdown
Contributor

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

@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 5, 2026
@openshift-ci openshift-ci Bot added the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label May 5, 2026
@openshift-ci-robot

openshift-ci-robot commented May 5, 2026

Copy link
Copy Markdown

@csrwng: This pull request references CNTRLPLANE-3381 which is a valid jira issue.

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

Details

In response to this:

Summary

  • Add CloudResourcesDeletionTimedOutReason constant to the API
  • Set CloudResourcesDestroyed condition to False with reason CloudResourcesDeletionTimedOut when the CPO deletion timeout is exceeded, including elapsed time and last known status in the message
  • Handle the new reason in the cleanup-skipped check so the CPO does not re-enter cleanup after a timeout

Context

When the CPO gives up on deleting cloud resources after a timeout, it only emits a log message. This behavior is not exposed through any status condition, making it invisible to users and to the hypershift-operator unless someone is actively tailing CPO logs. This change surfaces the timeout as a first-class condition for automated monitoring and OCM integration.

Identified during a debugging session investigating cluster deletion issues in the managed Azure service (ARO HCP).

Jira

https://issues.redhat.com/browse/CNTRLPLANE-3381

Test plan

  • Verify CloudResourcesDestroyed condition is set to False with reason CloudResourcesDeletionTimedOut when deletion times out
  • Verify condition message includes timeout duration and last known status
  • Verify subsequent reconciles treat the timed-out state the same as cleanup-skipped
  • make test passes
  • make build passes

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

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

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

This repository is configured in: LGTM mode

@openshift-ci openshift-ci Bot added do-not-merge/needs-area area/api Indicates the PR includes changes for the API area/control-plane-operator Indicates the PR includes changes for the control plane operator - in an OCP release approved Indicates a PR has been approved by an approver from all required OWNERS files. and removed do-not-merge/needs-area labels May 5, 2026
When the CPO decides to give up on deleting cloud resources after a
timeout, it emits a log but otherwise does not expose this behavior
through conditions, making it hard to know that this happened.

Set the CloudResourcesDestroyed condition to False with reason
CloudResourcesDeletionTimedOut when the deletion timeout is exceeded,
including a descriptive message with the elapsed time and last known
status. Also handle the new reason in the cleanup-skipped check so
the CPO does not re-enter cleanup after a timeout.

Signed-off-by: Cesar Wong <cewong@redhat.com>
Commit-Message-Assisted-by: Claude (via Claude Code)
@csrwng
csrwng force-pushed the cntrlplane-3381-cpo-deletion-timeout branch from b580a3d to 299e6af Compare May 5, 2026 19:40
@coderabbitai

coderabbitai Bot commented May 5, 2026

Copy link
Copy Markdown
Contributor

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: 28072527-6f62-40de-85d5-3304fa704aa2

📥 Commits

Reviewing files that changed from the base of the PR and between db26558 and 16f63ce.

📒 Files selected for processing (1)
  • control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go
✅ Files skipped from review due to trivial changes (1)
  • control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go

📝 Walkthrough

Walkthrough

A new exported reason constant CloudResourcesDeletionTimedOutReason was added. The hosted control plane controller's removeCloudResources treats CloudResourcesDestroyed with Status: False and Reason equal to either CloudResourcesCleanupSkippedReason or CloudResourcesDeletionTimedOutReason as terminal and returns done. If resource deletion exceeds resourceDeletionTimeout, the controller sets CloudResourcesDestroyed to Status: False with Reason: CloudResourcesDeletionTimedOutReason, composes a timeout message that may include the prior condition message, and persists the status update via Status().Update. A unit test exercising these cases was added.

Sequence Diagram(s)

sequenceDiagram
  actor Reconciler as Reconciler
  participant HCP as HostedControlPlane.Status
  participant API as API_Server_Status
  participant CVO as cluster-version-operator_Deployment

  Reconciler->>HCP: Read CloudResourcesDestroyed condition
  alt Condition true
    Reconciler-->>Reconciler: return done
  else Condition false with Reason CleanupSkipped or DeletionTimedOut
    Reconciler-->>Reconciler: log terminal reason/message
    Reconciler-->>Reconciler: return done
  else Not terminal
    Reconciler->>CVO: Get Deployment
    alt Deployment exists with replicas > 0
      Reconciler->>CVO: Scale down Deployment (set replicas=0)
      Reconciler-->>Reconciler: return not-done
    else CVO absent or scaled down
      Reconciler-->>Reconciler: check timeElapsed > resourceDeletionTimeout
      alt timed out
        Reconciler->>HCP: Set CloudResourcesDestroyed(Status=False, Reason=CloudResourcesDeletionTimedOutReason, message)
        Reconciler->>API: Status().Update(HCP)
        Reconciler-->>Reconciler: continue cleanup
      else not timed out
        Reconciler-->>Reconciler: return not-done
      end
    end
  end
Loading
🚥 Pre-merge checks | ✅ 11 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (11 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: adding a new status condition to surface cloud resource deletion timeouts in the control plane operator.
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 Test names in TestRemoveCloudResources are stable and static with no dynamic information like timestamps, UUIDs, or generated IDs. All test case names are descriptive and deterministic.
Test Structure And Quality ✅ Passed Test uses standard Go testing.T with t.Run subtests, not Ginkgo. Custom check specifies Ginkgo test code requirements (It blocks, Describe, BeforeEach/AfterEach), which do not apply here.
Microshift Test Compatibility ✅ Passed The TestRemoveCloudResources is a standard Go unit test (testing.T), not a Ginkgo e2e test. The check applies only to Ginkgo e2e tests. APIs used are MicroShift-compatible.
Single Node Openshift (Sno) Test Compatibility ✅ Passed The PR adds only a standard Go unit test (TestRemoveCloudResources), not Ginkgo e2e tests. The custom check applies exclusively to new Ginkgo e2e tests. Not applicable.
Topology-Aware Scheduling Compatibility ✅ Passed PR does not introduce scheduling constraints. Changes limited to status condition constants, cleanup timeout logic, and tests—no pod affinity, topology spread, or node selectors.
Ote Binary Stdout Contract ✅ Passed All logging uses ctrl.LoggerFrom() from controller-runtime, which uses structured logging and does not write to stdout. No direct stdout writes detected. Test uses zapr/zaptest for proper log capture.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed The custom check applies to Ginkgo e2e tests. The PR adds TestRemoveCloudResources, a standard Go unit test using testing.T with no external connectivity or IPv4 assumptions. 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.

@csrwng
csrwng marked this pull request as ready for review May 5, 2026 19:41
@openshift-ci openshift-ci Bot removed the do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress. label May 5, 2026
@openshift-ci
openshift-ci Bot requested review from jparrill and sjenning May 5, 2026 19:42

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go (1)

2422-2426: ⚡ Quick win

Clarify terminal cleanup logging for skipped vs timed-out states.

On Line 2426, the log always says cleanup was skipped and logs Message as "reason", which is misleading when the terminal state is a timeout.

Proposed diff
-		log.Info("Cleanup has been skipped", "reason", resourcesDestroyedCond.Message)
+		log.Info("Cloud resource cleanup reached terminal state",
+			"reason", resourcesDestroyedCond.Reason,
+			"message", resourcesDestroyedCond.Message)
🤖 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/controllers/hostedcontrolplane/hostedcontrolplane_controller.go`
around lines 2422 - 2426, The log incorrectly always states "Cleanup has been
skipped" for both skipped and timed-out terminal states; update the block that
checks resourcesDestroyedCond (and the constants
hyperv1.CloudResourcesCleanupSkippedReason /
hyperv1.CloudResourcesDeletionTimedOutReason) to branch the log message based on
resourcesDestroyedCond.Reason and use both resourcesDestroyedCond.Reason and
resourcesDestroyedCond.Message in structured fields passed to log.Info (e.g.,
log.Info("Cleanup has been skipped", "reason", resourcesDestroyedCond.Reason,
"message", resourcesDestroyedCond.Message) vs log.Info("Cleanup has timed out",
...)) so the output clearly distinguishes skipped vs timed-out outcomes while
keeping the same conditional.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In
`@control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go`:
- Around line 2422-2426: The log incorrectly always states "Cleanup has been
skipped" for both skipped and timed-out terminal states; update the block that
checks resourcesDestroyedCond (and the constants
hyperv1.CloudResourcesCleanupSkippedReason /
hyperv1.CloudResourcesDeletionTimedOutReason) to branch the log message based on
resourcesDestroyedCond.Reason and use both resourcesDestroyedCond.Reason and
resourcesDestroyedCond.Message in structured fields passed to log.Info (e.g.,
log.Info("Cleanup has been skipped", "reason", resourcesDestroyedCond.Reason,
"message", resourcesDestroyedCond.Message) vs log.Info("Cleanup has timed out",
...)) so the output clearly distinguishes skipped vs timed-out outcomes while
keeping the same conditional.

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Enterprise

Run ID: 0f991213-3892-4857-85c3-9b1b2f12fcce

📥 Commits

Reviewing files that changed from the base of the PR and between 2d3b34d and 299e6af.

⛔ Files ignored due to path filters (1)
  • vendor/github.com/openshift/hypershift/api/hypershift/v1beta1/hostedcluster_conditions.go is excluded by !vendor/**, !**/vendor/**
📒 Files selected for processing (2)
  • api/hypershift/v1beta1/hostedcluster_conditions.go
  • control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go

@codecov

codecov Bot commented May 5, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 83.33333% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 37.47%. Comparing base (e09cc2d) to head (16f63ce).
⚠️ Report is 16 commits behind head on main.

Files with missing lines Patch % Lines
...ostedcontrolplane/hostedcontrolplane_controller.go 83.33% 2 Missing and 1 partial ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8426      +/-   ##
==========================================
+ Coverage   37.39%   37.47%   +0.07%     
==========================================
  Files         751      751              
  Lines       91806    91865      +59     
==========================================
+ Hits        34333    34425      +92     
+ Misses      54838    54800      -38     
- Partials     2635     2640       +5     
Files with missing lines Coverage Δ
...ostedcontrolplane/hostedcontrolplane_controller.go 38.66% <83.33%> (+1.93%) ⬆️

... and 1 file with indirect coverage changes

Flag Coverage Δ
cmd-support 32.56% <ø> (ø)
cpo-hostedcontrolplane 36.77% <83.33%> (+0.28%) ⬆️
cpo-other 37.73% <ø> (ø)
hypershift-operator 47.93% <ø> (+0.07%) ⬆️
other 27.77% <ø> (ø)

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.

Clarify the log message when cloud resource cleanup reaches a terminal
state (skipped or timed out) to distinguish between the two cases by
logging the actual reason and message from the condition.

Add unit test coverage for the removeCloudResources method covering:
- resources already destroyed
- cleanup skipped
- deletion timed out (subsequent reconcile)
- deletion timing out (sets condition)
- deletion timing out with prior status (includes last status)
- deletion still in progress
- CVO deployment scaling down

Signed-off-by: Cesar Wong <cewong@redhat.com>
Commit-Message-Assisted-by: Claude (via Claude Code)
@csrwng

csrwng commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai Good catch on the misleading log message. Applied the suggested change — the log now reads "Cloud resource cleanup reached terminal state" with separate structured fields for reason and message, so skipped vs timed-out states are clearly distinguishable in the output.

Also added unit test coverage for removeCloudResources covering the terminal state paths (skipped, timed out, timed out with prior status) as well as the in-progress and CVO scale-down paths.

@coderabbitai

coderabbitai Bot commented May 5, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@csrwng: Thanks for the update! The revised log message "Cloud resource cleanup reached terminal state" with distinct structured fields for reason and message is a clear improvement — it makes skipped vs. timed-out states immediately distinguishable without any ambiguity. The added unit test coverage for removeCloudResources across all the key paths (terminal states, in-progress, and CVO scale-down) is a great addition and will help guard against regressions. The changes look solid!

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go (1)

2437-2459: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don't use LastTransitionTime as the cleanup heartbeat.

CloudResourcesDestroyed can remain False while its reason/message changes during deletion progress (e.g., "Deleting load balancers"). In that case, meta.SetStatusCondition preserves LastTransitionTime, so this branch measures from the first False transition, not from the latest progress update. That can trigger the timeout even while cleanup is actively advancing.

Suggested direction
-		var timeElapsed time.Duration
-		if resourcesDestroyedCond != nil {
-			timeElapsed = time.Since(resourcesDestroyedCond.LastTransitionTime.Time)
-		} else {
-			timeElapsed = time.Since(cvoScaledDownCond.LastTransitionTime.Time)
-		}
+		// LastTransitionTime only changes when Condition.Status flips.
+		// If timeout should be based on cleanup start, use CVOScaledDown.
+		// If timeout should be based on progress heartbeats, persist a dedicated timestamp.
+		timeElapsed := time.Since(cvoScaledDownCond.LastTransitionTime.Time)
🤖 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/controllers/hostedcontrolplane/hostedcontrolplane_controller.go`
around lines 2437 - 2459, The timeout check is using LastTransitionTime
(resourcesDestroyedCond.LastTransitionTime) which doesn't change when the
condition message/reason is updated, so replace that heartbeat check with a
timestamp that reflects the most recent condition update (e.g., use the
condition's LastUpdateTime/LastHeartbeatTime if available or the most-recent-of
LastTransitionTime and LastUpdateTime) when computing timeElapsed for
resourcesDestroyedCond (and similarly for cvoScaledDownCond); ensure you read
the newer timestamp field instead of LastTransitionTime before calling
meta.SetStatusCondition for CloudResourcesDestroyed so progress updates reset
the timeout.
🤖 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
`@control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go`:
- Around line 2834-2858: The test is reading the post-call condition instead of
the original one and never verifies scaling; capture the original prevCond from
tc.hcp.Status.Conditions before calling removeCloudResources (so prevCond
reflects the pre-timeout "InProgress" state) and use that saved value when
asserting the "last status:" message; additionally, for the "should scale it
down" case reload the cluster-version-operator Deployment from the test client
after removeCloudResources and assert its spec.replicas is 0 to validate the
scaling behavior; reference symbols: removeCloudResources, tc.hcp, prevCond, and
the cluster-version-operator Deployment in your changes.

---

Outside diff comments:
In
`@control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go`:
- Around line 2437-2459: The timeout check is using LastTransitionTime
(resourcesDestroyedCond.LastTransitionTime) which doesn't change when the
condition message/reason is updated, so replace that heartbeat check with a
timestamp that reflects the most recent condition update (e.g., use the
condition's LastUpdateTime/LastHeartbeatTime if available or the most-recent-of
LastTransitionTime and LastUpdateTime) when computing timeElapsed for
resourcesDestroyedCond (and similarly for cvoScaledDownCond); ensure you read
the newer timestamp field instead of LastTransitionTime before calling
meta.SetStatusCondition for CloudResourcesDestroyed so progress updates reset
the timeout.
🪄 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: 10a1f9f9-d361-4f70-af4b-13e5a295c15f

📥 Commits

Reviewing files that changed from the base of the PR and between 299e6af and db26558.

📒 Files selected for processing (2)
  • control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller.go
  • control-plane-operator/controllers/hostedcontrolplane/hostedcontrolplane_controller_test.go

The test was reading the CloudResourcesDestroyed condition after
removeCloudResources mutated it in place, so the "last status:"
assertions were never actually reached. Capture the original condition
before the call to properly validate the carry-forward message.

Also add assertion that CVO deployment replicas are set to 0 after
scaling.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@csrwng

csrwng commented May 5, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the CodeRabbit feedback in 16f63ce:

Test assertion bug (inline comment): Fixed. The test was reading prevCond after removeCloudResources mutated tc.hcp.Status.Conditions in place, so the "last status:" assertions were unreachable (the condition already had CloudResourcesDeletionTimedOutReason). Now captures the original condition before the call. Also added assertion that CVO deployment replicas are set to 0 after scaling.

Log message nitpick: Already addressed in db26558 — the log now says "Cloud resource cleanup reached terminal state" with both reason and message fields.

LastTransitionTime concern: This is intentional. We want a hard timeout from when cleanup started, not a resetting timeout based on progress heartbeats. If a deletion keeps updating its status message but never finishes, it should still time out. Using LastTransitionTime (which anchors to when CloudResourcesDestroyed first transitioned to False) gives us this behavior.

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

LGTM — clean implementation. The new CloudResourcesDeletionTimedOutReason condition surfaces the timeout state properly, and the terminal state check now handles both Skipped and TimedOut correctly. Tests are thorough with good coverage of all paths.

Minor nit: timeout tests use hardcoded -15 * time.Minute which assumes resourceDeletionTimeout = 10m — if that constant changes, the tests would silently pass/fail incorrectly. Not blocking.

@jparrill

jparrill commented May 6, 2026

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 6, 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

openshift-ci Bot commented May 6, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: csrwng, jparrill

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

@cwbotbot

cwbotbot commented May 6, 2026

Copy link
Copy Markdown

Test Results

e2e-aws

e2e-aks

@csrwng

csrwng commented May 6, 2026

Copy link
Copy Markdown
Contributor Author

/verified by @csrwng

  • Manually created a hosted cluster using the CPO from this PR
  • Created a service of type LoadBalancer in the hosted cluster
  • Added a VAP to the hosted cluster to prevent deletion of services of type LoadBalancer
  • Deleted hosted cluster
  • The hosted cluster's CloudResourcesDestroyed condition reported reason: CloudResourcesDeletionTimeout

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

Copy link
Copy Markdown

@csrwng: This PR has been marked as verified by @csrwng.

Details

In response to this:

/verified by @csrwng

  • Manually created a hosted cluster using the CPO from this PR
  • Created a service of type LoadBalancer in the hosted cluster
  • Added a VAP to the hosted cluster to prevent deletion of services of type LoadBalancer
  • Deleted hosted cluster
  • The hosted cluster's CloudResourcesDestroyed condition reported reason: CloudResourcesDeletionTimeout

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

@openshift-ci

openshift-ci Bot commented May 6, 2026

Copy link
Copy Markdown
Contributor

@csrwng: 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-merge-bot
openshift-merge-bot Bot merged commit b0a10c5 into openshift:main May 6, 2026
49 checks passed
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/control-plane-operator Indicates the PR includes changes for the control plane operator - in an OCP release 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.

5 participants