/*
 * This is an auto-generated file.
 * Any manual changes may be overwritten without notice!
 */

use derive_builder::Builder;
use serde::{Deserialize, Serialize};

/// AutopilotConfiguration is used for querying/setting the Autopilot configuration.
/// Autopilot helps manage operator tasks related to Nomad servers like removing
/// failed servers from the Raft quorum.
///
/// This struct was generated based on the Go types of the official Nomad API.
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, Builder)]
pub struct AutopilotConfiguration {
    /// CleanupDeadServers controls whether to remove dead servers from the Raft
    /// peer list when a new server joins
    #[serde(rename = "CleanupDeadServers")]
    pub cleanup_dead_servers: bool,

    /// LastContactThreshold is the limit on the amount of time a server can go
    /// without leader contact before being considered unhealthy.
    #[serde(
        rename = "LastContactThreshold",
        serialize_with = "crate::serialize_duration",
        deserialize_with = "crate::deserialize_duration"
    )]
    pub last_contact_threshold: chrono::TimeDelta,

    /// MaxTrailingLogs is the amount of entries in the Raft Log that a server can
    /// be behind before being considered unhealthy.
    #[serde(rename = "MaxTrailingLogs")]
    pub max_trailing_logs: u64,

    /// (Enterprise-only) DisableUpgradeMigration will disable Autopilot's upgrade migration
    /// strategy of waiting until enough newer-versioned servers have been added to the
    /// cluster before promoting them to voters.
    #[serde(rename = "DisableUpgradeMigration")]
    pub disable_upgrade_migration: bool,

    /// (Enterprise-only) EnableCustomUpgrades specifies whether to enable using custom
    /// upgrade versions when performing migrations.
    #[serde(rename = "EnableCustomUpgrades")]
    pub enable_custom_upgrades: bool,

    /// MinQuorum sets the minimum number of servers allowed in a cluster before
    /// autopilot can prune dead servers.
    #[serde(rename = "MinQuorum")]
    pub min_quorum: u64,

    /// ServerStabilizationTime is the minimum amount of time a server must be
    /// in a stable, healthy state before it can be added to the cluster. Only
    /// applicable with Raft protocol version 3 or higher.
    #[serde(
        rename = "ServerStabilizationTime",
        serialize_with = "crate::serialize_duration",
        deserialize_with = "crate::deserialize_duration"
    )]
    pub server_stabilization_time: chrono::TimeDelta,

    /// (Enterprise-only) EnableRedundancyZones specifies whether to enable redundancy zones.
    #[serde(rename = "EnableRedundancyZones")]
    pub enable_redundancy_zones: bool,

    /// CreateIndex holds the index corresponding the creation of this configuration.
    /// This is a read-only field.
    #[serde(rename = "CreateIndex")]
    pub create_index: u64,

    /// ModifyIndex will be set to the index of the last update when retrieving the
    /// Autopilot configuration. Resubmitting a configuration with
    /// AutopilotCASConfiguration will perform a check-and-set operation which ensures
    /// there hasn't been a subsequent update since the configuration was retrieved.
    #[serde(rename = "ModifyIndex")]
    pub modify_index: u64,
}
