Skip to content

Recover ambiguous DCP creates with configurable timeouts - #20752

Merged
David Negstad (danegsta) merged 2 commits into
mainfrom
danegsta-dcp-watch-timeouts
Oct 10, 2026
Merged

David Negstad (danegsta) merged 2 commits into
mainfrom
danegsta-dcp-watch-timeouts

Conversation

@danegsta

Copy link
Copy Markdown
Member

Description

A single timed-out or HTTP 504 DCP create currently puts a resource into FailedToStart, even though the server may have committed the object. The 20-second steady-state client budget can also expire before DCP's own create timeout, and users cannot configure those limits for slower environments.

Recover ambiguous creates by checking whether the same kind/namespace/name exists before retrying the POST. Creation has a configurable two-minute recovery budget covering setup, requests, confirmation, and retry delays. Initial conflicts and permanent failures still fail, caller cancellation remains terminal, and successful sibling creates are not replayed.

API operations now share one deadline between client setup and the request/retry work: 40 seconds plus a 20-second initialization allowance until the first successful API operation, then 40 seconds. Each operation selects its deadline once. Watch reconnects reselect the current budget without shortening in-flight requests or limiting established watch/log streams.

KubernetesClient's independent 100-second request timer no longer truncates larger configured budgets. Production requests use Aspire's timeout policy, including the cleanup polling GET that previously bypassed it. No new dependencies are required.

Fixes #20691

User-facing usage

The default timeout settings can now be overridden in AppHost configuration:

{
  "DcpPublisher": {
    "KubernetesApiTimeout": "00:00:40",
    "KubernetesInitializationAdditionalTimeout": "00:00:20",
    "KubernetesCreateRecoveryTimeout": "00:02:00"
  }
}

The initialization allowance may be zero. API and recovery budgets support one second through ten minutes; the API budget plus initialization allowance must not exceed ten minutes.

Validation

Passed: 97 selected tests, with no failures or skips. Coverage includes ambiguous-create confirmation/retries, permanent failures, caller cancellation, configuration validation, readiness-aware deadlines, watch reconnects, and established stream lifetimes.

MSBUILDTERMINALLOGGER=false ./dotnet.sh test \
  --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj \
  --no-launch-profile --no-restore /p:SkipNativeBuild=true \
  -- \
  --filter-class '*.KubernetesServiceTests' \
  --filter-class '*.ConfigureDefaultDcpOptionsTests' \
  --filter-not-trait 'quarantined=true' \
  --filter-not-trait 'outerloop=true'

No live DCP reproduction, end-to-end validation, or full test-suite run was performed for the final changes.

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Confirm timed-out creates before retrying the same named object, bound create recovery, and share readiness-aware request deadlines across client setup and API operations.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 20752

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 20752"

@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot October 6, 2026 01:28
@github-actions github-actions Bot added the needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners label Oct 6, 2026
@github-actions

This comment has been minimized.

Copilot AI 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.

Copilot review overview

🔵 Needs a closer look

The cross-cutting retry and timeout lifecycle changes lack live DCP or end-to-end validation.

Review effort: Balanced
Findings: None

What changed in this PR

Adds resilient DCP object creation and configurable Kubernetes API deadlines for slow environments.

Changes:

  • Reconciles ambiguous creates before retrying.
  • Adds validated API, initialization, and recovery timeout settings.
  • Applies Aspire deadlines consistently while preserving established streams.
File Description
src/​Aspire.Hosting/​Dcp/​KubernetesService.cs Implements recovery and shared deadline policies.
src/​Aspire.Hosting/​Dcp/​DcpOptions.cs Adds timeout configuration and validation.
src/​Aspire.Hosting/​Dcp/​DcpKubernetesClient.cs Disables the SDK’s independent timeout.
tests/​Aspire.Hosting.Tests/​Dcp/​KubernetesServiceTests.cs Covers recovery, deadlines, cancellation, and streams.
tests/​Aspire.Hosting.Tests/​Dcp/​ConfigureDefaultDcpOptionsTests.cs Covers defaults, configuration, and validation.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@danegsta

David Negstad (danegsta) commented Oct 6, 2026 •

Copy link
Copy Markdown
Member Author

PR Testing Report

