// <auto-generated>
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>

namespace k8s.Models
{
    using Microsoft.Rest;
    using Newtonsoft.Json;
    using System.Linq;

    /// <summary>
    /// MetricSpec specifies how to scale based on a single metric (only `type`
    /// and one other matching field should be set at once).
    /// </summary>
    public partial class V2beta2MetricSpec
    {
        /// <summary>
        /// Initializes a new instance of the V2beta2MetricSpec class.
        /// </summary>
        public V2beta2MetricSpec()
        {
            CustomInit();
        }

        /// <summary>
        /// Initializes a new instance of the V2beta2MetricSpec class.
        /// </summary>
        /// <param name="type">type is the type of metric source.  It should be
        /// one of "ContainerResource", "External", "Object", "Pods" or
        /// "Resource", each mapping to a matching field in the object. Note:
        /// "ContainerResource" type is available on when the feature-gate
        /// HPAContainerMetrics is enabled</param>
        /// <param name="containerResource">container resource refers to a
        /// resource metric (such as those specified in requests and limits)
        /// known to Kubernetes describing a single container in each pod of
        /// the current scale target (e.g. CPU or memory). Such metrics are
        /// built in to Kubernetes, and have special scaling options on top of
        /// those available to normal per-pod metrics using the "pods" source.
        /// This is an alpha feature and can be enabled by the
        /// HPAContainerMetrics feature flag.</param>
        /// <param name="external">external refers to a global metric that is
        /// not associated with any Kubernetes object. It allows autoscaling
        /// based on information coming from components running outside of
        /// cluster (for example length of queue in cloud messaging service, or
        /// QPS from loadbalancer running outside of cluster).</param>
        /// <param name="objectProperty">object refers to a metric describing a
        /// single kubernetes object (for example, hits-per-second on an
        /// Ingress object).</param>
        /// <param name="pods">pods refers to a metric describing each pod in
        /// the current scale target (for example,
        /// transactions-processed-per-second).  The values will be averaged
        /// together before being compared to the target value.</param>
        /// <param name="resource">resource refers to a resource metric (such
        /// as those specified in requests and limits) known to Kubernetes
        /// describing each pod in the current scale target (e.g. CPU or
        /// memory). Such metrics are built in to Kubernetes, and have special
        /// scaling options on top of those available to normal per-pod metrics
        /// using the "pods" source.</param>
        public V2beta2MetricSpec(string type, V2beta2ContainerResourceMetricSource containerResource = default(V2beta2ContainerResourceMetricSource), V2beta2ExternalMetricSource external = default(V2beta2ExternalMetricSource), V2beta2ObjectMetricSource objectProperty = default(V2beta2ObjectMetricSource), V2beta2PodsMetricSource pods = default(V2beta2PodsMetricSource), V2beta2ResourceMetricSource resource = default(V2beta2ResourceMetricSource))
        {
            ContainerResource = containerResource;
            External = external;
            ObjectProperty = objectProperty;
            Pods = pods;
            Resource = resource;
            Type = type;
            CustomInit();
        }

        /// <summary>
        /// An initialization method that performs custom operations like setting defaults
        /// </summary>
        partial void CustomInit();

        /// <summary>
        /// Gets or sets container resource refers to a resource metric (such
        /// as those specified in requests and limits) known to Kubernetes
        /// describing a single container in each pod of the current scale
        /// target (e.g. CPU or memory). Such metrics are built in to
        /// Kubernetes, and have special scaling options on top of those
        /// available to normal per-pod metrics using the "pods" source. This
        /// is an alpha feature and can be enabled by the HPAContainerMetrics
        /// feature flag.
        /// </summary>
        [JsonProperty(PropertyName = "containerResource")]
        public V2beta2ContainerResourceMetricSource ContainerResource { get; set; }

        /// <summary>
        /// Gets or sets external refers to a global metric that is not
        /// associated with any Kubernetes object. It allows autoscaling based
        /// on information coming from components running outside of cluster
        /// (for example length of queue in cloud messaging service, or QPS
        /// from loadbalancer running outside of cluster).
        /// </summary>
        [JsonProperty(PropertyName = "external")]
        public V2beta2ExternalMetricSource External { get; set; }

        /// <summary>
        /// Gets or sets object refers to a metric describing a single
        /// kubernetes object (for example, hits-per-second on an Ingress
        /// object).
        /// </summary>
        [JsonProperty(PropertyName = "object")]
        public V2beta2ObjectMetricSource ObjectProperty { get; set; }

        /// <summary>
        /// Gets or sets pods refers to a metric describing each pod in the
        /// current scale target (for example,
        /// transactions-processed-per-second).  The values will be averaged
        /// together before being compared to the target value.
        /// </summary>
        [JsonProperty(PropertyName = "pods")]
        public V2beta2PodsMetricSource Pods { get; set; }

        /// <summary>
        /// Gets or sets resource refers to a resource metric (such as those
        /// specified in requests and limits) known to Kubernetes describing
        /// each pod in the current scale target (e.g. CPU or memory). Such
        /// metrics are built in to Kubernetes, and have special scaling
        /// options on top of those available to normal per-pod metrics using
        /// the "pods" source.
        /// </summary>
        [JsonProperty(PropertyName = "resource")]
        public V2beta2ResourceMetricSource Resource { get; set; }

        /// <summary>
        /// Gets or sets type is the type of metric source.  It should be one
        /// of "ContainerResource", "External", "Object", "Pods" or "Resource",
        /// each mapping to a matching field in the object. Note:
        /// "ContainerResource" type is available on when the feature-gate
        /// HPAContainerMetrics is enabled
        /// </summary>
        [JsonProperty(PropertyName = "type")]
        public string Type { get; set; }

        /// <summary>
        /// Validate the object.
        /// </summary>
        /// <exception cref="ValidationException">
        /// Thrown if validation fails
        /// </exception>
        public virtual void Validate()
        {
            if (Type == null)
            {
                throw new ValidationException(ValidationRules.CannotBeNull, "Type");
            }
            if (ContainerResource != null)
            {
                ContainerResource.Validate();
            }
            if (External != null)
            {
                External.Validate();
            }
            if (ObjectProperty != null)
            {
                ObjectProperty.Validate();
            }
            if (Pods != null)
            {
                Pods.Validate();
            }
            if (Resource != null)
            {
                Resource.Validate();
            }
        }
    }
}
