Models

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

VariableOptionTypeDef = Literal["variable"]

GlobalOptionTypeDef = Literal["global"]

DefaultOptionTypeDef = Literal["default"]

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

StaticNatDirectionDef = Literal["inside", "outside"]

NatPortForwardProtocolDef = Literal["TCP", "UDP"]

SourceTypeDef = Literal["acl", "route-map"]

NatTypeDef = Literal["interface", "pool"]

RouteLeakProtocolFromGlobalDef = Literal[
    "bgp", "connected", "ospf", "static"
]

RouteLeakRedistributeGlobalProtocolDef = Literal["bgp", "ospf"]

RouteLeakProtocolFromServiceDef = Literal[
    "bgp", "connected", "ospf", "static"
]

RouteLeakRedistributeServiceProtocolDef = Literal["bgp", "ospf"]

RouteImportFromProtocolDef = Literal[
    "bgp", "connected", "ospf", "static"
]

RouteImportFromRedistributeProtocolDef = Literal["bgp", "ospf"]


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


class OneOfVrfOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: str


class MplsVpnRouteTargetOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class MplsVpnRouteTargetOptionsDef3:
    option_type: DefaultOptionTypeDef


class OneOfVpnNameOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class OneOfVpnNameOptionsDef3:
    option_type: DefaultOptionTypeDef


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


class OneOfIpAddressOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: Any


class Dns:
    ip_address: Union[
        OneOfIpAddressOptionsDef1, OneOfIpAddressOptionsDef2
    ]


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 HostMapping:
    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: Any


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


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


class OneOfIpV4AddressOptionsWithoutDefault2:
    option_type: GlobalOptionTypeDef
    value: Any


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 RefId:
    option_type: GlobalOptionTypeDef
    value: str


class OneOfRefIdOptionsDef1:
    ref_id: RefId


class OneOfRefIdOptionsDef2:
    option_type: DefaultOptionTypeDef


class NextHop:
    address: Union[
        OneOfIpV4AddressOptionsWithoutDefault1,
        OneOfIpV4AddressOptionsWithoutDefault2,
    ]
    distance: Union[
        OneOfIpv4NextHopDistanceOptionsDef1,
        OneOfIpv4NextHopDistanceOptionsDef2,
        OneOfIpv4NextHopDistanceOptionsDef3,
    ]
    tracker_id: Union[OneOfRefIdOptionsDef1, OneOfRefIdOptionsDef2]


class NextHopContainer:
    # IPv4 Route Gateway Next Hop
    next_hop: List[NextHop]


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,
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            OneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class OneOfIpv4RouteDhcpOptionsWithoutVariable1:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfIpv4RouteDhcpOptionsWithoutVariable2:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfIpRoute3:
    dhcp: Union[
        OneOfIpv4RouteDhcpOptionsWithoutVariable1,
        OneOfIpv4RouteDhcpOptionsWithoutVariable2,
    ]
    distance: Optional[
        Union[
            OneOfIpv4NextHopDistanceOptionsDef1,
            OneOfIpv4NextHopDistanceOptionsDef2,
            OneOfIpv4NextHopDistanceOptionsDef3,
        ]
    ]


class OneOfVrfInterfaceNameOptionsNoDefaultDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


class VrfNextHop:
    address: Union[
        OneOfIpV4AddressOptionsWithoutDefault1,
        OneOfIpV4AddressOptionsWithoutDefault2,
    ]
    distance: Union[
        OneOfIpv4NextHopDistanceOptionsDef1,
        OneOfIpv4NextHopDistanceOptionsDef2,
        OneOfIpv4NextHopDistanceOptionsDef3,
    ]


class IpStaticRouteInterface:
    interface_name: Union[
        OneOfVrfInterfaceNameOptionsNoDefaultDef1,
        OneOfVrfInterfaceNameOptionsNoDefaultDef2,
    ]
    next_hop: List[VrfNextHop]