PR Information

  • PR: #20752 - Recover ambiguous DCP creates with configurable timeouts
  • Head commit: 065920e94144388c046f4f5daf18db02e5ff3dbd
  • Tested at: 2026-10-06, completed at approximately 17:56 UTC
  • Execution: Repository container runner, Docker Desktop desktop-linux, Ubuntu 24.04 / Linux ARM64
  • Source regressions: macOS ARM64, Microsoft.Testing.Platform, net8.0
  • Repository changes made during testing: None

Artifact Version Verification

  • Installed CLI: 17.0.0-pr.20752.g065920e9
  • CLI path: /workspace/.aspire/dogfood/pr-20752/bin/aspire
  • PR package hive: /workspace/.aspire/hives/pr-20752/packages
  • Loaded Hosting assembly informational version: 17.0.0-pr.20752.g065920e9
  • Hosting package repository commit: c3ce52cb73d52b1e689113563b2eec7cb6c1b907
  • Status: Verified.

The package repository commit is the normal CI merge commit. Its parents are base
833be629720d582a57118babf1423201aa4944e9 and the exact PR head
065920e94144388c046f4f5daf18db02e5ff3dbd. This was checked against GitHub's commit
API; it is not a stale package mismatch. The running AppHost printed its loaded
Hosting assembly version, rather than relying only on the CLI's version.

The Tests workflow
also reports the same PR head and completed successfully. At the initial check,
the PR had 282 successful checks, 15 skipped checks, and no failed or pending
checks. The 153 check names matching Hosting.Tests or E2E all succeeded.

Changes Analyzed

Files Changed

  • src/Aspire.Hosting/Dcp/DcpKubernetesClient.cs: Remove the independent KubernetesClient request timer.
  • src/Aspire.Hosting/Dcp/DcpOptions.cs: Configurable API, additional initialization, and create-recovery budgets.
  • src/Aspire.Hosting/Dcp/KubernetesService.cs: Ambiguous-create confirmation/retry and readiness-aware operation deadlines.
  • tests/Aspire.Hosting.Tests/Dcp/ConfigureDefaultDcpOptionsTests.cs: Configuration and boundary regressions.
  • tests/Aspire.Hosting.Tests/Dcp/KubernetesServiceTests.cs: HTTP-backed recovery, cancellation, readiness, and stream-lifetime regressions.

Change Categories

  • Hosting core
  • Tests
  • CLI
  • Dashboard
  • Templates
  • Client integrations
  • VS Code extension
  • CI infrastructure

Environment Setup and Exact Commands

All five scenario apps were freshly generated with aspire new, in a temporary
workspace outside the repository. No automated repository E2E suite was run
locally; its validation remains in CI.

Host runner prefix, with testDir set to the recorded temporary workspace:

ASPIRE_PR_WORKSPACE="$testDir" ASPIRE_CONTAINER_USER=0:0 \
  ./eng/scripts/aspire-pr-container/run-aspire-pr-container.sh <command>

Inside the runner, installation used the PR's published dogfood command:

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh \
  | bash -s -- 20752

Result: Passed. The installer selected workflow run 37399355709, downloaded
the common and Linux ARM64 artifacts, and installed the expected CLI and package
hive. VS Code installation was skipped because code is not installed; this PR
has no extension changes.

Resolved prerequisite failure

The first normal AppHost start failed before DCP launched:

C# AppHost requires .NET SDK version 10.0.100 or later. Detected: (not found).

The runner's base image does not include a .NET SDK. The missing prerequisite was
installed only inside the isolated test volume:

curl -fsSL https://dot.net/v1/dotnet-install.sh \
  | bash -s -- --channel 10.0 --install-dir /workspace/.aspire/dotnet --no-path
export DOTNET_ROOT=/workspace/.aspire/dotnet
export PATH="$DOTNET_ROOT:$PATH"

Result: Installed SDK 10.0.401, runtime 10.0.12; subsequent starts succeeded.
This was an environment failure, not a DCP or PR failure. No bundle extraction or
layout repair was needed.

Fresh project creation

The following command was executed separately for NormalSmoke, BurstSmoke,
InvalidApi, InvalidAdditional, and InvalidCombined, substituting each name:

