/*
 * ProxMox VE API
 *
 * ProxMox VE API
 *
 * The version of the OpenAPI document: 2.0
 * Contact: support@lumaserv.com
 * Generated by: https://github.com/openapitools/openapi-generator.git
 */


using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System.ComponentModel.DataAnnotations;
using OpenAPIDateConverter = ProxmoxSharp.Client.OpenAPIDateConverter;

namespace ProxmoxSharp.Model
{
    /// <summary>
    /// GetClusterSDNZones200ResponseDataInner
    /// </summary>
    [DataContract(Name = "getClusterSDNZones_200_response_data_inner")]
    public partial class GetClusterSDNZones200ResponseDataInner : IValidatableObject
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="GetClusterSDNZones200ResponseDataInner" /> class.
        /// </summary>
        /// <param name="advertiseSubnets">Advertise IP prefixes (Type-5 routes) instead of MAC/IP pairs (Type-2 routes). EVPN zone only..</param>
        /// <param name="bridge">the bridge for which VLANs should be managed. VLAN &amp; QinQ zone only..</param>
        /// <param name="bridgeDisableMacLearning">Disable auto mac learning. VLAN zone only..</param>
        /// <param name="controller">ID of the controller for this zone. EVPN zone only..</param>
        /// <param name="dhcp">Name of DHCP server backend for this zone..</param>
        /// <param name="digest">Digest of the controller section..</param>
        /// <param name="disableArpNdSuppression">Suppress IPv4 ARP &amp;&amp; IPv6 Neighbour Discovery messages. EVPN zone only..</param>
        /// <param name="dns">ID of the DNS server for this zone..</param>
        /// <param name="dnszone">Domain name for this zone..</param>
        /// <param name="exitnodes">List of PVE Nodes that should act as exit node for this zone. EVPN zone only..</param>
        /// <param name="exitnodesLocalRouting">Create routes on the exit nodes, so they can connect to EVPN guests. EVPN zone only..</param>
        /// <param name="exitnodesPrimary">Force traffic through this exitnode first. EVPN zone only..</param>
        /// <param name="ipam">ID of the IPAM for this zone..</param>
        /// <param name="mac">MAC address of the anycast router for this zone..</param>
        /// <param name="mtu">MTU of the zone, will be used for the created VNet bridges..</param>
        /// <param name="nodes">Nodes where this zone should be created..</param>
        /// <param name="peers">Comma-separated list of peers, that are part of the VXLAN zone. Usually the IPs of the nodes. VXLAN zone only..</param>
        /// <param name="pending">pending.</param>
        /// <param name="reversedns">ID of the reverse DNS server for this zone..</param>
        /// <param name="rtImport">Route-Targets that should be imported into the VRF of this zone via BGP. EVPN zone only..</param>
        /// <param name="state">State of the SDN configuration object..</param>
        /// <param name="tag">Service-VLAN Tag (outer VLAN). QinQ zone only.</param>
        /// <param name="type">Type of the zone..</param>
        /// <param name="vlanProtocol">VLAN protocol for the creation of the QinQ zone. QinQ zone only..</param>
        /// <param name="vrfVxlan">VNI for the zone VRF. EVPN zone only..</param>
        /// <param name="vxlanPort">UDP port that should be used for the VXLAN tunnel (default 4789). VXLAN zone only..</param>
        /// <param name="zone">Name of the zone..</param>
        public GetClusterSDNZones200ResponseDataInner(Int64 advertiseSubnets = default(Int64), string bridge = default(string), Int64 bridgeDisableMacLearning = default(Int64), string controller = default(string), string dhcp = default(string), string digest = default(string), Int64 disableArpNdSuppression = default(Int64), string dns = default(string), string dnszone = default(string), string exitnodes = default(string), Int64 exitnodesLocalRouting = default(Int64), string exitnodesPrimary = default(string), string ipam = default(string), string mac = default(string), Int64 mtu = default(Int64), string nodes = default(string), string peers = default(string), GetClusterSDNZones200ResponseDataInnerPending pending = default(GetClusterSDNZones200ResponseDataInnerPending), string reversedns = default(string), string rtImport = default(string), string state = default(string), Int64 tag = default(Int64), string type = default(string), string vlanProtocol = default(string), Int64 vrfVxlan = default(Int64), Int64 vxlanPort = default(Int64), string zone = default(string))
        {
            this.AdvertiseSubnets = advertiseSubnets;
            this.Bridge = bridge;
            this.BridgeDisableMacLearning = bridgeDisableMacLearning;
            this.Controller = controller;
            this.Dhcp = dhcp;
            this.Digest = digest;
            this.DisableArpNdSuppression = disableArpNdSuppression;
            this.Dns = dns;
            this.Dnszone = dnszone;
            this.Exitnodes = exitnodes;
            this.ExitnodesLocalRouting = exitnodesLocalRouting;
            this.ExitnodesPrimary = exitnodesPrimary;
            this.Ipam = ipam;
            this.Mac = mac;
            this.Mtu = mtu;
            this.Nodes = nodes;
            this.Peers = peers;
            this.Pending = pending;
            this.Reversedns = reversedns;
            this.RtImport = rtImport;
            this.State = state;
            this.Tag = tag;
            this.Type = type;
            this.VlanProtocol = vlanProtocol;
            this.VrfVxlan = vrfVxlan;
            this.VxlanPort = vxlanPort;
            this.Zone = zone;
        }

