Skip to content

Add browser-facing origin references for CORS and redirect configuration - #21260

Open
David Negstad (danegsta) wants to merge 8 commits into
mainfrom
danegsta-browser-endpoint-resolution
Open

David Negstad (danegsta) wants to merge 8 commits into
mainfrom
danegsta-browser-endpoint-resolution

Conversation

@danegsta

@danegsta David Negstad (danegsta) commented Oct 21, 2026 •

Copy link
Copy Markdown
Member

Description

Browser-facing URLs such as *.dev.localhost currently exist only as dashboard display URLs. AppHosts cannot reference those addresses when configuring CORS or authentication redirects, so configuration can disagree with the origin the browser actually uses.

Expose finalized browser origins as ordinary endpoint-reference properties, without changing host or container service discovery:

var endpoint = frontend.GetEndpoint("https");
backend.WithEnvironment("FRONTEND_ORIGIN", endpoint.BrowserOrigins.First);
backend.WithEnvironment("ALLOWED_ORIGINS", endpoint.BrowserOrigins.Join());
backend.WithEnvironment("ALLOWED_ORIGINS_JSON", endpoint.BrowserOrigins.AsJson());
entraWeb.WithRedirectUris(endpoint.BrowserOrigins.First, "/signin-oidc");

URL customization completes before endpoint-allocation observers run. Origins omit credentials, navigation paths, queries, and fragments, and duplicate origins are removed. Entra redirect helpers share the finalized local origin; publication retains their existing compute-environment hostname and HTTPS convention.

Local display URLs are not deployment addresses. Native publishers interpret the endpoint property using their existing publication paths:

  • Container Apps and App Service use public platform addresses where available, otherwise configurable inputs.
  • Compose uses configurable inputs defaulting to localhost and the explicit published port for external HTTP endpoints. Unknown published ports require inputs.
  • Kubernetes, including AKS-backed publishing, derives defaults from explicit literal Ingress/Gateway routing hosts and matching TLS configuration. Hostless, wildcard, and deferred hostname sources require inputs rather than substituting service DNS.
  • Foundry exposes the authority of its deployed project endpoint. Sandboxes resolves the authority from the deployed proxy URL, after the producer is deployed. Radius workload configuration requires deployment inputs rather than using cluster-local DNS.

The manifest publisher lowers the three new origin properties to required inputs, including within selected conditional branches, formatted expressions, and resource manifest callbacks. Recognized endpoint tokens remain symbolic for azd. Generalizing existing handling of other unsupported endpoint properties, changing published TLS policy, and adding publish-time origin customization are outside this change.

Fixes #18819

Compatibility

WithUrls and WithUrlForEndpoint callbacks now finish before ResourceEndpointsAllocatedEvent handlers run. Code that registers URL customization from those handlers must move registration into model configuration. Physical endpoint allocation and host/container service discovery remain unchanged.

Security considerations

Origins can feed CORS allowlists and authentication redirect configuration. URL customization remains application-controlled; local vanity URLs are not silently reused as published addresses. No new listeners or authorization mechanisms are introduced.

Validation

Validation covers the current local revision; these code updates have not yet been committed or pushed. No live Azure/Entra, Kubernetes, or Radius deployments, or local E2E suites, were run.

Exact local commands and results

Core endpoint, manifest, and parameter coverage — passed, 191 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj --no-launch-profile -- --filter-class '*.EndpointReferenceTests' --filter-class '*.ManifestExpressionTests' --filter-class '*.AddParameterTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Compose inputs, defaults, and preparation — passed, 13 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Docker.Tests/Aspire.Hosting.Docker.Tests.csproj --no-launch-profile -- --filter-method '*.BrowserOrigin*' --filter-method '*.BrowserUrlProjectionUsesPublisherExpression' --filter-method '*.PrepareStep_*' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Kubernetes routing defaults and input overrides — passed, 20 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Kubernetes.Tests/Aspire.Hosting.Kubernetes.Tests.csproj --no-launch-profile -- --filter-method '*.BrowserOrigin*' --filter-method '*.BrowserUrlProjectionUsesPublisherExpression' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Foundry unit suite — passed, 201 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Foundry.Tests/Aspire.Hosting.Foundry.Tests.csproj --no-launch-profile -- --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Radius deployment bindings and existing endpoint/value resolution — passed, 91 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Radius.Tests/Aspire.Hosting.Radius.Tests.csproj --no-launch-profile -- --filter-class '*.RadiusDeployParametersTests' --filter-class '*.BackingResourceValueResolutionTests' --filter-class '*.RadiusEnvironmentResourceTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Azure workload and sandbox origins — passed, 11 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Azure.Tests/Aspire.Hosting.Azure.Tests.csproj --no-launch-profile -- --filter-method '*.BrowserOrigin*' --filter-method '*.BrowserUrlProjectionsUseAzureWorkloadExpressions' --filter-method '*.SandboxEndpointResolutionSupportsSameSandboxGroupReferences' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