cli=/workspace/.aspire/dogfood/pr-20752/bin/aspire
"$cli" new aspire-empty \
  --name NormalSmoke \
  --output /workspace/NormalSmoke \
  --source /workspace/.aspire/hives/pr-20752/packages \
  --version 17.0.0-pr.20752.g065920e9 \
  --language csharp \
  --localhost-tld false \
  --suppress-agent-init \
  --non-interactive

Result: All five fresh C# file-based AppHosts were created successfully.
Generated SDK/bundle settings and NuGet configuration were preserved.

Test Scenarios Executed

Scenario 1: Normal DCP orchestration

Objective: Exercise actual DCP creation, process startup, dependency ordering,
log delivery, and cleanup with the PR Hosting assembly.

Coverage type: Happy path.

Status: Passed after installing the missing SDK prerequisite.

The AppHost declared three shell executable resources with a dependency chain
root -> middle -> leaf. Each emitted periodic stdout.

apphost=/workspace/NormalSmoke/apphost.cs
"$cli" start --apphost "$apphost" --launch-profile http --isolated --non-interactive --format Json
for name in root middle leaf; do
  "$cli" wait "$name" --status up --timeout 120 --apphost "$apphost" --non-interactive
done
"$cli" describe --apphost "$apphost" --format Json --include-hidden --non-interactive
"$cli" logs --apphost "$apphost" --tail 10 --non-interactive
"$cli" stop --apphost "$apphost" --non-interactive
"$cli" ps --format Json --non-interactive

Observations:

  • All three application resources reported Running and Healthy.
  • Structured resource output contained the exact intended WaitFor edges.
  • Dependency-wait messages and process stdout reached the CLI.
  • The running AppHost loaded Hosting version 17.0.0-pr.20752.g065920e9.
  • Stop succeeded, and the AppHost registry was [] afterward.

Evidence: pr20752-normal-retry.log, pr20752-invalid.log (loaded assembly
identity), and pr20752-evidence/normal/.

Scenario 2: Resource burst and established stream lifetime

Objective: Exercise concurrent real DCP process creation and confirm that a
short API budget does not cap established resource-watch or console-log streams.

Coverage type: Happy path and supported configuration boundary.

Status: Passed.

A fresh AppHost declared 40 shell processes and configured:

DcpPublisher:KubernetesApiTimeout = 00:00:05
DcpPublisher:KubernetesInitializationAdditionalTimeout = 00:00:00
DcpPublisher:KubernetesCreateRecoveryTimeout = 00:00:30

The test script started the AppHost, launched a native CLI readiness wait for
each of the 40 named workers, captured structured resource state, and opened
watch and log followers for worker-00. It then waited 12 seconds, verified both
followers were still active, restarted the worker, checked its new state and
logs, stopped the followers, and stopped the AppHost.

Key commands:

apphost=/workspace/BurstSmoke/apphost.cs
"$cli" start --apphost "$apphost" --launch-profile http --isolated --non-interactive --format Json
"$cli" wait worker-00 --status up --timeout 120 --apphost "$apphost" --non-interactive
# The same readiness command was run for every worker through worker-39.
"$cli" describe --apphost "$apphost" --format Json --non-interactive
"$cli" describe worker-00 --follow --format Json --apphost "$apphost" --non-interactive
"$cli" logs worker-00 --follow --format Json --apphost "$apphost" --non-interactive
# After 12 seconds:
"$cli" logs worker-00 --tail 30 --apphost "$apphost" --non-interactive
"$cli" resource worker-00 restart --apphost "$apphost" --non-interactive
"$cli" wait worker-00 --status up --timeout 120 --apphost "$apphost" --non-interactive
"$cli" stop --apphost "$apphost" --non-interactive
"$cli" ps --format Json --non-interactive

Observations:

  • Exactly 40 named workers were Running and Healthy, both before and after restart.
  • The five-second base budget and zero initialization allowance worked.
  • The same log follower received worker-00:tick:12, beyond the five-second API budget.
  • The watch follower received Running, Stopping, Finished, Starting,
    an intermediate empty state, and then Running after restart.
  • worker-00's actual process ID changed from 498 to 2397.
  • The same log follower received restarted-process output beginning at tick:0.
  • Both followers stopped cleanly, AppHost stop succeeded, and the registry was [].

