Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
<PackageVersion Include="Aspire.Hosting.MongoDB" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.MySql" Version="$(AspireVersion)" />
<PackageVersion Include="Aspire.Hosting.SqlServer" Version="$(AspireVersion)" />
<PackageVersion Include="KurrentDB.Client" Version="1.0.0" />
</ItemGroup>
<ItemGroup Label="Core Packages">
<!-- AspNetCore packages -->
Expand Down Expand Up @@ -92,6 +91,7 @@
<PackageVersion Include="Microsoft.PowerShell.SDK" Version="7.4.10" />
<PackageVersion Include="ModelContextProtocol" Version="0.3.0-preview.1" />
<PackageVersion Include="ModelContextProtocol.AspNetCore" Version="0.3.0-preview.1" />
<PackageVersion Include="KurrentDB.Client" Version="1.1.0" />
</ItemGroup>
<ItemGroup Label="Testing">
<!-- Testing packages -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.EventStore.gRPC" />
<PackageReference Include="Aspire.Hosting" />
<PackageReference Include="KurrentDB.Client" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using Aspire.Hosting.ApplicationModel;
using Aspire.Hosting.Utils;
using CommunityToolkit.Aspire.Hosting.KurrentDB;
using HealthChecks.EventStore.gRPC;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;

Expand Down Expand Up @@ -60,7 +59,7 @@ public static IResourceBuilder<KurrentDBResource> AddKurrentDB(this IDistributed
builder.Services.AddHealthChecks()
.Add(new HealthCheckRegistration(
healthCheckKey,
sp => new EventStoreHealthCheck(connectionString!),
sp => new KurrentDBHealthCheck(connectionString!),
failureStatus: default,
tags: default,
timeout: default));
Expand Down Expand Up @@ -135,10 +134,10 @@ public static IResourceBuilder<KurrentDBResource> WithDataBindMount(this IResour

private static void ConfigureKurrentDBContainer(EnvironmentCallbackContext context)
{
context.EnvironmentVariables.Add("EVENTSTORE_CLUSTER_SIZE", "1");
context.EnvironmentVariables.Add("EVENTSTORE_RUN_PROJECTIONS", "All");
context.EnvironmentVariables.Add("EVENTSTORE_START_STANDARD_PROJECTIONS", "true");
context.EnvironmentVariables.Add("EVENTSTORE_NODE_PORT", $"{KurrentDBResource.DefaultHttpPort}");
context.EnvironmentVariables.Add("EVENTSTORE_INSECURE", "true");
context.EnvironmentVariables.Add("KURRENTDB_CLUSTER_SIZE", "1");
context.EnvironmentVariables.Add("KURRENTDB_RUN_PROJECTIONS", "All");
context.EnvironmentVariables.Add("KURRENTDB_START_STANDARD_PROJECTIONS", "true");
context.EnvironmentVariables.Add("KURRENTDB_NODE_PORT", $"{KurrentDBResource.DefaultHttpPort}");
context.EnvironmentVariables.Add("KURRENTDB_INSECURE", "true");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using KurrentDB.Client;
using Microsoft.Extensions.Diagnostics.HealthChecks;

namespace CommunityToolkit.Aspire.Hosting.KurrentDB;

/// <summary>
/// Checks whether a connection can be made to KurrentDB services using the supplied connection string.
/// </summary>
public class KurrentDBHealthCheck : IHealthCheck, IDisposable
{
private readonly KurrentDBClient _client;

/// <inheritdoc/>
public KurrentDBHealthCheck(string connectionString)
{
ArgumentNullException.ThrowIfNull(connectionString);

_client = new KurrentDBClient(KurrentDBClientSettings.Create(connectionString));
}

/// <inheritdoc/>
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
var readAllStreamResult = _client.ReadAllAsync(
direction: Direction.Backwards,
position: Position.End,
maxCount: 1,
cancellationToken: cancellationToken);

var events = await readAllStreamResult.ToListAsync(cancellationToken);

if (events.Count > 0)
{
return HealthCheckResult.Healthy();
}

return new HealthCheckResult(context.Registration.FailureStatus, "Failed to connect to KurrentDB.");
}
catch (Exception exception)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: exception);
}
}

/// <inheritdoc/>
public virtual void Dispose() => _client.Dispose();
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ public class KurrentDBResource(string name) : ContainerResource(name), IResource
/// </summary>
public ReferenceExpression ConnectionStringExpression =>
ReferenceExpression.Create(
$"esdb://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}?tls=false");
$"kurrentdb://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}?tls=false");
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