class InterfaceContainer:
    ip_static_route_interface: List[IpStaticRouteInterface]


class OneOfIpRoute4:
    interface_container: InterfaceContainer


class Ipv4Route:
    one_of_ip_route: Union[
        OneOfIpRoute1, OneOfIpRoute2, OneOfIpRoute3, OneOfIpRoute4
    ]
    # Prefix
    prefix: 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 ServiceVrfNextHop:
    address: Union[
        OneOfIpv6NextHopAddressOptionsWithOutDefault1,
        OneOfIpv6NextHopAddressOptionsWithOutDefault2,
    ]
    distance: Union[
        OneOfIpv6NextHopDistanceOptionsDef1,
        OneOfIpv6NextHopDistanceOptionsDef2,
        OneOfIpv6NextHopDistanceOptionsDef3,
    ]


class VrfNextHopContainer:
    # IPv6 Route Gateway Next Hop
    next_hop: Optional[List[ServiceVrfNextHop]]


class VrfOneOfIpRoute1:
    next_hop_container: VrfNextHopContainer


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


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


class Ipv6StaticRouteInterface:
    interface_name: Union[
        OneOfVrfInterfaceNameOptionsNoDefaultDef1,
        OneOfVrfInterfaceNameOptionsNoDefaultDef2,
    ]
    next_hop: Optional[List[SdRoutingServiceVrfNextHop]]


class VrfInterfaceContainer:
    ipv6_static_route_interface: List[Ipv6StaticRouteInterface]


class VrfOneOfIpRoute3:
    interface_container: VrfInterfaceContainer


class Ipv6Route:
    one_of_ip_route: Union[
        VrfOneOfIpRoute1, VrfOneOfIpRoute2, VrfOneOfIpRoute3
    ]
    prefix: Union[
        OneOfIpv6RoutePrefixOptionsDef1,
        OneOfIpv6RoutePrefixOptionsDef2,
    ]


class OneOfOnBooleanDefaultFalseNoVariableOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: bool


class OneOfOnBooleanDefaultFalseNoVariableOptionsDef2:
    option_type: DefaultOptionTypeDef
    value: bool


class OneOfDirectionOptionsDef:
    option_type: GlobalOptionTypeDef
    value: StaticNatDirectionDef


class NatInterfaces:
    direction: OneOfDirectionOptionsDef
    interface: Union[
        OneOfVrfInterfaceNameOptionsNoDefaultDef1,
        OneOfVrfInterfaceNameOptionsNoDefaultDef2,
    ]


class StaticNat:
    direction: OneOfDirectionOptionsDef
    source_ip: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    translate_ip: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    route_map_id: Optional[
        Union[OneOfRefIdOptionsDef1, OneOfRefIdOptionsDef2]
    ]
    tracker_id: Optional[
        Union[OneOfRefIdOptionsDef1, OneOfRefIdOptionsDef2]
    ]


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


class OneOfPrefixLengthOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


class StaticNatSubnet:
    direction: OneOfDirectionOptionsDef
    prefix_length: Union[
        OneOfPrefixLengthOptionsDef1, OneOfPrefixLengthOptionsDef2
    ]
    source_ip_subnet: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    translate_ip_subnet: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    tracker_id: Optional[
        Union[OneOfRefIdOptionsDef1, OneOfRefIdOptionsDef2]
    ]


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


class OneOfNatPortForwardProtocolOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: NatPortForwardProtocolDef  # pytype: disable=annotation-type-mismatch


class OneOfPortOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: int


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


class NatPortForward:
    protocol: Union[
        OneOfNatPortForwardProtocolOptionsDef1,
        OneOfNatPortForwardProtocolOptionsDef2,
    ]
    source_ip: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    source_port: Union[OneOfPortOptionsDef1, OneOfPortOptionsDef2]
    translate_port: Union[OneOfPortOptionsDef1, OneOfPortOptionsDef2]
    translated_source_ip: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]


