Models

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

Solution = Literal[
    "cellulargateway",
    "common",
    "mobility",
    "nfvirtual",
    "sd-routing",
    "sdwan",
    "service-insertion",
]

Attribute = Literal["tag"]

ParcelType = Literal[
    "global-vrf",
    "global-vrf/routing/bgp",
    "global-vrf/wan/interface/ipsec",
    "lan/multicloud-connection",
    "lan/vpn",
    "lan/vpn/interface/ethernet",
    "lan/vpn/interface/gre",
    "lan/vpn/interface/ipsec",
    "lan/vpn/interface/svi",
    "route-policy",
    "routing/bgp",
    "routing/ospf",
    "service-insertion-attachment",
    "vrf",
    "vrf/lan/interface/ethernet",
    "vrf/lan/interface/gre",
    "vrf/lan/interface/ipsec",
    "vrf/lan/multicloud-connection",
    "vrf/routing/bgp",
    "vrf/wan/interface/ethernet",
    "vrf/wan/interface/gre",
    "vrf/wan/interface/ipsec",
    "vrf/wan/multicloud-connection",
    "wan/multicloud-connection",
    "wan/vpn/interface/cellular",
    "wan/vpn/interface/dsl-ipoe",
    "wan/vpn/interface/dsl-pppoa",
    "wan/vpn/interface/dsl-pppoe",
    "wan/vpn/interface/ethernet",
    "wan/vpn/interface/gre",
    "wan/vpn/interface/ipsec",
    "wan/vpn/interface/serial",
]

ProfileType = Literal["global"]

Source = Literal[
    "custom_workflow",
    "equinix_workflow",
    "nfvirtual_workflow",
    "retail_workflow",
]

SolutionDef = Literal[
    "cellulargateway",
    "mobility",
    "nfvirtual",
    "sd-routing",
    "sdwan",
    "service-insertion",
]

UnsupportedFeaturesEnumDef = Literal[
    "lan/multicloud-connection",
    "lan/vpn",
    "lan/vpn/interface/ethernet",
    "lan/vpn/interface/ipsec",
    "lan/vpn/interface/svi",
    "route-policy",
    "routing/bgp",
    "routing/ospf",
    "vrf",
    "vrf/lan/interface/ethernet",
    "vrf/lan/interface/ipsec",
    "vrf/lan/multicloud-connection",
    "vrf/routing/bgp",
    "vrf/wan/interface/ethernet",
    "vrf/wan/interface/gre",
    "vrf/wan/interface/ipsec",
    "vrf/wan/multicloud-connection",
    "wan/multicloud-connection",
    "wan/vpn/interface/cellular",
    "wan/vpn/interface/dsl-ipoe",
    "wan/vpn/interface/dsl-pppoa",
    "wan/vpn/interface/dsl-pppoe",
    "wan/vpn/interface/ethernet",
    "wan/vpn/interface/gre",
    "wan/vpn/interface/ipsec",
    "wan/vpn/interface/serial",
]


class FeatureProfile:
    """
    List of devices UUIDs associated with this group
    """

    # Name of the feature Profile. Must be unique.
    name: str
    # Solution of the feature Profile.
    solution: str
    # Type of the feature Profile.
    type_: str
    # User who last created this.
    created_by: Optional[str]
    # Timestamp of creation
    created_on: Optional[int]
    # Description of the feature Profile.
    description: Optional[str]
    # System generated unique identifier of the feature profile in UUID format.
    id: Optional[str]
    # User who last updated this.
    last_updated_by: Optional[str]
    # Timestamp of last update
    last_updated_on: Optional[int]
    # Number of Parcels attached with Feature Profile
    profile_parcel_count: Optional[int]


class Criteria:
    attribute: Optional[Attribute]
    value: Optional[str]


class UnsupportedFeature:
    parcel_id: Optional[str]
    parcel_type: Optional[ParcelType]


class ConfigGroupDevice:
    criteria: Optional[Criteria]
    unsupported_features: Optional[List[UnsupportedFeature]]


class Topology:
    devices: Optional[List[ConfigGroupDevice]]
    site_devices: Optional[int]


class ConfigGroup:
    # Name of the  Group. Must be unique.
    name: str
    # Specify one of the device platform solution
    solution: Solution  # pytype: disable=annotation-type-mismatch
    #  Group Deployment state
    state: str
    #  Group Version Flag
    version: int
    copy_info: Optional[str]
    # User who last created this.
    created_by: Optional[str]
    # Timestamp of creation
    created_on: Optional[int]
    # Description of the  Group.
    description: Optional[str]
    devices: Optional[List[str]]
    full_config_cli: Optional[bool]
    # System generated unique identifier of the  Group in UUID format.
    id: Optional[str]
    ios_config_cli: Optional[bool]
    # User who last updated this.
    last_updated_by: Optional[str]
    # Timestamp of last update
    last_updated_on: Optional[int]
    number_of_devices: Optional[int]
    number_of_devices_up_to_date: Optional[int]
    origin: Optional[str]
    origin_info: Optional[Dict[str, str]]
    # List of devices UUIDs associated with this group
    profiles: Optional[List[FeatureProfile]]
    # Source of group
    source: Optional[str]
    topology: Optional[Topology]
    version_increment_reason: Optional[str]


class ProfileObjDef:
    id: str
    profile_type: ProfileType


class CreateConfigGroupPostResponse:
    """
    Config Group POST Response schema
    """

    id: str
    # (Optional - only applicable for AON) List of profile ids that belongs to the config group
    profiles: Optional[List[ProfileObjDef]]


class Criteria_1:
    attribute: Attribute  # pytype: disable=annotation-type-mismatch
    value: str


class UnsupportedFeatures:
    parcel_id: str
    parcel_type: UnsupportedFeaturesEnumDef


class TopologyDevicePropertiesDef:
    criteria: Criteria_1
    unsupported_features: Optional[List[UnsupportedFeatures]]


class TopologyDef:
    # list of devices in a site
    devices: List[TopologyDevicePropertiesDef]
    site_devices: Optional[int]


class ProfileIdObjDef:
    id: str


class FromConfigGroupDef:
    copy: str


class CreateConfigGroupPostRequest:
    """
    Config Group POST Request schema
    """

    description: str
    name: str
    solution: SolutionDef  # pytype: disable=annotation-type-mismatch
    from_config_group: Optional[FromConfigGroupDef]
    # list of profile ids that belongs to the config group
    profiles: Optional[List[ProfileIdObjDef]]
    source: Optional[Source]
    topology: Optional[TopologyDef]


class ConfigGroupProfileObjDef:
    id: str
    profile_type: ProfileType


class EditConfigGroupPutResponse:
    """
    Config Group PUT Response schema
    """

    id: str
    # (Optional - only applicable for AON) List of profile ids that belongs to the config group
    profiles: Optional[List[ConfigGroupProfileObjDef]]


class ConfigGroupTopologyDevicePropertiesDef:
    criteria: Criteria_1
    unsupported_features: Optional[List[UnsupportedFeatures]]


class ConfigGroupTopologyDef:
    # list of devices in a site
    devices: List[ConfigGroupTopologyDevicePropertiesDef]
    site_devices: Optional[int]


class ConfigGroupProfileIdObjDef:
    id: str


class EditConfigGroupPutRequest:
    """
    Config Group PUT Request schema
    """

    description: str
    name: str
    solution: SolutionDef  # pytype: disable=annotation-type-mismatch
    # list of profile ids that belongs to the config group
    profiles: Optional[List[ConfigGroupProfileIdObjDef]]
    topology: Optional[ConfigGroupTopologyDef]