Skip to content

Improve Nitro schema composition and validation in Aspire - #10179

Merged
michaelstaib merged 2 commits into
mainfrom
mst/improve-nitro-aspire-composition
Jul 31, 2026
Merged

michaelstaib merged 2 commits into
mainfrom
mst/improve-nitro-aspire-composition

Conversation

@michaelstaib

Copy link
Copy Markdown
Member

No description provided.

Copilot AI review requested due to automatic review settings July 31, 2026 21:07
@michaelstaib
michaelstaib merged commit b539979 into main Jul 31, 2026
146 of 147 checks passed
@michaelstaib
michaelstaib deleted the mst/improve-nitro-aspire-composition branch July 31, 2026 21:13

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 improves the Nitro integration in Fusion Aspire by (1) fetching and applying Nitro stage composition settings during seed acquisition/composition, (2) improving schema validation change parsing/formatting, and (3) providing clearer, actionable dashboard notifications (including deep links to resource logs).

Changes:

  • Add a Nitro composition-settings GraphQL operation + client, and merge stage settings into archives (including an initial “no archive yet” seed path).
  • Improve schema validation change parsing (support nested change structures) and update formatting/fingerprints accordingly.
  • Add/adjust notifications for schema validation and schema composition failures, and update/expand tests + persisted operation IDs.

Reviewed changes

Copilot reviewed 32 out of 32 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/SchemaCompositionTests.cs Adds tests for the updated WithGraphQLSchemaComposition overloads/defaults.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/NitroExtensionsTests.cs Removes local pragmas now covered by project-level NoWarn.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroSeedUpdateMonitorTests.cs Updates coordinator construction to include composition-settings client.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroSeedProviderTests.cs Asserts new NotFound outcome behavior.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroSchemaValidatorTests.cs Updates expectations for nested schema-change parsing output.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroSchemaValidationNotifierTests.cs Updates notifier contract and verifies new link/title/message shapes.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroSchemaValidationFormatterTests.cs Updates formatter snapshots for new wording + severity output.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroSchemaCompositionTests.cs Adds tests for applying/merging Nitro stage composition settings and composition failure notifications.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/NitroOperationDocumentsTests.cs Adds tests for new composition-settings operation doc/id and updates validation operation id expectations.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/Nitro/GatewaySchemaValidationWorkerTests.cs Updates notifier signature usage in worker tests.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/HotChocolate.Fusion.Aspire.Tests.csproj Adds ASPIREINTERACTION001 to NoWarn for tests.
src/HotChocolate/Fusion/test/Fusion.Aspire.Tests/CompositionHarness.cs Wires INitroCompositionNotifier into the harness + provides noop implementation.
src/HotChocolate/Fusion/src/Fusion.Aspire/SchemaCompositionRegistration.cs Registers INitroCompositionNotifier to reuse the existing notifier implementation.
src/HotChocolate/Fusion/src/Fusion.Aspire/SchemaComposition.cs Emits composition-failure notifications (including guarded recomposition paths).
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/Operations/PollNitroSchemaValidation.graphql.sha256 Updates persisted operation hash for the validation polling document.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/Operations/PollNitroSchemaValidation.graphql Expands validation polling document to include nested change details via fragments.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/Operations/GetNitroCompositionSettings.graphql.sha256 Adds persisted operation hash for composition settings query.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/Operations/GetNitroCompositionSettings.graphql Adds query to fetch stage composition settings from Nitro.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSeedUpdateNotifier.cs Aligns notification title/log text with the new Nitro notification naming.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSeedResult.cs Adds NotFound outcome and updates doc comments.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSeedProvider.cs Produces NotFound outcome when Nitro has no config and no cache exists.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSeedCoordinator.cs Fetches stage composition settings, supports “initial seed” creation, and merges settings into archives.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidator.cs Parses nested schema change logs and generates more specific finding messages.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidationReport.cs Extends fingerprinting and finding model to include severity.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidationNotifier.cs Adds composition notifier interface, deep links to logs, and updated notification title/log message.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidationFormatter.cs Updates header wording and includes severity in formatted findings.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidationCoordinator.cs Uses the new notifier signature and updates user-facing messages.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroOperationDocuments.cs Adds composition-settings operation name/document/id accessors.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroCompositionSettingsClient.cs New client to fetch and map Nitro stage composition settings.
src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/INitroCompositionSettingsClient.cs New abstraction for composition-settings retrieval.
src/HotChocolate/Fusion/src/Fusion.Aspire/HotChocolate.Fusion.Aspire.csproj Adds ASPIREINTERACTION001 to NoWarn and embeds the new operation resources.
src/HotChocolate/Fusion/src/Fusion.Aspire/GraphQLResourceBuilderExtensions.cs Adds a simpler composition configuration overload and adjusts the composition overload surface.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