class NatType:
    value: Optional[Any]


class OneOfSourceTypeOptionsDef:
    option_type: GlobalOptionTypeDef
    value: SourceTypeDef


class ParcelReferenceDef:
    ref_id: RefId


class OneOfPoolNameOptionsNoDefaultDef1:
    option_type: GlobalOptionTypeDef
    value: str


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


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


class OneOfPrefixLengthWithoutDefaultOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: int


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 NatPool:
    """
    NAT Pool
    """

    pool_name: Union[
        OneOfPoolNameOptionsNoDefaultDef1,
        OneOfPoolNameOptionsNoDefaultDef2,
    ]
    prefix_length: Union[
        OneOfPrefixLengthWithoutDefaultOptionsDef1,
        OneOfPrefixLengthWithoutDefaultOptionsDef2,
    ]
    range_end: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    range_start: Union[
        OneOfIpV4AddressOptionsDef1, OneOfIpV4AddressOptionsDef2
    ]
    match_in_vrf: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    overload: Optional[
        Union[
            OneOfOnBooleanDefaultFalseOptionsDef1,
            OneOfOnBooleanDefaultFalseOptionsDef2,
            OneOfOnBooleanDefaultFalseOptionsDef3,
        ]
    ]
    tracker_id: Optional[
        Union[OneOfRefIdOptionsDef1, OneOfRefIdOptionsDef2]
    ]


class DynamicNat1:
    direction: OneOfDirectionOptionsDef
    egress_interface: Union[
        OneOfVrfInterfaceNameOptionsNoDefaultDef1,
        OneOfVrfInterfaceNameOptionsNoDefaultDef2,
    ]
    nat_type: NatType
    source_type: OneOfSourceTypeOptionsDef
    ipv4_acl_id: Optional[ParcelReferenceDef]
    # NAT Pool
    nat_pool: Optional[NatPool]
    route_map_id: Optional[ParcelReferenceDef]


class OneOfNatTypeOptionsDef:
    option_type: GlobalOptionTypeDef
    value: NatTypeDef


class DynamicNat2:
    direction: OneOfDirectionOptionsDef
    nat_type: OneOfNatTypeOptionsDef
    source_type: OneOfSourceTypeOptionsDef
    egress_interface: Optional[
        Union[
            OneOfVrfInterfaceNameOptionsNoDefaultDef1,
            OneOfVrfInterfaceNameOptionsNoDefaultDef2,
        ]
    ]
    ipv4_acl_id: Optional[ParcelReferenceDef]
    # NAT Pool
    nat_pool: Optional[NatPool]
    route_map_id: Optional[ParcelReferenceDef]


class NatAttributesIpv4:
    """
    NAT Attributes Ipv4
    """

    nat_enable: Union[
        OneOfOnBooleanDefaultFalseNoVariableOptionsDef1,
        OneOfOnBooleanDefaultFalseNoVariableOptionsDef2,
    ]
    # NAT Attributes Ipv4
    dynamic_nat: Optional[List[Union[DynamicNat1, DynamicNat2]]]
    # nat interfaces
    nat_interfaces: Optional[List[NatInterfaces]]
    # NAT Port Forward
    nat_port_forward: Optional[List[NatPortForward]]
    # static NAT
    static_nat: Optional[List[StaticNat]]
    # static NAT Subnet
    static_nat_subnet: Optional[List[StaticNatSubnet]]


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


class OneOfRouteLeakFromGlobalProtocolOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: RouteLeakProtocolFromGlobalDef  # pytype: disable=annotation-type-mismatch


class OneOfRoutePolicyNameOptionsDef1:
    option_type: DefaultOptionTypeDef


class OneOfRoutePolicyNameOptionsDef2:
    ref_id: RefId


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


class OneOfRouteLeakFromGlobalRedistributeProtocolOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: RouteLeakRedistributeGlobalProtocolDef  # pytype: disable=annotation-type-mismatch


