Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ internal sealed record DaprSidecarExportOptions
public string? RuntimePath { get; init; }
public string? SchedulerHostAddress { get; init; }
public string? UnixDomainSocket { get; init; }
public string? SidecarName { get; init; }

public DaprSidecarOptions ToDaprSidecarOptions()
{
Expand Down Expand Up @@ -93,7 +94,8 @@ public DaprSidecarOptions ToDaprSidecarOptions()
RunFile = RunFile,
RuntimePath = RuntimePath,
SchedulerHostAddress = SchedulerHostAddress,
UnixDomainSocket = UnixDomainSocket
UnixDomainSocket = UnixDomainSocket,
SidecarName = SidecarName
};
#pragma warning restore CS0618
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,4 +241,12 @@ public string? DaprReadBufferSize
/// If specified, the Dapr sidecar will use Unix Domain Sockets for API calls.
/// </remarks>
public string? UnixDomainSocket { get; init; }

/// <summary>
/// Gets or sets the name of the Dapr sidecar resource as it appears in the Aspire dashboard.
/// </summary>
/// <remarks>
/// When null or whitespace, the default name <c>{resourceName}-dapr</c> is used.
/// </remarks>
public string? SidecarName { get; init; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ public static IResourceBuilder<T> WithDaprSidecar<T>(this IResourceBuilder<T> bu
[AspireExportIgnore(Reason = "Use the exported DTO-based overload instead to avoid ambiguous polyglot wrapper generation.")]
public static IResourceBuilder<T> WithDaprSidecar<T>(this IResourceBuilder<T> builder, DaprSidecarOptions? options = null) where T : IResource
{
return builder.WithDaprSidecar(
var sidecarName = !string.IsNullOrWhiteSpace(options?.SidecarName) ? options.SidecarName : null;

return builder.WithDaprSidecarCore(
sidecarName,
sidecarBuilder =>
{
if (options is not null)
Expand All @@ -61,11 +64,18 @@ internal static IResourceBuilder<T> WithDaprSidecarExport<T>(this IResourceBuild
/// <returns>The resource builder instance.</returns>
[AspireExport("configureDaprSidecar", MethodName = "configureDaprSidecar", Description = "Adds a Dapr sidecar to the resource and exposes it for callback configuration")]
public static IResourceBuilder<T> WithDaprSidecar<T>(this IResourceBuilder<T> builder, Action<IResourceBuilder<IDaprSidecarResource>> configureSidecar) where T : IResource
{
return builder.WithDaprSidecarCore(null, configureSidecar);
}

private static IResourceBuilder<T> WithDaprSidecarCore<T>(this IResourceBuilder<T> builder, string? sidecarName, Action<IResourceBuilder<IDaprSidecarResource>> configureSidecar) where T : IResource
{
// Add Dapr is idempotent, so we can call it multiple times.
builder.ApplicationBuilder.AddDapr();

var sidecarBuilder = builder.ApplicationBuilder.AddResource(new DaprSidecarResource($"{builder.Resource.Name}-dapr"))
var name = !string.IsNullOrWhiteSpace(sidecarName) ? sidecarName : $"{builder.Resource.Name}-dapr";

var sidecarBuilder = builder.ApplicationBuilder.AddResource(new DaprSidecarResource(name))
.WithInitialState(new()
{
Properties = [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,63 @@ public void ResourceWithWaitAnnotationAndDaprSidecar_SetsUpCorrectDependencies()
Assert.Equal(sidecarResource, sidecarAnnotation.Sidecar);
}

[Fact]
public void SidecarNameCanBeSetViaOptions()
{
var builder = DistributedApplication.CreateBuilder();

builder.AddProject<Projects.CommunityToolkit_Aspire_Hosting_Dapr_ServiceA>("test")
.WithDaprSidecar(new DaprSidecarOptions { SidecarName = "my-custom-sidecar" });

var resource = Assert.Single(builder.Resources.OfType<DaprSidecarResource>());
Assert.Equal("my-custom-sidecar", resource.Name);
}

[Fact]
public void SidecarNameDefaultsToResourceNameWhenNotSet()
{
var builder = DistributedApplication.CreateBuilder();

builder.AddProject<Projects.CommunityToolkit_Aspire_Hosting_Dapr_ServiceA>("test")
.WithDaprSidecar();

var resource = Assert.Single(builder.Resources.OfType<DaprSidecarResource>());
Assert.Equal("test-dapr", resource.Name);
}

[Fact]
public void SidecarNameDefaultsToResourceNameWhenSetToWhitespace()
{
var builder = DistributedApplication.CreateBuilder();

builder.AddProject<Projects.CommunityToolkit_Aspire_Hosting_Dapr_ServiceA>("test")
.WithDaprSidecar(new DaprSidecarOptions { SidecarName = " " });

var resource = Assert.Single(builder.Resources.OfType<DaprSidecarResource>());
Assert.Equal("test-dapr", resource.Name);
}

[Fact]
public void SidecarNameCanBeSetWithAppId()
{
var builder = DistributedApplication.CreateBuilder();

builder.AddProject<Projects.CommunityToolkit_Aspire_Hosting_Dapr_ServiceA>("my-service")
.WithDaprSidecar(new DaprSidecarOptions
{
SidecarName = "my-custom-sidecar",
AppId = "my-service"
});

var resource = Assert.Single(builder.Resources.OfType<DaprSidecarResource>());
Assert.Equal("my-custom-sidecar", resource.Name);

var annotation = Assert.Single(resource.Annotations.OfType<DaprSidecarOptionsAnnotation>());
Assert.Equal("my-service", annotation.Options.AppId);
Assert.Equal("my-custom-sidecar", annotation.Options.SidecarName);
}


[Fact]
public void ResourceWithMultipleWaitAnnotationsAndDaprSidecar_HasAllWaitDependencies()
{
Expand Down