Models

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

GlobalOptionTypeDef = Literal["global"]

VariableOptionTypeDef = Literal["variable"]

DefaultOptionTypeDef = Literal["default"]

Value = Literal["ipv4-unicast", "vpnv4-unicast", "vpnv6-unicast"]

BgpValue = Literal["disable-peer", "warning-only"]

RoutingBgpValue = Literal["ipv6-unicast", "vpnv6-unicast"]

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",
]

Ipv4AddressFamilyRedistributeProtocolDef = Literal[
    "connected", "nat", "ospf", "ospfv3", "static"
]

OspfMatchRouteListDef = Literal[
    "External-type1", "External-type2", "Internal"
]

Ipv6AddressFamilyRedistributeProtocolDef = Literal[
    "connected", "ospf", "static"
]


class OneOfAsNumOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: Union[int, str]


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


class OneOfRouterIdOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class OneOfRouterIdOptionsDef3:
    option_type: DefaultOptionTypeDef


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


class OneOfOnBooleanDefaultFalseOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfOnBooleanDefaultFalseOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfExternalOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfExternalOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfInternalOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfInternalOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfLocalOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfLocalOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfKeepaliveOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfKeepaliveOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfHoldtimeOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfHoldtimeOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


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


class OneOfIpV4AddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: Any


class OneOfNeighborDescriptionOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class OneOfNeighborDescriptionOptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfLocalAsOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: Union[int, str]


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


class OneOfLocalAsOptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfInterfaceNameOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class OneOfInterfaceNameOptionsDef3:
    option_type: DefaultOptionTypeDef


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


class OneOfOnBooleanDefaultTrueOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfOnBooleanDefaultTrueOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfNeighborEbgpMultihopOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfNeighborEbgpMultihopOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfNeighborPasswordOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class OneOfNeighborPasswordOptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfOnBooleanDefaultFalseNoVariableOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfOnBooleanDefaultFalseNoVariableOptionsDef2:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfNeighborAsNumberOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfNeighborAsNumberOptionsDef3:
    option_type: DefaultOptionTypeDef


class WanIpv4NeighborAfTypeDef:
    option_type: GlobalOptionTypeDef
    value: Value  # pytype: disable=annotation-type-mismatch


class PolicyType:
    """
    Neighbor received maximum prefix policy is disabled.
    """

    option_type: GlobalOptionTypeDef
    value: Any


class NeighborMaxPrefixConfigDef1:
    # Neighbor received maximum prefix policy is disabled.
    policy_type: PolicyType


class BgpPolicyType:
    """
    Neighbor maximum prefix policy is enabled, when maximum prefix threshold is exceeded, policy action is restarting device.
    """

    option_type: GlobalOptionTypeDef
    value: Any


class OneOfNeighborMaxPrefixNumOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfNeighborAddressFamilyThresholdOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfNeighborAddressFamilyThresholdOptionsDef3:
    option_type: DefaultOptionTypeDef
    value: int


class OneOfNeighborMaxPrefixExceedRestartTimeOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class NeighborMaxPrefixConfigDef2:
    # Neighbor maximum prefix policy is enabled, when maximum prefix threshold is exceeded, policy action is restarting device.
    policy_type: BgpPolicyType
    prefix_num: Union[
        OneOfNeighborMaxPrefixNumOptionsDef1,
        OneOfNeighborMaxPrefixNumOptionsDef2,
    ]
    restart_interval: Union[
        OneOfNeighborMaxPrefixExceedRestartTimeOptionsDef1,
        OneOfNeighborMaxPrefixExceedRestartTimeOptionsDef2,
    ]
    threshold: Union[
        OneOfNeighborAddressFamilyThresholdOptionsDef1,
        OneOfNeighborAddressFamilyThresholdOptionsDef2,
        OneOfNeighborAddressFamilyThresholdOptionsDef3,
    ]


class RoutingBgpPolicyType:
    """
    Neighbor maximum prefix policy is enabled, when maximum prefix threshold is exceeded, policy action is warning-only or disable-peer.
    """

    option_type: GlobalOptionTypeDef
    value: BgpValue  # pytype: disable=annotation-type-mismatch


