From 4c52e19b5862126547946142409cc5cd078ce1b7 Mon Sep 17 00:00:00 2001 From: David Negstad Date: Mon, 6 May 2024 12:19:00 -0700 Subject: [PATCH 1/6] Proof of concept of persistent container --- .../ContainerPersistenceAnnotation.cs | 33 +++++++++++++++++++ .../ApplicationModel/ResourceExtensions.cs | 6 ++-- .../ContainerResourceBuilderExtensions.cs | 12 +++++++ src/Aspire.Hosting/Dcp/ApplicationExecutor.cs | 9 +++++ src/Aspire.Hosting/PublicAPI.Unshipped.txt | 2 ++ 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/Aspire.Hosting/ApplicationModel/ContainerPersistenceAnnotation.cs diff --git a/src/Aspire.Hosting/ApplicationModel/ContainerPersistenceAnnotation.cs b/src/Aspire.Hosting/ApplicationModel/ContainerPersistenceAnnotation.cs new file mode 100644 index 00000000000..a00a2f2a7d9 --- /dev/null +++ b/src/Aspire.Hosting/ApplicationModel/ContainerPersistenceAnnotation.cs @@ -0,0 +1,33 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Diagnostics; + +namespace Aspire.Hosting.ApplicationModel; + +/// +/// Lifetime modes for container resources +/// +public enum ContainerLifetimeType +{ + /// + /// The resource is tied to the lifetime of the AppHost. + /// + AppHost, + /// + /// The resource is persistent and will not be disposed of when the AppHost shuts down. + /// + Persistent, +} + +/// +/// Annotation that controls the lifetime of a container resource (AppHost based lifetime or persistent) +/// +[DebuggerDisplay("Type = {GetType().Name,nq}")] +public sealed class ContainerLifetimeAnnotation : IResourceAnnotation +{ + /// + /// Gets or sets the lifetime type for the container resource. + /// + public required ContainerLifetimeType LifetimeType { get; set; } +} \ No newline at end of file diff --git a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs index 6f0f92d18e1..cc5fa17a945 100644 --- a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs +++ b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs @@ -84,9 +84,9 @@ public static bool TryGetEnvironmentVariables(this IResource resource, [NotNullW /// var container = builder.AddContainer("elasticsearch", "library/elasticsearch", "8.14.0") /// .WithEnvironment("discovery.type", "single-node") /// .WithEnvironment("xpack.security.enabled", "true"); - /// + /// /// var env = await container.Resource.GetEnvironmentVariableValuesAsync(); - /// + /// /// Assert.Collection(env, /// env => /// { @@ -179,7 +179,7 @@ public static IEnumerable GetEndpoints(this IResourceWithEndp /// /// The which contains annotations. /// The name of the endpoint. - /// An object representing the endpoint reference + /// An object representing the endpoint reference /// for the specified endpoint. public static EndpointReference GetEndpoint(this IResourceWithEndpoints resource, string endpointName) { diff --git a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs index 777a757e974..9507fc14ac4 100644 --- a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs @@ -221,6 +221,18 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil return builder.WithAnnotation(annotation); } + /// + /// Sets the lifetime behavior of the container resource. + /// + /// The resource type. + /// Builder for the container resource. + /// The lifetime behavior of the container resource (defaults behavior is ) + /// The . + public static IResourceBuilder WithContainerLifetime(this IResourceBuilder builder, ContainerLifetimeType lifetimeType) where T : ContainerResource + { + return builder.WithAnnotation(new ContainerLifetimeAnnotation { LifetimeType = lifetimeType }, ResourceAnnotationMutationBehavior.Replace); + } + private static IResourceBuilder ThrowResourceIsNotContainer(IResourceBuilder builder) where T : ContainerResource { throw new InvalidOperationException($"The resource '{builder.Resource.Name}' does not have a container image specified. Use WithImage to specify the container image and tag."); diff --git a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs index e29d5ff2dea..4d108c150b6 100644 --- a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs +++ b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs @@ -1332,6 +1332,15 @@ private void PrepareContainers() var ctr = Container.Create(containerObjectName, containerImageName); ctr.Spec.ContainerName = containerObjectName; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name. + + if (container.TryGetLastAnnotation(out var lifetimeAnnotation)) + { + if (lifetimeAnnotation.LifetimeType == ContainerLifetimeType.Persistent) + { + ctr.Spec.Persistent = true; + } + } + ctr.Annotate(CustomResource.ResourceNameAnnotation, container.Name); ctr.Annotate(CustomResource.OtelServiceNameAnnotation, container.Name); ctr.Annotate(CustomResource.OtelServiceInstanceIdAnnotation, nameSuffix); diff --git a/src/Aspire.Hosting/PublicAPI.Unshipped.txt b/src/Aspire.Hosting/PublicAPI.Unshipped.txt index a375d4c358b..d0c197d998e 100644 --- a/src/Aspire.Hosting/PublicAPI.Unshipped.txt +++ b/src/Aspire.Hosting/PublicAPI.Unshipped.txt @@ -11,6 +11,7 @@ Aspire.Hosting.ApplicationModel.BeforeStartEvent Aspire.Hosting.ApplicationModel.BeforeStartEvent.BeforeStartEvent(System.IServiceProvider! services, Aspire.Hosting.ApplicationModel.DistributedApplicationModel! model) -> void Aspire.Hosting.ApplicationModel.BeforeStartEvent.Model.get -> Aspire.Hosting.ApplicationModel.DistributedApplicationModel! Aspire.Hosting.ApplicationModel.BeforeStartEvent.Services.get -> System.IServiceProvider! +Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation Aspire.Hosting.ApplicationModel.ResourceNotificationService.ResourceNotificationService(Microsoft.Extensions.Logging.ILogger! logger, Microsoft.Extensions.Hosting.IHostApplicationLifetime! hostApplicationLifetime) -> void Aspire.Hosting.DistributedApplicationBuilder.Eventing.get -> Aspire.Hosting.Eventing.IDistributedApplicationEventing! Aspire.Hosting.Eventing.DistributedApplicationEventing @@ -68,3 +69,4 @@ static Aspire.Hosting.ContainerResourceBuilderExtensions.WithBuildArg(this As static Aspire.Hosting.ContainerResourceBuilderExtensions.WithBuildSecret(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.IResourceBuilder! value) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! static Aspire.Hosting.ProjectResourceBuilderExtensions.AddProject(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! projectPath, System.Action! configure) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! static Aspire.Hosting.ProjectResourceBuilderExtensions.AddProject(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, System.Action! configure) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! +static Aspire.Hosting.ProjectResourceBuilderExtensions.AddProject(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, System.Action! configure) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! From 26f9d6d0484abe9d608d0126e5d50a48aea0ee43 Mon Sep 17 00:00:00 2001 From: David Negstad Date: Mon, 19 Aug 2024 17:48:53 -0700 Subject: [PATCH 2/6] Update API --- ...otation.cs => ContainerLifetimeAnnotation.cs} | 0 .../ApplicationModel/ResourceExtensions.cs | 16 ++++++++++++++++ src/Aspire.Hosting/Dcp/ApplicationExecutor.cs | 15 +++++++++------ src/Aspire.Hosting/PublicAPI.Unshipped.txt | 9 ++++++++- 4 files changed, 33 insertions(+), 7 deletions(-) rename src/Aspire.Hosting/ApplicationModel/{ContainerPersistenceAnnotation.cs => ContainerLifetimeAnnotation.cs} (100%) diff --git a/src/Aspire.Hosting/ApplicationModel/ContainerPersistenceAnnotation.cs b/src/Aspire.Hosting/ApplicationModel/ContainerLifetimeAnnotation.cs similarity index 100% rename from src/Aspire.Hosting/ApplicationModel/ContainerPersistenceAnnotation.cs rename to src/Aspire.Hosting/ApplicationModel/ContainerLifetimeAnnotation.cs diff --git a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs index cc5fa17a945..0dfea702f09 100644 --- a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs +++ b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs @@ -233,4 +233,20 @@ public static int GetReplicaCount(this IResource resource) return 1; } } + + /// + /// Gets the lifetime type of the container for the specified resoruce. Defaults to if + /// no is found. + /// + /// The resource to the get the ContainerLifetimeType for. + /// + public static ContainerLifetimeType GetContainerLifetimeType(this IResource resource) + { + if (resource.TryGetLastAnnotation(out var lifetimeAnnotation)) + { + return lifetimeAnnotation.LifetimeType; + } + + return ContainerLifetimeType.AppHost; + } } diff --git a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs index 4d108c150b6..9f9f94598ff 100644 --- a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs +++ b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs @@ -1327,18 +1327,21 @@ private void PrepareContainers() throw new InvalidOperationException(); } - var nameSuffix = GetRandomNameSuffix(); + var nameSuffix = string.Empty; + + if (container.GetContainerLifetimeType() == ContainerLifetimeType.AppHost) + { + nameSuffix = GetRandomNameSuffix(); + } + var containerObjectName = GetObjectNameForResource(container, nameSuffix); var ctr = Container.Create(containerObjectName, containerImageName); ctr.Spec.ContainerName = containerObjectName; // Use the same name for container orchestrator (Docker, Podman) resource and DCP object name. - if (container.TryGetLastAnnotation(out var lifetimeAnnotation)) + if (container.GetContainerLifetimeType() == ContainerLifetimeType.Persistent) { - if (lifetimeAnnotation.LifetimeType == ContainerLifetimeType.Persistent) - { - ctr.Spec.Persistent = true; - } + ctr.Spec.Persistent = true; } ctr.Annotate(CustomResource.ResourceNameAnnotation, container.Name); diff --git a/src/Aspire.Hosting/PublicAPI.Unshipped.txt b/src/Aspire.Hosting/PublicAPI.Unshipped.txt index d0c197d998e..ed99a021a4b 100644 --- a/src/Aspire.Hosting/PublicAPI.Unshipped.txt +++ b/src/Aspire.Hosting/PublicAPI.Unshipped.txt @@ -12,6 +12,12 @@ Aspire.Hosting.ApplicationModel.BeforeStartEvent.BeforeStartEvent(System.IServic Aspire.Hosting.ApplicationModel.BeforeStartEvent.Model.get -> Aspire.Hosting.ApplicationModel.DistributedApplicationModel! Aspire.Hosting.ApplicationModel.BeforeStartEvent.Services.get -> System.IServiceProvider! Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation +Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation.ContainerLifetimeAnnotation() -> void +Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation.LifetimeType.get -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType +Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation.LifetimeType.set -> void +Aspire.Hosting.ApplicationModel.ContainerLifetimeType +Aspire.Hosting.ApplicationModel.ContainerLifetimeType.AppHost = 0 -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType +Aspire.Hosting.ApplicationModel.ContainerLifetimeType.Persistent = 1 -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType Aspire.Hosting.ApplicationModel.ResourceNotificationService.ResourceNotificationService(Microsoft.Extensions.Logging.ILogger! logger, Microsoft.Extensions.Hosting.IHostApplicationLifetime! hostApplicationLifetime) -> void Aspire.Hosting.DistributedApplicationBuilder.Eventing.get -> Aspire.Hosting.Eventing.IDistributedApplicationEventing! Aspire.Hosting.Eventing.DistributedApplicationEventing @@ -35,9 +41,11 @@ Aspire.Hosting.Eventing.IDistributedApplicationEventing.Unsubscribe(Aspire.Hosti Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent.Resource.get -> Aspire.Hosting.ApplicationModel.IResource! Aspire.Hosting.IDistributedApplicationBuilder.Eventing.get -> Aspire.Hosting.Eventing.IDistributedApplicationEventing! +static Aspire.Hosting.ApplicationModel.ResourceExtensions.GetContainerLifetimeType(this Aspire.Hosting.ApplicationModel.IResource! resource) -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType static Aspire.Hosting.ApplicationModel.ResourceExtensions.GetEnvironmentVariableValuesAsync(this Aspire.Hosting.ApplicationModel.IResourceWithEnvironment! resource, Aspire.Hosting.DistributedApplicationOperation applicationOperation = Aspire.Hosting.DistributedApplicationOperation.Run) -> System.Threading.Tasks.ValueTask!> Aspire.Hosting.ApplicationModel.ResourceNotificationService.WaitForResourceAsync(string! resourceName, string? targetState = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Aspire.Hosting.ApplicationModel.ResourceNotificationService.WaitForResourceAsync(string! resourceName, System.Collections.Generic.IEnumerable! targetStates, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! +static Aspire.Hosting.ContainerResourceBuilderExtensions.WithContainerLifetime(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, Aspire.Hosting.ApplicationModel.ContainerLifetimeType lifetimeType) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! static Aspire.Hosting.ProjectResourceBuilderExtensions.WithEndpointsInEnvironment(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, System.Func! filter) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! Aspire.Hosting.DistributedApplicationExecutionContext.DistributedApplicationExecutionContext(Aspire.Hosting.DistributedApplicationExecutionContextOptions! options) -> void Aspire.Hosting.DistributedApplicationExecutionContext.ServiceProvider.get -> System.IServiceProvider! @@ -69,4 +77,3 @@ static Aspire.Hosting.ContainerResourceBuilderExtensions.WithBuildArg(this As static Aspire.Hosting.ContainerResourceBuilderExtensions.WithBuildSecret(this Aspire.Hosting.ApplicationModel.IResourceBuilder! builder, string! name, Aspire.Hosting.ApplicationModel.IResourceBuilder! value) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! static Aspire.Hosting.ProjectResourceBuilderExtensions.AddProject(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, string! projectPath, System.Action! configure) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! static Aspire.Hosting.ProjectResourceBuilderExtensions.AddProject(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, System.Action! configure) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! -static Aspire.Hosting.ProjectResourceBuilderExtensions.AddProject(this Aspire.Hosting.IDistributedApplicationBuilder! builder, string! name, System.Action! configure) -> Aspire.Hosting.ApplicationModel.IResourceBuilder! From 81a6b5f06a2fbed1b5ab71b0dd3a128d3426f492 Mon Sep 17 00:00:00 2001 From: David Negstad Date: Tue, 20 Aug 2024 14:59:38 -0700 Subject: [PATCH 3/6] Update check to internal and mark API as experimental --- src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs | 2 +- src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs | 2 ++ src/Aspire.Hosting/PublicAPI.Unshipped.txt | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs index 0dfea702f09..60427f08192 100644 --- a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs +++ b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs @@ -240,7 +240,7 @@ public static int GetReplicaCount(this IResource resource) /// /// The resource to the get the ContainerLifetimeType for. /// - public static ContainerLifetimeType GetContainerLifetimeType(this IResource resource) + internal static ContainerLifetimeType GetContainerLifetimeType(this IResource resource) { if (resource.TryGetLastAnnotation(out var lifetimeAnnotation)) { diff --git a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs index 9507fc14ac4..2e3c3ee4fe8 100644 --- a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Utils; @@ -228,6 +229,7 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil /// Builder for the container resource. /// The lifetime behavior of the container resource (defaults behavior is ) /// The . + [Experimental("ASPIRECONTAINERLIFETIME001")] public static IResourceBuilder WithContainerLifetime(this IResourceBuilder builder, ContainerLifetimeType lifetimeType) where T : ContainerResource { return builder.WithAnnotation(new ContainerLifetimeAnnotation { LifetimeType = lifetimeType }, ResourceAnnotationMutationBehavior.Replace); diff --git a/src/Aspire.Hosting/PublicAPI.Unshipped.txt b/src/Aspire.Hosting/PublicAPI.Unshipped.txt index ed99a021a4b..e7b73c58bd4 100644 --- a/src/Aspire.Hosting/PublicAPI.Unshipped.txt +++ b/src/Aspire.Hosting/PublicAPI.Unshipped.txt @@ -41,7 +41,6 @@ Aspire.Hosting.Eventing.IDistributedApplicationEventing.Unsubscribe(Aspire.Hosti Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent Aspire.Hosting.Eventing.IDistributedApplicationResourceEvent.Resource.get -> Aspire.Hosting.ApplicationModel.IResource! Aspire.Hosting.IDistributedApplicationBuilder.Eventing.get -> Aspire.Hosting.Eventing.IDistributedApplicationEventing! -static Aspire.Hosting.ApplicationModel.ResourceExtensions.GetContainerLifetimeType(this Aspire.Hosting.ApplicationModel.IResource! resource) -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType static Aspire.Hosting.ApplicationModel.ResourceExtensions.GetEnvironmentVariableValuesAsync(this Aspire.Hosting.ApplicationModel.IResourceWithEnvironment! resource, Aspire.Hosting.DistributedApplicationOperation applicationOperation = Aspire.Hosting.DistributedApplicationOperation.Run) -> System.Threading.Tasks.ValueTask!> Aspire.Hosting.ApplicationModel.ResourceNotificationService.WaitForResourceAsync(string! resourceName, string? targetState = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! Aspire.Hosting.ApplicationModel.ResourceNotificationService.WaitForResourceAsync(string! resourceName, System.Collections.Generic.IEnumerable! targetStates, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task! From 2b9398b4355e51b5523ba60f86faaa2a163fca62 Mon Sep 17 00:00:00 2001 From: David Negstad Date: Tue, 20 Aug 2024 15:27:43 -0700 Subject: [PATCH 4/6] Add example for WithContainerLifetime --- src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs index 2e3c3ee4fe8..56171a86e08 100644 --- a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs @@ -229,6 +229,14 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil /// Builder for the container resource. /// The lifetime behavior of the container resource (defaults behavior is ) /// The . + /// + /// Marking a container resource to have a lifetime. + /// + /// var builder = DistributedApplication.CreateBuilder(args); + /// builder.AddContainer("mycontainer", "myimage") + /// .WithContainerLifetime(ContainerLifetimeType.Persistent); + /// + /// [Experimental("ASPIRECONTAINERLIFETIME001")] public static IResourceBuilder WithContainerLifetime(this IResourceBuilder builder, ContainerLifetimeType lifetimeType) where T : ContainerResource { From fd851e676c07e472a5b3a4863eda0f9c902f5c65 Mon Sep 17 00:00:00 2001 From: David Negstad Date: Tue, 20 Aug 2024 15:32:40 -0700 Subject: [PATCH 5/6] Add missing returns doc --- src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs index 60427f08192..51930596d5b 100644 --- a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs +++ b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs @@ -239,7 +239,7 @@ public static int GetReplicaCount(this IResource resource) /// no is found. /// /// The resource to the get the ContainerLifetimeType for. - /// + /// The from the for the resource (if the annotation exists). Defaults to if the annotation is not set. internal static ContainerLifetimeType GetContainerLifetimeType(this IResource resource) { if (resource.TryGetLastAnnotation(out var lifetimeAnnotation)) From a47a9bf219f36e664745661a22908a1db1aca6da Mon Sep 17 00:00:00 2001 From: David Negstad Date: Wed, 21 Aug 2024 12:32:07 -0700 Subject: [PATCH 6/6] Change AppHost lifetime to Default --- .../ApplicationModel/ContainerLifetimeAnnotation.cs | 6 +++--- src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs | 6 +++--- src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs | 2 +- src/Aspire.Hosting/Dcp/ApplicationExecutor.cs | 2 +- src/Aspire.Hosting/PublicAPI.Unshipped.txt | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Aspire.Hosting/ApplicationModel/ContainerLifetimeAnnotation.cs b/src/Aspire.Hosting/ApplicationModel/ContainerLifetimeAnnotation.cs index a00a2f2a7d9..5cc5bfc0002 100644 --- a/src/Aspire.Hosting/ApplicationModel/ContainerLifetimeAnnotation.cs +++ b/src/Aspire.Hosting/ApplicationModel/ContainerLifetimeAnnotation.cs @@ -11,9 +11,9 @@ namespace Aspire.Hosting.ApplicationModel; public enum ContainerLifetimeType { /// - /// The resource is tied to the lifetime of the AppHost. + /// The default lifetime behavior should apply. This will create the resource when the AppHost starts and dispose of it when the AppHost shuts down. /// - AppHost, + Default, /// /// The resource is persistent and will not be disposed of when the AppHost shuts down. /// @@ -21,7 +21,7 @@ public enum ContainerLifetimeType } /// -/// Annotation that controls the lifetime of a container resource (AppHost based lifetime or persistent) +/// Annotation that controls the lifetime of a container resource (default behavior that matches the lifetime of the AppHost or a persistent lifetime across AppHost restarts) /// [DebuggerDisplay("Type = {GetType().Name,nq}")] public sealed class ContainerLifetimeAnnotation : IResourceAnnotation diff --git a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs index 51930596d5b..9801d6b1b5f 100644 --- a/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs +++ b/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs @@ -235,11 +235,11 @@ public static int GetReplicaCount(this IResource resource) } /// - /// Gets the lifetime type of the container for the specified resoruce. Defaults to if + /// Gets the lifetime type of the container for the specified resoruce. Defaults to if /// no is found. /// /// The resource to the get the ContainerLifetimeType for. - /// The from the for the resource (if the annotation exists). Defaults to if the annotation is not set. + /// The from the for the resource (if the annotation exists). Defaults to if the annotation is not set. internal static ContainerLifetimeType GetContainerLifetimeType(this IResource resource) { if (resource.TryGetLastAnnotation(out var lifetimeAnnotation)) @@ -247,6 +247,6 @@ internal static ContainerLifetimeType GetContainerLifetimeType(this IResource re return lifetimeAnnotation.LifetimeType; } - return ContainerLifetimeType.AppHost; + return ContainerLifetimeType.Default; } } diff --git a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs index 56171a86e08..5f6dc2412c0 100644 --- a/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs +++ b/src/Aspire.Hosting/ContainerResourceBuilderExtensions.cs @@ -227,7 +227,7 @@ public static IResourceBuilder WithContainerRuntimeArgs(this IResourceBuil /// /// The resource type. /// Builder for the container resource. - /// The lifetime behavior of the container resource (defaults behavior is ) + /// The lifetime behavior of the container resource (defaults behavior is ) /// The . /// /// Marking a container resource to have a lifetime. diff --git a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs index 9f9f94598ff..465d06d5c94 100644 --- a/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs +++ b/src/Aspire.Hosting/Dcp/ApplicationExecutor.cs @@ -1329,7 +1329,7 @@ private void PrepareContainers() var nameSuffix = string.Empty; - if (container.GetContainerLifetimeType() == ContainerLifetimeType.AppHost) + if (container.GetContainerLifetimeType() == ContainerLifetimeType.Default) { nameSuffix = GetRandomNameSuffix(); } diff --git a/src/Aspire.Hosting/PublicAPI.Unshipped.txt b/src/Aspire.Hosting/PublicAPI.Unshipped.txt index e7b73c58bd4..111fa6cf9ff 100644 --- a/src/Aspire.Hosting/PublicAPI.Unshipped.txt +++ b/src/Aspire.Hosting/PublicAPI.Unshipped.txt @@ -16,7 +16,7 @@ Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation.ContainerLifetimeAnn Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation.LifetimeType.get -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType Aspire.Hosting.ApplicationModel.ContainerLifetimeAnnotation.LifetimeType.set -> void Aspire.Hosting.ApplicationModel.ContainerLifetimeType -Aspire.Hosting.ApplicationModel.ContainerLifetimeType.AppHost = 0 -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType +Aspire.Hosting.ApplicationModel.ContainerLifetimeType.Default = 0 -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType Aspire.Hosting.ApplicationModel.ContainerLifetimeType.Persistent = 1 -> Aspire.Hosting.ApplicationModel.ContainerLifetimeType Aspire.Hosting.ApplicationModel.ResourceNotificationService.ResourceNotificationService(Microsoft.Extensions.Logging.ILogger! logger, Microsoft.Extensions.Hosting.IHostApplicationLifetime! hostApplicationLifetime) -> void Aspire.Hosting.DistributedApplicationBuilder.Eventing.get -> Aspire.Hosting.Eventing.IDistributedApplicationEventing!