Skip to content

Update to Aspire 9.4 #770

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Jul 30, 2025
9 changes: 9 additions & 0 deletions CommunityToolkit.Aspire.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@
<Project Path="examples/meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost/CommunityToolkit.Aspire.Hosting.Meilisearch.AppHost.csproj" />
<Project Path="examples/meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults/CommunityToolkit.Aspire.Hosting.Meilisearch.ServiceDefaults.csproj" />
</Folder>
<Folder Name="/examples/minio/">
<Project Path="examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ApiService/CommunityToolkit.Aspire.Hosting.Minio.ApiService.csproj" />
<Project Path="examples/minio/CommunityToolkit.Aspire.Hosting.Minio.AppHost/CommunityToolkit.Aspire.Hosting.Minio.AppHost.csproj" />
<Project Path="examples/minio/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults/CommunityToolkit.Aspire.Hosting.Minio.ServiceDefaults.csproj" />
</Folder>
<Folder Name="/examples/mongodb-ext/">
<Project Path="examples/mongodb-ext/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.AppHost.csproj" />
</Folder>
Expand Down Expand Up @@ -161,6 +166,7 @@
<Project Path="src/CommunityToolkit.Aspire.Hosting.MailPit/CommunityToolkit.Aspire.Hosting.MailPit.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Hosting.Meilisearch/CommunityToolkit.Aspire.Hosting.Meilisearch.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Hosting.Minio/CommunityToolkit.Aspire.Hosting.Minio.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Hosting.MySql.Extensions/CommunityToolkit.Aspire.Hosting.MySql.Extensions.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Hosting.Ngrok/CommunityToolkit.Aspire.Hosting.Ngrok.csproj" />
Expand All @@ -181,6 +187,7 @@
<Project Path="src/CommunityToolkit.Aspire.Meilisearch/CommunityToolkit.Aspire.Meilisearch.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Microsoft.Data.Sqlite/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.csproj" />
<Project Path="src/CommunityToolkit.Aspire.Minio.Client/CommunityToolkit.Aspire.Minio.Client.csproj" />
<Project Path="src/CommunityToolkit.Aspire.OllamaSharp/CommunityToolkit.Aspire.OllamaSharp.csproj" />
<Project Path="src/CommunityToolkit.Aspire.RavenDB.Client/CommunityToolkit.Aspire.RavenDB.Client.csproj" />
<Project Path="src/CommunityToolkit.Aspire.SurrealDb/CommunityToolkit.Aspire.SurrealDb.csproj" />
Expand Down Expand Up @@ -208,6 +215,7 @@
<Project Path="tests/CommunityToolkit.Aspire.Hosting.MailPit.Tests/CommunityToolkit.Aspire.Hosting.MailPit.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests/CommunityToolkit.Aspire.Hosting.McpInspector.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests/CommunityToolkit.Aspire.Hosting.Meilisearch.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Hosting.Minio.Tests/CommunityToolkit.Aspire.Hosting.Minio.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests/CommunityToolkit.Aspire.Hosting.MongoDB.Extensions.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests/CommunityToolkit.Aspire.Hosting.MySql.Extensions.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests/CommunityToolkit.Aspire.Hosting.Ngrok.Tests.csproj" />
Expand All @@ -228,6 +236,7 @@
<Project Path="tests/CommunityToolkit.Aspire.Meilisearch.Tests/CommunityToolkit.Aspire.Meilisearch.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.Data.Sqlite.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests/CommunityToolkit.Aspire.Microsoft.EntityFrameworkCore.Sqlite.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.Minio.Client.Tests/CommunityToolkit.Aspire.Minio.Client.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.OllamaSharp.Tests/CommunityToolkit.Aspire.OllamaSharp.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.RavenDB.Client.Tests/CommunityToolkit.Aspire.RavenDB.Client.Tests.csproj" />
<Project Path="tests/CommunityToolkit.Aspire.SurrealDb.Tests/CommunityToolkit.Aspire.SurrealDb.Tests.csproj" />
Expand Down
6 changes: 3 additions & 3 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<Nullable>enable</Nullable>

<AspireMajorVersion>9</AspireMajorVersion>
<AspireVersion>$(AspireMajorVersion).3.1</AspireVersion>
<AspireVersion>$(AspireMajorVersion).4.0</AspireVersion>
<AspireAppHostSdkVersion>$(AspireVersion)</AspireAppHostSdkVersion>
<AspNetCoreVersion>9.0.0</AspNetCoreVersion>
<DotNetExtensionsVersion>9.0.4</DotNetExtensionsVersion>
Expand All @@ -37,8 +37,8 @@

<!-- Versioning -->
<PropertyGroup>
<ToolkitMinorVersion>6</ToolkitMinorVersion>
<ToolkitPatchVersion>1</ToolkitPatchVersion>
<ToolkitMinorVersion>7</ToolkitMinorVersion>
<ToolkitPatchVersion>0</ToolkitPatchVersion>
<ToolkitPreviewVersion>preview.1</ToolkitPreviewVersion>

<VersionPrefix>$(AspireMajorVersion).$(ToolkitMinorVersion).$(ToolkitPatchVersion)</VersionPrefix>
Expand Down
10 changes: 5 additions & 5 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<PackageVersion Include="Aspire.Hosting.Redis" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.MongoDB" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.MySql" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.SqlServer" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.SqlServer" Version="$(AspireVersion)" />
</ItemGroup>
<ItemGroup Label="Core Packages">
<!-- AspNetCore packages -->
Expand All @@ -42,7 +42,7 @@
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="$(DotNetExtensionsVersion)" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(DotNetExtensionsVersion)" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(DotNetExtensionsVersion)" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.4" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.7" />
<!-- .NET packages -->
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="9.4.0" />
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="9.1.0" />
Expand All @@ -62,7 +62,7 @@
</ItemGroup>
<ItemGroup Label="Integration Packages">
<!-- External packages -->
<PackageVersion Include="Azure.Provisioning.AppContainers" Version="1.0.0" />
<PackageVersion Include="Azure.Provisioning.AppContainers" Version="1.1.0" />
<PackageVersion Include="JsonSchema.Net" Version="7.3.4" />
<PackageVersion Include="OllamaSharp" Version="5.1.12" />
<PackageVersion Include="OpenFeature.Contrib.GOFeatureFlag" Version="0.2.1" />
Expand Down Expand Up @@ -109,7 +109,7 @@
<PackageVersion Include="Testcontainers.MsSql" Version="$(TestContainersVersion)" />
</ItemGroup>
<ItemGroup Label=".NET 9 Overrides" Condition="'$(TargetFramework)' == 'net9.0'">
<PackageVersion Update="Microsoft.Extensions.Logging.Abstractions" Version="9.0.4" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.4" />
<PackageVersion Update="Microsoft.Extensions.Logging.Abstractions" Version="9.0.7" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.7" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -154,10 +154,10 @@ private static IResourceBuilder<T> WithJolokiaHealthCheck<T>(
const int statusCode = 200;
const string endpointName = "web";
const string scheme = "http";
EndpointReference endpoint = builder.Resource.GetEndpoint(endpointName);

builder.ApplicationBuilder.Eventing.Subscribe<AfterEndpointsAllocatedEvent>((_, _) =>
builder.OnResourceEndpointsAllocated((resource, @event, ct) =>
{
var endpoint = resource.GetEndpoint(endpointName);
if (!endpoint.Exists)
{
throw new DistributedApplicationException($"The endpoint '{endpointName}' does not exist on the resource '{builder.Resource.Name}'.");
Expand All @@ -173,11 +173,12 @@ private static IResourceBuilder<T> WithJolokiaHealthCheck<T>(

Uri? uri = null;
string basicAuthentication = string.Empty;
builder.ApplicationBuilder.Eventing.Subscribe<BeforeResourceStartedEvent>(builder.Resource, async (_, ct) =>
builder.OnBeforeResourceStarted(async (resource, _, ct) =>
{
Uri baseUri = new Uri(endpoint.Url, UriKind.Absolute);
string userName = (await builder.Resource.UserNameReference.GetValueAsync(ct))!;
string password = (await ((IValueProvider)builder.Resource.PasswordParameter).GetValueAsync(ct))!;
var endpoint = resource.GetEndpoint(endpointName);
Uri baseUri = new (endpoint.Url, UriKind.Absolute);
string userName = (await resource.UserNameReference.GetValueAsync(ct))!;
string password = (await resource.PasswordParameter.GetValueAsync(ct))!;
basicAuthentication = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}"));
uri = new UriBuilder(baseUri)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,43 +135,39 @@ private static void ConfigureDbGateContainer(EnvironmentCallbackContext context,
}
}

internal static void ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder)
internal static async Task ConfigureAdminerContainer(EnvironmentCallbackContext context, IDistributedApplicationBuilder applicationBuilder)
{
var mysqlInstances = applicationBuilder.Resources.OfType<MySqlServerResource>();

string ADMINER_SERVERS = context.EnvironmentVariables.GetValueOrDefault("ADMINER_SERVERS")?.ToString() ?? string.Empty;

var new_servers = mysqlInstances.ToDictionary(
mysqlServer => mysqlServer.Name,
mysqlServer =>
async mysqlServer =>
{
return new AdminerLoginServer
{
Server = mysqlServer.Name,
UserName = "root",
Password = mysqlServer.PasswordParameter.Value,
Password = await mysqlServer.PasswordParameter.GetValueAsync(context.CancellationToken),
Driver = "server" // driver for MySQL is called 'server'
};
});

if (string.IsNullOrEmpty(ADMINER_SERVERS))
{
string servers_json = JsonSerializer.Serialize(new_servers);
context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json;
ADMINER_SERVERS = "{}"; // Initialize with an empty JSON object if not set
}
else

var servers = JsonSerializer.Deserialize<Dictionary<string, AdminerLoginServer>>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen.");
foreach (var server in new_servers)
{
var servers = JsonSerializer.Deserialize<Dictionary<string, AdminerLoginServer>>(ADMINER_SERVERS) ?? throw new InvalidOperationException("The servers should not be null. This should never happen.");
foreach (var server in new_servers)
if (!servers.ContainsKey(server.Key))
{
if (!servers.ContainsKey(server.Key))
{
servers!.Add(server.Key, server.Value);
}
servers!.Add(server.Key, await server.Value);
}
string servers_json = JsonSerializer.Serialize(servers);
context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json;
}

string servers_json = JsonSerializer.Serialize(servers);
context.EnvironmentVariables["ADMINER_SERVERS"] = servers_json;
}
}
27 changes: 13 additions & 14 deletions src/CommunityToolkit.Aspire.Hosting.Ngrok/NgrokExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public static IResourceBuilder<NgrokResource> AddNgrok(
ArgumentNullException.ThrowIfNull(builder);
if (configurationFolder is not null)
ArgumentException.ThrowIfNullOrWhiteSpace(configurationFolder);

if (endpointPort is not null)
{
ArgumentOutOfRangeException.ThrowIfLessThan(endpointPort.Value, 1, nameof(endpointPort));
Expand All @@ -49,28 +49,27 @@ public static IResourceBuilder<NgrokResource> AddNgrok(
configurationFolder ??= Path.Combine(builder.AppHostDirectory, ".ngrok");
if (!Directory.Exists(configurationFolder))
Directory.CreateDirectory(configurationFolder);

var resource = new NgrokResource(name);
var resourceBuilder = builder.AddResource(resource)

var resourceBuilder = builder.AddResource(new NgrokResource(name))
.WithImage(NgrokContainerValues.Image, NgrokContainerValues.Tag)
.WithImageRegistry(NgrokContainerValues.Registry)
.WithBindMount(configurationFolder, "/var/tmp/ngrok")
.WithHttpEndpoint(targetPort: 4040, port: endpointPort, name: endpointName);
builder.Eventing.Subscribe<AfterEndpointsAllocatedEvent>(async (e, ct) =>
resourceBuilder.OnResourceEndpointsAllocated(async (resource, e, ct) =>
{
var endpointTuples = resource.Annotations
.OfType<NgrokEndpointAnnotation>()
.SelectMany(annotation => annotation.Endpoints.Select(ngrokEndpoint => (endpointRefernce: annotation.Resource.GetEndpoint(ngrokEndpoint.EndpointName), ngrokEndpoint)))
.ToList();
await CreateNgrokConfigurationFileAsync(configurationFolder, name, endpointTuples, configurationVersion ?? 3);

resourceBuilder.WithArgs(
"start", endpointTuples.Count > 0 ? "--all" : "--none",
"start", endpointTuples.Count > 0 ? "--all" : "--none",
"--config", $"/var/tmp/ngrok/{name}.yml");
});
return resourceBuilder;
}

/// <summary>
/// Adds a ngrok auth token to a ngrok resource.
/// </summary>
Expand All @@ -86,7 +85,7 @@ public static IResourceBuilder<NgrokResource> WithAuthToken(

return builder.WithEnvironment(NgrokContainerValues.AuthTokenEnvName, ngrokAuthToken);
}

/// <summary>
/// Adds a ngrok auth token to a ngrok resource.
/// </summary>
Expand All @@ -102,13 +101,13 @@ public static IResourceBuilder<NgrokResource> WithAuthToken(

return builder.WithEnvironment(NgrokContainerValues.AuthTokenEnvName, ngrokAuthToken);
}

/// <summary>
/// Configures a resource with endpoints as a ngrok tunnel endpoint.
/// </summary>
/// <typeparam name="TResource">The resource type.</typeparam>
public static IResourceBuilder<NgrokResource> WithTunnelEndpoint<TResource>(
this IResourceBuilder<NgrokResource> builder,
this IResourceBuilder<NgrokResource> builder,
IResourceBuilder<TResource> resource,
string endpointName,
string? ngrokUrl = null,
Expand Down Expand Up @@ -136,7 +135,7 @@ public static IResourceBuilder<NgrokResource> WithTunnelEndpoint<TResource>(

return builder;
}

private static async Task CreateNgrokConfigurationFileAsync(
string configurationFolder,
string name,
Expand Down Expand Up @@ -165,7 +164,7 @@ private static async Task CreateNgrokConfigurationFileAsync(
break;
case 3:
ngrokConfig.AppendLine("agent:");
ngrokConfig.AppendLine( " log: stdout");
ngrokConfig.AppendLine(" log: stdout");
if (endpointTuples.Count > 0)
{
ngrokConfig.AppendLine();
Expand All @@ -190,7 +189,7 @@ private static async Task CreateNgrokConfigurationFileAsync(
private static string GetUpstreamUrl(EndpointReference endpoint)
{
var isLocal = endpoint.Host.Equals("localhost", StringComparison.InvariantCultureIgnoreCase);
var host = (IsWindows || IsOsx) && isLocal? "host.docker.internal" : endpoint.Host;
var host = (IsWindows || IsOsx) && isLocal ? "host.docker.internal" : endpoint.Host;
return $"{endpoint.Scheme}://{host}:{endpoint.Port}";
}
}
Loading
Loading