Evidence: pr20752-burst.log, pr20752-evidence-verification.log, and
pr20752-evidence/burst/. The preserved pr20752-evidence/run-burst.sh contains
the full command sequence.

Scenario 3: Invalid timeout configuration

Objective: Verify the actual AppHost startup path rejects invalid timeout
settings with the correct options-validation error.

Coverage type: Unhappy path and bounds.

Status: Passed.

Three separate fresh AppHosts used the following invalid configurations:

AppHost Configuration Expected outcome
InvalidApi API timeout 00:00:00 API timeout must be between one second and ten minutes
InvalidAdditional Additional initialization timeout -00:00:01 Additional initialization timeout must be non-negative
InvalidCombined API timeout 00:10:00, additional initialization 00:00:01 Combined initialization budget must not exceed ten minutes

For each AppHost:

"$cli" start --apphost "/workspace/$name/apphost.cs" \
  --launch-profile http --isolated --non-interactive --format Json

Observations: Each CLI start returned nonzero (2), with an
OptionsValidationException naming the expected property and exact range error.
None was mistaken for successful startup. The AppHost registry was empty afterward.

Evidence: pr20752-invalid.log and pr20752-evidence/invalid/.

Scenario 4: HTTP-backed recovery and options regressions

Objective: Validate failure paths that cannot be deterministically forced in
the ordinary live-DCP smoke apps.

Coverage type: Happy path, unhappy path, cancellation, and timeout boundaries.

Status: Passed: 97 tests, zero failures, zero skips.

Executed from the source worktree at the exact PR head:

MSBUILDTERMINALLOGGER=false ./dotnet.sh test \
  --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj \
  --no-launch-profile --no-restore /p:SkipNativeBuild=true \
  -- \
  --filter-class '*.KubernetesServiceTests' \
  --filter-class '*.ConfigureDefaultDcpOptionsTests' \
  --filter-not-trait 'quarantined=true' \
  --filter-not-trait 'outerloop=true'

The run compiled and passed in approximately 58 seconds. Coverage includes
complete HTTP 504 after commit, pre-header attempt timeouts with committed and
uncommitted outcomes, confirmation before retry, initial conflict/permanent
failures, Retry-After handling, setup failure versus attempted creation, caller
cancellation, total recovery deadlines, readiness changes, configuration ranges,
and established watch/log stream lifetime.

No partial-response-body stall scenarios were added or run.

Evidence: pr20752-regressions.log.

Evidence Verification

The structured JSON/NDJSON artifacts were checked independently of the CLI's
success messages. Assertions verified exact worker names/counts, healthy/running
states, exact dependency edges, the changed process ID, streamed restart
transitions, log output beyond the API deadline, post-restart logs, all three
specific validation errors, and empty AppHost registries after shutdown.

Result: Passed. See pr20752-evidence-verification.log.

Summary

Scenario Status Notes
Artifact identity Passed CLI and loaded Hosting assembly match PR head; CI merge parent verified
Normal orchestration Passed Three dependent application resources; clean shutdown
Burst and streams Passed 40 workers; streams survive five-second budget; restart observed
Invalid configuration Passed Three explicit startup validation failures
Focused regressions Passed 97 passed, zero failed/skipped

Overall Result

PR VERIFIED for the approved testing scope.

Limitations

  • This does not reproduce the original Intel macOS / Lima / QEMU software-emulation
    environment from issue #20691.
  • Real DCP smoke tests exercised normal and burst creation, watch/log delivery,
    restart, and cleanup. Ambiguous 504/timeout recovery was validated with the
    existing HTTP-backed service tests, not by forcing a real DCP server to stall.
  • The live stream check used a five-second API budget and observed the stream
    across a longer interval; it was not a multi-hour soak.
  • Dashboard resource state was verified through structured CLI output; no
    screenshots or visual UI assertions were needed for this hosting-only change.
  • No local automated E2E suite or additional full-suite run was performed.
  • No product code, PR description, commits, or pushes were changed by testing.