Entra redirect helpers — passed, 20 tests:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Azure.EntraId.Tests/Aspire.Hosting.Azure.EntraId.Tests.csproj --no-launch-profile -- --filter-method '*.WithRedirectUris*' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

The explicit origin overload was also re-run with concrete published callback-value assertions — passed, 1 test:

MSBUILDTERMINALLOGGER=false dotnet test --project tests/Aspire.Hosting.Azure.EntraId.Tests/Aspire.Hosting.Azure.EntraId.Tests.csproj --no-launch-profile -- --filter-method '*.WithRedirectUris_BrowserOrigin_PreservesDeferredValues' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'

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

Finalize customized browser URLs before endpoint allocation observers, expose deferred origin and URL projections, and use them for Entra redirects. Lower manifest values through existing schema features while preserving selected-path evaluation and symbolic deployment references.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b3d226ee-2c7f-4986-a0e4-a6d27b72f6ec
@danegsta David Negstad (danegsta) added the breaking-change Issue or PR that represents a breaking API or functional change over a prerelease. label Oct 21, 2026
@github-actions

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

Or

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

@github-actions github-actions Bot added the area-app-model Issues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication label Oct 21, 2026
@github-actions

This comment has been minimized.

@danegsta

Copy link
Copy Markdown
Member Author

Eric Erhardt (@eerhardt) I did a thing based on our discussion of how the browser URLs would need to work to be general purpose. This basically takes the work you did but makes it generalized and removes the callback order risk.

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.

🔵 Needs a closer look

Unresolved manifest correctness issues and the breaking lifecycle and security-sensitive origin changes require fixes and final human review.

2 open issues
What changed in this PR

Adds browser-facing origin references for CORS and authentication redirects, addressing #18819 without changing host or container service discovery.

Changes:

  • Introduces preferred-origin, full-URL, collection, and custom projections with explicit deployment expressions.
  • Finalizes URL customization before endpoint-allocation observers and shares browser origins with Entra redirect helpers.
  • Extends manifest expression processing and adds lifecycle, publishing, schema, and export coverage.
