Skip to content

Fix WithIngressClass parameter resolution for Kubernetes publish#17423

Merged
mitchdenny merged 3 commits into
mainfrom
mitchdenny/fix-ingress-class-parameter
May 25, 2026
Merged

Fix WithIngressClass parameter resolution for Kubernetes publish#17423
mitchdenny merged 3 commits into
mainfrom
mitchdenny/fix-ingress-class-parameter

Conversation

@mitchdenny
Copy link
Copy Markdown
Member

@mitchdenny mitchdenny commented May 24, 2026

Description

When an ingress or gateway resource referenced a ParameterResource via WithIngressClass, WithHostname, WithTls, etc., the generated Kubernetes YAML rendered the literal format string "{0}" for unresolved parameters instead of a Helm template expression. This made the published Helm chart unusable unless the parameter happened to have a value at publish time. Reproduced from a bug shown on AspireFridays by @robrich:

var ingressClass = builder.AddParameter("ingressclass");
ingress.WithIngressClass(ingressClass);

produced:

spec:
  ingressClassName: "{0}"     # should be a Helm template reference

Why the bug existed

KubernetesEnvironmentResource.ResolveExpressionAsync was the single helper used to resolve every ReferenceExpression consumed by the Kubernetes publisher (ingress class, hostname, TLS, gateway listeners, etc.). It called ReferenceExpression.GetValueAsync and, on MissingParameterValueException, returned expression.Format verbatim as a "fallback":

catch (MissingParameterValueException)
{
    return expression.Format;   // "{0}" for a single ParameterResource
}

expression.Format is the raw composite format string (e.g. "{0}" for one parameter, "{0}-{1}" for two). It only resembles a useful value for expressions that contain no placeholders, which is essentially never the case for parameter-driven values. The docstring claimed the helper returned the parameter name, but the implementation never did — it just emitted the format string and let it land in the published YAML.

This was harmless for the original callers (TLS bootstrap and gateway address discovery in pipeline steps) because those run at deploy time, where parameters already have values and the catch block is never hit. The bug only surfaced once the same helper was reused for publish-time manifest generation, where missing values are the normal case.

How the fix works

ResolveExpressionAsync is now parameter-aware and runs at publish time. When the expression contains unresolved ParameterResources, the fix:

  1. Walks each IValueProvider in the expression individually instead of returning the raw format string.
  2. For each unresolved ParameterResource, substitutes a Helm template reference of the form {{ .Values.parameters.<owningResource>.<paramName> }} (or secrets. for secret parameters), scoped to the owning ingress/gateway resource so multiple resources can reuse the same parameter name without colliding.
  3. Captures the parameter in CapturedHelmValues so two downstream consumers get the right data:
    • HelmDeploymentEngine writes the resolved parameter value into the deploy-time override file Aspire passes to helm install/helm upgrade.
    • values.yaml gets a matching placeholder entry via the new EnsureCapturedHelmValuePlaceholders pass in KubernetesPublishingContext, so helm template against the published chart does not render <no value> for users who deploy outside of Aspire.
  4. Re-applies string.Format with the substituted segments, preserving any literal text from the original expression (e.g. an expression like "prefix-{0}-suffix" becomes "prefix-{{ .Values.parameters.ingress.foo }}-suffix").

Pipeline-time callers (TLS bootstrap, gateway address discovery) keep their original behavior through a renamed static helper ResolveExpressionAtDeployTimeAsync. Those paths run after parameters are guaranteed to be resolved, so a missing-value fallback there is acceptable (and, again, never hit in practice).

Testing notes

Added two regression tests in KubernetesIngressTests.cs covering the parameter and missing-parameter cases. The missing-parameter test needs Pipeline:ClearCache=true plus a per-run unique parameter name because the deployment state file at ~/.aspire/deployments/<sha>/<env>.json persists across local test runs and would otherwise auto-resolve the parameter from a previous run, masking the failure.

Fixes # (issue)

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

Copilot AI review requested due to automatic review settings May 24, 2026 00:56
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 24, 2026

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

Or

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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes Kubernetes publish output when ingress/gateway properties (e.g., ingressClassName, hostname, TLS secret) are provided via ParameterResource but are unresolved at publish time. Instead of emitting the literal "{0}" format string into generated YAML, the publish pipeline now renders Helm {{ .Values... }} template references and ensures corresponding placeholders exist in values.yaml, keeping published charts usable for non-Aspire Helm consumers.