        /// <summary>
        /// Advertise IP prefixes (Type-5 routes) instead of MAC/IP pairs (Type-2 routes). EVPN zone only.
        /// </summary>
        /// <value>Advertise IP prefixes (Type-5 routes) instead of MAC/IP pairs (Type-2 routes). EVPN zone only.</value>
        [DataMember(Name = "advertise-subnets", EmitDefaultValue = false)]
        public Int64 AdvertiseSubnets { get; set; }

        /// <summary>
        /// the bridge for which VLANs should be managed. VLAN &amp; QinQ zone only.
        /// </summary>
        /// <value>the bridge for which VLANs should be managed. VLAN &amp; QinQ zone only.</value>
        [DataMember(Name = "bridge", EmitDefaultValue = false)]
        public string Bridge { get; set; }

        /// <summary>
        /// Disable auto mac learning. VLAN zone only.
        /// </summary>
        /// <value>Disable auto mac learning. VLAN zone only.</value>
        [DataMember(Name = "bridge-disable-mac-learning", EmitDefaultValue = false)]
        public Int64 BridgeDisableMacLearning { get; set; }

        /// <summary>
        /// ID of the controller for this zone. EVPN zone only.
        /// </summary>
        /// <value>ID of the controller for this zone. EVPN zone only.</value>
        [DataMember(Name = "controller", EmitDefaultValue = false)]
        public string Controller { get; set; }

        /// <summary>
        /// Name of DHCP server backend for this zone.
        /// </summary>
        /// <value>Name of DHCP server backend for this zone.</value>
        [DataMember(Name = "dhcp", EmitDefaultValue = false)]
        public string Dhcp { get; set; }

        /// <summary>
        /// Digest of the controller section.
        /// </summary>
        /// <value>Digest of the controller section.</value>
        [DataMember(Name = "digest", EmitDefaultValue = false)]
        public string Digest { get; set; }

        /// <summary>
        /// Suppress IPv4 ARP &amp;&amp; IPv6 Neighbour Discovery messages. EVPN zone only.
        /// </summary>
        /// <value>Suppress IPv4 ARP &amp;&amp; IPv6 Neighbour Discovery messages. EVPN zone only.</value>
        [DataMember(Name = "disable-arp-nd-suppression", EmitDefaultValue = false)]
        public Int64 DisableArpNdSuppression { get; set; }

        /// <summary>
        /// ID of the DNS server for this zone.
        /// </summary>
        /// <value>ID of the DNS server for this zone.</value>
        [DataMember(Name = "dns", EmitDefaultValue = false)]
        public string Dns { get; set; }

        /// <summary>
        /// Domain name for this zone.
        /// </summary>
        /// <value>Domain name for this zone.</value>
        [DataMember(Name = "dnszone", EmitDefaultValue = false)]
        public string Dnszone { get; set; }