File Description
tests/​Aspire.Hosting.Tests/​WithUrlsTests.cs Updates callback-order expectations.
tests/​Aspire.Hosting.Tests/​Utils/​TestManifestValue.cs Adds a configurable expression test helper.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.WrappersDiscoverSelectedConditionalAndUnsupportedLeafReferences.verified.json Records wrapped dependency processing.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.WrapperRewritesOnlyReferencedTokensAndIgnoresEscapedDependencies.verified.json Records escaped-token handling.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.UriFormattingExpandsOnlySelectedBrowserAndConditionalAliases.verified.json Records selected-alias URI formatting.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.UnsupportedEndpointPropertyBecomesConcreteInDirectAndSelectedValues_tlsEnabled=True.verified.json Records concrete TLS-enabled values.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.UnsupportedEndpointPropertyBecomesConcreteInDirectAndSelectedValues_tlsEnabled=False.verified.json Records concrete TLS-disabled values.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.UnsupportedCustomPropertyResolvesOnceWithoutResolvingAdjacentParameters.verified.json Records concrete and symbolic composition.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.SupportedCustomProviderRetainsSymbolicValueWithoutResolution.verified.json Records symbolic custom-provider output.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.LiteralManifestValuesAreFormattedWithoutResolvingProviders.verified.json Records literal URI formatting.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.DistinctProviderInstancesRetainValuesAndDeterministicNames.verified.json Records distinct provider identities.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.ConcreteNullValueRetainsEmptyStringBehavior.verified.json Records null-to-empty conversion.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.ConcreteNamesAvoidExistingModelResourceNames.verified.json Records generated-name collision handling.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.CompositeUriFormattingEncodesLiteralsAndDefersParameters.verified.json Records deferred parameter formatting.
tests/​Aspire.Hosting.Tests/​Snapshots/​ManifestExpressionTests.CompositeUriFormattingDefersInfrastructureOutputs.verified.json Records deferred output formatting.
tests/​Aspire.Hosting.Tests/​Snapshots/​ConditionalReferenceExpressionTests.ManifestSelectedBranchReusesFormattedParameters.verified.json Records formatted-parameter reuse.
tests/​Aspire.Hosting.Tests/​Snapshots/​ConditionalReferenceExpressionTests.ManifestSelectedBranchRetainsParameterReferences_conditionValue=True.verified.json Records symbolic true-branch output.
tests/​Aspire.Hosting.Tests/​Snapshots/​ConditionalReferenceExpressionTests.ManifestSelectedBranchRetainsParameterReferences_conditionValue=False.verified.json Records symbolic false-branch output.
tests/​Aspire.Hosting.Tests/​Snapshots/​ConditionalReferenceExpressionTests.ManifestSelectedBranchRetainsInfrastructureOutput.verified.json Records selected infrastructure references.
tests/​Aspire.Hosting.Tests/​Snapshots/​ConditionalReferenceExpressionTests.ManifestOnlyEvaluatesSelectedNestedConditions.verified.json Records nested conditional selection.
tests/​Aspire.Hosting.Tests/​Snapshots/​ConditionalReferenceExpressionTests.ManifestCallbackRegistersReferencedConditionalValues.verified.json Records callback dependency registration.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestUsesValueResourcesForCollectionAndConditionalPublishingExpressions.verified.json Records collection and conditional aliases.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestUsesPublisherExpressionForDirectAndInterpolatedValues.verified.json Records deployment-expression reuse.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestPreservesShortCircuitingForUnselectedNestedConditions.verified.json Records conditional short-circuiting.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestInactiveBrowserBranchDoesNotRequirePublishingSupport_browserInTrueBranch=True.verified.json Records inactive true-branch exclusion.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestInactiveBrowserBranchDoesNotRequirePublishingSupport_browserInTrueBranch=False.verified.json Records inactive false-branch exclusion.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestConditionalBrowserConditionReceivesPublishingContext.verified.json Records publishing-context selection.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestConditionalBrowserBranchesRetainDeploymentReferences.verified.json Records deferred browser references.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestBrowserInstancesPreserveFormattingAndWrappedTokens_reverseOrder=True.verified.json Records identities with reversed usage order.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestBrowserInstancesPreserveFormattingAndWrappedTokens_reverseOrder=False.verified.json Records identities with normal usage order.
tests/​Aspire.Hosting.Tests/​Snapshots/​BrowserUrlReferenceTests.ManifestBrowserInstancesPreserveDistinctPublishingProviders.verified.json Records distinct publishing providers.
tests/​Aspire.Hosting.Tests/​Schema/​SchemaTests.cs Adds mixed-expression schema coverage.
tests/​Aspire.Hosting.Tests/​Orchestrator/​ApplicationOrchestratorTests.cs Tests finalization, normalization, and recovery.
tests/​Aspire.Hosting.Tests/​ManifestExpressionTests.cs Tests expression processing and formatting.
tests/​Aspire.Hosting.Tests/​Eventing/​DistributedApplicationBuilderEventingTests.cs Tests preparation across dispatch modes.
tests/​Aspire.Hosting.Tests/​Dcp/​DcpExecutorTests.cs Tests batch-wide URL finalization.
tests/​Aspire.Hosting.Tests/​ConditionalReferenceExpressionTests.cs Tests selected-branch publication.
tests/​Aspire.Hosting.Kubernetes.Tests/​Snapshots/​KubernetesPublisherTests.BrowserUrlProjectionUsesPublisherExpression#01.verified.yaml Records Helm configuration values.
tests/​Aspire.Hosting.Kubernetes.Tests/​Snapshots/​KubernetesPublisherTests.BrowserUrlProjectionUsesPublisherExpression#00.verified.yaml Records ConfigMap expressions.
tests/​Aspire.Hosting.Kubernetes.Tests/​KubernetesPublisherTests.cs Tests native Kubernetes projection.
tests/​Aspire.Hosting.Docker.Tests/​Snapshots/​DockerComposePublisherTests.BrowserUrlProjectionUsesPublisherExpression.verified.yaml Records Compose deployment expressions.
tests/​Aspire.Hosting.Docker.Tests/​Snapshots/​DockerComposePublisherTests.BrowserUrlProjectionUsesPublisherExpression.verified.env Records deployment parameter declaration.
tests/​Aspire.Hosting.Docker.Tests/​DockerComposePublisherTests.cs Tests native Compose projection.
tests/​Aspire.Hosting.CodeGeneration.TypeScript.Tests/​AtsTypeScriptCodeGeneratorTests.cs Checks browser-reference exports.
tests/​Aspire.Hosting.Azure.Tests/​Snapshots/​AzureEnvironmentResourceTests.BrowserUrlProjectionUsesPublisherExpression.verified.bicep Records native Azure parameter composition.
tests/​Aspire.Hosting.Azure.Tests/​Snapshots/​AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=True.verified.json Records App Service manifest parameters.
tests/​Aspire.Hosting.Azure.Tests/​Snapshots/​AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=True.verified.bicep Records App Service settings.
tests/​Aspire.Hosting.Azure.Tests/​Snapshots/​AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=False.verified.json Records Container Apps manifest parameters.
tests/​Aspire.Hosting.Azure.Tests/​Snapshots/​AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=False.verified.bicep Records Container Apps environment values.
tests/​Aspire.Hosting.Azure.Tests/​AzureEnvironmentResourceTests.cs Tests native Azure projections.
tests/​Aspire.Hosting.Azure.EntraId.Tests/​Snapshots/​EntraIdProvisioningTests.WithRedirectUris_Expressions_PreserveDeferredValues.verified.bicep Records deferred redirect parameters.
tests/​Aspire.Hosting.Azure.EntraId.Tests/​Snapshots/​EntraIdProvisioningTests.Publish_BrowserOriginRedirectExpression_PreservesDeploymentParameter#01.verified.bicep Records registration redirect input.
tests/​Aspire.Hosting.Azure.EntraId.Tests/​Snapshots/​EntraIdProvisioningTests.Publish_BrowserOriginRedirectExpression_PreservesDeploymentParameter#00.verified.bicep Records deployment redirect composition.
tests/​Aspire.Hosting.Azure.EntraId.Tests/​EntraIdProvisioningTests.cs Tests shared origins and deferred redirects.
src/​Aspire.Hosting/​ResourceBuilderExtensions.cs Adds browser-origin helpers and lifecycle documentation.
src/​Aspire.Hosting/​README.md Documents projections and publishing behavior.
src/​Aspire.Hosting/​Publishing/​ManifestPublishingContext.cs Processes symbolic, concrete, and formatted values.
src/​Aspire.Hosting/​Publishing/​ManifestExpression.cs Adds manifest tokenization and vocabulary checks.
src/​Aspire.Hosting/​Orchestrator/​ApplicationOrchestrator.cs Captures finalized URLs before observers.
src/​Aspire.Hosting/​Eventing/​DistributedApplicationEventSubscription.cs Marks lifecycle preparation subscriptions.
src/​Aspire.Hosting/​Eventing/​DistributedApplicationEventing.cs Runs preparation before observer dispatch.
src/​Aspire.Hosting/​Dcp/​DcpExecutorEvents.cs Carries allocated-event batches.
src/​Aspire.Hosting/​Dcp/​DcpExecutor.cs Prepares batch URLs before notifications.
src/​Aspire.Hosting/​Aspire.Hosting.csproj Includes shared resource-name helpers.
src/​Aspire.Hosting/​ApplicationModel/​ResourceEndpointsAllocatedEvent.cs Tracks URL preparation and documents ordering.
src/​Aspire.Hosting/​ApplicationModel/​BrowserUrlSnapshotAnnotation.cs Stores and orders finalized browser URLs.
src/​Aspire.Hosting/​ApplicationModel/​BrowserOriginReference.cs Implements browser projections and deployment expressions.
src/​Aspire.Hosting.Azure.EntraId/​README.md Documents shared-origin redirects.
src/​Aspire.Hosting.Azure.EntraId/​EntraIdResourceExtensions.cs Adds expression redirects and shared-origin usage.
src/​Aspire.Hosting.Azure.EntraId/​EntraIdEndpointRedirectUri.cs Removes the separate redirect URL-capture implementation.
src/​Aspire.Hosting.Azure.EntraId/​EntraIdApplicationResource.cs Preserves redirect expressions during provisioning.