class RedistributeToProtocol:
    protocol: Union[
        OneOfRouteLeakFromGlobalRedistributeProtocolOptionsDef1,
        OneOfRouteLeakFromGlobalRedistributeProtocolOptionsDef2,
    ]
    policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class RouteLeakFromGlobal:
    route_protocol: Union[
        OneOfRouteLeakFromGlobalProtocolOptionsDef1,
        OneOfRouteLeakFromGlobalProtocolOptionsDef2,
    ]
    # Redistribute Routes to specific Protocol on Service VRF
    redistribute_to_protocol: Optional[List[RedistributeToProtocol]]
    route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


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


class OneOfRouteLeakFromServiceProtocolOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: RouteLeakProtocolFromServiceDef  # pytype: disable=annotation-type-mismatch


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


class OneOfRouteLeakFromServiceRedistributeProtocolOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: RouteLeakRedistributeServiceProtocolDef  # pytype: disable=annotation-type-mismatch


class VrfRedistributeToProtocol:
    protocol: Union[
        OneOfRouteLeakFromServiceRedistributeProtocolOptionsDef1,
        OneOfRouteLeakFromServiceRedistributeProtocolOptionsDef2,
    ]
    policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class RouteLeakFromService:
    route_protocol: Union[
        OneOfRouteLeakFromServiceProtocolOptionsDef1,
        OneOfRouteLeakFromServiceProtocolOptionsDef2,
    ]
    # Redistribute Routes to specific Protocol on Global VRF
    redistribute_to_protocol: Optional[
        List[VrfRedistributeToProtocol]
    ]
    route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


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


class OneOfRouteImportFromProtocolOptionsDef2:
    option_type: GlobalOptionTypeDef
    value: RouteImportFromProtocolDef  # pytype: disable=annotation-type-mismatch


class OneOfRouteImportFromRedistributeProtocolOptionsDef1:
    option_type: GlobalOptionTypeDef
    value: RouteImportFromRedistributeProtocolDef  # pytype: disable=annotation-type-mismatch


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


class ServiceVrfRedistributeToProtocol:
    protocol: Union[
        OneOfRouteImportFromRedistributeProtocolOptionsDef1,
        OneOfRouteImportFromRedistributeProtocolOptionsDef2,
    ]
    policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class RouteLeakBetweenServices:
    route_protocol: Union[
        OneOfRouteImportFromProtocolOptionsDef1,
        OneOfRouteImportFromProtocolOptionsDef2,
    ]
    source_vpn: Union[OneOfVrfOptionsDef1, OneOfVrfOptionsDef2]
    # Redistribute Route to specific Protocol on Current Service VRF
    redistribute_to_protocol: Optional[
        List[ServiceVrfRedistributeToProtocol]
    ]
    route_policy: Optional[
        Union[
            OneOfRoutePolicyNameOptionsDef1,
            OneOfRoutePolicyNameOptionsDef2,
        ]
    ]


class VrfData:
    vrf_name: Union[OneOfVrfOptionsDef1, OneOfVrfOptionsDef2]
    description: Optional[
        Union[
            OneOfVpnNameOptionsDef1,
            OneOfVpnNameOptionsDef2,
            OneOfVpnNameOptionsDef3,
        ]
    ]
    dns: Optional[List[Dns]]
    host_mapping: Optional[List[HostMapping]]
    # IPv4 Static Route
    ipv4_route: Optional[List[Ipv4Route]]
    # IPv6 Static Route
    ipv6_route: Optional[List[Ipv6Route]]
    # NAT Attributes Ipv4
    nat_attributes_ipv4: Optional[NatAttributesIpv4]
    rd: Optional[
        Union[
            MplsVpnRouteTargetOptionsDef1,
            MplsVpnRouteTargetOptionsDef2,
            MplsVpnRouteTargetOptionsDef3,
        ]
    ]
    # Enable route leak from another Service VRF to current Service VRF
    route_leak_between_services: Optional[
        List[RouteLeakBetweenServices]
    ]
    # Enable route leaking from Global to Service VRF
    route_leak_from_global: Optional[List[RouteLeakFromGlobal]]
    # Enable route leaking from Service to Global VRF
    route_leak_from_service: Optional[List[RouteLeakFromService]]