        /// <summary>
        /// List of PVE Nodes that should act as exit node for this zone. EVPN zone only.
        /// </summary>
        /// <value>List of PVE Nodes that should act as exit node for this zone. EVPN zone only.</value>
        [DataMember(Name = "exitnodes", EmitDefaultValue = false)]
        public string Exitnodes { get; set; }

        /// <summary>
        /// Create routes on the exit nodes, so they can connect to EVPN guests. EVPN zone only.
        /// </summary>
        /// <value>Create routes on the exit nodes, so they can connect to EVPN guests. EVPN zone only.</value>
        [DataMember(Name = "exitnodes-local-routing", EmitDefaultValue = false)]
        public Int64 ExitnodesLocalRouting { get; set; }

        /// <summary>
        /// Force traffic through this exitnode first. EVPN zone only.
        /// </summary>
        /// <value>Force traffic through this exitnode first. EVPN zone only.</value>
        [DataMember(Name = "exitnodes-primary", EmitDefaultValue = false)]
        public string ExitnodesPrimary { get; set; }

        /// <summary>
        /// ID of the IPAM for this zone.
        /// </summary>
        /// <value>ID of the IPAM for this zone.</value>
        [DataMember(Name = "ipam", EmitDefaultValue = false)]
        public string Ipam { get; set; }

        /// <summary>
        /// MAC address of the anycast router for this zone.
        /// </summary>
        /// <value>MAC address of the anycast router for this zone.</value>
        [DataMember(Name = "mac", EmitDefaultValue = false)]
        public string Mac { get; set; }

        /// <summary>
        /// MTU of the zone, will be used for the created VNet bridges.
        /// </summary>
        /// <value>MTU of the zone, will be used for the created VNet bridges.</value>
        [DataMember(Name = "mtu", EmitDefaultValue = false)]
        public Int64 Mtu { get; set; }

        /// <summary>
        /// Nodes where this zone should be created.
        /// </summary>
        /// <value>Nodes where this zone should be created.</value>
        [DataMember(Name = "nodes", EmitDefaultValue = false)]
        public string Nodes { get; set; }

        /// <summary>
        /// Comma-separated list of peers, that are part of the VXLAN zone. Usually the IPs of the nodes. VXLAN zone only.
        /// </summary>
        /// <value>Comma-separated list of peers, that are part of the VXLAN zone. Usually the IPs of the nodes. VXLAN zone only.</value>
        [DataMember(Name = "peers", EmitDefaultValue = false)]
        public string Peers { get; set; }

        /// <summary>
        /// Gets or Sets Pending
        /// </summary>
        [DataMember(Name = "pending", EmitDefaultValue = false)]
        public GetClusterSDNZones200ResponseDataInnerPending Pending { get; set; }

        /// <summary>
        /// ID of the reverse DNS server for this zone.
        /// </summary>
        /// <value>ID of the reverse DNS server for this zone.</value>
        [DataMember(Name = "reversedns", EmitDefaultValue = false)]
        public string Reversedns { get; set; }

        /// <summary>
        /// Route-Targets that should be imported into the VRF of this zone via BGP. EVPN zone only.
        /// </summary>
        /// <value>Route-Targets that should be imported into the VRF of this zone via BGP. EVPN zone only.</value>
        [DataMember(Name = "rt-import", EmitDefaultValue = false)]
        public string RtImport { get; set; }

        /// <summary>
        /// State of the SDN configuration object.
        /// </summary>
        /// <value>State of the SDN configuration object.</value>
        [DataMember(Name = "state", EmitDefaultValue = false)]
        public string State { get; set; }

        /// <summary>
        /// Service-VLAN Tag (outer VLAN). QinQ zone only
        /// </summary>
        /// <value>Service-VLAN Tag (outer VLAN). QinQ zone only</value>
        [DataMember(Name = "tag", EmitDefaultValue = false)]
        public Int64 Tag { get; set; }

        /// <summary>
        /// Type of the zone.
        /// </summary>
        /// <value>Type of the zone.</value>
        [DataMember(Name = "type", EmitDefaultValue = false)]
        public string Type { get; set; }

