Skip to content

fix(sandboxclaim): default Delete+TTL=0 lifecycle for warm pool claims - #1309

Open
vvoronko wants to merge 7 commits into
kubernetes-sigs:mainfrom
vvoronko:fix/1306-warmpool-claim-lifecycle
Open

fix(sandboxclaim): default Delete+TTL=0 lifecycle for warm pool claims#1309
vvoronko wants to merge 7 commits into
kubernetes-sigs:mainfrom
vvoronko:fix/1306-warmpool-claim-lifecycle

Conversation

@vvoronko

@vvoronko vvoronko commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Summary

  • When a SandboxClaim references a WarmPool but omits spec.lifecycle, checkExpiration() short-circuits at the nil check and returns (false, 0) — the expiration reconciler never runs, so the claim, sandbox, pod, and VM persist indefinitely
  • This leaks VPC IPs, auto-refreshes SA tokens, and holds cloud IMDS access with no expiration path
  • Inject an in-memory default Lifecycle{ShutdownPolicy: Delete, TTLSecondsAfterFinished: 0} for warm-pool-sourced claims that omit it — the default is deterministic and reconcile-local (not persisted to the API server)
  • Non-warm-pool claims retain the existing behavior (immortal when Lifecycle is nil)
  • Explicit Lifecycle settings (e.g. Retain for debugging) are never overridden

Details

The root cause is in checkExpiration (sandboxclaim_controller.go:427):

if claim.Spec.Lifecycle == nil {
    return false, 0  // claim never expires
}