Report, Evidence, and Cleanup Status

  • Persistent report: files/pr20752-testing-report.md in this session.
  • Persistent logs: files/pr20752-*.log.
  • Persistent structured evidence: files/pr20752-evidence/.
  • PR comment: Posted with user approval.
  • Processes: All test-owned AppHosts and followers stopped. Ephemeral runner containers exited and were removed.
  • Temporary workspace: Removed with user approval after preserving evidence.
  • Owned Docker state volume: aspire-pr-state-5e244cde43fc, removed with user approval.

Preserve the DCP recovery tests while removing the filesystem warning suppression retired on main.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Tests selector

50 / 98 PR test projects · 4 PR jobs, from 5 changed files.

Selected PR test projects (50 / 98)

Aspire.Cli.EndToEnd.Tests, Aspire.Hosting.Analyzers.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Kusto.Tests, Aspire.Hosting.Azure.Provisioning.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Browsers.Tests, Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Containers.Tests, Aspire.Hosting.DevTunnels.Tests, Aspire.Hosting.Docker.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.EntityFrameworkCore.Tests, Aspire.Hosting.Foundry.Tests, Aspire.Hosting.Garnet.Tests, Aspire.Hosting.Go.Tests, Aspire.Hosting.Java.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Kafka.Tests, Aspire.Hosting.Keycloak.Tests, Aspire.Hosting.Kubernetes.Tests, Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests, Aspire.Hosting.MongoDB.Tests, Aspire.Hosting.MySql.Tests, Aspire.Hosting.Nats.Tests, Aspire.Hosting.OpenAI.Tests, Aspire.Hosting.Oracle.Tests, Aspire.Hosting.Orleans.Tests, Aspire.Hosting.PostgreSQL.Tests, Aspire.Hosting.Python.Tests, Aspire.Hosting.Qdrant.Tests, Aspire.Hosting.RabbitMQ.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Redis.Tests, Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Rust.Tests, Aspire.Hosting.Seq.Tests, Aspire.Hosting.SqlServer.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Hosting.Valkey.Tests, Aspire.Hosting.Yarp.Tests, Aspire.Playground.Tests

Selected PR jobs (4)

cli-starter-validation, extension-e2e, polyglot, typescript-api-compat


How these were chosen — grouped by what changed

⚠️ 45 of the 50 selected test projects come from a single change — src/Aspire.Hosting/Dcp/DcpKubernetesClient.cs.

🔧 src/Aspire.Hosting/Dcp/DcpKubernetesClient.cs (changed source)
→ 45 via the project graph

show 45

Aspire.Hosting.Analyzers.Tests (2 hops), Aspire.Hosting.Azure.Kubernetes.Tests (2 hops), Aspire.Hosting.Azure.Kusto.Tests (2 hops), Aspire.Hosting.Azure.Provisioning.Tests (3 hops), Aspire.Hosting.Azure.Tests, Aspire.Hosting.Browsers.Tests (2 hops), Aspire.Hosting.CodeGeneration.Go.Tests, Aspire.Hosting.CodeGeneration.Java.Tests, Aspire.Hosting.CodeGeneration.Python.Tests, Aspire.Hosting.CodeGeneration.Rust.Tests, Aspire.Hosting.CodeGeneration.TypeScript.Tests, Aspire.Hosting.Containers.Tests (2 hops), Aspire.Hosting.DevTunnels.Tests (2 hops), Aspire.Hosting.Docker.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests (2 hops), Aspire.Hosting.EntityFrameworkCore.Tests (2 hops), Aspire.Hosting.Foundry.Tests (2 hops), Aspire.Hosting.Garnet.Tests (2 hops), Aspire.Hosting.Go.Tests (2 hops), Aspire.Hosting.Java.Tests (2 hops), Aspire.Hosting.JavaScript.Tests (2 hops), Aspire.Hosting.Kafka.Tests (2 hops), Aspire.Hosting.Keycloak.Tests (2 hops), Aspire.Hosting.Kubernetes.Tests (2 hops), Aspire.Hosting.Maui.Tests, Aspire.Hosting.Milvus.Tests (2 hops), Aspire.Hosting.MongoDB.Tests (2 hops), Aspire.Hosting.MySql.Tests (2 hops), Aspire.Hosting.Nats.Tests (2 hops), Aspire.Hosting.OpenAI.Tests (2 hops), Aspire.Hosting.Oracle.Tests (2 hops), Aspire.Hosting.Orleans.Tests (2 hops), Aspire.Hosting.PostgreSQL.Tests (2 hops), Aspire.Hosting.Python.Tests (2 hops), Aspire.Hosting.Qdrant.Tests (2 hops), Aspire.Hosting.RabbitMQ.Tests (2 hops), Aspire.Hosting.Redis.Tests (2 hops), Aspire.Hosting.RemoteHost.Tests, Aspire.Hosting.Rust.Tests (2 hops), Aspire.Hosting.Seq.Tests (2 hops), Aspire.Hosting.SqlServer.Tests (2 hops), Aspire.Hosting.Testing.Tests (2 hops), Aspire.Hosting.Valkey.Tests (2 hops), Aspire.Hosting.Yarp.Tests (2 hops), Aspire.Playground.Tests