        /// <summary>
        /// VLAN protocol for the creation of the QinQ zone. QinQ zone only.
        /// </summary>
        /// <value>VLAN protocol for the creation of the QinQ zone. QinQ zone only.</value>
        [DataMember(Name = "vlan-protocol", EmitDefaultValue = false)]
        public string VlanProtocol { get; set; }

        /// <summary>
        /// VNI for the zone VRF. EVPN zone only.
        /// </summary>
        /// <value>VNI for the zone VRF. EVPN zone only.</value>
        [DataMember(Name = "vrf-vxlan", EmitDefaultValue = false)]
        public Int64 VrfVxlan { get; set; }

        /// <summary>
        /// UDP port that should be used for the VXLAN tunnel (default 4789). VXLAN zone only.
        /// </summary>
        /// <value>UDP port that should be used for the VXLAN tunnel (default 4789). VXLAN zone only.</value>
        [DataMember(Name = "vxlan-port", EmitDefaultValue = false)]
        public Int64 VxlanPort { get; set; }

        /// <summary>
        /// Name of the zone.
        /// </summary>
        /// <value>Name of the zone.</value>
        [DataMember(Name = "zone", EmitDefaultValue = false)]
        public string Zone { get; set; }

        /// <summary>
        /// Returns the string presentation of the object
        /// </summary>
        /// <returns>String presentation of the object</returns>
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("class GetClusterSDNZones200ResponseDataInner {\n");
            sb.Append("  AdvertiseSubnets: ").Append(AdvertiseSubnets).Append("\n");
            sb.Append("  Bridge: ").Append(Bridge).Append("\n");
            sb.Append("  BridgeDisableMacLearning: ").Append(BridgeDisableMacLearning).Append("\n");
            sb.Append("  Controller: ").Append(Controller).Append("\n");
            sb.Append("  Dhcp: ").Append(Dhcp).Append("\n");
            sb.Append("  Digest: ").Append(Digest).Append("\n");
            sb.Append("  DisableArpNdSuppression: ").Append(DisableArpNdSuppression).Append("\n");
            sb.Append("  Dns: ").Append(Dns).Append("\n");
            sb.Append("  Dnszone: ").Append(Dnszone).Append("\n");
            sb.Append("  Exitnodes: ").Append(Exitnodes).Append("\n");
            sb.Append("  ExitnodesLocalRouting: ").Append(ExitnodesLocalRouting).Append("\n");
            sb.Append("  ExitnodesPrimary: ").Append(ExitnodesPrimary).Append("\n");
            sb.Append("  Ipam: ").Append(Ipam).Append("\n");
            sb.Append("  Mac: ").Append(Mac).Append("\n");
            sb.Append("  Mtu: ").Append(Mtu).Append("\n");
            sb.Append("  Nodes: ").Append(Nodes).Append("\n");
            sb.Append("  Peers: ").Append(Peers).Append("\n");
            sb.Append("  Pending: ").Append(Pending).Append("\n");
            sb.Append("  Reversedns: ").Append(Reversedns).Append("\n");
            sb.Append("  RtImport: ").Append(RtImport).Append("\n");
            sb.Append("  State: ").Append(State).Append("\n");
            sb.Append("  Tag: ").Append(Tag).Append("\n");
            sb.Append("  Type: ").Append(Type).Append("\n");
            sb.Append("  VlanProtocol: ").Append(VlanProtocol).Append("\n");
            sb.Append("  VrfVxlan: ").Append(VrfVxlan).Append("\n");
            sb.Append("  VxlanPort: ").Append(VxlanPort).Append("\n");
            sb.Append("  Zone: ").Append(Zone).Append("\n");
            sb.Append("}\n");
            return sb.ToString();
        }

        /// <summary>
        /// Returns the JSON string presentation of the object
        /// </summary>
        /// <returns>JSON string presentation of the object</returns>
        public virtual string ToJson()
        {
            return Newtonsoft.Json.JsonConvert.SerializeObject(this, Newtonsoft.Json.Formatting.Indented);
        }

        /// <summary>
        /// To validate all properties of the instance
        /// </summary>
        /// <param name="validationContext">Validation context</param>
        /// <returns>Validation Result</returns>
        IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
        {
            yield break;
        }
    }

}
