// <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>
    /// MetricStatus describes the last-read state of a single metric.
    /// </summary>
    public partial class V2beta1MetricStatus
    {
        /// <summary>
        /// Initializes a new instance of the V2beta1MetricStatus class.
        /// </summary>
        public V2beta1MetricStatus()
        {
            CustomInit();
        }

        /// <summary>
        /// Initializes a new instance of the V2beta1MetricStatus class.
        /// </summary>
        /// <param name="type">type is the type of metric source.  It will be
        /// one of "Object", "Pods" or "Resource", each corresponds to a
        /// matching field in the object.</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 V2beta1MetricStatus(string type, V2beta1ExternalMetricStatus external = default(V2beta1ExternalMetricStatus), V2beta1ObjectMetricStatus objectProperty = default(V2beta1ObjectMetricStatus), V2beta1PodsMetricStatus pods = default(V2beta1PodsMetricStatus), V2beta1ResourceMetricStatus resource = default(V2beta1ResourceMetricStatus))
        {
            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 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 V2beta1ExternalMetricStatus 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 V2beta1ObjectMetricStatus 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 V2beta1PodsMetricStatus 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 V2beta1ResourceMetricStatus Resource { get; set; }

        /// <summary>
        /// Gets or sets type is the type of metric source.  It will be one of
        /// "Object", "Pods" or "Resource", each corresponds to a matching
        /// field in the object.
        /// </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 (External != null)
            {
                External.Validate();
            }
            if (ObjectProperty != null)
            {
                ObjectProperty.Validate();
            }
            if (Pods != null)
            {
                Pods.Validate();
            }
            if (Resource != null)
            {
                Resource.Validate();
            }
        }
    }
}