.Append(" operations, ")
.Append(report.FindingCount)
.AppendLine(" findings.");
.Append(report.OperationCount == 1 ? " operation are affected." : " operations are affected.")
Comment on lines +232 to +249
CompositionSettings? stageSettings;
try
{
stageSettings = await settingsTask;
}
catch (Exception exception) when (
exception is not OperationCanceledException
&& result.Outcome is NitroSeedOutcome.ServedFromCache)
{
stageSettings = null;
logger.LogWarning(
exception,
"The composition settings for the api {ApiId} and the stage {Stage} could not "
+ "be fetched from Nitro. The settings in the cached fusion configuration will "
+ "be used.",
apiId,
Stage);
}
public sealed class SchemaCompositionTests
{
[Fact]
public void WithGraphQLSchemaComposition_Should_UseValidationAndOutput_WhenArgumentsAreProvided()
Comment on lines 86 to +90
public static IResourceBuilder<T> WithGraphQLSchemaComposition<T>(
this IResourceBuilder<T> builder,
string outputFileName = "gateway.far",
GraphQLCompositionSettings settings = default)
bool disableValidation = false,
string outputFileName = "gateway.far")
where T : IResourceWithEndpoints
@@ -1 +1 @@
6ebe506f2dda96523ef2a0302b7b4aa0f748c2ace6dd5b89449c081c7dbb135e
0fcb0a11b85be6ede7bb6141f0cdcc34a3fc7eaa611747d013d02b9374e48e22
@github-actions

Copy link
Copy Markdown
Contributor

Patch coverage

72.9% of changed lines covered (320/439)

File Covered Changed Patch %
…/Fusion/src/Fusion.Aspire/Nitro/NitroSeedUpdateNotifier.cs 0 2 0.0% 🔴
…/HotChocolate/Fusion/src/Fusion.Aspire/SchemaComposition.cs 14 37 37.8% 🔴
…/src/Fusion.Aspire/Nitro/NitroSchemaValidationReport.cs 2 4 50.0% 🔴
…/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidator.cs 47 81 58.0% 🔴
…/src/Fusion.Aspire/Nitro/NitroCompositionSettingsClient.cs 109 148 73.6% 🔴
…/Fusion/src/Fusion.Aspire/Nitro/NitroSeedCoordinator.cs 106 124 85.5% 🟡
…/src/Fusion.Aspire/Nitro/NitroSchemaValidationNotifier.cs 12 13 92.3% 🟡
…/Fusion/src/Fusion.Aspire/GraphQLResourceBuilderExtensions.cs 6 6 100.0% 🟢
…/Fusion/src/Fusion.Aspire/Nitro/NitroOperationDocuments.cs 1 1 100.0% 🟢
…/src/Fusion.Aspire/Nitro/NitroSchemaValidationCoordinator.cs 5 5 100.0% 🟢
…/src/Fusion.Aspire/Nitro/NitroSchemaValidationFormatter.cs 10 10 100.0% 🟢
…/Fusion/src/Fusion.Aspire/Nitro/NitroSeedProvider.cs 7 7 100.0% 🟢
…/Fusion/src/Fusion.Aspire/SchemaCompositionRegistration.cs 1 1 100.0% 🟢
Uncovered changed lines (JSON)
{
  "sha": "4bb854b923ea26dcd619a4e2b510f0b740947700",
  "files": [
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSeedUpdateNotifier.cs", "ranges": [[39, 39], [49, 49]] },
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/SchemaComposition.cs", "ranges": [[524, 526], [528, 531], [584, 584], [845, 854], [856, 859], [868, 868]] },
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidationReport.cs", "ranges": [[80, 81]] },
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidator.cs", "ranges": [[610, 612], [648, 650], [652, 653], [655, 655], [657, 657], [659, 659], [661, 661], [663, 663], [665, 668], [670, 670], [672, 679], [681, 681], [685, 687], [689, 692]] },
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroCompositionSettingsClient.cs", "ranges": [[49, 51], [56, 58], [62, 65], [71, 73], [84, 86], [116, 117], [122, 122], [124, 125], [133, 134], [138, 140], [147, 149], [165, 166], [169, 170], [179, 179], [181, 183], [191, 192]] },
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSeedCoordinator.cs", "ranges": [[237, 249], [382, 385], [387, 387]] },
    { "path": "src/HotChocolate/Fusion/src/Fusion.Aspire/Nitro/NitroSchemaValidationNotifier.cs", "ranges": [[33, 33]] }
  ]
}

Project coverage: 54.0% (237585/439932 lines)

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.

2 participants