🧪 tests/Aspire.Hosting.Tests/Dcp/ConfigureDefaultDcpOptionsTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests
→ 3 via the project graph: Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.Radius.Tests

📦 affected project Aspire.Hosting
→ 1 test: Aspire.Cli.EndToEnd.Tests

🧪 tests/Aspire.Hosting.Tests/Dcp/KubernetesServiceTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests

Job reasons

Job Triggered by
cli-starter-validation affected project Aspire.Hosting.PostgreSQL
extension-e2e • src/Aspire.Hosting/Dcp/DcpKubernetesClient.cs, src/Aspire.Hosting/Dcp/DcpOptions.cs, src/Aspire.Hosting/Dcp/KubernetesService.cs
• affected project Aspire.Hosting
polyglot • affected project Aspire.Hosting
• affected project Aspire.Hosting.Azure.Provisioning
typescript-api-compat affected project Aspire.Hosting

Selection computed for commit 1ad7cef.

Copilot AI 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.

🟡 Changes recommended

The newly timeout-governed cleanup polling path lacks focused regression coverage.

1 open finding

🧠 Review effort: Balanced

Comment thread src/Aspire.Hosting/Dcp/KubernetesService.cs
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

@danegsta David Negstad (danegsta) added area-orchestrator and removed needs-area-label An area label is needed to ensure this gets routed to the appropriate area owners labels Oct 9, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No high-confidence blocking issues found. Reviewed recovery design, cancellation and retry edge cases, configuration validation, and regression coverage. Validation at this head: 62/62 focused KubernetesServiceTests passed; controlled stalled-create recovery succeeded; live Windows DCP started a resource with custom timeout settings and shut down cleanly; invalid timeout configuration was rejected. The original macOS Intel HTTP 504 scenario was not reproduced exactly.

@danegsta
David Negstad (danegsta) merged commit ccc9d55 into main Oct 10, 2026
590 of 596 checks passed
@danegsta

Copy link
Copy Markdown
Member Author

/backport to release/13.6

@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 17.0 milestone Oct 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/13.6 (link to workflow run)

aspire-repo-bot Bot added a commit to microsoft/aspire.dev that referenced this pull request Oct 10, 2026
Documents the new DcpPublisher:KubernetesApiTimeout,
KubernetesInitializationAdditionalTimeout, and
KubernetesCreateRecoveryTimeout options added in
microsoft/aspire#20752, along with the ambiguous-create
recovery behavior they enable.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1862

Generated by PR Documentation Check · copilot · auto · 51.2 AIC · ⌖ 9.56 AIC · ⊞ 20.4K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#1862 targeting release/17.0.

Triggered signals: pr_body_has_user_facing_section (PR body has a "### User-facing usage" heading showing the DcpPublisher JSON config block) and pr_body_has_cli_flag_mention (a --filter-class flag mention in the test command, incidental to the test run). Updated src/frontend/src/content/docs/app-host/configuration.mdx to add a new "DCP Kubernetes API timeouts" section under "Advanced orchestration properties", documenting the three new DcpPublisher options confirmed from DcpOptions.cs: KubernetesApiTimeout (default 40s), KubernetesInitializationAdditionalTimeout (default 20s), and KubernetesCreateRecoveryTimeout (default 2m), including valid ranges and the ambiguous-create recovery behavior they enable.

Note

This draft PR needs human review before merging.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A single timed-out or 504 DCP Create call permanently fails the resource (FailedToStart); not retried since 13.6.0

3 participants