Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
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
Prev Previous commit
Next Next commit
Add nameless storage resources
  • Loading branch information
sebastienros committed Jul 3, 2025
commit e02db027ec86189457cddbb9441dabac314e75f7
21 changes: 11 additions & 10 deletions src/Aspire.Hosting.Azure.Storage/AzureStorageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -340,10 +340,11 @@ public static IResourceBuilder<AzureBlobStorageResource> AddBlobs(this IResource
/// <param name="builder">The <see cref="IResourceBuilder{T}"/> for <see cref="AzureStorageResource"/>.</param>
/// <param name="name">The name of the resource.</param>
/// <returns>An <see cref="IResourceBuilder{T}"/> for the <see cref="AzureBlobStorageResource"/>.</returns>
public static IResourceBuilder<AzureBlobStorageResource> AddBlobService(this IResourceBuilder<AzureStorageResource> builder, [ResourceName] string name)
public static IResourceBuilder<AzureBlobStorageResource> AddBlobService(this IResourceBuilder<AzureStorageResource> builder, [ResourceName] string? name = null)
{
ArgumentNullException.ThrowIfNull(builder);
ArgumentException.ThrowIfNullOrEmpty(name);

name ??= builder.Resource.Name + "-blobs";

var resource = new AzureBlobStorageResource(name, builder.Resource);
builder.Resource.BlobStorageResource = resource;
Expand Down Expand Up @@ -386,8 +387,7 @@ public static IResourceBuilder<AzureBlobStorageContainerResource> AddBlobContain
// Create a Blob Service resource implicitly
if (builder.Resource.BlobStorageResource is null)
{
var blobServiceName = $"{builder.Resource.Name}-blobs";
AddBlobService(builder, blobServiceName);
AddBlobService(builder);
}

AzureBlobStorageContainerResource resource = new(name, blobContainerName, builder.Resource.BlobStorageResource!);
Expand Down Expand Up @@ -469,10 +469,11 @@ public static IResourceBuilder<AzureTableStorageResource> AddTables(this IResour
/// <param name="builder">The <see cref="IResourceBuilder{T}"/> for <see cref="AzureStorageResource"/>.</param>
/// <param name="name">The name of the resource.</param>
/// <returns>An <see cref="IResourceBuilder{T}"/> for the <see cref="AzureTableStorageResource"/>.</returns>
public static IResourceBuilder<AzureTableStorageResource> AddTableService(this IResourceBuilder<AzureStorageResource> builder, [ResourceName] string name)
public static IResourceBuilder<AzureTableStorageResource> AddTableService(this IResourceBuilder<AzureStorageResource> builder, [ResourceName] string? name = null)
{
ArgumentNullException.ThrowIfNull(builder);
ArgumentException.ThrowIfNullOrEmpty(name);

name ??= builder.Resource.Name + "-tables";

var resource = new AzureTableStorageResource(name, builder.Resource);
builder.Resource.TableStorageResource = resource;
Expand Down Expand Up @@ -501,10 +502,11 @@ public static IResourceBuilder<AzureQueueStorageResource> AddQueues(this IResour
/// <param name="builder">The <see cref="IResourceBuilder{T}"/> for <see cref="AzureStorageResource"/>.</param>
/// <param name="name">The name of the resource.</param>
/// <returns>An <see cref="IResourceBuilder{T}"/> for the <see cref="AzureQueueStorageResource"/>.</returns>
public static IResourceBuilder<AzureQueueStorageResource> AddQueueService(this IResourceBuilder<AzureStorageResource> builder, [ResourceName] string name)
public static IResourceBuilder<AzureQueueStorageResource> AddQueueService(this IResourceBuilder<AzureStorageResource> builder, [ResourceName] string? name = null)
{
ArgumentNullException.ThrowIfNull(builder);
ArgumentException.ThrowIfNullOrEmpty(name);

name ??= builder.Resource.Name + "-queues";

var resource = new AzureQueueStorageResource(name, builder.Resource);
builder.Resource.QueueStorageResource = resource;
Expand Down Expand Up @@ -547,8 +549,7 @@ public static IResourceBuilder<AzureQueueStorageQueueResource> AddQueue(this IRe
// Create a Queue Service resource implicitly
if (builder.Resource.QueueStorageResource is null)
{
var queueServiceName = $"{builder.Resource.Name}-queues";
AddQueueService(builder, queueServiceName);
AddQueueService(builder);
}

AzureQueueStorageQueueResource resource = new(name, queueName, builder.Resource.QueueStorageResource!);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,7 @@ public static void AddAzureBlobServiceClient(
new BlobStorageComponent().AddClient(builder, DefaultConfigSectionName, configureSettings, configureClientBuilder, connectionName, serviceKey: null);
}

/// <summary>
/// Registers <see cref="BlobServiceClient"/> as a singleton in the services provided by the <paramref name="builder"/>.
/// Enables retries, corresponding health check, logging and telemetry.
/// </summary>
/// <param name="builder">The <see cref="IHostApplicationBuilder" /> to read config from and add services to.</param>
/// <param name="connectionName">
/// A name used to retrieve the connection string from the ConnectionStrings configuration section.
/// </param>
/// <param name="configureSettings">
/// An optional method that can be used for customizing the <see cref="AzureStorageBlobsSettings"/>. It's invoked after the settings are read from the configuration.
/// </param>
/// <param name="configureClientBuilder">
/// An optional method that can be used for customizing the <see cref="IAzureClientBuilder{TClient, TOptions}"/>.
/// </param>
/// <remarks>Reads the configuration from "Aspire:Azure:Storage:Blobs" section.</remarks>
/// <exception cref="InvalidOperationException">
/// Neither <see cref="AzureStorageBlobsSettings.ConnectionString"/> nor <see cref="AzureStorageBlobsSettings.ServiceUri"/> is provided.
/// </exception>
/// <inheritdoc cref="AddAzureBlobServiceClient"/>
[Obsolete("Use AddAzureBlobServiceClient instead. This method will be removed in a future version.")]
public static void AddAzureBlobClient(
this IHostApplicationBuilder builder,
Expand Down Expand Up @@ -108,26 +91,8 @@ public static void AddKeyedAzureBlobServiceClient(
new BlobStorageComponent().AddClient(builder, DefaultConfigSectionName, configureSettings, configureClientBuilder, connectionName: name, serviceKey: name);
}

/// <summary>
/// Registers <see cref="BlobServiceClient"/> as a singleton for given <paramref name="name"/> in the services provided by the <paramref name="builder"/>.
/// Enables retries, corresponding health check, logging and telemetry.
/// </summary>
/// <param name="builder">The <see cref="IHostApplicationBuilder" /> to read config from and add services to.</param>
/// <param name="name">
/// The name of the component, which is used as the <see cref="ServiceDescriptor.ServiceKey"/> of the service and also to retrieve
/// the connection string from the ConnectionStrings configuration section.
/// </param>
/// <param name="configureSettings">
/// An optional method that can be used for customizing the <see cref="AzureStorageBlobsSettings"/>.
/// It's invoked after the settings are read from the configuration.
/// </param>
/// <param name="configureClientBuilder">
/// An optional method that can be used for customizing the <see cref="IAzureClientBuilder{TClient, TOptions}"/>.
/// </param>
/// <remarks>Reads the configuration from "Aspire:Azure:Storage:Blobs:{name}" section.</remarks>
/// <exception cref="InvalidOperationException">
/// Neither <see cref="AzureStorageBlobsSettings.ConnectionString"/> nor <see cref="AzureStorageBlobsSettings.ServiceUri"/> is provided.
/// </exception>
/// <inheritdoc cref="AddKeyedAzureBlobServiceClient"/>
[Obsolete("Use AddKeyedAzureBlobServiceClient instead. This method will be removed in a future version.")]
public static void AddKeyedAzureBlobClient(
this IHostApplicationBuilder builder,
string name,
Expand Down
35 changes: 34 additions & 1 deletion tests/Aspire.Hosting.Azure.Tests/AzureStorageExtensionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ public void AddBlobContainer_ConnectionString_unresolved_expected()
Assert.Equal("Endpoint={storage.outputs.blobEndpoint};ContainerName=myContainer", blobContainer.Resource.ConnectionStringExpression.ValueExpression);
}

[Fact]
[Fact]
public async Task AddQueues_ConnectionString_resolved_expected_RunAsEmulator()
{
const string expected = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;";
Expand Down Expand Up @@ -822,4 +822,37 @@ public async Task AddAzureStorageViaPublishModeEnableAllowSharedKeyAccessOverrid
var tableManifest = await ManifestUtils.GetManifest(table.Resource);
Assert.Equal(expectedTableManifest, tableManifest.ToString());
}

[Fact]
public void AddBlobService_Default_Name()
{
using var builder = TestDistributedApplicationBuilder.Create();

var storage = builder.AddAzureStorage("storage");
var blobService = storage.AddBlobService();

Assert.Equal("storage-blobs", blobService.Resource.Name);
}

[Fact]
public void AddQueueService_Default_Name()
{
using var builder = TestDistributedApplicationBuilder.Create();

var storage = builder.AddAzureStorage("storage");
var queueService = storage.AddQueueService();

Assert.Equal("storage-queues", queueService.Resource.Name);
}

[Fact]
public void AddTableService_Default_Name()
{
using var builder = TestDistributedApplicationBuilder.Create();

var storage = builder.AddAzureStorage("storage");
var tableService = storage.AddTableService();

Assert.Equal("storage-tables", tableService.Resource.Name);
}
}
Loading