Skip to content
Snippets Groups Projects

Add Edge Port, GÉANT IP and IAS products

Merged Karel van Klink requested to merge feature/add-geant-ip into develop
3 files
+ 168
0
Compare changes
  • Side-by-side
  • Inline
Files
3
+ 136
0
"""Edge port product block.
Edge port sets the boundary between Geant network and an external entity that could also be a different technological
domain still managed by GEANT. In other words, an Edge port determines where the network ends.
"""
from typing import Annotated
from annotated_types import Len
from orchestrator.domain.base import ProductBlockModel, T
from orchestrator.types import SubscriptionLifecycle, strEnum
from pydantic import AfterValidator
from pydantic_forms.validators import validate_unique_list
from typing_extensions import Doc
from gso.products.product_blocks.iptrunk import PhysicalPortCapacity
from gso.products.product_blocks.router import RouterBlockInactive
LAGMemberList = Annotated[
list[T], AfterValidator(validate_unique_list), Len(min_length=0), Doc("A list of :term:`LAG` member interfaces.")
]
class EdgePortInterfaceBlockInactive(
ProductBlockModel,
lifecycle=[SubscriptionLifecycle.INITIAL],
product_block_name="EdgePortInterfaceBlock",
):
"""An inactive edge port interface that's currently inactive."""
interface_name: str | None = None
interface_description: str | None = None
class EdgePortInterfaceBlockProvisioning(
EdgePortInterfaceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]
):
"""An IP trunk interface that is being provisioned."""
interface_name: str
interface_description: str | None = None
class EdgePortInterfaceBlock(EdgePortInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
"""An active edge port interface."""
interface_name: str
interface_description: str | None = None
class EncapsulationType(strEnum):
"""Enum representing different Ethernet encapsulation service options.
Null supports a single service on the port.
Dot1Q supports multiple services for one customer or services for multiple customers.
QinQ expands VLAN space by double-tagging frames.
"""
DOT1Q = "dot1q"
QINQ = "qinq"
NULL = "null"
class EdgePortType(strEnum):
"""Types of edge ports."""
CUSTOMER = "CUSTOMER"
INFRASTRUCTURE = "INFRASTRUCTURE"
PRIVATE = "PRIVATE"
PUBLIC = "PUBLIC"
RE_INTERCONNECT = "RE_INTERCONNECT"
class EdgePortBlockInactive(
ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="EdgePortBlock"
):
"""An edge port that's currently inactive. See :class:`EdgePortBlock`."""
node: RouterBlockInactive
edge_port_name: str
enable_lacp: bool
edge_port_encapsulation: EncapsulationType = EncapsulationType.DOT1Q
edge_port_mac_address: str | None = None
edge_port_member_speed: PhysicalPortCapacity
edge_port_minimum_links: int | None = None
edge_port_type: EdgePortType
edge_port_ignore_if_down: bool = False
edge_port_geant_ga_id: str | None = None
edge_port_ae_iface: str | None = None
edge_port_ae_members: LAGMemberList[EdgePortInterfaceBlockInactive]
class EdgePortBlockProvisioning(EdgePortBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
"""An edge port that's being provisioned. See :class:`EdgePortBlock`."""
node: RouterBlockInactive
edge_port_name: str
edge_port_enable_lacp: bool
edge_port_encapsulation: EncapsulationType = EncapsulationType.DOT1Q
edge_port_mac_address: str | None = None
edge_port_member_speed: PhysicalPortCapacity
edge_port_minimum_links: int | None = None
edge_port_type: EdgePortType
edge_port_ignore_if_down: bool = False
edge_port_geant_ga_id: str | None = None
edge_port_ae_iface: str | None = None
edge_port_ae_members: LAGMemberList[EdgePortInterfaceBlockProvisioning] # type: ignore[assignment]
class EdgePortBlock(EdgePortBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
"""An edge port that's currently deployed in the network."""
#: The router that this edge port is connected to.
node: RouterBlockInactive
#: The name of the edge port.
edge_port_name: str
#: Indicates whether LACP (Link Aggregation Control Protocol) is enabled for this edge port.
edge_port_enable_lacp: bool
#: The type of encapsulation used on this edge port, by default DOT1Q.
edge_port_encapsulation: EncapsulationType = EncapsulationType.DOT1Q
#: The MAC address assigned to this edge port, if applicable.
edge_port_mac_address: str | None = None
#: The speed capacity of each member in the physical port.
edge_port_member_speed: PhysicalPortCapacity
#: The minimum number of links required for this edge port.
edge_port_minimum_links: int | None = None
#: The type of edge port (e.g., access, trunk).
edge_port_type: EdgePortType
#: If set to True, the edge port will be ignored if it is down.
edge_port_ignore_if_down: bool = False
#: The GEANT GA ID associated with this edge port, if any.
edge_port_geant_ga_id: str | None = None
#: The interface name for the aggregated Ethernet (AE) interface, if applicable.
edge_port_ae_iface: str | None = None
#: A list of LAG members associated with this edge port.
edge_port_ae_members: LAGMemberList[EdgePortInterfaceBlock] # type: ignore[assignment]
Loading