Review effort: Balanced

@github-actions

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.

Lower complete structured expressions before token matching and reject ambiguous provider matches. Retain formatting alias metadata so nested URI encoding preserves each pass without resolving deployment parameters.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b3d226ee-2c7f-4986-a0e4-a6d27b72f6ec
@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.

🔵 Needs a closer look

Broad lifecycle and security-sensitive origin changes require human review, and the azd Bicep URI-formatting compatibility issue remains unresolved.

1 open issue
2 resolved since last review

Review effort: Balanced

@github-actions

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.

@github-actions

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.

@github-actions

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.

Replace browser-specific references with endpoint properties, finalize canonical URLs before allocation notifications, and handle publisher-owned origin inputs and defaults. Project Codespaces URLs before origin resolution while preserving physical endpoints.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b3d226ee-2c7f-4986-a0e4-a6d27b72f6ec

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

Invalid Helm YAML, endpoint-name casing failures, wildcard TLS origin mismatches, and incomplete MAUI URL finalization remain unresolved.

4 open issues
1 resolved since last review

Review effort: Balanced

Quote ConfigMap values after Helm evaluation, preserve canonical endpoint lookup names, and use HostString matching with the Ingress-specific wildcard restriction. Add rendered-chart and hostname-scope regressions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b3d226ee-2c7f-4986-a0e4-a6d27b72f6ec

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.

