Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public static IResourceBuilder<SurrealDbServerResource> AddSurrealServer(
: SurrealDbContainerImageTags.Tag;

var surrealServer = new SurrealDbServerResource(name, userName?.Resource, passwordParameter);

return builder.AddResource(surrealServer)
.WithEndpoint(port: port, targetPort: SurrealDbPort, name: SurrealDbServerResource.PrimaryEndpointName)
.WithImage(SurrealDbContainerImageTags.Image, imageTag)
Expand All @@ -106,33 +106,44 @@ public static IResourceBuilder<SurrealDbServerResource> AddSurrealServer(
throw new DistributedApplicationException($"ResourceReadyEvent was published for the '{surrealServer.Name}' resource but the connection string was null.");
}

var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
await using var surrealClient = new SurrealDbClient(options);
await EnsuresNsDbCreated(builder, connectionString, surrealServer, @event.Services, ct);
});
}

private static async Task EnsuresNsDbCreated(
IDistributedApplicationBuilder builder,
string connectionString,
SurrealDbServerResource surrealServer,
IServiceProvider services,
CancellationToken ct
)
{
var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
await using var surrealClient = new SurrealDbClient(options);

foreach (var nsResourceName in surrealServer.Namespaces.Keys)
{
if (builder.Resources.FirstOrDefault(n =>
string.Equals(n.Name, nsResourceName, StringComparison.OrdinalIgnoreCase)) is
SurrealDbNamespaceResource surrealDbNamespace)
{
await CreateNamespaceAsync(surrealClient, surrealDbNamespace, @event.Services, ct)
.ConfigureAwait(false);
foreach (var nsResourceName in surrealServer.Namespaces.Keys)
{
if (builder.Resources.FirstOrDefault(n =>
string.Equals(n.Name, nsResourceName, StringComparison.OrdinalIgnoreCase)) is
SurrealDbNamespaceResource surrealDbNamespace)
{
await CreateNamespaceAsync(surrealClient, surrealDbNamespace, services, ct)
.ConfigureAwait(false);

await surrealClient.Use(surrealDbNamespace.NamespaceName, null!, ct).ConfigureAwait(false);
await surrealClient.Use(surrealDbNamespace.NamespaceName, null!, ct).ConfigureAwait(false);

foreach (var dbResourceName in surrealDbNamespace.Databases.Keys)
{
if (builder.Resources.FirstOrDefault(n =>
string.Equals(n.Name, dbResourceName, StringComparison.OrdinalIgnoreCase)) is
SurrealDbDatabaseResource surrealDbDatabase)
{
await CreateDatabaseAsync(surrealClient, surrealDbDatabase, @event.Services, ct)
.ConfigureAwait(false);
}
}
}
}
});
foreach (var dbResourceName in surrealDbNamespace.Databases.Keys)
{
if (builder.Resources.FirstOrDefault(n =>
string.Equals(n.Name, dbResourceName, StringComparison.OrdinalIgnoreCase)) is
SurrealDbDatabaseResource surrealDbDatabase)
{
await CreateDatabaseAsync(surrealClient, surrealDbDatabase, services, ct)
.ConfigureAwait(false);
}
}
}
}
}