using Aspire;
using CommunityToolkit.Aspire.KurrentDB;
using HealthChecks.EventStore.gRPC;
using KurrentDB.Client;
using KurrentDB.Client.Extensions.OpenTelemetry;
using Microsoft.Extensions.Configuration;
Expand Down Expand Up @@ -91,7 +90,7 @@ private static void AddKurrentDBClient(

builder.TryAddHealthCheck(new HealthCheckRegistration(
healthCheckName,
sp => new EventStoreHealthCheck(settings.ConnectionString!),
sp => new KurrentDBHealthCheck(settings.ConnectionString!),
failureStatus: default,
tags: default,
timeout: settings.HealthCheckTimeout));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.EventStore.gRPC" />
<PackageReference Include="KurrentDB.Client" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
Expand Down
49 changes: 49 additions & 0 deletions src/CommunityToolkit.Aspire.KurrentDB/KurrentDBHealthCheck.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using KurrentDB.Client;
using Microsoft.Extensions.Diagnostics.HealthChecks;

namespace CommunityToolkit.Aspire.KurrentDB;

/// <summary>
/// Checks whether a connection can be made to KurrentDB services using the supplied connection string.
/// </summary>
public class KurrentDBHealthCheck : IHealthCheck, IDisposable
{
private readonly KurrentDBClient _client;

/// <inheritdoc/>
public KurrentDBHealthCheck(string connectionString)
{
ArgumentNullException.ThrowIfNull(connectionString);

_client = new KurrentDBClient(KurrentDBClientSettings.Create(connectionString));
}

/// <inheritdoc/>
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
var readAllStreamResult = _client.ReadAllAsync(
direction: Direction.Backwards,
position: Position.End,
maxCount: 1,
cancellationToken: cancellationToken);

var events = await readAllStreamResult.ToListAsync(cancellationToken);

if (events.Count > 0)
{
return HealthCheckResult.Healthy();
}

return new HealthCheckResult(context.Registration.FailureStatus, "Failed to connect to KurrentDB.");
}
catch (Exception exception)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: exception);
}
}

