Models

from typing import Any, Dict, List, Literal, Optional, Union

GlobalOptionTypeDef = Literal["global"]

DefaultOptionTypeDef = Literal["default"]

VariableOptionTypeDef = Literal["variable"]

Ipv4SubnetMaskDef = Literal[
    "0.0.0.0",
    "128.0.0.0",
    "192.0.0.0",
    "224.0.0.0",
    "240.0.0.0",
    "248.0.0.0",
    "252.0.0.0",
    "254.0.0.0",
    "255.0.0.0",
    "255.128.0.0",
    "255.192.0.0",
    "255.224.0.0",
    "255.240.0.0",
    "255.252.0.0",
    "255.254.0.0",
    "255.255.0.0",
    "255.255.128.0",
    "255.255.192.0",
    "255.255.224.0",
    "255.255.240.0",
    "255.255.248.0",
    "255.255.252.0",
    "255.255.254.0",
    "255.255.255.0",
    "255.255.255.128",
    "255.255.255.192",
    "255.255.255.224",
    "255.255.255.240",
    "255.255.255.248",
    "255.255.255.252",
    "255.255.255.254",
    "255.255.255.255",
]

Ipv4GatewayDef = Literal["dhcp", "nextHop", "null0"]

DefaultIpv4GatewayDef = Literal["nextHop"]

Ipv6RouteNatDef = Literal["NAT64", "NAT66"]

ServiceTypeDef = Literal["TE"]

VpnIpv4GatewayDef = Literal["dhcp", "nextHop", "null0"]

VpnDefaultIpv4GatewayDef = Literal["nextHop"]

VpnServiceTypeDef = Literal["TE"]

WanVpnIpv4GatewayDef = Literal["dhcp", "nextHop", "null0"]

WanVpnDefaultIpv4GatewayDef = Literal["nextHop"]

WanVpnServiceTypeDef = Literal["TE"]


class OneOfVpnIdOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


class OneOfVpnIdOptionsDef2:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfEnhanceEcmpKeyingOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfEnhanceEcmpKeyingOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfEnhanceEcmpKeyingOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfPrimaryDnsAddressIpv4OptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfPrimaryDnsAddressIpv4OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfPrimaryDnsAddressIpv4OptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfSecondaryDnsAddressIpv4OptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfSecondaryDnsAddressIpv4OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfSecondaryDnsAddressIpv4OptionsDef3:
    option_type: DefaultOptionTypeDef


class DnsIpv4:
    primary_dns_address_ipv4: Optional[
        Union[
            OneOfPrimaryDnsAddressIpv4OptionsDef1,
            OneOfPrimaryDnsAddressIpv4OptionsDef2,
            OneOfPrimaryDnsAddressIpv4OptionsDef3,
        ]
    ]
    secondary_dns_address_ipv4: Optional[
        Union[
            OneOfSecondaryDnsAddressIpv4OptionsDef1,
            OneOfSecondaryDnsAddressIpv4OptionsDef2,
            OneOfSecondaryDnsAddressIpv4OptionsDef3,
        ]
    ]


class OneOfPrimaryDnsAddressIpv6OptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfPrimaryDnsAddressIpv6OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfPrimaryDnsAddressIpv6OptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfSecondaryDnsAddressIpv6OptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfSecondaryDnsAddressIpv6OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfSecondaryDnsAddressIpv6OptionsDef3:
    option_type: DefaultOptionTypeDef


class DnsIpv6:
    primary_dns_address_ipv6: Optional[
        Union[
            OneOfPrimaryDnsAddressIpv6OptionsDef1,
            OneOfPrimaryDnsAddressIpv6OptionsDef2,
            OneOfPrimaryDnsAddressIpv6OptionsDef3,
        ]
    ]
    secondary_dns_address_ipv6: Optional[
        Union[
            OneOfSecondaryDnsAddressIpv6OptionsDef1,
            OneOfSecondaryDnsAddressIpv6OptionsDef2,
            OneOfSecondaryDnsAddressIpv6OptionsDef3,
        ]
    ]