class NeighborMaxPrefixConfigDef3:
    # Neighbor maximum prefix policy is enabled, when maximum prefix threshold is exceeded, policy action is warning-only or disable-peer.
    policy_type: RoutingBgpPolicyType
    prefix_num: Union[
        OneOfNeighborMaxPrefixNumOptionsDef1,
        OneOfNeighborMaxPrefixNumOptionsDef2,
    ]
    threshold: Union[
        OneOfNeighborAddressFamilyThresholdOptionsDef1,
        OneOfNeighborAddressFamilyThresholdOptionsDef2,
        OneOfNeighborAddressFamilyThresholdOptionsDef3,
    ]


class OneOfRoutePolicyNameOptionsDef1:
    option_type: DefaultOptionTypeDef


class RefId:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfRoutePolicyNameOptionsDef2:
    ref_id: RefId


class AddressFamily:
    family_type: WanIpv4NeighborAfTypeDef
    in_route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]
    max_prefix_config: Optional[
        Union[
            NeighborMaxPrefixConfigDef1,
            NeighborMaxPrefixConfigDef2,
            NeighborMaxPrefixConfigDef3,
        ]
    ]
    out_route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class Neighbor:
    address: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    remote_as: Union[OneOfAsNumOptionsDef1, OneOfAsNumOptionsDef2]
    # Set BGP address family
    address_family: Optional[List[AddressFamily]]
    as_number: Optional[
        Union[
            OneOfNeighborAsNumberOptionsDef1,
            OneOfNeighborAsNumberOptionsDef2,
            OneOfNeighborAsNumberOptionsDef3,
        ]
    ]
    as_override: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    description: Optional[
        Union[
            OneOfNeighborDescriptionOptionsDef1,
            OneOfNeighborDescriptionOptionsDef2,
            OneOfNeighborDescriptionOptionsDef3,
        ]
    ]
    ebgp_multihop: Optional[
        Union[
            OneOfNeighborEbgpMultihopOptionsDef1,
            OneOfNeighborEbgpMultihopOptionsDef2,
            OneOfNeighborEbgpMultihopOptionsDef3,
        ]
    ]
    holdtime: Optional[
        Union[
            OneOfHoldtimeOptionsDef1,
            OneOfHoldtimeOptionsDef2,
            OneOfHoldtimeOptionsDef3,
        ]
    ]
    if_name: Optional[
        Union[
            OneOfInterfaceNameOptionsDef1,
            OneOfInterfaceNameOptionsDef2,
            OneOfInterfaceNameOptionsDef3,
        ]
    ]
    keepalive: Optional[
        Union[
            OneOfKeepaliveOptionsDef1,
            OneOfKeepaliveOptionsDef2,
            OneOfKeepaliveOptionsDef3,
        ]
    ]
    local_as: Optional[
        Union[
            OneOfLocalAsOptionsDef1,
            OneOfLocalAsOptionsDef2,
            OneOfLocalAsOptionsDef3,
        ]
    ]
    next_hop_self: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    password: Optional[
        Union[
            OneOfNeighborPasswordOptionsDef1,
            OneOfNeighborPasswordOptionsDef2,
            OneOfNeighborPasswordOptionsDef3,
        ]
    ]
    send_community: Optional[
        Union[
            OneOfOnBooleanDefaultTrueOptionsDef1,
            OneOfOnBooleanDefaultTrueOptionsDef2,
            OneOfOnBooleanDefaultTrueOptionsDef3,
        ]
    ]
    send_ext_community: Optional[
        Union[
            OneOfOnBooleanDefaultTrueOptionsDef1,
            OneOfOnBooleanDefaultTrueOptionsDef2,
            OneOfOnBooleanDefaultTrueOptionsDef3,
        ]
    ]
    send_label: Optional[
        Union[
            OneOfOnBooleanDefaultFalseNoVariableOptionsDef1,
            OneOfOnBooleanDefaultFalseNoVariableOptionsDef2,
        ]
    ]
    send_label_explicit: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    shutdown: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]