class Payload:
    """
    SD-Routing VRF feature schema
    """

    data: VrfData
    name: str
    # Set the feature 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]
    # SD-Routing VRF feature schema
    payload: Optional[Payload]


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


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

    parcel_id: str
    metadata: Optional[Any]


class ServiceVrfData:
    vrf_name: Union[OneOfVrfOptionsDef1, OneOfVrfOptionsDef2]
    description: Optional[
        Union[
            OneOfVpnNameOptionsDef1,
            OneOfVpnNameOptionsDef2,
            OneOfVpnNameOptionsDef3,
        ]
    ]
    dns: Optional[List[Dns]]
    host_mapping: Optional[List[HostMapping]]
    # IPv4 Static Route
    ipv4_route: Optional[List[Ipv4Route]]
    # IPv6 Static Route
    ipv6_route: Optional[List[Ipv6Route]]
    # NAT Attributes Ipv4
    nat_attributes_ipv4: Optional[NatAttributesIpv4]
    rd: Optional[
        Union[
            MplsVpnRouteTargetOptionsDef1,
            MplsVpnRouteTargetOptionsDef2,
            MplsVpnRouteTargetOptionsDef3,
        ]
    ]
    # Enable route leak from another Service VRF to current Service VRF
    route_leak_between_services: Optional[
        List[RouteLeakBetweenServices]
    ]
    # Enable route leaking from Global to Service VRF
    route_leak_from_global: Optional[List[RouteLeakFromGlobal]]
    # Enable route leaking from Service to Global VRF
    route_leak_from_service: Optional[List[RouteLeakFromService]]


class CreateSdroutingServiceVrfFeaturePostRequest:
    """
    SD-Routing VRF feature schema
    """

    data: ServiceVrfData
    name: str
    # Set the feature description
    description: Optional[str]
    metadata: Optional[Any]


class GetSingleSdRoutingServiceVrfPayload:
    # 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]
    # SD-Routing VRF feature schema
    payload: Optional[Payload]


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

    id: str
    metadata: Optional[Any]


class SdRoutingServiceVrfData:
    vrf_name: Union[OneOfVrfOptionsDef1, OneOfVrfOptionsDef2]
    description: Optional[
        Union[
            OneOfVpnNameOptionsDef1,
            OneOfVpnNameOptionsDef2,
            OneOfVpnNameOptionsDef3,
        ]
    ]
    dns: Optional[List[Dns]]
    host_mapping: Optional[List[HostMapping]]
    # IPv4 Static Route
    ipv4_route: Optional[List[Ipv4Route]]
    # IPv6 Static Route
    ipv6_route: Optional[List[Ipv6Route]]
    # NAT Attributes Ipv4
    nat_attributes_ipv4: Optional[NatAttributesIpv4]
    rd: Optional[
        Union[
            MplsVpnRouteTargetOptionsDef1,
            MplsVpnRouteTargetOptionsDef2,
            MplsVpnRouteTargetOptionsDef3,
        ]
    ]
    # Enable route leak from another Service VRF to current Service VRF
    route_leak_between_services: Optional[
        List[RouteLeakBetweenServices]
    ]
    # Enable route leaking from Global to Service VRF
    route_leak_from_global: Optional[List[RouteLeakFromGlobal]]
    # Enable route leaking from Service to Global VRF
    route_leak_from_service: Optional[List[RouteLeakFromService]]


class EditSdroutingServiceVrfFeaturePutRequest:
    """
    SD-Routing VRF feature schema
    """

    data: SdRoutingServiceVrfData
    name: str
    # Set the feature description
    description: Optional[str]
    metadata: Optional[Any]