class OneOfHostNameOptionsWithoutDefault1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfHostNameOptionsWithoutDefault2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfListOfIpOptionsWithoutDefault1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfListOfIpOptionsWithoutDefault2:
    option_type: GlobalOptionTypeDef
    value: List[Union[Any, Any]]


class NewHostMapping:
    host_name: Union[
        OneOfHostNameOptionsWithoutDefault1,
        OneOfHostNameOptionsWithoutDefault2,
    ]
    list_of_ip: Union[
        OneOfListOfIpOptionsWithoutDefault1,
        OneOfListOfIpOptionsWithoutDefault2,
    ]


class OneOfIpV4AddressOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpV4AddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfIpV4SubnetMaskOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpV4SubnetMaskOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: (
        Ipv4SubnetMaskDef  # pytype: disable=annotation-type-mismatch
    )


class Prefix:
    """
    Prefix
    """

    ip_address: Optional[
        Union[
            OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
        ]
    ]
    subnet_mask: Optional[
        Union[
            OneOfIpV4SubnetMaskOptionsDef1,
            OneOfIpV4SubnetMaskOptionsDef2,
        ]
    ]


class Gateway:
    value: Optional[Any]


class OneOfIpv4NextHopAddressOptionsWithOutDefault1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv4NextHopAddressOptionsWithOutDefault2:
    option_type: GlobalOptionTypeDef
    value: Union[Any, str]


