Skip to content

Move resource property metadata to producers#18202

Open
davidfowl wants to merge 7 commits into
mainfrom
davidfowl/undo-hardcoded-properties
Open

Move resource property metadata to producers#18202
davidfowl wants to merge 7 commits into
mainfrom
davidfowl/undo-hardcoded-properties

Conversation

@davidfowl

@davidfowl davidfowl commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Description

Follow-up to #1644 after PR #18132 added resource-supplied property display metadata.

This removes dashboard-owned, resource-specific property handling for built-in resource details where the resource/server side can now provide the metadata instead. The dashboard keeps ownership of generic resource properties such as display name, state, health, start/stop time, exit code, and connection string. Resource producers now provide labels, default highlighting, and ordering for resource-specific properties.

Producer metadata is emitted from:

  • Hosting/DCP snapshot metadata for Project, Executable, and Container properties.
  • ParameterResource for parameter values.
  • DotnetToolResource for tool package/version details.

Sort order is producer-local: producers use simple values such as 0, 1, and 2 for their own properties. The dashboard normalizes producer-defined and legacy fallback sort orders after the generic dashboard-owned properties, preserving the previous details ordering without requiring producers to know a dashboard-specific starting constant.

Compatibility

The protocol changes are additive metadata fields, so older dashboards ignore the new fields and newer dashboards handle missing metadata. To avoid a UX regression with old built-in resource servers, the dashboard includes a temporary legacy fallback for Project, Executable, Container, and Parameter snapshots that do not carry producer metadata. If producer metadata is present for a built-in resource, the dashboard trusts it and does not apply the fallback.

This is not expected to be a breaking change.

User-facing behavior

The resource details panel continues to show the important Project, Executable, Container, Parameter, and DotnetTool properties with the same labels, default visibility, and ordering as before. Unknown properties that producers mark as highlighted are shown by default. Parameter resources still show the custom Value not set experience.

Manual Stress playground comparison was performed for manual-project-args, manual-arg-source, manual-container-args, api-key, and manual-dotnet-tool-args.

Validation

dotnet build /t:UpdateXlf src/Aspire.Hosting/Aspire.Hosting.csproj
dotnet test --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj --no-launch-profile -- --filter-class "*.ResourceSnapshotBuilderTests" --filter-class "*.DotnetToolResourceTests" --filter-class "*.ParameterProcessorTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
dotnet test --project tests/Aspire.Dashboard.Tests/Aspire.Dashboard.Tests.csproj --no-launch-profile -- --filter-class "*.ResourceViewModelTests" --filter-class "*.KnownPropertyLookupTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
dotnet test --project tests/Aspire.Dashboard.Components.Tests/Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class "*.ResourceDetailsTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
git diff --check

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

Move resource-specific dashboard property labels, highlighting, and ordering into resource snapshot metadata emitted by hosting/resource producers. Preserve dashboard-owned generic properties and flow sort order through the dashboard protocol so existing details ordering is retained.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 14, 2026 22:43
@github-actions

github-actions Bot commented Jun 14, 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 -- 18202

Or

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

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.

Pull request overview

This PR follows up on issue #1644, moving resource-specific property metadata (display names, highlighting, sort order) from the dashboard's KnownPropertyLookup to the resource producers (hosting side). The dashboard now only owns generic resource behavior (state, health, timing, connection strings), while container, executable, project, parameter, and tool-specific property labels, visibility, and ordering are supplied by the resource snapshots.

Changes:

  • Adds a SortOrder property to ResourcePropertySnapshot and plumbs it through the protobuf wire format and dashboard view models, with a fallback to the existing Priority for backward compatibility.
  • Introduces ResourcePropertySnapshotMetadata to centralize DCP-produced property metadata (containers, executables, projects), and moves parameter/tool metadata into ParameterResource.CreateValueSnapshotProperty and DotnetToolResource.CreateSnapshotProperties respectively.
  • Simplifies KnownPropertyLookup to only contain generic resource properties, removing the per-resource-type property lists, and updates the dashboard's ResourceDetails ordering to use SortOrder instead of Priority.