/// <summary>
Expand Down Expand Up @@ -234,24 +245,10 @@ public static IResourceBuilder<SurrealDbDatabaseResource> AddDatabase(

SurrealDbClient? surrealDbClient = null;

builder.ApplicationBuilder.Eventing.Subscribe<ConnectionStringAvailableEvent>(surrealServerDatabase, async (@event, ct) =>
{
var connectionString = await surrealServerDatabase.ConnectionStringExpression.GetValueAsync(ct).ConfigureAwait(false);
if (connectionString is null)
{
throw new DistributedApplicationException($"ConnectionStringAvailableEvent was published for the '{surrealServerDatabase}' resource but the connection string was null.");
}

var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
surrealDbClient = new SurrealDbClient(options);
});

string namespaceName = builder.Resource.Name;
string serverName = builder.Resource.Parent.Name;

string healthCheckKey = $"{serverName}_{namespaceName}_{name}_check";
// TODO : Bug to be fixed
//builder.ApplicationBuilder.Services.AddHealthChecks().AddSurreal(_ => surrealDbClient!, healthCheckKey);
builder.ApplicationBuilder.Services.AddHealthChecks().Add(new HealthCheckRegistration(
name: healthCheckKey,
_ => new SurrealDbHealthCheck(surrealDbClient!),
Expand All @@ -261,7 +258,17 @@ public static IResourceBuilder<SurrealDbDatabaseResource> AddDatabase(
);

return builder.ApplicationBuilder.AddResource(surrealServerDatabase)
.WithHealthCheck(healthCheckKey);
.WithHealthCheck(healthCheckKey)
.OnConnectionStringAvailable(async (_, _, ct) => {
var connectionString = await surrealServerDatabase.ConnectionStringExpression.GetValueAsync(ct).ConfigureAwait(false);
if (connectionString is null)
{
throw new DistributedApplicationException($"ConnectionStringAvailableEvent was published for the '{surrealServerDatabase}' resource but the connection string was null.");
}

var options = new SurrealDbOptionsBuilder().FromConnectionString(connectionString).Build();
surrealDbClient = new SurrealDbClient(options);
});
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ UserNameParameter is not null ?

private ReferenceExpression ConnectionString =>
ReferenceExpression.Create(
$"Server={SchemeUri}://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}/rpc;User={UserNameReference};Password={PasswordParameter}");
$"Server={SchemeUri}://{PrimaryEndpoint.Property(EndpointProperty.Host)}:{PrimaryEndpoint.Property(EndpointProperty.Port)}/rpc;User={UserNameReference};Password='{PasswordParameter}'");

/// <summary>
/// Gets the connection string expression for the SurrealDB instance.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context
try
{
bool isHealthy = await _surrealdbClient.Health(cancellationToken).ConfigureAwait(false);

var response = await _surrealdbClient.RawQuery("RETURN 1", cancellationToken: cancellationToken).ConfigureAwait(false);
response.EnsureAllOks();

return isHealthy
? HealthCheckResult.Healthy()
: new HealthCheckResult(context.Registration.FailureStatus);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,8 @@ public async Task SurrealServerCreatesConnectionString()
var connectionStringResource = Assert.Single(appModel.Resources.OfType<SurrealDbServerResource>());
var connectionString = await connectionStringResource.GetConnectionStringAsync(default);

Assert.Equal("Server=ws://localhost:8000/rpc;User=root;Password=p@ssw0rd1", connectionString);
Assert.Equal("Server=ws://{surreal.bindings.tcp.host}:{surreal.bindings.tcp.port}/rpc;User=root;Password={pass.value}", connectionStringResource.ConnectionStringExpression.ValueExpression);
Assert.Equal("Server=ws://localhost:8000/rpc;User=root;Password='p@ssw0rd1'", connectionString);
Assert.Equal("Server=ws://{surreal.bindings.tcp.host}:{surreal.bindings.tcp.port}/rpc;User=root;Password='{pass.value}'", connectionStringResource.ConnectionStringExpression.ValueExpression);
}

[Fact]
Expand All @@ -116,7 +116,7 @@ public async Task SurrealServerDatabaseCreatesConnectionString()
var connectionStringResource = (IResourceWithConnectionString)surrealResource;
var connectionString = await connectionStringResource.GetConnectionStringAsync();

Assert.Equal("Server=ws://localhost:8000/rpc;User=root;Password=p@ssw0rd1;Namespace=myns;Database=mydb", connectionString);
Assert.Equal("Server=ws://localhost:8000/rpc;User=root;Password='p@ssw0rd1';Namespace=myns;Database=mydb", connectionString);
Assert.Equal("{ns.connectionString};Database=mydb", connectionStringResource.ConnectionStringExpression.ValueExpression);
}

Expand Down
Loading