class OneOfIpv4NextHopDistanceOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv4NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class OneOfIpv4NextHopDistanceOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class NextHop:
    address: Optional[
        Union[
            OneOfIpv4NextHopAddressOptionsWithOutDefault1,
            OneOfIpv4NextHopAddressOptionsWithOutDefault2,
        ]
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            OneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class OneOfIpv4GatewayDistanceOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv4GatewayDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class OneOfIpv4GatewayDistanceOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class Ipv4Route1:
    gateway: Gateway
    # IPv4 Route Gateway Next Hop
    next_hop: List[NextHop]
    distance: Optional[
        Union[
            OneOfIpv4GatewayDistanceOptionsDef1,
            OneOfIpv4GatewayDistanceOptionsDef2,
            OneOfIpv4GatewayDistanceOptionsDef3,
        ]
    ]
    # Prefix
    prefix: Optional[Prefix]


class OneOfIpv4RouteGatewayOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: Ipv4GatewayDef  # pytype: disable=annotation-type-mismatch


class OneOfIpv4RouteGatewayOptionsDef2:
    option_type: DefaultOptionTypeDef
    value: DefaultIpv4GatewayDef  # pytype: disable=annotation-type-mismatch


class Ipv4Route2:
    distance: Optional[
        Union[
            OneOfIpv4GatewayDistanceOptionsDef1,
            OneOfIpv4GatewayDistanceOptionsDef2,
            OneOfIpv4GatewayDistanceOptionsDef3,
        ]
    ]
    gateway: Optional[
        Union[
            OneOfIpv4RouteGatewayOptionsDef1,
            OneOfIpv4RouteGatewayOptionsDef2,
        ]
    ]
    # IPv4 Route Gateway Next Hop
    next_hop: Optional[List[NextHop]]
    # Prefix
    prefix: Optional[Prefix]


class OneOfIpv6RoutePrefixOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv6RoutePrefixOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfIpv6NextHopAddressOptionsWithOutDefault1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv6NextHopAddressOptionsWithOutDefault2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfIpv6NextHopDistanceOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv6NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class OneOfIpv6NextHopDistanceOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class VpnNextHop:
    address: Union[
        OneOfIpv6NextHopAddressOptionsWithOutDefault1,
        OneOfIpv6NextHopAddressOptionsWithOutDefault2,
    ]
    distance: Union[
        OneOfIpv6NextHopDistanceOptionsDef1,
        OneOfIpv6NextHopDistanceOptionsDef2,
        OneOfIpv6NextHopDistanceOptionsDef3,
    ]


class NextHopContainer:
    # IPv6 Route Gateway Next Hop
    next_hop: Optional[List[VpnNextHop]]


class OneOfIpRoute1:
    next_hop_container: NextHopContainer


class OneOfIpv4V6RouteNull0OptionsWithoutVariable1:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfIpv4V6RouteNull0OptionsWithoutVariable2:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfIpRoute2:
    null0: Union[
        OneOfIpv4V6RouteNull0OptionsWithoutVariable1,
        OneOfIpv4V6RouteNull0OptionsWithoutVariable2,
    ]


class OneOfIpv6RouteNatOptionsWithoutDefault1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfIpv6RouteNatOptionsWithoutDefault2:
    option_type: GlobalOptionTypeDef
    value: Ipv6RouteNatDef  # pytype: disable=annotation-type-mismatch


class OneOfIpRoute3:
    nat: Union[
        OneOfIpv6RouteNatOptionsWithoutDefault1,
        OneOfIpv6RouteNatOptionsWithoutDefault2,
    ]


class Ipv6Route:
    one_of_ip_route: Union[
        OneOfIpRoute1, OneOfIpRoute2, OneOfIpRoute3
    ]
    prefix: Union[
        OneOfIpv6RoutePrefixOptionsDef1,
        OneOfIpv6RoutePrefixOptionsDef2,
    ]


class OneOfServiceTypeOptionsDef:
    option_type: GlobalOptionTypeDef
    value: ServiceTypeDef  # pytype: disable=annotation-type-mismatch


class Service:
    service_type: OneOfServiceTypeOptionsDef


class OneOfNat64V4PoolNameOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfNat64V4PoolNameOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfNat64V4PoolRangeStartOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfNat64V4PoolRangeStartOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfNat64V4PoolRangeEndOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfNat64V4PoolRangeEndOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfNat64V4PoolOverloadOptionsDef1:
    option_type: VariableOptionTypeDef
    value: str
    default: Optional[str]
    description: Optional[str]


class OneOfNat64V4PoolOverloadOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfNat64V4PoolOverloadOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: bool


class Nat64V4Pool:
    nat64_v4_pool_name: Union[
        OneOfNat64V4PoolNameOptionsDef1,
        OneOfNat64V4PoolNameOptionsDef2,
    ]
    nat64_v4_pool_overload: Union[
        OneOfNat64V4PoolOverloadOptionsDef1,
        OneOfNat64V4PoolOverloadOptionsDef2,
        OneOfNat64V4PoolOverloadOptionsDef3,
    ]
    nat64_v4_pool_range_end: Union[
        OneOfNat64V4PoolRangeEndOptionsDef1,
        OneOfNat64V4PoolRangeEndOptionsDef2,
    ]
    nat64_v4_pool_range_start: Union[
        OneOfNat64V4PoolRangeStartOptionsDef1,
        OneOfNat64V4PoolRangeStartOptionsDef2,
    ]


class VpnData:
    enhance_ecmp_keying: Union[
        OneOfEnhanceEcmpKeyingOptionsDef1,
        OneOfEnhanceEcmpKeyingOptionsDef2,
        OneOfEnhanceEcmpKeyingOptionsDef3,
    ]
    vpn_id: Union[OneOfVpnIdOptionsDef1, OneOfVpnIdOptionsDef2]
    dns_ipv4: Optional[DnsIpv4]
    dns_ipv6: Optional[DnsIpv6]
    # IPv4 Static Route
    ipv4_route: Optional[List[Union[Ipv4Route1, Ipv4Route2]]]
    # IPv6 Static Route
    ipv6_route: Optional[List[Ipv6Route]]
    # NAT64 V4 Pool
    nat64_v4_pool: Optional[List[Nat64V4Pool]]
    new_host_mapping: Optional[List[NewHostMapping]]
    # Service
    service: Optional[List[Service]]


class Payload:
    """
    WAN VPN profile parcel schema for POST request
    """

    data: VpnData
    name: str
    # Set the parcel description
    description: Optional[str]
    metadata: Optional[Any]


class Data:
    # User who last created this.
    created_by: Optional[str]
    # Timestamp of creation
    created_on: Optional[int]
    # User who last updated this.
    last_updated_by: Optional[str]
    # Timestamp of last update
    last_updated_on: Optional[int]
    parcel_id: Optional[str]
    parcel_type: Optional[str]
    # WAN VPN profile parcel schema for POST request
    payload: Optional[Payload]


class GetListSdwanTransportWanVpnPayload:
    data: Optional[List[Data]]


class CreateWanVpnProfileParcelForTransportPostResponse:
    """
    Profile Parcel POST Response schema
    """

    parcel_id: str
    metadata: Optional[Any]


class WanVpnData:
    enhance_ecmp_keying: Union[
        OneOfEnhanceEcmpKeyingOptionsDef1,
        OneOfEnhanceEcmpKeyingOptionsDef2,
        OneOfEnhanceEcmpKeyingOptionsDef3,
    ]
    vpn_id: Union[OneOfVpnIdOptionsDef1, OneOfVpnIdOptionsDef2]
    dns_ipv4: Optional[DnsIpv4]
    dns_ipv6: Optional[DnsIpv6]
    # IPv4 Static Route
    ipv4_route: Optional[List[Union[Ipv4Route1, Ipv4Route2]]]
    # IPv6 Static Route
    ipv6_route: Optional[List[Ipv6Route]]
    # NAT64 V4 Pool
    nat64_v4_pool: Optional[List[Nat64V4Pool]]
    new_host_mapping: Optional[List[NewHostMapping]]
    # Service
    service: Optional[List[Service]]


class CreateWanVpnProfileParcelForTransportPostRequest:
    """
    WAN VPN profile parcel schema for POST request
    """

    data: WanVpnData
    name: str
    # Set the parcel description
    description: Optional[str]
    metadata: Optional[Any]


class VpnOneOfVpnIdOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


class VpnOneOfPrimaryDnsAddressIpv4OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class VpnOneOfSecondaryDnsAddressIpv4OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class VpnDnsIpv4:
    primary_dns_address_ipv4: Optional[
        Union[
            OneOfPrimaryDnsAddressIpv4OptionsDef1,
            VpnOneOfPrimaryDnsAddressIpv4OptionsDef2,
            OneOfPrimaryDnsAddressIpv4OptionsDef3,
        ]
    ]
    secondary_dns_address_ipv4: Optional[
        Union[
            OneOfSecondaryDnsAddressIpv4OptionsDef1,
            VpnOneOfSecondaryDnsAddressIpv4OptionsDef2,
            OneOfSecondaryDnsAddressIpv4OptionsDef3,
        ]
    ]


class VpnDnsIpv6:
    primary_dns_address_ipv6: Optional[
        Union[
            OneOfPrimaryDnsAddressIpv6OptionsDef1,
            OneOfPrimaryDnsAddressIpv6OptionsDef2,
            OneOfPrimaryDnsAddressIpv6OptionsDef3,
        ]
    ]
    secondary_dns_address_ipv6: Optional[
        Union[
            OneOfSecondaryDnsAddressIpv6OptionsDef1,
            OneOfSecondaryDnsAddressIpv6OptionsDef2,
            OneOfSecondaryDnsAddressIpv6OptionsDef3,
        ]
    ]


class VpnOneOfIpV4AddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class VpnPrefix:
    """
    Prefix
    """

    ip_address: Optional[
        Union[
            OneOfIpV4AddressOptionsDef1,
            VpnOneOfIpV4AddressOptionsDef2,
        ]
    ]
    subnet_mask: Optional[
        Union[
            OneOfIpV4SubnetMaskOptionsDef1,
            OneOfIpV4SubnetMaskOptionsDef2,
        ]
    ]


class VpnOneOfIpv4NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class WanVpnNextHop:
    address: Optional[
        Union[
            OneOfIpv4NextHopAddressOptionsWithOutDefault1,
            OneOfIpv4NextHopAddressOptionsWithOutDefault2,
        ]
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            VpnOneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class VpnOneOfIpv4GatewayDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class VpnIpv4Route1:
    gateway: Gateway
    # IPv4 Route Gateway Next Hop
    next_hop: List[WanVpnNextHop]
    distance: Optional[
        Union[
            OneOfIpv4GatewayDistanceOptionsDef1,
            VpnOneOfIpv4GatewayDistanceOptionsDef2,
            OneOfIpv4GatewayDistanceOptionsDef3,
        ]
    ]
    # Prefix
    prefix: Optional[VpnPrefix]


class WanVpnOneOfIpV4AddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class WanVpnPrefix:
    """
    Prefix
    """

    ip_address: Optional[
        Union[
            OneOfIpV4AddressOptionsDef1,
            WanVpnOneOfIpV4AddressOptionsDef2,
        ]
    ]
    subnet_mask: Optional[
        Union[
            OneOfIpV4SubnetMaskOptionsDef1,
            OneOfIpV4SubnetMaskOptionsDef2,
        ]
    ]


class VpnOneOfIpv4RouteGatewayOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: (
        VpnIpv4GatewayDef  # pytype: disable=annotation-type-mismatch
    )


class VpnOneOfIpv4RouteGatewayOptionsDef2:
    option_type: DefaultOptionTypeDef
    value: VpnDefaultIpv4GatewayDef  # pytype: disable=annotation-type-mismatch


class WanVpnOneOfIpv4NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class TransportWanVpnNextHop:
    address: Optional[
        Union[
            OneOfIpv4NextHopAddressOptionsWithOutDefault1,
            OneOfIpv4NextHopAddressOptionsWithOutDefault2,
        ]
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            WanVpnOneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class WanVpnOneOfIpv4GatewayDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class VpnIpv4Route2:
    distance: Optional[
        Union[
            OneOfIpv4GatewayDistanceOptionsDef1,
            WanVpnOneOfIpv4GatewayDistanceOptionsDef2,
            OneOfIpv4GatewayDistanceOptionsDef3,
        ]
    ]
    gateway: Optional[
        Union[
            VpnOneOfIpv4RouteGatewayOptionsDef1,
            VpnOneOfIpv4RouteGatewayOptionsDef2,
        ]
    ]
    # IPv4 Route Gateway Next Hop
    next_hop: Optional[List[TransportWanVpnNextHop]]
    # Prefix
    prefix: Optional[WanVpnPrefix]


class VpnOneOfIpv6NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class SdwanTransportWanVpnNextHop:
    address: Union[
        OneOfIpv6NextHopAddressOptionsWithOutDefault1,
        OneOfIpv6NextHopAddressOptionsWithOutDefault2,
    ]
    distance: Union[
        OneOfIpv6NextHopDistanceOptionsDef1,
        VpnOneOfIpv6NextHopDistanceOptionsDef2,
        OneOfIpv6NextHopDistanceOptionsDef3,
    ]


class VpnNextHopContainer:
    # IPv6 Route Gateway Next Hop
    next_hop: Optional[List[SdwanTransportWanVpnNextHop]]


class VpnOneOfIpRoute1:
    next_hop_container: VpnNextHopContainer


class VpnIpv6Route:
    one_of_ip_route: Union[
        VpnOneOfIpRoute1, OneOfIpRoute2, OneOfIpRoute3
    ]
    prefix: Union[
        OneOfIpv6RoutePrefixOptionsDef1,
        OneOfIpv6RoutePrefixOptionsDef2,
    ]


class VpnOneOfServiceTypeOptionsDef:
    option_type: GlobalOptionTypeDef
    value: (
        VpnServiceTypeDef  # pytype: disable=annotation-type-mismatch
    )


class VpnService:
    service_type: VpnOneOfServiceTypeOptionsDef


class VpnOneOfNat64V4PoolNameOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class VpnOneOfNat64V4PoolRangeStartOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class VpnOneOfNat64V4PoolRangeEndOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class VpnNat64V4Pool:
    nat64_v4_pool_name: Union[
        OneOfNat64V4PoolNameOptionsDef1,
        VpnOneOfNat64V4PoolNameOptionsDef2,
    ]
    nat64_v4_pool_overload: Union[
        OneOfNat64V4PoolOverloadOptionsDef1,
        OneOfNat64V4PoolOverloadOptionsDef2,
        OneOfNat64V4PoolOverloadOptionsDef3,
    ]
    nat64_v4_pool_range_end: Union[
        OneOfNat64V4PoolRangeEndOptionsDef1,
        VpnOneOfNat64V4PoolRangeEndOptionsDef2,
    ]
    nat64_v4_pool_range_start: Union[
        OneOfNat64V4PoolRangeStartOptionsDef1,
        VpnOneOfNat64V4PoolRangeStartOptionsDef2,
    ]


class TransportWanVpnData:
    enhance_ecmp_keying: Union[
        OneOfEnhanceEcmpKeyingOptionsDef1,
        OneOfEnhanceEcmpKeyingOptionsDef2,
        OneOfEnhanceEcmpKeyingOptionsDef3,
    ]
    vpn_id: Union[VpnOneOfVpnIdOptionsDef1, OneOfVpnIdOptionsDef2]
    dns_ipv4: Optional[VpnDnsIpv4]
    dns_ipv6: Optional[VpnDnsIpv6]
    # IPv4 Static Route
    ipv4_route: Optional[List[Union[VpnIpv4Route1, VpnIpv4Route2]]]
    # IPv6 Static Route
    ipv6_route: Optional[List[VpnIpv6Route]]
    # NAT64 V4 Pool
    nat64_v4_pool: Optional[List[VpnNat64V4Pool]]
    new_host_mapping: Optional[List[NewHostMapping]]
    # Service
    service: Optional[List[VpnService]]


class VpnPayload:
    """
    WAN VPN profile parcel schema for PUT request
    """

    data: TransportWanVpnData
    name: str
    # Set the parcel description
    description: Optional[str]
    metadata: Optional[Any]


class GetSingleSdwanTransportWanVpnPayload:
    # User who last created this.
    created_by: Optional[str]
    # Timestamp of creation
    created_on: Optional[int]
    # User who last updated this.
    last_updated_by: Optional[str]
    # Timestamp of last update
    last_updated_on: Optional[int]
    parcel_id: Optional[str]
    parcel_type: Optional[str]
    # WAN VPN profile parcel schema for PUT request
    payload: Optional[VpnPayload]


class EditWanVpnProfileParcelForTransportPutResponse:
    """
    Profile Parcel PUT Response schema
    """

    id: str
    metadata: Optional[Any]


class WanVpnOneOfVpnIdOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


class WanVpnOneOfPrimaryDnsAddressIpv4OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class WanVpnOneOfSecondaryDnsAddressIpv4OptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class WanVpnDnsIpv4:
    primary_dns_address_ipv4: Optional[
        Union[
            OneOfPrimaryDnsAddressIpv4OptionsDef1,
            WanVpnOneOfPrimaryDnsAddressIpv4OptionsDef2,
            OneOfPrimaryDnsAddressIpv4OptionsDef3,
        ]
    ]
    secondary_dns_address_ipv4: Optional[
        Union[
            OneOfSecondaryDnsAddressIpv4OptionsDef1,
            WanVpnOneOfSecondaryDnsAddressIpv4OptionsDef2,
            OneOfSecondaryDnsAddressIpv4OptionsDef3,
        ]
    ]


class WanVpnDnsIpv6:
    primary_dns_address_ipv6: Optional[
        Union[
            OneOfPrimaryDnsAddressIpv6OptionsDef1,
            OneOfPrimaryDnsAddressIpv6OptionsDef2,
            OneOfPrimaryDnsAddressIpv6OptionsDef3,
        ]
    ]
    secondary_dns_address_ipv6: Optional[
        Union[
            OneOfSecondaryDnsAddressIpv6OptionsDef1,
            OneOfSecondaryDnsAddressIpv6OptionsDef2,
            OneOfSecondaryDnsAddressIpv6OptionsDef3,
        ]
    ]


class TransportWanVpnOneOfIpV4AddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class TransportWanVpnPrefix:
    """
    Prefix
    """

    ip_address: Optional[
        Union[
            OneOfIpV4AddressOptionsDef1,
            TransportWanVpnOneOfIpV4AddressOptionsDef2,
        ]
    ]
    subnet_mask: Optional[
        Union[
            OneOfIpV4SubnetMaskOptionsDef1,
            OneOfIpV4SubnetMaskOptionsDef2,
        ]
    ]


class TransportWanVpnOneOfIpv4NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class FeatureProfileSdwanTransportWanVpnNextHop:
    address: Optional[
        Union[
            OneOfIpv4NextHopAddressOptionsWithOutDefault1,
            OneOfIpv4NextHopAddressOptionsWithOutDefault2,
        ]
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            TransportWanVpnOneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class TransportWanVpnOneOfIpv4GatewayDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class WanVpnIpv4Route1:
    gateway: Gateway
    # IPv4 Route Gateway Next Hop
    next_hop: List[FeatureProfileSdwanTransportWanVpnNextHop]
    distance: Optional[
        Union[
            OneOfIpv4GatewayDistanceOptionsDef1,
            TransportWanVpnOneOfIpv4GatewayDistanceOptionsDef2,
            OneOfIpv4GatewayDistanceOptionsDef3,
        ]
    ]
    # Prefix
    prefix: Optional[TransportWanVpnPrefix]


class SdwanTransportWanVpnOneOfIpV4AddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class SdwanTransportWanVpnPrefix:
    """
    Prefix
    """

    ip_address: Optional[
        Union[
            OneOfIpV4AddressOptionsDef1,
            SdwanTransportWanVpnOneOfIpV4AddressOptionsDef2,
        ]
    ]
    subnet_mask: Optional[
        Union[
            OneOfIpV4SubnetMaskOptionsDef1,
            OneOfIpV4SubnetMaskOptionsDef2,
        ]
    ]


class WanVpnOneOfIpv4RouteGatewayOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: WanVpnIpv4GatewayDef  # pytype: disable=annotation-type-mismatch


class WanVpnOneOfIpv4RouteGatewayOptionsDef2:
    option_type: DefaultOptionTypeDef
    value: WanVpnDefaultIpv4GatewayDef  # pytype: disable=annotation-type-mismatch


class SdwanTransportWanVpnOneOfIpv4NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class V1FeatureProfileSdwanTransportWanVpnNextHop:
    address: Optional[
        Union[
            OneOfIpv4NextHopAddressOptionsWithOutDefault1,
            OneOfIpv4NextHopAddressOptionsWithOutDefault2,
        ]
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            SdwanTransportWanVpnOneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class SdwanTransportWanVpnOneOfIpv4GatewayDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class WanVpnIpv4Route2:
    distance: Optional[
        Union[
            OneOfIpv4GatewayDistanceOptionsDef1,
            SdwanTransportWanVpnOneOfIpv4GatewayDistanceOptionsDef2,
            OneOfIpv4GatewayDistanceOptionsDef3,
        ]
    ]
    gateway: Optional[
        Union[
            WanVpnOneOfIpv4RouteGatewayOptionsDef1,
            WanVpnOneOfIpv4RouteGatewayOptionsDef2,
        ]
    ]
    # IPv4 Route Gateway Next Hop
    next_hop: Optional[
        List[V1FeatureProfileSdwanTransportWanVpnNextHop]
    ]
    # Prefix
    prefix: Optional[SdwanTransportWanVpnPrefix]


class WanVpnOneOfIpv6NextHopDistanceOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class NextHop1:
    address: Union[
        OneOfIpv6NextHopAddressOptionsWithOutDefault1,
        OneOfIpv6NextHopAddressOptionsWithOutDefault2,
    ]
    distance: Union[
        OneOfIpv6NextHopDistanceOptionsDef1,
        WanVpnOneOfIpv6NextHopDistanceOptionsDef2,
        OneOfIpv6NextHopDistanceOptionsDef3,
    ]


class WanVpnNextHopContainer:
    # IPv6 Route Gateway Next Hop
    next_hop: Optional[List[NextHop1]]


class WanVpnOneOfIpRoute1:
    next_hop_container: WanVpnNextHopContainer


class WanVpnIpv6Route:
    one_of_ip_route: Union[
        WanVpnOneOfIpRoute1, OneOfIpRoute2, OneOfIpRoute3
    ]
    prefix: Union[
        OneOfIpv6RoutePrefixOptionsDef1,
        OneOfIpv6RoutePrefixOptionsDef2,
    ]


class WanVpnOneOfServiceTypeOptionsDef:
    option_type: GlobalOptionTypeDef
    value: WanVpnServiceTypeDef  # pytype: disable=annotation-type-mismatch


class WanVpnService:
    service_type: WanVpnOneOfServiceTypeOptionsDef


class WanVpnOneOfNat64V4PoolNameOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class WanVpnOneOfNat64V4PoolRangeStartOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class WanVpnOneOfNat64V4PoolRangeEndOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class WanVpnNat64V4Pool:
    nat64_v4_pool_name: Union[
        OneOfNat64V4PoolNameOptionsDef1,
        WanVpnOneOfNat64V4PoolNameOptionsDef2,
    ]
    nat64_v4_pool_overload: Union[
        OneOfNat64V4PoolOverloadOptionsDef1,
        OneOfNat64V4PoolOverloadOptionsDef2,
        OneOfNat64V4PoolOverloadOptionsDef3,
    ]
    nat64_v4_pool_range_end: Union[
        OneOfNat64V4PoolRangeEndOptionsDef1,
        WanVpnOneOfNat64V4PoolRangeEndOptionsDef2,
    ]
    nat64_v4_pool_range_start: Union[
        OneOfNat64V4PoolRangeStartOptionsDef1,
        WanVpnOneOfNat64V4PoolRangeStartOptionsDef2,
    ]


class SdwanTransportWanVpnData:
    enhance_ecmp_keying: Union[
        OneOfEnhanceEcmpKeyingOptionsDef1,
        OneOfEnhanceEcmpKeyingOptionsDef2,
        OneOfEnhanceEcmpKeyingOptionsDef3,
    ]
    vpn_id: Union[WanVpnOneOfVpnIdOptionsDef1, OneOfVpnIdOptionsDef2]
    dns_ipv4: Optional[WanVpnDnsIpv4]
    dns_ipv6: Optional[WanVpnDnsIpv6]
    # IPv4 Static Route
    ipv4_route: Optional[
        List[Union[WanVpnIpv4Route1, WanVpnIpv4Route2]]
    ]
    # IPv6 Static Route
    ipv6_route: Optional[List[WanVpnIpv6Route]]
    # NAT64 V4 Pool
    nat64_v4_pool: Optional[List[WanVpnNat64V4Pool]]
    new_host_mapping: Optional[List[NewHostMapping]]
    # Service
    service: Optional[List[WanVpnService]]


class EditWanVpnProfileParcelForTransportPutRequest:
    """
    WAN VPN profile parcel schema for PUT request
    """

    data: SdwanTransportWanVpnData
    name: str
    # Set the parcel description
    description: Optional[str]
    metadata: Optional[Any]