This is correct for bare Sandbox objects (GitOps safety — see #201), but warm pool claims are ephemeral by definition and should not accumulate indefinitely. The fix adds a warm pool check before the early return:

if claim.Spec.Lifecycle == nil {
    if claim.Spec.WarmPoolRef.Name == "" {
        return false, 0  // non-warm-pool: preserve existing behavior
    }
    // Inject default: Delete + TTL=0
    ttl := int32(0)
    claim.Spec.Lifecycle = &extensionsv1beta1.Lifecycle{
        ShutdownPolicy:          extensionsv1beta1.ShutdownPolicyDelete,
        TTLSecondsAfterFinished: &ttl,
    }
}

Follow-up (not in this PR)

A configurable default reaper TTL for explicit Retain claims could prevent stale object accumulation for debugging scenarios. See #1306 comment for the full security analysis.

Fixes #1306

Test plan

  • go build ./... passes
  • go vet ./... passes
  • New unit tests (4 cases):
    • Warm pool claim, nil lifecycle, finished → claim deleted ✅
    • Warm pool claim, nil lifecycle, not finished → claim stays active ✅
    • Warm pool claim, explicit Retain → respected, no override ✅
    • Non-warm-pool claim, nil lifecycle → immortal (old behavior) ✅
  • All existing controller tests pass unchanged

Summary by CodeRabbit

  • Bug Fixes

    • Warm-pool SandboxClaims without an explicit lifecycle now automatically delete after their workload finishes.
    • Claims remain active before completion and continue honoring explicit retention settings.
    • SandboxClaims not associated with a warm pool retain their existing behavior.
  • Documentation

    • Clarified lifecycle defaults and how explicit settings override them.

@kubernetes-prow kubernetes-prow Bot added the do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. label Jul 29, 2026
@netlify

netlify Bot commented Jul 29, 2026

Copy link
Copy Markdown

Deploy Preview for agent-sandbox canceled.

Name Link
🔨 Latest commit ccdf4bb
🔍 Latest deploy log https://app.netlify.com/projects/agent-sandbox/deploys/6a6d0c694e73520008e1dde6

@kubernetes-prow
kubernetes-prow Bot requested review from igooch and vicentefb July 29, 2026 21:56
@kubernetes-prow kubernetes-prow Bot added cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Jul 29, 2026
@kubernetes-prow

Copy link
Copy Markdown

Hi @vvoronko. Thanks for your PR.

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

Regular contributors should join the org to skip this step.

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

I understand the commands that are listed here.

Details

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

@kubernetes-prow kubernetes-prow Bot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Jul 29, 2026
@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

WarmPool-backed SandboxClaims without an explicit lifecycle now use an effective Delete lifecycle after completion. Claims without a WarmPool reference remain active, and explicit Retain remains unchanged. The effective default is not persisted.

Changes

WarmPool lifecycle behavior

Layer / File(s) Summary
Default lifecycle and reconciliation
extensions/controllers/sandboxclaim_controller.go
checkExpiration returns the effective lifecycle. WarmPool claims without a lifecycle use ShutdownPolicyDelete and zero TTL during reconciliation without updating the claim spec.
Lifecycle behavior tests
extensions/controllers/sandboxclaim_controller_test.go, test/e2e/extensions/warmpool_sandbox_watcher_test.go
Tests cover finished and active claims, explicit Retain, non-WarmPool claims, deletion, retention, non-persistence of effective defaults, and retained adopted sandboxes.
Lifecycle default documentation
extensions/api/v1beta1/sandboxclaim_types.go, docs/api.md
The API documentation describes Delete and zero TTL defaults for WarmPool claims without an explicit lifecycle.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested labels: kind/bug, lgtm

Suggested reviewers: vicentefb, igooch

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes satisfy issue #1306 by defaulting WarmPool claims to Delete with TTL zero while preserving explicit and non-WarmPool lifecycle behavior.
Out of Scope Changes check ✅ Passed The code, documentation, unit tests, and E2E test adjustment directly support the WarmPool lifecycle change and issue objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed The title clearly and concisely describes the WarmPool lifecycle default change.
Description check ✅ Passed The description clearly explains the fix, rationale, linked issue, implementation details, and test plan; it is mostly complete despite omitting the release-note block.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

…s with nil Lifecycle

When a SandboxClaim references a WarmPool but omits spec.lifecycle,
checkExpiration() short-circuits at the nil check and returns (false, 0).
The expiration reconciler never runs, so the claim, sandbox, pod, and VM
persist indefinitely — leaking VPC IPs, auto-refreshing SA tokens, and
holding cloud IMDS access with no expiration path.

Inject an in-memory default Lifecycle{ShutdownPolicy: Delete, TTL: 0}
for warm-pool-sourced claims that omit it. The default is deterministic
and reconcile-local (not persisted to the API server). Non-warm-pool
claims retain the existing behavior (immortal when Lifecycle is nil).

Explicit Lifecycle settings (e.g. Retain for debugging) are never
overridden. A follow-up could add a configurable default reaper TTL
for explicit Retain claims to prevent stale object accumulation.

For: kubernetes-sigs#1306
Signed-off-by: vvoronko <vvoronko@redhat.com>
@vvoronko
vvoronko force-pushed the fix/1306-warmpool-claim-lifecycle branch from 9593683 to 82e065b Compare July 29, 2026 21:59
@kubernetes-prow kubernetes-prow Bot removed the do-not-merge/invalid-commit-message Indicates that a PR should not merge because it has an invalid commit message. label Jul 29, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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 `@extensions/controllers/sandboxclaim_controller_test.go`:
- Around line 1766-1769: Replace the fake.NewClientBuilder setup in this
extension reconciler test with the existing envtest-style extension harness and
fixtures. Preserve the configured scheme, objects, and status-subresource
behavior through the harness APIs, and use its reconciler client so status and
patch operations run against the API server.

In `@extensions/controllers/sandboxclaim_controller.go`:
- Around line 426-439: The warm-pool lifecycle default must remain in-memory
only and must not be persisted to the Claim. Update checkExpiration in
sandboxclaim_controller.go so its temporary lifecycle value is not retained on
the claim used by active reconciliation, then extend the active WarmPool
regression coverage in sandboxclaim_controller_test.go to reconcile a claim
without an explicit lifecycle and assert updatedClaim.Spec.Lifecycle remains nil
across reconcile cycles.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: b2b956d5-efd2-4eee-a605-a01f4197d050

📥 Commits

Reviewing files that changed from the base of the PR and between e3d15b6 and 9593683.

📒 Files selected for processing (2)
  • extensions/controllers/sandboxclaim_controller.go
  • extensions/controllers/sandboxclaim_controller_test.go

Comment thread extensions/controllers/sandboxclaim_controller_test.go
Comment thread extensions/controllers/sandboxclaim_controller.go Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Not ready to approve

The new unit test uses invalid Kubernetes object names (spaces/overlength), which can mask real-world behavior and should be corrected before approval.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

This review doesn't count toward merge requirements. Sign up for the private preview to control whether Copilot approvals count.

Pull request overview

This PR fixes a warm-pool SandboxClaim lifecycle leak by ensuring warm-pool-sourced claims without spec.lifecycle get an in-memory default lifecycle that expires immediately after the workload finishes, allowing the controller to delete the claim (and associated resources) instead of retaining them forever.

Changes:

  • Inject a warm-pool-only default lifecycle (ShutdownPolicy=Delete, TTLSecondsAfterFinished=0) when spec.lifecycle is nil.
  • Preserve existing behavior for non-warm-pool claims with nil lifecycle (no expiration) and never override explicitly set lifecycles.
  • Add unit tests covering warm-pool defaulting, explicit retain, and the non-warm-pool nil-lifecycle case.
File summaries
File Description
extensions/controllers/sandboxclaim_controller.go Defaults nil lifecycle for warm-pool claims so expiration and deletion can run.
extensions/controllers/sandboxclaim_controller_test.go Adds tests to validate the warm-pool default lifecycle behavior and non-regression cases.
Review details
  • Files reviewed: 2/2 changed files
  • Comments generated: 2
  • Review effort level: Low

We're testing this review assessment. Please use 👍 or 👎 to tell us if it's correct.

Comment thread extensions/controllers/sandboxclaim_controller.go
Comment thread extensions/controllers/sandboxclaim_controller_test.go
vvoronko added 2 commits July 30, 2026 01:08
Add a defensive assertion to TestSandboxClaimWarmPoolDefaultLifecycle
verifying that Spec.Lifecycle remains nil in the API server after
reconciliation cycles. This enforces the contract that checkExpiration's
warm-pool lifecycle injection is in-memory only and cannot leak through
status subresource patches.

For: kubernetes-sigs#1306
Signed-off-by: vvoronko <vvoronko@redhat.com>
Update checkExpiration godoc to describe the in-memory lifecycle
injection for warm-pool claims. Use short DNS-1123-valid slugs for
test object names while keeping descriptive subtest labels.

For: kubernetes-sigs#1306
Signed-off-by: vvoronko <vvoronko@redhat.com>

@aditya-shantanu aditya-shantanu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

One blocking issue: the injected default can leak into the persisted spec.

// finished claims accumulate indefinitely — leaking VMs, pod IPs,
// and auto-refreshing SA tokens. See #1306.
ttl := int32(0)
claim.Spec.Lifecycle = &extensionsv1beta1.Lifecycle{

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This injection is not actually "never persisted": Reconcile runs checkExpiration before reconcileActive, and the warm-pool adoption path then does a full-object r.Update(ctx, claim) (~line 1008), which writes this Delete+TTL=0 default into the user's spec. Compute the effective lifecycle in a local variable instead of mutating claim.Spec.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Thanks for catching this, Aditya — great attention to detail. You're absolutely right that r.Update(ctx, claim) at line 1008 (adoption path) is a full-object write and would persist the injected lifecycle.

I've refactored checkExpiration to return the effective lifecycle as a third value instead of mutating claim.Spec. The caller uses it only for the policy decision at lines 254-258. Here's the case-by-case trace through the reconcile loop:

Case 1: Warm-pool claim, nil lifecycle, workload finished

  • checkExpiration synthesizes {Delete, TTL=0} in a local lc. TimeLeft(true, 0).
  • First reconcile: sets Expired condition via updateStatus (status subresource only), requeues.
  • Second reconcile: line 254 checks effectiveLifecycle.ShutdownPolicy == Deleter.Delete(ctx, claim).
  • claim.Spec.Lifecycle remains nil throughout. ✓

Case 2: Warm-pool claim, nil lifecycle, workload active

  • checkExpiration synthesizes {Delete, TTL=0}. No finished condition → TimeLeft returns (false, ...).
  • claimExpired=falsereconcileActive → adoption path → r.Update(ctx, claim).
  • claim.Spec.Lifecycle is nil — never mutated. Full-object update is safe. ✓

Case 3: Warm-pool claim, explicit Retain (no TTL), workload finished

  • checkExpiration uses claim.Spec.Lifecycle directly. TTLSecondsAfterFinished=nilNeedsCleanup() returns false → ExpireAt returns nil → TimeLeft returns (false, 0).
  • claimExpired=falsereconcileActive. Explicit Retain honored, no override. ✓

Case 4: Non-warm-pool claim, nil lifecycle, workload finished

  • checkExpiration: WarmPoolRef.Name="" → early return (false, 0, nil).
  • Immortal behavior preserved — unchanged from original code. ✓

Case 5: Warm-pool claim, explicit Delete + TTL=300, finished 1m ago

  • checkExpiration uses claim.Spec.Lifecycle. TTL expires at finished+300s (4m from now).
  • TimeLeft returns (false, ~4min). Requeued for later. ✓

Case 6: Post-reconcile expiration check (line 290)

  • After reconcileActive, sandbox may have transitioned to Finished mid-reconcile.
  • Second checkExpiration call: lifecycle discarded (_), only expired used to set condition and requeue. Policy action happens on the next reconcile cycle at lines 254-272.
  • No spec mutation. ✓

Summary matrix:

Scenario WarmPoolRef Lifecycle Finished effectiveLC expired Path Spec mutated?
Warm+nil+finished yes nil yes Delete+TTL=0 true delete claim no
Warm+nil+active yes nil no Delete+TTL=0 false reconcileActive no
Warm+Retain yes Retain yes Retain false reconcileActive no
No pool+nil no nil yes nil false reconcileActive no
Warm+Delete+TTL yes Delete+300 yes (1m) Delete+300 false reconcileActive no
Post-reconcile any any transitions discarded maybe set condition no

The ttl local inside checkExpiration is stack-scoped — the pointer in lc.TTLSecondsAfterFinished lives for the duration of Reconcile and falls out of scope at the end. No stashing, no leak.

Fixed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@aditya-shantanu FYI — updated test coverage matrix across all lifecycle cases (our 4 new + 3 existing):

Case WarmPoolRef Lifecycle Finished Expected outcome Asserts
warm+nil+finished yes nil yes claim deleted IsNotFound
warm+nil+active yes nil no claim stays Spec.Lifecycle == nil, no expired condition
warm+explicit Retain yes Retain yes claim stays ShutdownPolicy preserved as Retain
non-warm+nil no nil yes claim stays (immortal) Spec.Lifecycle == nil, no expired condition
explicit Retain+TTL=0 yes Retain+TTL=0 yes sandbox deleted, claim kept expired condition set, finished preserved
explicit DeleteForeground+TTL=0 yes DeleteForeground+TTL=0 yes claim deleted IsNotFound
two-reconcile persistence yes Delete+TTL=0 yes expired condition persisted before delete first reconcile sets condition, second deletes

False-positive guards:

  • Active claims: assert no expired condition is set (prevents premature deletion)
  • Nil lifecycle: assert Spec.Lifecycle remains nil after reconciliation (prevents spec leak via r.Update)
  • Explicit lifecycle: assert ShutdownPolicy is preserved (prevents synthesized default from overriding user intent)

…ing claim.Spec

checkExpiration now returns (expired, timeLeft, *Lifecycle) so the
caller uses the effective lifecycle for policy decisions without
mutating claim.Spec. This prevents the synthesized Delete+TTL=0
default from leaking into the API server via the full-object
r.Update in the warm-pool adoption path (line 1008).

Test coverage across 7 lifecycle cases (our 4 + 3 existing):
- warm+nil+finished: synthesized default deletes the claim
- warm+nil+active: claim stays, Spec.Lifecycle remains nil, no
  expired condition (guards premature deletion and spec leak)
- warm+explicit Retain: policy preserved after reconciliation
- non-warm+nil: immortal behavior unchanged
- explicit Retain+TTL=0: sandbox deleted, claim kept (existing)
- explicit DeleteForeground+TTL=0: claim deleted (existing)
- two-reconcile expired persistence dance (existing)

For: kubernetes-sigs#1306
Signed-off-by: vvoronko <vvoronko@redhat.com>

@aditya-shantanu aditya-shantanu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed at 11627ae. Effective-lifecycle handling now covers all policy decision sites and the default is not persisted to spec - thanks for addressing the earlier feedback. One non-blocking doc note inline.

// are cleaned up. The default is never written back to claim.Spec — callers
// must use the returned lifecycle for policy decisions. See #1306.
func (r *SandboxClaimReconciler) checkExpiration(claim *extensionsv1beta1.SandboxClaim) (bool, time.Duration, *extensionsv1beta1.Lifecycle) {
lc := claim.Spec.Lifecycle

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The warm-pool Delete+TTL=0 default is a user-visible behavior change documented only in this code comment; please also note it in the Lifecycle field docs / CRD description so users aren't surprised when finished warm-pool claims are auto-deleted. Non-blocking.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch — you're right that a behavior change like this should be discoverable from the API surface, not just the controller code. Users shouldn't have to read the implementation to understand why their finished warm-pool claims are being cleaned up.

Added the default to the Lifecycle field doc in SandboxClaimSpec (bae52e0) so it shows up in kubectl explain and generated API references. Thank you for the user-facing perspective — it makes the experience much more transparent.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed

@aditya-shantanu

Copy link
Copy Markdown
Collaborator

/lgtm
/ok-to-test

@kubernetes-prow kubernetes-prow Bot added ok-to-test Indicates a non-member PR verified by an org member that is safe to test. and removed needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Jul 30, 2026
@kubernetes-prow kubernetes-prow Bot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Jul 30, 2026
…ifecycle field

Addresses review feedback: note the controller-injected Delete+TTL=0
default in the CRD field description so the behavior is visible to
users via kubectl explain and generated API docs.

Signed-off-by: vvoronko <vvoronko@redhat.com>
@kubernetes-prow kubernetes-prow Bot removed the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Jul 31, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@extensions/api/v1beta1/sandboxclaim_types.go`:
- Around line 115-117: Before applying the new default described by the
warmPoolRef/Lifecycle behavior, add a compatibility migration for persisted
WarmPool claims with nil Lifecycle so existing claims remain retained during a
deprecation period. Update the controller’s defaulting or reconciliation logic
to distinguish migrated legacy claims from newly created claims, and only
interpret omission as ShutdownPolicy=Delete with TTLSecondsAfterFinished=0 after
the migration path is established.
🪄 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: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 27bba214-a6fc-4e91-a5ce-e627126798ba

📥 Commits

Reviewing files that changed from the base of the PR and between 9593683 and bae52e0.

📒 Files selected for processing (3)
  • extensions/api/v1beta1/sandboxclaim_types.go
  • extensions/controllers/sandboxclaim_controller.go
  • extensions/controllers/sandboxclaim_controller_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • extensions/controllers/sandboxclaim_controller_test.go

Comment thread extensions/api/v1beta1/sandboxclaim_types.go
@vvoronko

Copy link
Copy Markdown
Contributor Author

/retest-required

vvoronko added 2 commits July 31, 2026 23:42
Signed-off-by: vvoronko <vvoronko@redhat.com>
TestWarmPoolSandboxWatcher deletes the pod and observes the sandbox
not-ready condition. With the new Delete+TTL=0 default for warm-pool
claims, the controller deletes the claim before the test can observe
that state. Set explicit Retain so the object survives for inspection.

Signed-off-by: vvoronko <vvoronko@redhat.com>

@aditya-shantanu aditya-shantanu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Defaulting is now purely in-memory with the non-persistence covered by a regression test, and the behavior change is documented in the API. Thanks for the quick turnaround.

@aditya-shantanu

Copy link
Copy Markdown
Collaborator

/lgtm

@kubernetes-prow kubernetes-prow Bot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Aug 3, 2026
@kubernetes-prow

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: aditya-shantanu, vvoronko
Once this PR has been reviewed and has the lgtm label, please assign janetkuo for approval. For more information see the Code Review Process.

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

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

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

@vvoronko

vvoronko commented Aug 12, 2026

Copy link
Copy Markdown
Contributor Author

@aditya-shantanu sorry, I have an issue with https://inviter.co/kubernetes slack, could you help me to join the slack channel? Looks like this fix require more discussion. Thanks!

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

Labels

cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. lgtm "Looks good to me", indicates that a PR is ready to be merged. ok-to-test Indicates a non-member PR verified by an org member that is safe to test. ready-for-review size/L Denotes a PR that changes 100-499 lines, ignoring generated files.

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

Default ShutdownPolicy for WarmPool-sourced SandboxClaims should be Delete, not Retain

4 participants