Changes:

  • Make ingress/gateway manifest expression resolution parameter-aware: unresolved ParameterResources become Helm template references and are captured for deploy-time override generation.
  • Add a deploy-time-only resolver helper to preserve existing post-deploy pipeline behavior for steps that expect parameters to be resolved.
  • Add regression tests covering both missing-parameter (Helm reference + values.yaml placeholder) and publish-default (inline value) behaviors.
Show a summary per file
File Description
tests/Aspire.Hosting.Kubernetes.Tests/KubernetesIngressTests.cs Adds regression coverage for WithIngressClass(ParameterResource) with/without publish-time defaults, including values.yaml placeholder validation.
src/Aspire.Hosting.Kubernetes/KubernetesPublishingContext.cs Ensures captured Helm values from ingress/gateway resources also get placeholders in values.yaml.
src/Aspire.Hosting.Kubernetes/KubernetesEnvironmentResource.cs Introduces publish-time Helm-substituting resolver for ingress/gateway expressions and keeps deploy-time pipeline resolution behavior via a separate helper.

Copilot's findings

  • Files reviewed: 3/3 changed files
  • Comments generated: 0

@mitchdenny
Copy link
Copy Markdown
Member Author

/deployment-test

@github-actions
Copy link
Copy Markdown
Contributor

🚀 Deployment tests starting on PR #17423...

This will deploy to real Azure infrastructure. Results will be posted here when complete.

View workflow run

@mitchdenny
Copy link
Copy Markdown
Member Author

/cc @robrich

@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot had a problem deploying to deployment-testing May 24, 2026 01:39 Failure
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot had a problem deploying to deployment-testing May 24, 2026 01:39 Failure
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot had a problem deploying to deployment-testing May 24, 2026 01:39 Failure
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot had a problem deploying to deployment-testing May 24, 2026 01:39 Failure
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 24, 2026 01:39 Inactive
Copy link
Copy Markdown
Member

@JamesNK JamesNK left a comment

Choose a reason for hiding this comment

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

LGTM — clean fix with good comments and test coverage. 1 low-severity observation posted (multi-parameter expression edge case).