Show a summary per file
File Description
src/Aspire.Hosting/ApplicationModel/CustomResourceSnapshot.cs Adds SortOrder property to ResourcePropertySnapshot
src/Aspire.Hosting/Dashboard/ResourcePropertySnapshotMetadata.cs New centralized metadata lookup for DCP resource properties
src/Aspire.Hosting/Dashboard/ResourceSnapshot.cs Updates Properties tuple to include SortOrder
src/Aspire.Hosting/Dashboard/GenericResourceSnapshot.cs Propagates SortOrder through the snapshot tuple
src/Aspire.Hosting/Dashboard/proto/dashboard_service.proto Adds sort_order field to ResourceProperty message
src/Aspire.Hosting/Dashboard/proto/Partials.cs Maps SortOrder to protobuf ResourceProperty
src/Aspire.Hosting/Dcp/ResourceSnapshotBuilder.cs Uses ResourcePropertySnapshotMetadata.Create for all DCP snapshots
src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs Applies container image metadata via ResourcePropertySnapshotMetadata.Get
src/Aspire.Hosting/Orchestrator/ParameterProcessor.cs Uses ParameterResource.CreateValueSnapshotProperty
src/Aspire.Hosting/ApplicationModel/ParameterResource.cs Adds CreateValueSnapshotProperty with display metadata
src/Aspire.Hosting/ApplicationModel/DotnetToolResource.cs Adds CreateSnapshotProperties with tool property metadata
src/Aspire.Hosting/DotnetToolResourceExtensions.cs Delegates to CreateSnapshotProperties
src/Shared/CustomResourceSnapshotExtensions.cs Adds sortOrder parameter to SetResourceProperty
src/Aspire.Dashboard/Model/KnownPropertyLookup.cs Removes type-specific property lists, retains only generic properties
src/Aspire.Dashboard/Model/ResourceViewModel.cs Adds SortOrder to view models with fallback to Priority
src/Aspire.Dashboard/Components/Controls/ResourceDetails.razor.cs Orders by SortOrder, handles parameter key dual-registration
src/Aspire.Dashboard/ServiceClient/Partials.cs Reads SortOrder from protobuf property
src/Aspire.Hosting/Resources/MessageStrings.resx New localized display name strings for resource properties
src/Aspire.Hosting/Resources/MessageStrings.Designer.cs Auto-generated accessors for new resource strings
src/Aspire.Hosting/Resources/xlf/*.xlf XLF translation entries for 13 locales
tests/Aspire.Hosting.Tests/DotnetToolResourceTests.cs New test for tool snapshot property metadata
tests/Aspire.Hosting.Tests/Dcp/ResourceSnapshotBuilderTests.cs New tests for container/executable/project display metadata
tests/Aspire.Dashboard.Tests/Model/KnownPropertyLookupTests.cs New test verifying producer-supplied properties aren't known
tests/Aspire.Dashboard.Tests/Model/ResourceViewModelTests.cs Tests producer-supplied metadata doesn't require known property
tests/Aspire.Dashboard.Components.Tests/Controls/ResourceDetailsTests.cs Tests sort order for highlighted properties, parameter helper
tests/Aspire.Hosting.Tests/Dashboard/DashboardServiceDataTerminalTests.cs Updates tuple type for SortOrder

Copilot's findings

Files not reviewed (1)
  • src/Aspire.Hosting/Resources/MessageStrings.Designer.cs: Generated file
  • Files reviewed: 37/38 changed files
  • Comments generated: 0

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

@davidfowl

davidfowl commented Jun 14, 2026

Copy link
Copy Markdown
Contributor Author

PR Testing Report

PR Information

Artifact Version Verification

  • Expected Commit: 01092e4
  • Installed Version: 13.5.0-pr.18202.g01092e4c
  • Status: Verified - installed PR CLI version contains short SHA 01092e4c.

Changes Analyzed

Files Changed

  • src/Aspire.Dashboard/Components/Controls/ResourceDetails.razor.cs
  • src/Aspire.Dashboard/Model/KnownPropertyLookup.cs
  • src/Aspire.Dashboard/Model/ResourceViewModel.cs
  • src/Aspire.Dashboard/ServiceClient/Partials.cs
  • src/Aspire.Hosting/ApplicationModel/CustomResourceSnapshot.cs
  • src/Aspire.Hosting/ApplicationModel/DotnetToolResource.cs
  • src/Aspire.Hosting/ApplicationModel/ParameterResource.cs
  • src/Aspire.Hosting/Dashboard/GenericResourceSnapshot.cs
  • src/Aspire.Hosting/Dashboard/ResourcePropertySnapshotMetadata.cs
  • src/Aspire.Hosting/Dashboard/ResourceSnapshot.cs
  • src/Aspire.Hosting/Dashboard/proto/Partials.cs
  • src/Aspire.Hosting/Dashboard/proto/dashboard_service.proto
  • src/Aspire.Hosting/Dcp/ResourceSnapshotBuilder.cs
  • src/Aspire.Hosting/DotnetToolResourceExtensions.cs
  • src/Aspire.Hosting/Orchestrator/ApplicationOrchestrator.cs
  • src/Aspire.Hosting/Orchestrator/ParameterProcessor.cs
  • src/Aspire.Hosting/Resources/MessageStrings.Designer.cs
  • src/Aspire.Hosting/Resources/MessageStrings.resx
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.cs.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.de.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.es.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.fr.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.it.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.ja.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.ko.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.pl.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.pt-BR.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.ru.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.tr.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.zh-Hans.xlf
  • src/Aspire.Hosting/Resources/xlf/MessageStrings.zh-Hant.xlf
  • src/Shared/CustomResourceSnapshotExtensions.cs
  • tests/Aspire.Dashboard.Components.Tests/Controls/ResourceDetailsTests.cs
  • tests/Aspire.Dashboard.Tests/Model/KnownPropertyLookupTests.cs
  • tests/Aspire.Dashboard.Tests/Model/ResourceViewModelTests.cs
  • tests/Aspire.Hosting.Tests/Dashboard/DashboardServiceDataTerminalTests.cs
  • tests/Aspire.Hosting.Tests/Dcp/ResourceSnapshotBuilderTests.cs
  • tests/Aspire.Hosting.Tests/DotnetToolResourceTests.cs

Change Categories

  • CLI changes detected
  • Hosting changes
  • Dashboard changes
  • Template changes
  • Client/Component changes
  • CI infrastructure changes
  • VS Code extension changes
  • Test changes

Test Scenarios Executed

Scenario 1: Artifact verification

Objective: Verify the dogfood CLI artifact for PR #18202 matches the latest PR head before testing behavior.
Coverage Type: Artifact/version verification
Status: Passed

Steps:

  1. Installed the PR CLI with the dogfood script into an isolated temp directory using --install-path, --skip-path, and --skip-extension.
  2. Ran the installed binary directly with --version.
  3. Compared the version suffix to the PR head commit.

Evidence:

  • Install log: artifacts/install.log
  • Version output: artifacts/version.txt

Observations:

  • Installed version was 13.5.0-pr.18202.g01092e4c, which matches PR head 01092e4c.

Scenario 2: Resource details metadata smoke app

Objective: Verify a fresh PR-hive Aspire app can produce resource-specific properties from hosting/resource producers for project, executable, container, parameter, and dotnet tool resources.
Coverage Type: Happy path
Status: Passed

Steps:

  1. Created a fresh file-based AppHost from the PR package hive using aspire new aspire-empty.
  2. Added resources modeled after the Stress playground coverage: parameter, executable, project, container, and explicit-start dotnet tool.
  3. Started the AppHost with the PR CLI.
  4. Captured aspire describe --include-hidden --format Json before and after starting the explicit-start dotnet tool.

Evidence:

  • Generated AppHost: artifacts/apphost.cs
  • Start log: artifacts/aspire-start.log
  • Initial describe JSON: artifacts/describe.json
  • Tool-after-start JSON: artifacts/tool-after-start.json

Observations:

  • Project, executable, container, parameter, and tool resources appeared in the running dashboard.
  • Starting the explicit-start dotnet tool published tool.package=dotnet-dump and resource.source=dotnet-dump, with tool.version safely omitted from default display because its value was null.

Scenario 3: Dashboard details UI verification

Objective: Verify the dashboard displays the important resource-specific details with preserved ordering through producer-supplied metadata rather than dashboard hard-coded known-property lists.
Coverage Type: Dashboard UI validation
Status: Passed

Steps:

  1. Logged into the running smoke app dashboard with Playwright.
  2. Captured the resources list.
  3. Opened details for project, executable, container, tool, and parameter resources.
  4. Captured screenshots and snapshots for each relevant details view.
  5. Extracted the observed details row order.

Evidence:

  • Resources screenshot: artifacts/dashboard-resources.png
  • Project details screenshot: artifacts/dashboard-project-details.png
  • Executable details screenshot: artifacts/dashboard-executable-details.png
  • Container details screenshot: artifacts/dashboard-container-details.png
  • Tool details screenshot: artifacts/dashboard-tool-details.png
  • Parameter details screenshot: artifacts/dashboard-parameter-details.png
  • Extracted detail-row order: artifacts/details-row-order.txt

Observations:

  • Project details showed generic rows first, followed by Project path and Process ID.
  • Executable details showed Executable path, Working directory, Executable arguments, and Process ID in the expected producer-specified order.
  • Container details showed Container image, Container ID, Container command, Container arguments, and Container lifetime in the expected producer-specified order.
  • Tool details showed Executable path, Tool package, Working directory, Executable arguments, and Process ID after starting the tool.
  • Parameter details showed Display name, Value, and State, with the secret parameter value masked.

Scenario 4: Non-highlighted producer property remains hidden by default

Objective: Verify producer-supplied properties that are not highlighted are not promoted into the dashboard default details view.
Coverage Type: Negative/boundary
Status: Passed

Steps:

  1. Started the explicit-start dotnet tool resource so resource.source was present in the raw resource snapshot.
  2. Opened the tool resource details in the dashboard.
  3. Searched the default details snapshot for resource.source or a Resource source row.

Evidence:

  • Negative check: artifacts/nonhighlighted-source-check.txt
  • Tool details snapshot: artifacts/dashboard-tool-details-snapshot.txt

Expected Unhappy-Path Outcome:

  • resource.source exists in the raw snapshot but is not shown as a promoted default details row because it is not highlighted.

Observations:

  • Raw tool properties included resource.source=dotnet-dump.
  • No resource.source or Resource source row appeared in the default tool details snapshot.

Scenario 5: Focused automated regression tests

Objective: Verify the unit/component tests covering the changed hosting metadata and dashboard rendering paths pass on the PR branch.
Coverage Type: Automated regression
Status: Passed

Steps:

  1. Ran focused hosting tests for ResourceSnapshotBuilderTests, DotnetToolResourceTests, and DashboardServiceDataTerminalTests.
  2. Ran focused dashboard model tests for KnownPropertyLookupTests and ResourceViewModelTests.
  3. Ran focused dashboard component tests for ResourceDetailsTests.

Evidence:

  • Test log: artifacts/focused-tests.log

Observations:

  • Hosting tests: 15 passed.
  • Dashboard model tests: 20 passed.
  • Dashboard component tests: 18 passed.

Summary

Scenario Status Notes
Artifact verification Passed Dogfood CLI matched 01092e4c.
Resource details metadata smoke app Passed Fresh PR-hive app started and emitted the tested resource properties.
Dashboard details UI verification Passed Important resource-specific details were visible in preserved order.
Non-highlighted producer property remains hidden Passed resource.source stayed out of default tool details.
Focused automated regression tests Passed 53 focused tests passed.

Overall Result

PR VERIFIED

Recommendations

  • No issues found during PR testing.

Artifacts

  • Artifact directory: [local-user-path]
  • Manifest: artifacts/artifacts-manifest.txt

Uploaded Screenshots

Resources list

Resources list

Project details

Project details

Executable details

Executable details

Container details

Container details

Tool details

Tool details

Parameter details

Parameter details

PR Comment Status

  • Posted and updated with uploaded redacted screenshots.

Cleanup / Inspection Status

  • Temporary PR CLI install and smoke workspace removed.
  • Smoke AppHost stopped successfully.

@davidfowl davidfowl marked this pull request as ready for review June 15, 2026 00:09
Comment thread src/Aspire.Dashboard/Model/ResourceViewModel.cs Outdated
Comment thread src/Aspire.Hosting/ApplicationModel/DotnetToolResource.cs Outdated

@JamesNK JamesNK left a comment

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-severity cleanup: 2 dead-code items identified (unused resourceType parameter, orphaned dashboard localization strings). No bugs, security, correctness, or convention issues found.

Comment thread src/Aspire.Dashboard/Model/KnownPropertyLookup.cs
Comment thread src/Aspire.Dashboard/Model/KnownPropertyLookup.cs Outdated
@davidfowl davidfowl added the breaking-change Issue or PR that represents a breaking API or functional change over a prerelease. label Jun 15, 2026
@davidfowl

Copy link
Copy Markdown
Contributor Author

There's also a breaking change here since the dashboard no longer hardcodes the set of known properties per resource,

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

@JamesNK

JamesNK commented Jun 15, 2026

Copy link
Copy Markdown
Member

There's also a breaking change here since the dashboard no longer hardcodes the set of known properties per resource,

What is the situation where the app host SDK version and dashboard version are out of sync? I haven't run into that problem yet.

@davidfowl

Copy link
Copy Markdown
Contributor Author

What is the situation where the app host SDK version and dashboard version are out of sync? I haven't run into that problem yet.

There are 2 scenarios where this could happen:

  • ACA and AppService both host resource servers
  • We now support loading the dashboard via the CLI bundle everywhere (even for .NET apps). We'll need to handle situations where the dashboard and apphost version are out of sync. Default AppHosts to use the CLI bundle #18188. This will be the default.

@JamesNK

JamesNK commented Jun 15, 2026

Copy link
Copy Markdown
Member

Got it.

We could keep the current behavior in the dashboard. But at that point I wonder if this is a useful change. There are situations it breaks, but what do we get out of it.

@davidfowl

Copy link
Copy Markdown
Contributor Author

I think we do the breaking change. Easy to bring back if everyone gets up running into this but we wil be doing more to make sure we push updates more aggressively. I want to get to a point where we are using all of these features ourselves (within reason).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 15, 2026 15:59

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's findings

Files not reviewed (1)
  • src/Aspire.Hosting/Resources/MessageStrings.Designer.cs: Generated file
  • Files reviewed: 63/65 changed files
  • Comments generated: 1

Comment thread src/Aspire.Hosting/ApplicationModel/ParameterResource.cs
davidfowl and others added 2 commits June 15, 2026 09:12
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 15, 2026 16:23

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's findings

Files not reviewed (1)
  • src/Aspire.Hosting/Resources/MessageStrings.Designer.cs: Generated file
  • Files reviewed: 64/66 changed files
  • Comments generated: 1

Comment thread tests/Aspire.Dashboard.Components.Tests/Controls/ResourceDetailsTests.cs Outdated
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 15, 2026 17:24

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's findings

Files not reviewed (1)
  • src/Aspire.Hosting/Resources/MessageStrings.Designer.cs: Generated file
  • Files reviewed: 64/66 changed files
  • Comments generated: 0 new

@davidfowl davidfowl removed the breaking-change Issue or PR that represents a breaking API or functional change over a prerelease. label Jun 15, 2026
@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

CLI E2E Tests unknown — 115 passed, 0 failed, 2 unknown (commit 92129b5)

View all recordings
- Test Detail
AddPackageInteractiveWhileAppHostRunningDetached Recording · Job · CLI logs
AddPackageWhileAppHostRunningDetached Recording · Job · CLI logs
AgentCommands_AllHelpOutputs_AreCorrect Recording · Job · CLI logs
AgentInitCommand_DefaultSelection_InstallsDefaultSkills Recording · Job · CLI logs
AgentInitCommand_MigratesDeprecatedConfig Recording · Job · CLI logs
AgentInit_NonInteractive_BundleOnlySkillsNotInCatalog Recording · Job · CLI logs
AgentMcpListResources_ExcludesResourceMarkedWithExcludeFromMcp Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_DevLocalhost Recording · Job · CLI logs
AgentMcpListStructuredLogsReturnsLogsFromStarterApp_Isolated Recording · Job · CLI logs
AllPublishMethodsBuildDockerImages Recording · Job · CLI logs
AspireAddAndStartWorkAgainstLegacyAppHostTs Recording · Job · CLI logs
AspireAddPackageVersionToDirectoryPackagesProps Recording · Job · CLI logs
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost Recording · Job · CLI logs
AspireInit_ExistingAppHostDir_RecreatesNuGetConfigKeepsFiles Recording · Job · CLI logs
AspireInit_SolutionFile_BuildsAgainstChannelHive Recording · Job · CLI logs
AspireStartUpdatesStaleTypeScriptAppHostPath Recording · Job · CLI logs
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps Recording · Job · CLI logs
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent Recording · Job · CLI logs
Banner_DisplayedOnFirstRun Recording · Job · CLI logs
Banner_DisplayedWithExplicitFlag Recording · Job · CLI logs
Banner_NotDisplayedWithNoLogoFlag Recording · Job · CLI logs
CertificatesClean_RemovesCertificates Recording · Job · CLI logs
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate Recording · Job · CLI logs
CertificatesTrust_WithUntrustedCert_TrustsCertificate Recording · Job · CLI logs
ConfigSetGet_CreatesNestedJsonFormat Recording · Job · CLI logs
CreateAndRunAspireStarterProject Recording · Job · CLI logs
CreateAndRunAspireStarterProjectWithBundle Recording · Job · CLI logs
CreateAndRunEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJavaEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunJsReactProject Recording · Job · CLI logs
CreateAndRunPolyglotAppHostWithDevLocalhostUrls Recording · Job · CLI logs
CreateAndRunPythonReactProject Recording · Job · CLI logs
CreateAndRunTypeScriptEmptyAppHostProject Recording · Job · CLI logs
CreateAndRunTypeScriptStarterProject Recording · Job · CLI logs
CreateJavaAppHostWithViteApp Recording · Job · CLI logs
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithAgentMcpListTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces Recording · Job · CLI logs
DashboardRunWithOtelTracesReturnsNoTraces_DevLocalhost Recording · Job · CLI logs
DeployK8sBasicApiService Recording · Job · CLI logs
DeployK8sWithExternalHelmChart Recording · Job · CLI logs
DeployK8sWithGarnet Recording · Job · CLI logs
DeployK8sWithMongoDB Recording · Job · CLI logs
DeployK8sWithMySql Recording · Job · CLI logs
DeployK8sWithPostgres Recording · Job · CLI logs
DeployK8sWithRabbitMQ Recording · Job · CLI logs
DeployK8sWithRedis Recording · Job · CLI logs
DeployK8sWithSqlServer Recording · Job · CLI logs
DeployK8sWithValkey Recording · Job · CLI logs
DeployTypeScriptAppToKubernetes Recording · Job · CLI logs
DescribeCommandResolvesReplicaNames Recording · Job · CLI logs
DescribeCommandShowsRunningResources Recording · Job · CLI logs
DetachFormatJsonProducesValidJson Recording · Job · CLI logs
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance Recording · Job · CLI logs
DoPublishAndDeployListStepsWork Recording · Job · CLI logs
DocsCommand_RendersInteractiveMarkdownFromLocalSource Recording · Job · CLI logs
DoctorCommand_DetectsDeprecatedAgentConfig Recording · Job · CLI logs
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain Recording · Job · CLI logs
DoctorCommand_WithSslCertDir_ShowsTrusted Recording · Job · CLI logs
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted Recording · Job · CLI logs
DotNetRunFileBasedAppHostUsesAspireCliBundle Recording · Job · CLI logs
DotNetRunProjectAppHostUsesAspireCliBundle Recording · Job · CLI logs
GatewayWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain Recording · Job · CLI logs
GlobalMigration_HandlesCommentsAndTrailingCommas Recording · Job · CLI logs
GlobalMigration_HandlesMalformedLegacyJson Recording · Job · CLI logs
GlobalMigration_PreservesAllValueTypes Recording · Job · CLI logs
GlobalMigration_SkipsWhenNewConfigExists Recording · Job · CLI logs
GlobalSettings_MigratedFromLegacyFormat Recording · Job · CLI logs
IngressWithoutExternalEndpoint_FailsPublishWithGuidance Recording · Job · CLI logs
InitTypeScriptAppHost_AugmentsExistingViteRepoInWorkspaceSubdirectory Recording · Job · CLI logs
InteractiveCSharpInitCreatesExpectedFiles Recording · Job · CLI logs
InvalidAppHostPathWithComments_IsHealedOnRun Recording · Job · CLI logs
JavaScriptHostingApisRunFromTypeScriptAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelAppHost Recording · Job · CLI logs
LatestCliCanStartStableChannelTypeScriptAppHost Recording · Job · CLI logs
LegacySettingsMigration_AdjustsRelativeAppHostPath Recording · Job · CLI logs
LogsCommandShowsResourceLogs Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterApp Recording · Job · CLI logs
OtelLogsReturnsStructuredLogsFromStarterAppIsolated Recording · Job · CLI logs
ProcessCommandCallbackReceivesCliArguments Recording · Job · CLI logs
PsCommandListsRunningAppHost Recording · Job · CLI logs
PsFormatJsonOutputsOnlyJsonToStdout Recording · Job · CLI logs
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts Recording · Job · CLI logs
PublishWithConfigureEnvFileUpdatesEnvOutput Recording · Job · CLI logs
PublishWithDockerComposeServiceCallbackSucceeds Recording · Job · CLI logs
PublishWithoutOutputPathUsesAppHostDirectoryDefault Recording · Job · CLI logs
ResourceCommand_FailedExec_ShowsLogPathAndLogHasEntries Recording · Job · CLI logs
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput Recording · Job · CLI logs
RestoreGeneratesSdkFiles Recording · Job · CLI logs
RestoreGeneratesSdkFiles_WithConfiguredToolchain Recording · Job · CLI logs
RestoreRefreshesGeneratedSdkAfterAddingIntegration Recording · Job · CLI logs
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes Recording · Job · CLI logs
RunFromParentDirectory_UsesExistingConfigNearAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
RunReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
SecretCrudOnDotNetAppHost Recording · Job · CLI logs
SecretCrudOnTypeScriptAppHost Recording · Job · CLI logs
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels Recording · Job · CLI logs
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets Recording · Job · CLI logs
StartReportsSyntaxErrorsForDotNetAppHost Recording · Job · CLI logs
StartReportsSyntaxErrorsForTypeScriptAppHost Recording · Job · CLI logs
StopAllAppHostsFromAppHostDirectory Recording · Job · CLI logs
StopJavaPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopNonInteractiveSingleAppHost Recording · Job · CLI logs
StopTypeScriptPolyglotAppHostUsingApphostDirectory Recording · Job · CLI logs
StopWithNoRunningAppHostExitsSuccessfully Recording · Job · CLI logs
TerminalAttachFrontend_ShowsViteHelpAndDetaches Recording · Job · CLI logs
TypeScriptAppHostRunDoesNotDeadlockWhenLazyOptionsInvokeAsyncCallback Recording · Job · CLI logs
TypeScriptAppHostWithVite_AllowsDifferentGuestPkgManager Recording · Job · CLI logs
UnAwaitedChainsCompileWithAutoResolvePromises Recording · Job · CLI logs
UpdateToStable_CSharpEmptyAppHost_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_CSharpSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScriptSingleFileInit_KeepsConfigChannel Recording · Job · CLI logs
UpdateToStable_TypeScript_PreviewsStablePkgsAndKeepsChannel Recording · Job · CLI logs

📹 Recordings uploaded automatically from CI run #27563928254

@davidfowl

davidfowl commented Jun 16, 2026

Copy link
Copy Markdown
Contributor Author

PR Testing Report

PR Information

Artifact Version Verification

  • Expected Commit: 92129b5d493e00abb10672908ff708436b9447e8
  • Installed Version: 13.5.0-pr.18202.g92129b5d
  • Status: Verified - installed PR CLI version contains 92129b5d

Changes Analyzed

  • Hosting changes: producer-side resource property metadata and dashboard protocol snapshots.
  • Dashboard changes: resource details metadata handling, known-property lookup cleanup, producer-local sort order normalization, and legacy fallback for old built-in snapshots.
  • Test changes: hosting snapshot, dashboard model, and resource details rendering coverage.
  • No CLI, template, client/component, VS Code extension, or CI infrastructure changes detected.

Test Scenarios Executed

Scenario 1: Dogfood artifact verification

Objective: Verify the tested CLI artifact is built from PR #18202 head.
Coverage Type: Artifact verification
Status: Passed

Observations:

  • The dogfood script installed 13.5.0-pr.18202.g92129b5d.
  • The version contains 92129b5d, matching the PR head.

Scenario 2: Targeted automated validation

Objective: Verify hosting metadata producers, dashboard model conversion, legacy fallback, producer-local sort normalization, and ResourceDetails rendering behavior.
Coverage Type: Happy path, compatibility, and boundary/unit validation
Status: Passed

Commands:

dotnet test --project tests/Aspire.Hosting.Tests/Aspire.Hosting.Tests.csproj --no-launch-profile -- --filter-class "*.ResourceSnapshotBuilderTests" --filter-class "*.DotnetToolResourceTests" --filter-class "*.ParameterProcessorTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
dotnet test --project tests/Aspire.Dashboard.Tests/Aspire.Dashboard.Tests.csproj --no-launch-profile -- --filter-class "*.ResourceViewModelTests" --filter-class "*.KnownPropertyLookupTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
dotnet test --project tests/Aspire.Dashboard.Components.Tests/Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class "*.ResourceDetailsTests" --filter-not-trait "quarantined=true" --filter-not-trait "outerloop=true"
git diff --check

Observations:

  • Hosting metadata tests passed: 59 total.
  • Dashboard model tests passed: 47 total.
  • Dashboard component tests passed: 18 total.
  • git diff --check passed.

Scenario 3: Minimal AppHost dashboard smoke test

Objective: Verify a fresh PR-hive app can run with producer-supplied resource metadata and that the dashboard renders the relevant resource details.
Coverage Type: Happy path runtime/UI smoke
Status: Passed

Observations:

  • The minimal AppHost started successfully and exposed the dashboard.
  • The Parameter details page showed Display name, State, Health state, and the producer-supplied Value row with the secret value masked.
  • After starting the tool resource, aspire describe showed tool.package and the dashboard Tool details page showed Tool package ordered with the resource details.

Scenario 4: Starter template smoke retry

Objective: Verify the broader aspire-starter template scenario with project resources plus the added Parameter and DotnetTool metadata paths.
Coverage Type: Runtime/UI smoke
Status: Passed on retry

Steps:

  1. Created a fresh aspire-starter app from the PR hive in a canonical, non-symlinked workspace.
  2. Verified the generated solution builds before modifications.
  3. Added a secret parameter and explicit-start DotnetToolResource to the AppHost.
  4. Started the AppHost with the verified PR CLI in isolated mode.
  5. Waited for apiservice and webfrontend to become healthy.
  6. Started the tool resource and captured aspire describe --format Json after it finished.
  7. Captured the dashboard resource list screenshot.

Observations:

  • The starter app built successfully from the PR hive.
  • apiservice and webfrontend reached healthy state.
  • aspire describe showed project resource metadata (project.path, project.launchProfile, process ID) and tool metadata (tool.package).
  • Dashboard resource list showed apiservice, webfrontend, and manual-dotnet-tool-args.
  • The earlier starter failure was a test-environment artifact from generating/running under a macOS symlinked temp path, not a PR-specific failure.

Unhappy-Path Coverage

Old built-in snapshot compatibility

Objective: Verify dashboards connected to old built-in resource servers do not lose labels/order/default visibility when metadata is absent.
Coverage Type: Compatibility/unit validation
Status: Passed via Dashboard model tests

Custom resource safety

Objective: Verify built-in fallback metadata is not applied to custom resources just because they use a built-in property name.
Coverage Type: Negative/unit validation
Status: Passed via Dashboard model tests

Producer metadata precedence

Objective: Verify producer metadata disables the temporary legacy fallback for a resource.
Coverage Type: Boundary/unit validation
Status: Passed via Dashboard model tests

Screenshots

Minimal app resource list

Resource list

Minimal app parameter details

Parameter details

Minimal app tool details

Tool details

Starter app retry resource list

Starter retry resource list

Summary

Scenario Status Notes
Dogfood artifact verification Passed CLI version matched PR head 92129b5d
Targeted automated validation Passed 59 Hosting, 47 Dashboard model, 18 Dashboard component tests
Minimal AppHost dashboard smoke test Passed Parameter and Tool details rendered producer metadata
Starter template smoke retry Passed Starter app built, projects healthy, tool metadata present

Overall Result

PR-specific behavior verified.

The hosting/dashboard changes in PR #18202 were verified by targeted automated tests, a fresh minimal AppHost dashboard smoke test, and a retried aspire-starter smoke test from a canonical workspace. The earlier starter failure was a test setup artifact and is no longer considered a PR testing issue.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants