Skip to content
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