class OneOfIpv6AddrGlobalVariableOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class WanIpv6NeighborAfTypeDef:
    option_type: GlobalOptionTypeDef
    value: RoutingBgpValue  # pytype: disable=annotation-type-mismatch


class BgpAddressFamily:
    family_type: WanIpv6NeighborAfTypeDef
    in_route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]
    max_prefix_config: Optional[
        Union[
            NeighborMaxPrefixConfigDef1,
            NeighborMaxPrefixConfigDef2,
            NeighborMaxPrefixConfigDef3,
        ]
    ]
    out_route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class Ipv6Neighbor:
    address: Union[
        OneOfIpv6AddrGlobalVariableOptionsDef1,
        OneOfIpv6AddrGlobalVariableOptionsDef2,
    ]
    remote_as: Union[OneOfAsNumOptionsDef1, OneOfAsNumOptionsDef2]
    # Set IPv6 BGP address family
    address_family: Optional[List[BgpAddressFamily]]
    as_number: Optional[
        Union[
            OneOfNeighborAsNumberOptionsDef1,
            OneOfNeighborAsNumberOptionsDef2,
            OneOfNeighborAsNumberOptionsDef3,
        ]
    ]
    as_override: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    description: Optional[
        Union[
            OneOfNeighborDescriptionOptionsDef1,
            OneOfNeighborDescriptionOptionsDef2,
            OneOfNeighborDescriptionOptionsDef3,
        ]
    ]
    ebgp_multihop: Optional[
        Union[
            OneOfNeighborEbgpMultihopOptionsDef1,
            OneOfNeighborEbgpMultihopOptionsDef2,
            OneOfNeighborEbgpMultihopOptionsDef3,
        ]
    ]
    holdtime: Optional[
        Union[
            OneOfHoldtimeOptionsDef1,
            OneOfHoldtimeOptionsDef2,
            OneOfHoldtimeOptionsDef3,
        ]
    ]
    if_name: Optional[
        Union[
            OneOfInterfaceNameOptionsDef1,
            OneOfInterfaceNameOptionsDef2,
            OneOfInterfaceNameOptionsDef3,
        ]
    ]
    keepalive: Optional[
        Union[
            OneOfKeepaliveOptionsDef1,
            OneOfKeepaliveOptionsDef2,
            OneOfKeepaliveOptionsDef3,
        ]
    ]
    local_as: Optional[
        Union[
            OneOfLocalAsOptionsDef1,
            OneOfLocalAsOptionsDef2,
            OneOfLocalAsOptionsDef3,
        ]
    ]
    next_hop_self: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    password: Optional[
        Union[
            OneOfNeighborPasswordOptionsDef1,
            OneOfNeighborPasswordOptionsDef2,
            OneOfNeighborPasswordOptionsDef3,
        ]
    ]
    send_community: Optional[
        Union[
            OneOfOnBooleanDefaultTrueOptionsDef1,
            OneOfOnBooleanDefaultTrueOptionsDef2,
            OneOfOnBooleanDefaultTrueOptionsDef3,
        ]
    ]
    send_ext_community: Optional[
        Union[
            OneOfOnBooleanDefaultTrueOptionsDef1,
            OneOfOnBooleanDefaultTrueOptionsDef2,
            OneOfOnBooleanDefaultTrueOptionsDef3,
        ]
    ]
    shutdown: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]


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 Ipv4AddressAndMaskDef:
    address: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    mask: Union[
        OneOfIpV4SubnetMaskOptionsDef1, OneOfIpV4SubnetMaskOptionsDef2
    ]


class AggregateAddress:
    prefix: Ipv4AddressAndMaskDef
    as_set: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    summary_only: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]


class Network:
    prefix: Ipv4AddressAndMaskDef


class OneOfAddressFamilyPathsOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfAddressFamilyPathsOptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfIpv4AddressFamilyRedistributeProtocolOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: Ipv4AddressFamilyRedistributeProtocolDef  # pytype: disable=annotation-type-mismatch


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


class OneOfMetricOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class OneOfMetricOptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfOspfMatchRouteOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: List[
        OspfMatchRouteListDef
    ]  # pytype: disable=annotation-type-mismatch


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


class OneOfOspfMatchRouteOptionsDef3:
    option_type: DefaultOptionTypeDef


class Redistribute:
    protocol: Union[
        OneOfIpv4AddressFamilyRedistributeProtocolOptionsDef1,
        OneOfIpv4AddressFamilyRedistributeProtocolOptionsDef2,
    ]
    metric: Optional[
        Union[
            OneOfMetricOptionsDef1,
            OneOfMetricOptionsDef2,
            OneOfMetricOptionsDef3,
        ]
    ]
    ospf_match_route: Optional[
        Union[
            OneOfOspfMatchRouteOptionsDef1,
            OneOfOspfMatchRouteOptionsDef2,
            OneOfOspfMatchRouteOptionsDef3,
        ]
    ]
    route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class RoutingBgpAddressFamily:
    """
    Set IPv4 unicast BGP address family
    """

    # Aggregate prefixes in specific range
    aggregate_address: Optional[List[AggregateAddress]]
    filter: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    name: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]
    # Configure the networks for BGP to advertise
    network: Optional[List[Network]]
    originate: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    paths: Optional[
        Union[
            OneOfAddressFamilyPathsOptionsDef1,
            OneOfAddressFamilyPathsOptionsDef2,
            OneOfAddressFamilyPathsOptionsDef3,
        ]
    ]
    # Redistribute routes into BGP
    redistribute: Optional[List[Redistribute]]


class OneOfIpv6PrefixOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class Ipv6AggregateAddress:
    prefix: Union[
        OneOfIpv6PrefixOptionsDef1, OneOfIpv6PrefixOptionsDef2
    ]
    as_set: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    summary_only: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]


class Ipv6Network:
    prefix: Union[
        OneOfIpv6PrefixOptionsDef1, OneOfIpv6PrefixOptionsDef2
    ]


class OneOfIpv6AddressFamilyRedistributeProtocolOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: Ipv6AddressFamilyRedistributeProtocolDef  # pytype: disable=annotation-type-mismatch


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


class BgpRedistribute:
    protocol: Union[
        OneOfIpv6AddressFamilyRedistributeProtocolOptionsDef1,
        OneOfIpv6AddressFamilyRedistributeProtocolOptionsDef2,
    ]
    metric: Optional[
        Union[
            OneOfMetricOptionsDef1,
            OneOfMetricOptionsDef2,
            OneOfMetricOptionsDef3,
        ]
    ]
    ospf_match_route: Optional[
        Union[
            OneOfOspfMatchRouteOptionsDef1,
            OneOfOspfMatchRouteOptionsDef2,
            OneOfOspfMatchRouteOptionsDef3,
        ]
    ]
    route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class Ipv6AddressFamily:
    """
    Set BGP address family
    """

    filter: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # IPv6 Aggregate prefixes in specific range
    ipv6_aggregate_address: Optional[List[Ipv6AggregateAddress]]
    # Configure the networks for BGP to advertise
    ipv6_network: Optional[List[Ipv6Network]]
    name: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]
    originate: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    paths: Optional[
        Union[
            OneOfAddressFamilyPathsOptionsDef1,
            OneOfAddressFamilyPathsOptionsDef2,
            OneOfAddressFamilyPathsOptionsDef3,
        ]
    ]
    # Redistribute routes into BGP
    redistribute: Optional[List[BgpRedistribute]]


class OneOfBgpMplsIfNameOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class MplsInterface:
    if_name: Union[
        OneOfBgpMplsIfNameOptionsDef1, OneOfBgpMplsIfNameOptionsDef2
    ]


