diff --git a/gso/api/v1/network.py b/gso/api/v1/network.py index c1e20368944d1d8cd90d5d5dd8758afb9d109f66..309d52ec79fda8b072c26ff6d1375de848b845e4 100644 --- a/gso/api/v1/network.py +++ b/gso/api/v1/network.py @@ -1,5 +1,6 @@ """API endpoints for network related operations.""" +import ipaddress from uuid import UUID from fastapi import APIRouter @@ -8,17 +9,38 @@ from orchestrator.schemas.base import OrchestratorBaseModel from orchestrator.services.subscriptions import build_extended_domain_model from starlette import status -from gso.products.product_blocks.iptrunk import PhysicalPortCapacity +from gso.products.product_blocks.iptrunk import IptrunkType, PhysicalPortCapacity +from gso.products.product_blocks.router import RouterRole +from gso.products.product_blocks.site import LatitudeCoordinate, LongitudeCoordinate from gso.services.subscriptions import get_active_iptrunk_subscriptions +from gso.utils.shared_enums import Vendor router = APIRouter(prefix="/networks", tags=["Network"]) +class SiteBlock(OrchestratorBaseModel): + """Site block schema.""" + + site_name: str + site_city: str + site_country: str + site_latitude: LatitudeCoordinate + site_longitude: LongitudeCoordinate + site_internal_id: int + + class RouterBlock(OrchestratorBaseModel): """Router block schema.""" subscription_instance_id: UUID router_fqdn: str + router_access_via_ts: bool + router_lo_ipv4_address: ipaddress.IPv4Address + router_lo_ipv6_address: ipaddress.IPv6Address + router_lo_iso_address: str + router_role: RouterRole + vendor: Vendor + router_site: SiteBlock class IptrunkSideBlock(OrchestratorBaseModel): @@ -32,7 +54,10 @@ class IptrunkBlock(OrchestratorBaseModel): """Iptrunk block schema.""" subscription_instance_id: UUID - iptrunk_speed: str + iptrunk_speed: PhysicalPortCapacity + iptrunk_type: IptrunkType + iptrunk_ipv4_network: ipaddress.IPv4Network + iptrunk_ipv6_network: ipaddress.IPv6Network iptrunk_capacity: str iptrunk_isis_metric: int iptrunk_sides: list[IptrunkSideBlock] @@ -61,7 +86,7 @@ def _calculate_iptrunk_capacity(iptrunk_sides: list, iptrunk_speed: PhysicalPort @router.get("/topology", status_code=status.HTTP_200_OK, response_model=NetworkTopologyDomainModelSchema) def network_topology() -> NetworkTopologyDomainModelSchema: - """Retrieve all active or provisioning IP trunk subscriptions.""" + """Retrieve the network topology.""" topology: dict = {"iptrunks": []} active_iptrunks = get_active_iptrunk_subscriptions() for iptrunk in active_iptrunks: @@ -73,6 +98,9 @@ def network_topology() -> NetworkTopologyDomainModelSchema: "iptrunk": { "subscription_instance_id": extended_model["iptrunk"]["subscription_instance_id"], "iptrunk_speed": extended_model["iptrunk"]["iptrunk_speed"], + "iptrunk_type": extended_model["iptrunk"]["iptrunk_type"], + "iptrunk_ipv4_network": extended_model["iptrunk"]["iptrunk_ipv4_network"], + "iptrunk_ipv6_network": extended_model["iptrunk"]["iptrunk_ipv6_network"], "iptrunk_isis_metric": extended_model["iptrunk"]["iptrunk_isis_metric"], "iptrunk_capacity": _calculate_iptrunk_capacity( extended_model["iptrunk"]["iptrunk_sides"], extended_model["iptrunk"]["iptrunk_speed"] @@ -83,6 +111,13 @@ def network_topology() -> NetworkTopologyDomainModelSchema: "iptrunk_side_node": { "subscription_instance_id": side["iptrunk_side_node"]["subscription_instance_id"], "router_fqdn": side["iptrunk_side_node"]["router_fqdn"], + "router_access_via_ts": side["iptrunk_side_node"]["router_access_via_ts"], + "router_lo_ipv4_address": side["iptrunk_side_node"]["router_lo_ipv4_address"], + "router_lo_ipv6_address": side["iptrunk_side_node"]["router_lo_ipv6_address"], + "router_lo_iso_address": side["iptrunk_side_node"]["router_lo_iso_address"], + "router_role": side["iptrunk_side_node"]["router_role"], + "vendor": side["iptrunk_side_node"]["vendor"], + "router_site": side["iptrunk_side_node"]["router_site"], }, } for side in extended_model["iptrunk"]["iptrunk_sides"]