🔵 Needs a closer look

Deployment E2E coverage must verify Container Apps origin values and Sandbox producer/consumer ordering against actual deployed authorities.

No open issues 🎉

1 previously missed issue

In code that hasn't changed since last review

Medium severity Test deployed BrowserOrigins resolution between producer and consumer

src/​Aspire.Hosting.Azure.Sandboxes/​AzureSandboxEndpointPropertyValueProvider.cs:113

The new sandbox-origin test pre-populates Ports, so it verifies URI extraction but not that a browser-origin reference is resolved after its producer deploys and reaches the consuming workload. No deployment E2E currently consumes BrowserOrigins. Please extend tests/Aspire.Deployment.EndToEnd.Tests/AzureSandboxesDeploymentTests.cs with a producer/consumer scenario that injects these properties and compares the consumer's received values with the producer's actual deployed proxy authority; this would catch deployment-order and value-projection failures that the seeded-state test cannot detect.

4 resolved since last review

Review effort: Balanced

Preserve the Azure environment test imports and upstream experimental API suppression. Update the browser-origin Entra snapshot for the upstream service-principal tags.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b3d226ee-2c7f-4986-a0e4-a6d27b72f6ec
@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot October 27, 2026 00:34
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
@github-actions
github-actions Bot temporarily deployed to deployment-testing October 27, 2026 22:25 Inactive
Preserve shared URL contracts and regenerate the Go SDK snapshot. Adapt browser-origin tests and the Entra redirect overload to upstream deprecation and explicit-export requirements.

Validation: 247 targeted checks passed across hosting, five code generators, Azure, Docker, Kubernetes, and Entra; deployment tests compile. DotnetProject V2 URL validation remains incomplete after a child MSBuild task-host failure and a bounded test timeout.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b3d226ee-2c7f-4986-a0e4-a6d27b72f6ec
@github-actions

Copy link
Copy Markdown
Contributor

Tests selector

53 / 100 PR test projects · 4 PR jobs, from 169 changed files.

Selected PR test projects (53 / 100)

Aspire.Cli.EndToEnd.Tests, Aspire.Hosting.Analyzers.Tests, Aspire.Hosting.Azure.EntraId.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, Aspire.Templates.Tests, Infrastructure.Tests

Selected PR jobs (4)

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


How these were chosen — grouped by what changed

⚠️ 31 of the 53 selected test projects come from a single change — src/Aspire.Hosting/ApplicationModel/EndpointAnnotation.cs.

🔧 src/Aspire.Hosting/ApplicationModel/EndpointAnnotation.cs (changed source)
→ 31 via the project graph

show 31

Aspire.Hosting.Analyzers.Tests (2 hops), Aspire.Hosting.Browsers.Tests (2 hops), Aspire.Hosting.Containers.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests (2 hops), Aspire.Hosting.EntityFrameworkCore.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.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.Playground.Tests

🔧 src/Aspire.Hosting.Azure/AzureBicepResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests
→ 2 via the project graph: Aspire.Hosting.Azure.Kusto.Tests (2 hops), Aspire.Hosting.Azure.Provisioning.Tests (2 hops)

🧪 tests/Aspire.Hosting.Tests/AddParameterTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Tests
→ 2 via the project graph: Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Dotnet.Tests

📦 affected project Aspire.Hosting.Dotnet
→ 2 tests: Aspire.Cli.EndToEnd.Tests, Aspire.Templates.Tests

🔧 src/Aspire.Hosting.Azure.EntraId/EntraIdApplicationResource.cs (changed source)
→ 2 directly: Aspire.Hosting.Azure.EntraId.Tests, Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.EntraId/EntraIdEndpointRedirectUri.cs (changed source)
→ 2 directly: Aspire.Hosting.Azure.EntraId.Tests, Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.EntraId/EntraIdResourceExtensions.cs (changed source)
→ 2 directly: Aspire.Hosting.Azure.EntraId.Tests, Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Docker/Aspire.Hosting.Docker.csproj (changed source)
→ 1 directly: Aspire.Hosting.Docker.Tests
→ 1 via the project graph: Aspire.Hosting.Yarp.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/AzureContainerAppExpressEndpointTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests
→ 1 via the project graph: Aspire.Hosting.Azure.Kubernetes.Tests

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