class BgpData:
    as_num: Union[OneOfAsNumOptionsDef1, OneOfAsNumOptionsDef2]
    # Set IPv4 unicast BGP address family
    address_family: Optional[RoutingBgpAddressFamily]
    always_compare: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    compare_router_id: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    deterministic: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    external: Optional[
        Union[
            OneOfExternalOptionsDef1,
            OneOfExternalOptionsDef2,
            OneOfExternalOptionsDef3,
        ]
    ]
    holdtime: Optional[
        Union[
            OneOfHoldtimeOptionsDef1,
            OneOfHoldtimeOptionsDef2,
            OneOfHoldtimeOptionsDef3,
        ]
    ]
    internal: Optional[
        Union[
            OneOfInternalOptionsDef1,
            OneOfInternalOptionsDef2,
            OneOfInternalOptionsDef3,
        ]
    ]
    # Set BGP address family
    ipv6_address_family: Optional[Ipv6AddressFamily]
    # Set BGP IPv6 neighbors
    ipv6_neighbor: Optional[List[Ipv6Neighbor]]
    keepalive: Optional[
        Union[
            OneOfKeepaliveOptionsDef1,
            OneOfKeepaliveOptionsDef2,
            OneOfKeepaliveOptionsDef3,
        ]
    ]
    local: Optional[
        Union[
            OneOfLocalOptionsDef1,
            OneOfLocalOptionsDef2,
            OneOfLocalOptionsDef3,
        ]
    ]
    missing_as_worst: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # MPLS BGP Interface
    mpls_interface: Optional[List[MplsInterface]]
    multipath_relax: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # Set BGP IPv4 neighbors
    neighbor: Optional[List[Neighbor]]
    propagate_aspath: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    propagate_community: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    router_id: Optional[
        Union[
            OneOfRouterIdOptionsDef1,
            OneOfRouterIdOptionsDef2,
            OneOfRouterIdOptionsDef3,
        ]
    ]


class Payload:
    """
    routing/bgp profile parcel schema for request
    """

    data: BgpData
    description: Optional[str]
    metadata: Optional[Any]
    name: Optional[str]


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]
    # routing/bgp profile parcel schema for request
    payload: Optional[Payload]


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


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

    parcel_id: str
    metadata: Optional[Any]


class TransportRoutingBgpAddressFamily:
    """
    Set IPv4 unicast BGP address family
    """

    # Aggregate prefixes in specific range
    aggregate_address: Optional[List[AggregateAddress]]
    filter: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    name: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]
    # Configure the networks for BGP to advertise
    network: Optional[List[Network]]
    originate: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    paths: Optional[
        Union[
            OneOfAddressFamilyPathsOptionsDef1,
            OneOfAddressFamilyPathsOptionsDef2,
            OneOfAddressFamilyPathsOptionsDef3,
        ]
    ]
    # Redistribute routes into BGP
    redistribute: Optional[List[Redistribute]]


class RoutingBgpData:
    as_num: Union[OneOfAsNumOptionsDef1, OneOfAsNumOptionsDef2]
    # Set IPv4 unicast BGP address family
    address_family: Optional[TransportRoutingBgpAddressFamily]
    always_compare: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    compare_router_id: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    deterministic: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    external: Optional[
        Union[
            OneOfExternalOptionsDef1,
            OneOfExternalOptionsDef2,
            OneOfExternalOptionsDef3,
        ]
    ]
    holdtime: Optional[
        Union[
            OneOfHoldtimeOptionsDef1,
            OneOfHoldtimeOptionsDef2,
            OneOfHoldtimeOptionsDef3,
        ]
    ]
    internal: Optional[
        Union[
            OneOfInternalOptionsDef1,
            OneOfInternalOptionsDef2,
            OneOfInternalOptionsDef3,
        ]
    ]
    # Set BGP address family
    ipv6_address_family: Optional[Ipv6AddressFamily]
    # Set BGP IPv6 neighbors
    ipv6_neighbor: Optional[List[Ipv6Neighbor]]
    keepalive: Optional[
        Union[
            OneOfKeepaliveOptionsDef1,
            OneOfKeepaliveOptionsDef2,
            OneOfKeepaliveOptionsDef3,
        ]
    ]
    local: Optional[
        Union[
            OneOfLocalOptionsDef1,
            OneOfLocalOptionsDef2,
            OneOfLocalOptionsDef3,
        ]
    ]
    missing_as_worst: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # MPLS BGP Interface
    mpls_interface: Optional[List[MplsInterface]]
    multipath_relax: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # Set BGP IPv4 neighbors
    neighbor: Optional[List[Neighbor]]
    propagate_aspath: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    propagate_community: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    router_id: Optional[
        Union[
            OneOfRouterIdOptionsDef1,
            OneOfRouterIdOptionsDef2,
            OneOfRouterIdOptionsDef3,
        ]
    ]


