-
Notifications
You must be signed in to change notification settings - Fork 182
Expand file tree
/
Copy pathSqliteResourceBuilderExtensions.cs
More file actions
91 lines (75 loc) · 4.3 KB
/
Copy pathSqliteResourceBuilderExtensions.cs
File metadata and controls
91 lines (75 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using Aspire.Hosting.ApplicationModel;
namespace Aspire.Hosting;
/// <summary>
/// Provides extension methods for adding Sqlite resources to an application builder.
/// </summary>
public static class SqliteResourceBuilderExtensions
{
/// <summary>
/// Adds an Sqlite resource to the application builder.
/// </summary>
/// <param name="builder">The application builder.</param>
/// <param name="name">The name of the resource.</param>
/// <param name="databasePath">The optional path to the database file. If no path is provided the database is stored in a temporary location.</param>
/// <param name="databaseFileName">The filename of the database file. Must include extension. If no file name is provided, a randomly generated file name is used.</param>
/// <returns>A resource builder for the Sqlite resource.</returns>
public static IResourceBuilder<SqliteResource> AddSqlite(this IDistributedApplicationBuilder builder, [ResourceName] string name, string? databasePath = null, string? databaseFileName = null)
{
ArgumentNullException.ThrowIfNull(builder, nameof(builder));
ArgumentNullException.ThrowIfNull(name, nameof(name));
var resource = new SqliteResource(name, databasePath ?? Path.GetTempPath(), databaseFileName ?? $"{Path.GetFileName(Path.GetRandomFileName())}.db");
builder.Eventing.Subscribe<BeforeStartEvent>((_, ct) =>
{
if (!File.Exists(resource.DatabaseFilePath))
{
Directory.CreateDirectory(resource.DatabasePath);
File.Create(resource.DatabaseFilePath).Dispose();
if (!OperatingSystem.IsWindows())
{
// Change permissions for non-root accounts (container user account)
const UnixFileMode OwnershipPermissions =
UnixFileMode.UserRead | UnixFileMode.UserWrite |
UnixFileMode.GroupRead | UnixFileMode.GroupWrite |
UnixFileMode.OtherRead | UnixFileMode.OtherWrite;
File.SetUnixFileMode(resource.DatabaseFilePath, OwnershipPermissions);
}
}
return Task.CompletedTask;
});
var state = new CustomResourceSnapshot()
{
State = new(KnownResourceStates.Running, KnownResourceStateStyles.Success),
ResourceType = "Sqlite",
Properties = [
new("DatabasePath", resource.DatabasePath),
new("DatabaseFileName", resource.DatabaseFileName)
]
};
return builder.AddResource(resource)
.WithInitialState(state);
}
/// <summary>
/// Adds an Sqlite Web resource to the resource builder, to allow access to the Sqlite database via a web interface.
/// </summary>
/// <param name="builder">The resource builder.</param>
/// <param name="configureContainer">Callback to configure SqliteWeb container resource.</param>
/// <param name="containerName">The optional name of the container.</param>
/// <returns>A resource builder for the Sqlite resource.</returns>
public static IResourceBuilder<SqliteResource> WithSqliteWeb(this IResourceBuilder<SqliteResource> builder, Action<IResourceBuilder<SqliteWebResource>>? configureContainer = null, string? containerName = null)
{
ArgumentNullException.ThrowIfNull(builder, nameof(builder));
containerName ??= $"{builder.Resource.Name}-sqliteweb";
var resource = new SqliteWebResource(containerName);
var resourceBuilder = builder.ApplicationBuilder.AddResource(resource)
.WithImage(SqliteContainerImageTags.SqliteWebImage, SqliteContainerImageTags.SqliteWebTag)
.WithImageRegistry(SqliteContainerImageTags.SqliteWebRegistry)
.WithHttpEndpoint(targetPort: 8080, name: "http")
.WithArgs(builder.Resource.DatabaseFileName)
.WithBindMount(builder.Resource.DatabasePath, "/data")
.WaitFor(builder)
.WithHttpHealthCheck("/")
.WithParentRelationship(builder.Resource);
configureContainer?.Invoke(resourceBuilder);
return builder;
}
}