Comment on lines +585 to +598
{
if (valueProvider is ParameterResource parameter)
{
// Capture the parameter so HelmDeploymentEngine writes its resolved value to
// the deploy-time override file, and ensure values.yaml has a placeholder so
// `helm template` (and `aspire publish` consumers that don't deploy via Aspire)
// can render the chart without `<no value>` substitutions.
var section = parameter.Secret ? HelmExtensions.SecretsKey : HelmExtensions.ParametersKey;
var valueKey = parameter.Name.ToHelmValuesSectionName();

if (!CapturedHelmValues.Any(c =>
c.Section == section &&
c.ResourceKey == owningResourceKey &&
c.ValueKey == valueKey))
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.

Low: When MissingParameterValueException is caught on the whole expression (because at least one parameter is unresolved), this handler generates Helm template references for every ParameterResource in the expression — including those that have default values and could have been inlined.

For example, if an expression combines paramWithDefault (has publishValueAsDefault: true) and paramWithoutDefault, both get Helm references even though the first could be resolved to its literal value here.

Impact: Functionally correct — HelmDeploymentEngine resolves all captured values at deploy time. But the published chart contains an unnecessary placeholder for parameters with known defaults, making the chart slightly less self-contained.

The fix would be to attempt GetValueAsync on each individual ParameterResource first and only fall back to a Helm reference for those that throw. However, I suspect multi-parameter expressions for ingress/gateway APIs are extremely rare in practice, so this may not be worth the added complexity.

…Path

- Resolve each ParameterResource individually when the outer expression
  raises MissingParameterValueException, so parameters with
  publishValueAsDefault still get inlined in mixed-parameter expressions
  (per JamesNK review feedback).
- Update new ingress tests to use WithPath after WithRoute was renamed
  on KubernetesIngressResource in #17424.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@mitchdenny
Copy link
Copy Markdown
Member Author

Thanks @JamesNK — good catch. Addressed in edf3bbb: ResolveValueProviderAsync now attempts to resolve each ParameterResource individually before falling back to a Helm template reference, so parameters with publishValueAsDefault: true get inlined even when they appear alongside an unresolved parameter in the same expression. The outer MissingParameterValueException from the whole-expression GetValueAsync call no longer "infects" the resolvable parameters.

Also picked up the rename of WithRouteWithPath on KubernetesIngressResource (from #17424) which had broken the build after rebasing.

@mitchdenny
Copy link
Copy Markdown
Member Author

/deployment-test

@github-actions
Copy link
Copy Markdown
Contributor

🚀 Deployment tests starting on PR #17423...

This will deploy to real Azure infrastructure. Results will be posted here when complete.

View workflow run

@github-actions
Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 96 passed, 0 failed, 5 unknown (commit edf3bbb)

View all recordings
Status Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View recording
AddPackageWhileAppHostRunningDetached ▶️ View recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View recording
AgentInitCommand_DefaultSelection_InstallsDefaultSkills ▶️ View recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View recording
AgentMcpListStructuredLogsFromStarterAppCore ▶️ View recording
AllPublishMethodsBuildDockerImages ▶️ View recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View recording
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost ▶️ View recording
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles ▶️ View recording
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive ▶️ View recording
AspireStartUpdatesStaleTypeScriptAppHostPath ▶️ View recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View recording
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent ▶️ View recording
Banner_DisplayedOnFirstRun ▶️ View recording
Banner_DisplayedWithExplicitFlag ▶️ View recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View recording
CertificatesClean_RemovesCertificates ▶️ View recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View recording
CreateAndRunAspireStarterProject ▶️ View recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View recording
CreateAndRunEmptyAppHostProject ▶️ View recording
CreateAndRunJavaEmptyAppHostProject ▶️ View recording
CreateAndRunJsReactProject ▶️ View recording
CreateAndRunPythonReactProject ▶️ View recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View recording
CreateAndRunTypeScriptStarterProject ▶️ View recording
CreateJavaAppHostWithViteApp ▶️ View recording
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain ▶️ View recording
DashboardRunWithAgentMcpCore ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTracesCore ▶️ View recording
DeployK8sBasicApiService ▶️ View recording
DeployK8sWithExternalHelmChart ▶️ View recording
DeployK8sWithGarnet ▶️ View recording
DeployK8sWithMongoDB ▶️ View recording
DeployK8sWithMySql ▶️ View recording
DeployK8sWithPostgres ▶️ View recording
DeployK8sWithRabbitMQ ▶️ View recording
DeployK8sWithRedis ▶️ View recording
DeployK8sWithSqlServer ▶️ View recording
DeployK8sWithValkey ▶️ View recording
DeployTypeScriptAppToKubernetes ▶️ View recording
DescribeCommandResolvesReplicaNames ▶️ View recording
DescribeCommandShowsRunningResources ▶️ View recording
DetachFormatJsonProducesValidJson ▶️ View recording
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance ▶️ View recording
DoListStepsShowsPipelineSteps ▶️ View recording
DocsCommand_RendersInteractiveMarkdownFromLocalSource ▶️ View recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View recording
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain ▶️ View recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View recording
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain ▶️ View recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View recording
GlobalMigration_PreservesAllValueTypes ▶️ View recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View recording
InitTypeScriptAppHost_AugmentsExistingViteRepoAtRoot ▶️ View recording
InteractiveCSharpInitCreatesExpectedFiles ▶️ View recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View recording
JavaScriptHostingApisRunFromTypeScriptAppHost ▶️ View recording
LatestCliCanStartStableChannelAppHost ▶️ View recording
LatestCliCanStartStableChannelTypeScriptAppHost ▶️ View recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View recording
LogLevelTrace_ProducesTraceEntriesInCliLogFile ▶️ View recording
LogsCommandShowsResourceLogs ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterApp ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterAppIsolated ▶️ View recording
PsCommandListsRunningAppHost ▶️ View recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View recording
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts ▶️ View recording
PublishWithConfigureEnvFileUpdatesEnvOutput ▶️ View recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View recording
PublishWithoutOutputPathUsesAppHostDirectoryDefault ▶️ View recording
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries ▶️ View recording
ResourceCommand_FailsWhenInteractionServiceIsRequired ▶️ View recording
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput ▶️ View recording
RestoreGeneratesSdkFiles ▶️ View recording
RestoreGeneratesSdkFiles_WithConfiguredToolchain ▶️ View recording
RestoreRefreshesGeneratedSdkAfterAddingIntegration ▶️ View recording
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes ▶️ View recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View recording
RunPublishFailureScenarioAsync ▶️ View recording
RunReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
RunReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
SecretCrudOnDotNetAppHost ▶️ View recording
SecretCrudOnTypeScriptAppHost ▶️ View recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View recording
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets ▶️ View recording
StartReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
StartReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
StopAllAppHostsFromAppHostDirectory ▶️ View recording
StopJavaPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopNonInteractiveSingleAppHost ▶️ View recording
StopTypeScriptPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View recording
UnAwaitedChainsCompileWithAutoResolvePromises ▶️ View recording
UpdateProjectChannelToStable_TypeScript_PicksUpStablePackages ▶️ View recording

📹 Recordings uploaded automatically from CI run #26377291906

@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot had a problem deploying to deployment-testing May 25, 2026 01:07 Failure
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions github-actions Bot temporarily deployed to deployment-testing May 25, 2026 01:07 Inactive
@github-actions
Copy link
Copy Markdown
Contributor

Deployment E2E Tests failed — 38 passed, 2 failed, 0 cancelled

View test results and recordings

View workflow run

Test Result Recording
Deployment.EndToEnd-KubernetesGatewayTlsDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureServiceBusDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-NspStorageKeyVaultDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureLogAnalyticsDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-TypeScriptVnetSqlServerInfraDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureStorageDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-VnetKeyVaultConnectivityDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureEventHubsDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-FrontDoorDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AcaCompactNamingDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-TypeScriptExpressDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-TypeScriptAzureContainerAppJobDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-KubernetesHelmChartDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureKeyVaultDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-VnetSqlServerInfraDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureContainerRegistryDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AcaCustomRegistryDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksBlazorRedisDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AuthenticationTests ✅ Passed
Deployment.EndToEnd-AcaStarterDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksAzureKubernetesEnvironmentCertManagerTypeScriptDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AcaDeploymentErrorOutputTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksVnetWithAzureResourcesDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-TypeScriptJavaScriptHostingDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-VnetStorageBlobInfraDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AppServiceReactDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksStarterDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-VnetSqlServerConnectivityDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksMultipleNodePoolsDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksWithAzureResourcesDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-VnetKeyVaultInfraDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AzureAppConfigDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksVnetInfraDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksWithHelmChartDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksStarterWithRedisHelmDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-VnetStorageBlobConnectivityDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AksAzureKubernetesEnvironmentGatewayDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AcaExistingRegistryDeploymentTests ✅ Passed ▶️ View Recording
Deployment.EndToEnd-AcaManagedRedisDeploymentTests ❌ Failed ▶️ View Recording
Deployment.EndToEnd-AksAzureKubernetesEnvironmentCertManagerDeploymentTests ❌ Failed ▶️ View Recording

@aspire-repo-bot
Copy link
Copy Markdown
Contributor

✅ No documentation update needed.

docs_optional → bug_fix_restores_documented_behavior

No signals triggered (signal_count = 0).

This PR fixes a bug in KubernetesEnvironmentResource.ResolveExpressionAsync where unresolved ParameterResource values rendered as "{0}" instead of a Helm template reference (e.g. {{ .Values.parameters.ingress.foo }}). The docs on microsoft/aspire.dev already document this exact usage pattern as intended behavior:

  • src/frontend/src/content/docs/deployment/kubernetes-ingress.mdx shows builder.AddParameter("ingressclass") + .WithIngressClass(ingressClass) as a working pattern.
  • src/frontend/src/content/docs/deployment/kubernetes-ingress-aks.mdx likewise uses WithIngressClass(ingressClassName) with a parameter resource.

The bug was that the implementation diverged from documented behavior; this fix closes the gap. No new user-facing surface, options, or APIs were introduced.

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.

3 participants