diff --git a/gso/products/product_blocks/lan_switch_interconnect.py b/gso/products/product_blocks/lan_switch_interconnect.py index 08693fef09ff372623ddcdb36cd5759c4e1e088e..55a7b97a3ca788dbe3e61f5ddd9c8a5344e5976f 100644 --- a/gso/products/product_blocks/lan_switch_interconnect.py +++ b/gso/products/product_blocks/lan_switch_interconnect.py @@ -117,7 +117,7 @@ class LanSwitchInterconnectBlockInactive( lan_switch_interconnect_description: str | None = None address_space: LanSwitchInterconnectAddressSpace | None = None - number_of_members: int | None = None + minimum_links: int | None = None router_side: LanSwitchInterconnectRouterSideBlockInactive switch_side: LanSwitchInterconnectSwitchSideBlockInactive @@ -129,7 +129,7 @@ class LanSwitchInterconnectBlockProvisioning( lan_switch_interconnect_description: str | None = None address_space: LanSwitchInterconnectAddressSpace | None = None - number_of_members: int | None = None + minimum_links: int | None = None router_side: LanSwitchInterconnectRouterSideBlockProvisioning switch_side: LanSwitchInterconnectSwitchSideBlockProvisioning @@ -142,7 +142,7 @@ class LanSwitchInterconnectBlock(LanSwitchInterconnectBlockProvisioning, lifecyc #: The address space of the VLAN Switch Interconnect. It can be private or public. address_space: LanSwitchInterconnectAddressSpace #: The minimum amount of links the LAN Switch Interconnect should consist of. - number_of_members: int + minimum_links: int #: The router side of the LAN Switch Interconnect. router_side: LanSwitchInterconnectRouterSideBlock #: The switch side of the LAN Switch Interconnect. diff --git a/gso/products/product_blocks/pop_vlan.py b/gso/products/product_blocks/pop_vlan.py index 9840299c80c8dffa9cb270d0f381f7ed47e42ea8..1407a06c99c9cff2560ec2cb96f1491efc935ce9 100644 --- a/gso/products/product_blocks/pop_vlan.py +++ b/gso/products/product_blocks/pop_vlan.py @@ -1,18 +1,28 @@ """Pop VLAN product block that has all parameters of a subscription throughout its lifecycle.""" - +from ipaddress import IPv4Network, IPv6Network from typing import TypeVar from orchestrator.domain.base import ProductBlockModel from orchestrator.forms.validators import UniqueConstrainedList from orchestrator.types import SubscriptionLifecycle +from pydantic_forms.types import strEnum -from gso.products.product_blocks.iptrunk import LAGMemberList -from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning -from gso.products.product_blocks.switch import SwitchBlock, SwitchBlockInactive, SwitchBlockProvisioning +from gso.products.product_blocks.lan_switch_interconnect import LanSwitchInterconnectBlock +from gso.products.product_types.lan_switch_interconnect import ( + LanSwitchInterconnectInactive, + LanSwitchInterconnectProvisioning, +) T_co = TypeVar("T_co", covariant=True) +class LayerPreference(strEnum): + """Enumerator for the different types of layer preferences.""" + + L2 = "L2" + L3 = "L3" + + class PortList(UniqueConstrainedList[T_co]): # type: ignore[type-var] """A list of ports.""" @@ -22,7 +32,7 @@ class PopVlanPortBlockInactive( ): """An inactive Pop VLAN port.""" - port: str | None = None + port_name: str | None = None port_description: str | None = None tagged: bool | None = None @@ -30,7 +40,7 @@ class PopVlanPortBlockInactive( class PopVlanPortBlockProvisioning(PopVlanPortBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): """A Pop VLAN port that is being provisioned.""" - port: str | None = None + port_name: str | None = None port_description: str | None = None tagged: bool | None = None @@ -38,96 +48,11 @@ class PopVlanPortBlockProvisioning(PopVlanPortBlockInactive, lifecycle=[Subscrip class PopVlanPortBlock(PopVlanPortBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): """An active Pop VLAN port.""" - port: str + port_name: str port_description: str tagged: bool -class PopVlanInterfaceBlockInactive( - ProductBlockModel, - lifecycle=[SubscriptionLifecycle.INITIAL], - product_block_name="PopVlanInterfaceBlock", -): - """An inactive Pop VLAN interface.""" - - interface_name: str | None = None - interface_description: str | None = None - - -class PopVlanInterfaceBlockProvisioning(PopVlanInterfaceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): - """A Pop VLAN interface that is being provisioned.""" - - interface_name: str - interface_description: str - - -class PopVlanInterfaceBlock(PopVlanInterfaceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): - """An active Pop VLAN interface.""" - - interface_name: str - interface_description: str - - -class PopVlanRouterSideBlockInactive( - ProductBlockModel, - lifecycle=[SubscriptionLifecycle.INITIAL], - product_block_name="PopVlanRouterSideBlock", -): - """An inactive Pop VLAN router side.""" - - node: RouterBlockInactive - ae_iface: str | None = None - ae_members: LAGMemberList[PopVlanInterfaceBlockInactive] - - -class PopVlanRouterSideBlockProvisioning( - PopVlanRouterSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] -): - """An Pop VLAN router side that is being provisioned.""" - - node: RouterBlockProvisioning - ae_iface: str | None = None - ae_members: LAGMemberList[PopVlanInterfaceBlockProvisioning] - - -class PopVlanRouterSideBlock(PopVlanRouterSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): - """An active Pop VLAN router side.""" - - node: RouterBlock - ae_iface: str - ae_members: LAGMemberList[PopVlanInterfaceBlock] - - -class PopVlanSwitchSideBlockInactive( - ProductBlockModel, - lifecycle=[SubscriptionLifecycle.INITIAL], - product_block_name="PopVlanSwitchSideBlock", -): - """An inactive Pop VLAN switch side.""" - - node: SwitchBlockInactive - ae_iface: str | None = None - ae_members: LAGMemberList[PopVlanInterfaceBlockInactive] - - -class PopVlanSwitchSideBlockProvisioning( - PopVlanSwitchSideBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING] -): - """An Pop VLAN switch side that is being provisioned.""" - - node: SwitchBlockProvisioning - ae_iface: str | None = None - ae_members: LAGMemberList[PopVlanInterfaceBlockProvisioning] - - -class PopVlanSwitchSideBlock(PopVlanSwitchSideBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): - """An active Pop VLAN switch side.""" - - node: SwitchBlock - ae_iface: str - ae_members: LAGMemberList[PopVlanInterfaceBlock] - - class PopVlanBlockInactive( ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], @@ -135,33 +60,41 @@ class PopVlanBlockInactive( ): """A Pop VLAN that's currently inactive, see :class:`PopVlanBlock`.""" - number_of_ports: int | None = None - number_of_members: int | None = None - router_side: PopVlanRouterSideBlockInactive - switch_side: PopVlanSwitchSideBlockInactive - ports: PortList[PopVlanPortBlockInactive] + vlan_id: int + description: str | None + lan_switch_interconnect: LanSwitchInterconnectInactive + ports: PortList[PopVlanPortBlockProvisioning] + layer_preference: LayerPreference + ipv4_network: IPv4Network | None = None + ipv6_network: IPv6Network | None = None class PopVlanBlockProvisioning(PopVlanBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): """A Pop VLAN that's currently being provisioned, see :class:`PopVlanBlock`.""" - number_of_ports: int | None = None - number_of_members: int | None = None - router_side: PopVlanRouterSideBlockProvisioning - switch_side: PopVlanSwitchSideBlockProvisioning + vlan_id: int + description: str | None + lan_switch_interconnect: LanSwitchInterconnectProvisioning ports: PortList[PopVlanPortBlockProvisioning] + layer_preference: LayerPreference + ipv4_network: IPv4Network | None = None + ipv6_network: IPv6Network | None = None class PopVlanBlock(PopVlanBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): """A Pop VLAN that's currently deployed in the network.""" - #: The number of ports in the Pop VLAN. - number_of_ports: int - #: The number of members in the Pop VLAN. - number_of_members: int - #: The router side of the Pop VLAN. - router_side: PopVlanRouterSideBlock - #: The switch side of the Pop VLAN. - switch_side: PopVlanSwitchSideBlock - #: The ports of the Pop VLAN. + #: The VLAN ID of the Pop VLAN. + vlan_id: int + #: The description of the Pop VLAN. + description: str + #: The Lan Switch Interconnect that this Pop VLAN is connected to. + lan_switch_interconnect: LanSwitchInterconnectBlock + #: The ports of the Pop VLAN. ports: PortList[PopVlanPortBlock] + #: The level of the layer preference for the Pop VLAN (L2 or L3). + layer_preference: LayerPreference + #: IPv4 network for the Pop VLAN if layer_preference is L3. + ipv4_network: IPv4Network | None = None + #: IPv6 network for the Pop VLAN if layer_preference is L3. + ipv6_network: IPv6Network | None = None diff --git a/gso/products/product_blocks/switch.py b/gso/products/product_blocks/switch.py index 42f920a86689ce5cf132aa243b2c86c43e94a5b8..b0fdec46b1fe2e95c3dc9e7908585cc566d2f5c8 100644 --- a/gso/products/product_blocks/switch.py +++ b/gso/products/product_blocks/switch.py @@ -2,13 +2,22 @@ from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle +from pydantic_forms.types import strEnum from gso.products.product_blocks.site import ( SiteBlock, SiteBlockInactive, SiteBlockProvisioning, ) -from gso.utils.shared_enums import PortNumber +from gso.utils.shared_enums import PortNumber, Vendor + + +class SwitchModel(strEnum): + """Enumerator for the different types of switches.""" + + EX3400_24 = "EX3400 24" + EX3400_32 = "EX3400 32" + EX3400_48 = "EX3400 48" class SwitchBlockInactive( @@ -21,6 +30,8 @@ class SwitchBlockInactive( switch_hostname: str | None = None switch_ts_port: PortNumber | None = None switch_site: SiteBlockInactive | None + switch_vendor: Vendor | None + switch_model: SwitchModel | None = None class SwitchBlockProvisioning(SwitchBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): @@ -29,6 +40,8 @@ class SwitchBlockProvisioning(SwitchBlockInactive, lifecycle=[SubscriptionLifecy switch_hostname: str switch_ts_port: PortNumber switch_site: SiteBlockProvisioning + switch_vendor: Vendor + switch_model: SwitchModel | None = None class SwitchBlock(SwitchBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): @@ -40,3 +53,7 @@ class SwitchBlock(SwitchBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTI switch_ts_port: PortNumber #: The :class:`Site` that this switch resides in. Both physically and computationally. switch_site: SiteBlock + #: The vendor of the switch. + switch_vendor: Vendor + #: The model of the switch. + switch_model: SwitchModel | None = None