class CreateRoutingBgpProfileParcelForTransportPostRequest:
    """
    routing/bgp profile parcel schema for request
    """

    data: RoutingBgpData
    description: Optional[str]
    metadata: Optional[Any]
    name: Optional[str]


class GetSingleSdwanTransportRoutingBgpPayload:
    # 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]
    # routing/bgp profile parcel schema for request
    payload: Optional[Payload]


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

    id: str
    metadata: Optional[Any]


class SdwanTransportRoutingBgpAddressFamily:
    """
    Set IPv4 unicast BGP address family
    """

    # Aggregate prefixes in specific range
    aggregate_address: Optional[List[AggregateAddress]]
    filter: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    name: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]
    # Configure the networks for BGP to advertise
    network: Optional[List[Network]]
    originate: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    paths: Optional[
        Union[
            OneOfAddressFamilyPathsOptionsDef1,
            OneOfAddressFamilyPathsOptionsDef2,
            OneOfAddressFamilyPathsOptionsDef3,
        ]
    ]
    # Redistribute routes into BGP
    redistribute: Optional[List[Redistribute]]


class TransportRoutingBgpData:
    as_num: Union[OneOfAsNumOptionsDef1, OneOfAsNumOptionsDef2]
    # Set IPv4 unicast BGP address family
    address_family: Optional[SdwanTransportRoutingBgpAddressFamily]
    always_compare: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    compare_router_id: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    deterministic: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    external: Optional[
        Union[
            OneOfExternalOptionsDef1,
            OneOfExternalOptionsDef2,
            OneOfExternalOptionsDef3,
        ]
    ]
    holdtime: Optional[
        Union[
            OneOfHoldtimeOptionsDef1,
            OneOfHoldtimeOptionsDef2,
            OneOfHoldtimeOptionsDef3,
        ]
    ]
    internal: Optional[
        Union[
            OneOfInternalOptionsDef1,
            OneOfInternalOptionsDef2,
            OneOfInternalOptionsDef3,
        ]
    ]
    # Set BGP address family
    ipv6_address_family: Optional[Ipv6AddressFamily]
    # Set BGP IPv6 neighbors
    ipv6_neighbor: Optional[List[Ipv6Neighbor]]
    keepalive: Optional[
        Union[
            OneOfKeepaliveOptionsDef1,
            OneOfKeepaliveOptionsDef2,
            OneOfKeepaliveOptionsDef3,
        ]
    ]
    local: Optional[
        Union[
            OneOfLocalOptionsDef1,
            OneOfLocalOptionsDef2,
            OneOfLocalOptionsDef3,
        ]
    ]
    missing_as_worst: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # MPLS BGP Interface
    mpls_interface: Optional[List[MplsInterface]]
    multipath_relax: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    # Set BGP IPv4 neighbors
    neighbor: Optional[List[Neighbor]]
    propagate_aspath: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    propagate_community: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    router_id: Optional[
        Union[
            OneOfRouterIdOptionsDef1,
            OneOfRouterIdOptionsDef2,
            OneOfRouterIdOptionsDef3,
        ]
    ]


class EditRoutingBgpProfileParcelForTransportPutRequest:
    """
    routing/bgp profile parcel schema for request
    """

    data: TransportRoutingBgpData
    description: Optional[str]
    metadata: Optional[Any]
    name: Optional[str]