feat: add RustFs#1295
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.sh | bash -s -- 1295Or
iex "& { $(irm https://raw.githubusercontent.com/CommunityToolkit/Aspire/main/eng/scripts/dogfood-pr.ps1) } 1295" |
There was a problem hiding this comment.
Pull request overview
Adds a new Aspire hosting integration (CommunityToolkit.Aspire.Hosting.RustFs) to run RustFs (MinIO/S3-compatible object storage) as a container resource, along with an example AppHost and CI-enabled test coverage.
Changes:
- Introduces
AddRustFs()plus persistence helpers (WithDataVolume/WithDataBindMount) and connection-string support viaRustFsResource. - Adds bucket-creation helpers (
AddBucket) implemented via a companionminio/mccontainer. - Adds a new example AppHost, a new test project (unit + docker functional), and wires tests into the solution + CI workflow.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/CommunityToolkit.Aspire.Hosting.RustFs.Tests/RustFsPublicApiTests.cs | Public API guard/contract tests (null/empty checks, connection string). |
| tests/CommunityToolkit.Aspire.Hosting.RustFs.Tests/RustFsFunctionalTests.cs | Docker functional tests for health + persisted storage behavior. |
| tests/CommunityToolkit.Aspire.Hosting.RustFs.Tests/CommunityToolkit.Aspire.Hosting.RustFs.Tests.csproj | New test project setup and references for RustFs integration. |
| tests/CommunityToolkit.Aspire.Hosting.RustFs.Tests/AppHostTests.cs | End-to-end example AppHost smoke tests (health + console endpoint). |
| tests/CommunityToolkit.Aspire.Hosting.RustFs.Tests/AddRustFsTests.cs | Model-level tests for resource registration, endpoints, health checks, and connection string. |
| src/CommunityToolkit.Aspire.Hosting.RustFs/RustFsResource.cs | New container resource type implementing connection-string support. |
| src/CommunityToolkit.Aspire.Hosting.RustFs/RustFsContainerImageTags.cs | Centralizes RustFs and minio/mc image/tag constants. |
| src/CommunityToolkit.Aspire.Hosting.RustFs/RustFsBuilderExtensions.cs | Core AddRustFs + persistence + bucket-creation extension methods. |
| src/CommunityToolkit.Aspire.Hosting.RustFs/README.md | Package-level usage documentation. |
| src/CommunityToolkit.Aspire.Hosting.RustFs/CommunityToolkit.Aspire.Hosting.RustFs.csproj | New hosting integration project definition and NuGet metadata. |
| examples/rustfs/CommunityToolkit.Aspire.Hosting.RustFs.AppHost/appsettings.json | Example AppHost logging configuration. |
| examples/rustfs/CommunityToolkit.Aspire.Hosting.RustFs.AppHost/Properties/launchSettings.json | Example AppHost launch profiles. |
| examples/rustfs/CommunityToolkit.Aspire.Hosting.RustFs.AppHost/Program.cs | Example showing AddRustFs().WithDataVolume().AddBucket(...). |
| examples/rustfs/CommunityToolkit.Aspire.Hosting.RustFs.AppHost/CommunityToolkit.Aspire.Hosting.RustFs.AppHost.csproj | Example AppHost project wiring to the new integration project. |
| README.md | Adds RustFs to the integrations list + NuGet/doc links. |
| CommunityToolkit.Aspire.slnx | Adds the new RustFs projects (src/tests/example) into the solution. |
| .github/workflows/tests.yaml | Adds Hosting.RustFs.Tests to CI test matrix. |
| /// <summary> | ||
| /// Adds a bucket to the RustFs resource using the MinIO CLI (<c>minio/mc</c>). | ||
| /// </summary> | ||
| /// <param name="builder">The resource builder.</param> | ||
| /// <param name="bucketName">The name of the bucket to create.</param> | ||
| /// <returns>A reference to the <see cref="IResourceBuilder{ContainerResource}"/> for the bucket creation container.</returns> | ||
| public static IResourceBuilder<ContainerResource> AddBucket(this IResourceBuilder<RustFsResource> builder, string bucketName) | ||
| { | ||
| ArgumentNullException.ThrowIfNull(builder); |
| <Nullable>enable</Nullable> | ||
| </PropertyGroup> | ||
|
|
||
| <ItemGroup> | ||
| <PackageReference Include="Aspire.Hosting" /> |
| return builder.AddBucket( | ||
| name: $"{builder.Resource.Name}-create-buckets-{bucketNames[0]}", | ||
| bucketNames: bucketNames); |
| .WithEnvironment(AccessKeyEnvVarName, resource.AccessKey) | ||
| .WithEnvironment(SecretKeyEnvVarName, resource.SecretKey) |
| return builder.AddBucket( | ||
| name: $"{builder.Resource.Name}-create-bucket-{bucketName}", | ||
| bucketNames: [bucketName]); |
| <Project Sdk="Microsoft.NET.Sdk"> | ||
|
|
||
| <ItemGroup> | ||
| <Compile Include="..\..\src\CommunityToolkit.Aspire.Hosting.RustFs\RustFsContainerImageTags.cs" Link="RustFsContainerImageTags.cs" /> |
| using Aspire.Components.Common.Tests; | ||
| using Aspire.Hosting; | ||
| using Aspire.Hosting.Utils; | ||
| using Microsoft.Extensions.Hosting; |
| | - **Learn More**: [`Hosting.MySql.Extensions`][mysql-ext-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.MySql.Extensions][mysql-ext-shields]][mysql-ext-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.MySql.Extensions][mysql-ext-shields-preview]][mysql-ext-nuget-preview] | An integration that contains some additional extensions for hosting MySql container. | | ||
| | - **Learn More**: [`Hosting.MinIO`][minio-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields]][minio-hosting-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.Minio][minio-hosting-shields-preview]][minio-hosting-nuget-preview] | An Aspire hosting integration to setup a [MinIO S3](https://min.io/) storage. | | ||
| | - **Learn More**: [`MinIO.Client`][minio-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Minio.Client][minio-client-shields]][minio-client-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Client.Minio][minio-client-shields-preview]][minio-client-nuget-preview] | An Aspire client integration for the [MinIO](https://github.com/minio/minio-dotnet) package. | | ||
| | - **Learn More**: [`Hosting.RustFs`][rustfs-integration-docs] <br /> - Stable 📦: [![CommunityToolkit.Aspire.Hosting.RustFs][rustfs-hosting-shields]][rustfs-hosting-nuget] <br /> - Preview 📦: [![CommunityToolkit.Aspire.Hosting.RustFs][rustfs-hosting-shields-preview]][rustfs-hosting-nuget-preview] | An Aspire hosting integration to setup a [RustFs](https://github.com/rustfs/rustfs) S3-compatible storage. | |
| IReadOnlyList<string> bucketNames) | ||
| { | ||
| return builder.ApplicationBuilder | ||
| .AddContainer(name, RustFsContainerImageTags.McImage, RustFsContainerImageTags.McTag) |
There was a problem hiding this comment.
todo: I can see there is an HTTP endpoint to create a bucket. Wouldn't it be simpler/faster to execute a HTTP query over running a container? https://docs.rustfs.com/management/bucket/creation.html
| /// <param name="builder">The resource builder.</param> | ||
| /// <param name="bucketName">The name of the bucket to create.</param> | ||
| /// <returns>A reference to the <see cref="IResourceBuilder{ContainerResource}"/> for the bucket creation container.</returns> | ||
| public static IResourceBuilder<ContainerResource> AddBucket(this IResourceBuilder<RustFsResource> builder, string bucketName) |
There was a problem hiding this comment.
question: I am curious if adding a RustFsBucketResource would be a good idea. That would make the associated buckets visible in the Dashboard, and maybe with a direct link access in the console (not sure if that part is feasible). What do you think @aaronpowell ?
@dotnet-policy-service agree |
Closes #1271
Adds a new hosting integration for RustFs, a high-performance, MinIO-compatible S3-compatible object storage server.
What's included
CommunityToolkit.Aspire.Hosting.RustFs— new hosting integration packageAddRustFs()— adds a RustFs container with configurable access/secret keys and portsWithDataVolume()/WithDataBindMount()— persistent storage supportAddBucket()/AddBucket(IReadOnlyList<string>)— creates S3 buckets viaminio/mcon startupNotes
minio/mcis reused for bucket creation — consistent with the existing MinIO integration pattern.PR Checklist
Other information
RustFs implements the MinIO-compatible S3 API (rustfs/rustfs#2212), which allows reuse of
minio/mcfor bucketmanagement without adding a new dependency. The connection string format is intentionally kept identical to the MinIO integration to ease migration.