/// <inheritdoc/>
public virtual void Dispose() => _client.Dispose();
}
4 changes: 2 additions & 2 deletions src/CommunityToolkit.Aspire.KurrentDB/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ And then the connection string will be retrieved from the `ConnectionStrings` co
```json
{
"ConnectionStrings": {
"kurrentdb": "esdb://localhost:22113?tls=false"
"kurrentdb": "kurrentdb://localhost:22113?tls=false"
}
}
```
Expand All @@ -55,7 +55,7 @@ The .NET Aspire KurrentDB Client integration supports [Microsoft.Extensions.Conf
"Aspire": {
"KurrentDB": {
"Client": {
"ConnectionString": "esdb://localhost:22113?tls=false",
"ConnectionString": "kurrentdb://localhost:22113?tls=false",
"DisableHealthChecks": true
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,27 @@ public async Task AddKurrentDBContainerWithDefaultsAddsAnnotationMetadata()
Assert.Collection(config,
env =>
{
Assert.Equal("EVENTSTORE_CLUSTER_SIZE", env.Key);
Assert.Equal("KURRENTDB_CLUSTER_SIZE", env.Key);
Assert.Equal("1", env.Value);
},
env =>
{
Assert.Equal("EVENTSTORE_RUN_PROJECTIONS", env.Key);
Assert.Equal("KURRENTDB_RUN_PROJECTIONS", env.Key);
Assert.Equal("All", env.Value);
},
env =>
{
Assert.Equal("EVENTSTORE_START_STANDARD_PROJECTIONS", env.Key);
Assert.Equal("KURRENTDB_START_STANDARD_PROJECTIONS", env.Key);
Assert.Equal("true", env.Value);
},
env =>
{
Assert.Equal("EVENTSTORE_NODE_PORT", env.Key);
Assert.Equal("KURRENTDB_NODE_PORT", env.Key);
Assert.Equal($"{KurrentDBResource.DefaultHttpPort}", env.Value);
},
ext =>
{
Assert.Equal("EVENTSTORE_INSECURE", ext.Key);
Assert.Equal("KURRENTDB_INSECURE", ext.Key);
Assert.Equal("true", ext.Value);
});
}
Expand All @@ -84,7 +84,7 @@ public async Task KurrentDBCreatesConnectionString()
var connectionStringResource = Assert.Single(appModel.Resources.OfType<KurrentDBResource>()) as IResourceWithConnectionString;
var connectionString = await connectionStringResource.GetConnectionStringAsync();

Assert.Equal("esdb://localhost:22113?tls=false", connectionString);
Assert.Equal("esdb://{kurrentdb.bindings.http.host}:{kurrentdb.bindings.http.port}?tls=false", connectionStringResource.ConnectionStringExpression.ValueExpression);
Assert.Equal("kurrentdb://localhost:22113?tls=false", connectionString);
Assert.Equal("kurrentdb://{kurrentdb.bindings.http.host}:{kurrentdb.bindings.http.port}?tls=false", connectionStringResource.ConnectionStringExpression.ValueExpression);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public class AspireKurrentDBClientExtensionsTest(KurrentDBContainerFixture conta
private const string DefaultConnectionName = "kurrentdb";

private string DefaultConnectionString =>
RequiresDockerAttribute.IsSupported ? containerFixture.GetConnectionString() : "esdb://localhost:2113?tls=false";
RequiresDockerAttribute.IsSupported ? containerFixture.GetConnectionString() : "kurrentdb://localhost:2113?tls=false";

[Theory]
[InlineData(true)]
Expand Down Expand Up @@ -57,9 +57,9 @@ public void CanAddMultipleKeyedServices()
{
var builder = Host.CreateEmptyApplicationBuilder(null);
builder.Configuration.AddInMemoryCollection([
new KeyValuePair<string, string?>("ConnectionStrings:kurrentdb1", "esdb://localhost:22113?tls=false"),
new KeyValuePair<string, string?>("ConnectionStrings:kurrentdb2", "esdb://localhost:22114?tls=false"),
new KeyValuePair<string, string?>("ConnectionStrings:kurrentdb3", "esdb://localhost:22115?tls=false"),
new KeyValuePair<string, string?>("ConnectionStrings:kurrentdb1", "kurrentdb://localhost:22113?tls=false"),
new KeyValuePair<string, string?>("ConnectionStrings:kurrentdb2", "kurrentdb://localhost:22114?tls=false"),
new KeyValuePair<string, string?>("ConnectionStrings:kurrentdb3", "kurrentdb://localhost:22115?tls=false"),
]);

builder.AddKurrentDBClient("kurrentdb1");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ protected override void PopulateConfiguration(ConfigurationManager configuration
{
var connectionString = RequiresDockerAttribute.IsSupported
? $"{_containerFixture.GetConnectionString()}"
: "esdb://localhost:22113?tls=false";
: "kurrentdb://localhost:22113?tls=false";

configuration.AddInMemoryCollection(
[
Expand All @@ -53,7 +53,7 @@ protected override void RegisterComponent(HostApplicationBuilder builder, Action
"Aspire": {
"KurrentDB": {
"Client": {
"ConnectionString": "esdb://localhost:22113?tls=false",
"ConnectionString": "kurrentdb://localhost:22113?tls=false",
"DisableHealthChecks": "false"
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public string GetConnectionString()
{
throw new InvalidOperationException("The test container was not initialized.");
}
var endpoint = new UriBuilder("esdb", Container.Hostname, Container.GetMappedPublicPort(2113)).ToString();
var endpoint = new UriBuilder("kurrentdb", Container.Hostname, Container.GetMappedPublicPort(2113)).ToString();
return $"{endpoint}?tls=false";
}

Expand All @@ -30,9 +30,9 @@ public async Task InitializeAsync()
.WithImage($"{KurrentDBContainerImageTags.Registry}/{KurrentDBContainerImageTags.Image}:{KurrentDBContainerImageTags.Tag}")
.WithPortBinding(2113, true)
.WithWaitStrategy(Wait.ForUnixContainer().UntilHttpRequestIsSucceeded(r => r.ForPort(2113)))
.WithEnvironment("EVENTSTORE_CLUSTER_SIZE", "1")
.WithEnvironment("EVENTSTORE_NODE_PORT", "2113")
.WithEnvironment("EVENTSTORE_INSECURE", "true")
.WithEnvironment("KURRENTDB_CLUSTER_SIZE", "1")
.WithEnvironment("KURRENTDB_NODE_PORT", "2113")
.WithEnvironment("KURRENTDB_INSECURE", "true")
.Build();

await Container.StartAsync();
Expand Down
Loading