File: Resources\PodAffinityV1.cs
Web Access
Project: src\src\Aspire.Hosting.Kubernetes\Aspire.Hosting.Kubernetes.csproj (Aspire.Hosting.Kubernetes)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using YamlDotNet.Serialization;
 
namespace Aspire.Hosting.Kubernetes.Resources;
 
/// <summary>
/// Represents pod affinity rules for Kubernetes pod scheduling.
/// This class defines the pod affinity and anti-affinity constraints
/// that influence the placement of pods during scheduling.
/// </summary>
/// <remarks>
/// Pod affinity is used to dictate that certain pods should be scheduled
/// either in the same topology (e.g., node or zone) as other specified pods
/// or avoid the same topology. It supports both soft preferences and hard requirements
/// for pod placement.
/// </remarks>
[YamlSerializable]
public sealed class PodAffinityV1
{
    /// <summary>
    /// Represents an optional list of weighted pod affinity terms that are considered
    /// during the scheduling phase of a pod's lifecycle, but ignored during the
    /// execution phase.
    /// </summary>
    /// <remarks>
    /// This property is typically used to express soft rules for pod placement, enabling
    /// the Kubernetes scheduler to give higher preference to certain nodes or
    /// configurations without mandating strict enforcement.
    /// </remarks>
    [YamlMember(Alias = "preferredDuringSchedulingIgnoredDuringExecution")]
    public List<WeightedPodAffinityTermV1> PreferredDuringSchedulingIgnoredDuringExecution { get; } = [];
 
    /// <summary>
    /// Represents a collection of hard affinity rules used during pod scheduling in Kubernetes.
    /// The `RequiredDuringSchedulingIgnoredDuringExecution` property contains a list of
    /// `PodAffinityTermV1` objects, each defining strict constraints that must be met
    /// for pod placement during scheduling. These constraints are mandatory for scheduling
    /// but are not enforced once the pod is running. This allows for ensuring initial
    /// placement conditions while tolerating changes in the cluster environment
    /// after the pod is already scheduled.
    /// </summary>
    [YamlMember(Alias = "requiredDuringSchedulingIgnoredDuringExecution")]
    public List<PodAffinityTermV1> RequiredDuringSchedulingIgnoredDuringExecution { get; } = [];
}