🔧 src/Aspire.Hosting.Azure.AppContainers/Aspire.Hosting.Azure.AppContainers.csproj (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppContainers/AzureContainerAppEnvironmentResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppContainers/BaseContainerAppContext.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppContainers/ContainerAppEnvironmentContext.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppService/Aspire.Hosting.Azure.AppService.csproj (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppService/AzureAppServiceEnvironmentContext.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppService/AzureAppServiceEnvironmentResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.AppService/AzureAppServiceWebsiteContext.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.Azure.Sandboxes/AzureSandboxEndpointPropertyValueProvider.cs (changed source)
→ 1 directly: Aspire.Hosting.Azure.Tests

🔧 src/Aspire.Hosting.DevTunnels/DevTunnelMonitor.cs (changed source)
→ 1 directly: Aspire.Hosting.DevTunnels.Tests

🔧 src/Aspire.Hosting.DevTunnels/DevTunnelResourceBuilderExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.DevTunnels.Tests

🔧 src/Aspire.Hosting.Docker/DockerComposeEnvironmentResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Docker.Tests

🔧 src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs (changed source)
→ 1 directly: Aspire.Hosting.Docker.Tests

🔧 src/Aspire.Hosting.Docker/DockerComposeServiceResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Docker.Tests

🔧 src/Aspire.Hosting.Docker/DockerComposeServiceResourceExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.Docker.Tests

🔧 src/Aspire.Hosting.Foundry/Project/ProjectBuilderExtension.cs (changed source)
→ 1 directly: Aspire.Hosting.Foundry.Tests

🔧 src/Aspire.Hosting.Foundry/Project/ProjectResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Foundry.Tests

🔧 src/Aspire.Hosting.Kubernetes/Aspire.Hosting.Kubernetes.csproj (changed source)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/Extensions/HelmExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/Extensions/ResourceExtensions.cs (changed source)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentContext.cs (changed source)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Kubernetes/KubernetesResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🔧 src/Aspire.Hosting.Radius/Aspire.Hosting.Radius.csproj (changed source)
→ 1 directly: Aspire.Hosting.Radius.Tests

🔧 src/Aspire.Hosting.Radius/Publishing/RadiusInfrastructureBuilder.cs (changed source)
→ 1 directly: Aspire.Hosting.Radius.Tests

🔧 src/Aspire.Hosting.Radius/RadiusEnvironmentResource.cs (changed source)
→ 1 directly: Aspire.Hosting.Radius.Tests

🔧 src/Aspire.Hosting/Aspire.Hosting.csproj (changed source)
→ 1 directly: Infrastructure.Tests

🧪 tests/Aspire.Hosting.Azure.EntraId.Tests/EntraIdProvisioningTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Azure.EntraId.Tests

🧪 tests/Aspire.Hosting.Azure.EntraId.Tests/Snapshots/EntraIdProvisioningTests.WithRedirectUris_BrowserOrigin_PreservesDeferredValues.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.EntraId.Tests

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

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

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserOriginInputsKeepDistinctEndpointIdentities_longNames=False.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserOriginInputsKeepDistinctEndpointIdentities_longNames=True.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserOriginsFollowEndpointVisibility_appService=False.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserOriginsFollowEndpointVisibility_appService=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=False.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=True.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/AzureEnvironmentResourceTests.BrowserUrlProjectionsUseAzureWorkloadExpressions_appService=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.Azure.Tests/Snapshots/FoundryExtensionsTests.AddProject_GeneratesEndpointFromParentFoundryApiEndpoint.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Azure.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Go.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.go (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.Go.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Java.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.java (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.Java.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Python.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.py (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.Python.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.Rust.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.rs (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.Rust.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/AtsTypeScriptCodeGeneratorTests.cs (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

🧪 tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts (changed test)
→ 1 directly: Aspire.Hosting.CodeGeneration.TypeScript.Tests

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

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

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserOriginInputsDefaultToPublishedLocalhost_overridden=False.verified.env (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserOriginInputsDefaultToPublishedLocalhost_overridden=True.verified.env (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserOriginInputsKeepDistinctEndpointIdentities_longNames=False.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserOriginInputsKeepDistinctEndpointIdentities_longNames=True.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserUrlProjectionUsesPublisherExpression#00.verified.env (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserUrlProjectionUsesPublisherExpression#01.verified.env (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

🧪 tests/Aspire.Hosting.Docker.Tests/Snapshots/DockerComposePublisherTests.BrowserUrlProjectionUsesPublisherExpression.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Docker.Tests

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

🧪 tests/Aspire.Hosting.Foundry.Tests/Snapshots/ProjectResourceTests.BrowserOriginOutputRemovesProjectNavigationPath.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Foundry.Tests

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

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

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesDeployTests.DeferredValueProvider_EndToEnd_PublishAndResolve#01.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/ServiceA/config.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env1/templates/env1-dashboard/config.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/ServiceB/config.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesEnvironmentResourceTests.MultipleKubernetesEnvironmentsSupported/env2/templates/env2-dashboard/config.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserOriginDefaultsAllowConfiguredOverride.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserOriginDefaultsFollowConfiguredPublicRoutes_gateway=False_tls=False.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserOriginDefaultsFollowConfiguredPublicRoutes_gateway=False_tls=True.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserOriginDefaultsFollowConfiguredPublicRoutes_gateway=True_tls=False.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserOriginDefaultsFollowConfiguredPublicRoutes_gateway=True_tls=True.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserOriginInputsKeepDistinctEndpointIdentities.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserUrlProjectionUsesPublisherExpression#00.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserUrlProjectionUsesPublisherExpression#01.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.BrowserUrlProjectionUsesPublisherExpression#02.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesEndpointReferenceUsesServicePortNotTargetPort#02.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#06.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesMapsPortsForBaitAndSwitchResources#08.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithDotnetProjectUsesImageParameterAndProjectEndpoint#04.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#06.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.KubernetesWithProjectResources#08.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CompositeExpressionPreservesExpressionShape#01.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_CustomWorkloadAndResourceType#06.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_EmbeddedParametersInEnvironmentExpressionsPopulateValues#01.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#05.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#08.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_GeneratesValidHelmChart#10.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesConditionalReferenceExpression#05.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesScalarEnvironmentVariableTypes#03.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_HandlesSpecialResourceName#05.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#00.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_ProjectAndExecutableVolumesUseDefaultStorageAndEnvironmentPaths#02.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_SharedEmbeddedParameterIsScopedPerResource#01.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_SharedEmbeddedParameterIsScopedPerResource#02.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath#00.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#00.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Kubernetes.Tests/Snapshots/KubernetesPublisherTests.PublishAsync_WithPersistentVolumeEnvironment_OnContainerAndExecutable#03.verified.yaml (changed test)
→ 1 directly: Aspire.Hosting.Kubernetes.Tests

🧪 tests/Aspire.Hosting.Radius.Tests/Publishing/RadiusDeployParametersTests.cs (changed test)
→ 1 directly: Aspire.Hosting.Radius.Tests

🧪 tests/Aspire.Hosting.Radius.Tests/Snapshots/RadiusDeployParametersTests.BrowserOriginInputsKeepDistinctEndpointIdentities.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Radius.Tests

🧪 tests/Aspire.Hosting.Radius.Tests/Snapshots/RadiusDeployParametersTests.BrowserOriginsUseRequiredInputsAndStandardDeployBindings_configured=True.verified.bicep (changed test)
→ 1 directly: Aspire.Hosting.Radius.Tests

🧪 tests/Aspire.Hosting.Radius.Tests/Snapshots/RadiusDeployParametersTests.BrowserOriginsUseRequiredInputsAndStandardDeployBindings_configured=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Radius.Tests

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

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

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

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

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

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

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

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

🧪 tests/Aspire.Hosting.Tests/Snapshots/ConditionalReferenceExpressionTests.ManifestCallbackRegistersReferencedConditionalValues.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ConditionalReferenceExpressionTests.ManifestOnlyEvaluatesSelectedNestedConditions.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ConditionalReferenceExpressionTests.ManifestSelectedBranchRetainsInfrastructureOutput.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ConditionalReferenceExpressionTests.ManifestSelectedBranchRetainsParameterReferences_conditionValue=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ConditionalReferenceExpressionTests.ManifestSelectedBranchRetainsParameterReferences_conditionValue=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ConditionalReferenceExpressionTests.ManifestSelectedBranchReusesFormattedParameters.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.CompositeUriFormattingDefersInfrastructureOutputs.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.CompositeUriFormattingEncodesLiteralsAndDefersParameters.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.ConcreteNamesAvoidExistingModelResourceNames.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.ConcreteNullValueRetainsEmptyStringBehavior.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.ConditionalDoesNotEvaluateUnselectedNestedCondition.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.DistinctProviderInstancesRetainValuesAndDeterministicNames.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.EndpointOriginInputsAreLoweredInResourceManifestCallbacks.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.EndpointOriginInputsAvoidExistingResourceNames.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.EndpointOriginPropertiesBecomeRequiredInputs_property=BrowserOrigin.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.EndpointOriginPropertiesBecomeRequiredInputs_property=BrowserOrigins.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.EndpointOriginPropertiesBecomeRequiredInputs_property=BrowserOriginsJson.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.LiteralManifestValuesAreFormattedWithoutResolvingProviders.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.NestedUriFormattingPreservesConcreteEncodingPasses.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.NestedUriFormattingPreservesParameterAndCompositeAliasOperations_composite=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.NestedUriFormattingPreservesParameterAndCompositeAliasOperations_composite=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.SupportedCustomProviderRetainsSymbolicValueWithoutResolution.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.SymbolicOnlyProvidersPreserveOpaqueTokensAlongsideLoweredOrigins.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.UnselectedEndpointOriginDoesNotRequireDeploymentInput_originInTrueBranch=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.UnselectedEndpointOriginDoesNotRequireDeploymentInput_originInTrueBranch=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.UnsupportedCustomPropertyResolvesOnceWithoutResolvingAdjacentParameters.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.UnsupportedEndpointPropertyBecomesConcreteInDirectAndSelectedValues_tlsEnabled=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.UnsupportedEndpointPropertyBecomesConcreteInDirectAndSelectedValues_tlsEnabled=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.UriFormattingExpandsOnlySelectedConditionalAliases.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.WrappedRepeatedProviderIsNotAmbiguous.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.WrappedStructuredExpressionsPreserveProviderOccurrencesAndFormats_reverseOrder=False.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.WrappedStructuredExpressionsPreserveProviderOccurrencesAndFormats_reverseOrder=True.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.WrapperRewritesOnlyReferencedTokensAndIgnoresEscapedDependencies.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

🧪 tests/Aspire.Hosting.Tests/Snapshots/ManifestExpressionTests.WrappersDiscoverSelectedConditionalAndUnsupportedLeafReferences.verified.json (changed test)
→ 1 directly: Aspire.Hosting.Tests

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

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

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

Job reasons

Job Triggered by
cli-starter-validation affected project Aspire.Hosting.Dotnet
extension-e2e • src/Aspire.Hosting.Docker/Aspire.Hosting.Docker.csproj, src/Aspire.Hosting.Docker/DockerComposeEnvironmentResource.cs, src/Aspire.Hosting.Docker/DockerComposePublishingContext.cs, src/Aspire.Hosting.Docker/DockerComposeServiceResource.cs, src/Aspire.Hosting.Docker/DockerComposeServiceResourceExtensions.cs, src/Aspire.Hosting/ApplicationModel/EndpointAnnotation.cs, src/Aspire.Hosting/ApplicationModel/EndpointBrowserOrigins.cs, src/Aspire.Hosting/ApplicationModel/EndpointReference.cs, src/Aspire.Hosting/ApplicationModel/IComputeEnvironmentResource.cs, src/Aspire.Hosting/ApplicationModel/ResourceEndpointsAllocatedEvent.cs, src/Aspire.Hosting/Aspire.Hosting.csproj, src/Aspire.Hosting/Dcp/DcpExecutor.cs, src/Aspire.Hosting/Dcp/DcpExecutorEvents.cs, src/Aspire.Hosting/Devcontainers/Codespaces/CodespacesResourceUrlRewriterService.cs, src/Aspire.Hosting/Devcontainers/Codespaces/CodespacesUrlRewriter.cs, src/Aspire.Hosting/DistributedApplicationEventingExtensions.cs, src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs, src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs, src/Aspire.Hosting/Publishing/ManifestExpression.cs, src/Aspire.Hosting/Publishing/ManifestPublishingContext.cs, src/Aspire.Hosting/ResourceBuilderExtensions.cs
• affected project Aspire.Hosting.Docker
polyglot • affected project Aspire.Hosting.Azure.AppContainers
• affected project Aspire.Hosting.Azure.Provisioning.AppContainers
typescript-api-compat affected project Aspire.Hosting.Azure.AppContainers

Selection computed for commit cc2d97f.

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

Secret-containing environment expressions still produce invalid YAML because ToSecret does not correctly quote evaluated values, preventing Helm chart installation.

1 open issue

Review effort: Balanced

Comment on lines +606 to +607
EndpointProperty.BrowserOrigins or EndpointProperty.BrowserOrigin or EndpointProperty.BrowserOriginsJson =>
await ProcessValueAsync(context, executionContext, context.GetEndpointInput(epExpr, executionContext), embedded).ConfigureAwait(false),
@github-actions

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.

This branch was previously deployed

1 inactive (outdated) deployment
deployment-testing — e3b643ea Deployed Oct 27, 2026 by github-actions[bot] via Deploy (Deployment.EndToEnd-AuthenticationTests) #919
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-app-model Issues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication breaking-change Issue or PR that represents a breaking API or functional change over a prerelease.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cannot access the "public" URL of a resource when using the dev.localhost applicationUrls

3 participants