diff --git "a/gso/migrations/versions/2024-10-03_b3cda39379a0_update_g\303\251ant_ip_model.py" "b/gso/migrations/versions/2024-10-03_b3cda39379a0_update_g\303\251ant_ip_model.py" deleted file mode 100644 index 4f4cbd6eb54170979a25ec24470943f02e6a6b0a..0000000000000000000000000000000000000000 --- "a/gso/migrations/versions/2024-10-03_b3cda39379a0_update_g\303\251ant_ip_model.py" +++ /dev/null @@ -1,29 +0,0 @@ -"""Update GÉANT IP model. - -Revision ID: b3cda39379a0 -Revises: 289e5334848f -Create Date: 2024-10-03 15:47:51.942674 - -""" -import sqlalchemy as sa -from alembic import op - -# revision identifiers, used by Alembic. -revision = 'b3cda39379a0' -down_revision = '289e5334848f' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - conn = op.get_bind() - conn.execute(sa.text(""" -INSERT INTO product_block_relations (in_use_by_id, depends_on_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('NRENAccessPort')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort'))) - """)) - - -def downgrade() -> None: - conn = op.get_bind() - conn.execute(sa.text(""" -DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('NRENAccessPort')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort')) - """)) diff --git "a/gso/migrations/versions/2024-10-07_6dd8a91b8ce0_update_g\303\251ant_ip_and_edge_port_models.py" "b/gso/migrations/versions/2024-10-07_6dd8a91b8ce0_update_g\303\251ant_ip_and_edge_port_models.py" new file mode 100644 index 0000000000000000000000000000000000000000..2e4d52a255accc3236a27d9f362f4d277b289c7e --- /dev/null +++ "b/gso/migrations/versions/2024-10-07_6dd8a91b8ce0_update_g\303\251ant_ip_and_edge_port_models.py" @@ -0,0 +1,41 @@ +"""Update GÉANT IP and Edge Port models. + +Revision ID: 6dd8a91b8ce0 +Revises: 289e5334848f +Create Date: 2024-10-07 14:11:14.041301 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '6dd8a91b8ce0' +down_revision = '289e5334848f' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('EdgePortBlock')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort')) + """)) + conn.execute(sa.text(""" +DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('NRENAccessPort')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('EdgePortBlock')) + """)) + conn.execute(sa.text(""" +INSERT INTO product_block_relations (in_use_by_id, depends_on_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('EdgePortBlock'))) + """)) + conn.execute(sa.text(""" +INSERT INTO product_block_relations (in_use_by_id, depends_on_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('NRENAccessPort')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort'))) + """)) + + +def downgrade() -> None: + conn = op.get_bind() + conn.execute(sa.text(""" +DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('EdgePortBlock')) + """)) + conn.execute(sa.text(""" +DELETE FROM product_block_relations WHERE product_block_relations.in_use_by_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('NRENAccessPort')) AND product_block_relations.depends_on_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('ServiceBindingPort')) + """)) diff --git a/gso/products/product_blocks/edge_port.py b/gso/products/product_blocks/edge_port.py index b77fd9386635d10ef22e647a3f2a10d059c0a401..d8228a89a84ca2b9bd6662c46382f352ee521ad7 100644 --- a/gso/products/product_blocks/edge_port.py +++ b/gso/products/product_blocks/edge_port.py @@ -6,14 +6,8 @@ domain still managed by GEANT. In other words, an Edge port determines where the from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle, strEnum -from pydantic import Field from gso.products.product_blocks.router import RouterBlock, RouterBlockInactive, RouterBlockProvisioning -from gso.products.product_blocks.service_binding_port import ( - ServiceBindingPort, - ServiceBindingPortInactive, - ServiceBindingPortProvisioning, -) from gso.utils.types.interfaces import LAGMemberList, PhysicalPortCapacity @@ -80,7 +74,6 @@ class EdgePortBlockInactive( edge_port_ignore_if_down: bool = False edge_port_geant_ga_id: str | None = None edge_port_ae_members: LAGMemberList[EdgePortAEMemberBlockInactive] - edge_port_sbp_list: list[ServiceBindingPortInactive] = Field(default_factory=list) class EdgePortBlockProvisioning(EdgePortBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): @@ -98,7 +91,6 @@ class EdgePortBlockProvisioning(EdgePortBlockInactive, lifecycle=[SubscriptionLi edge_port_ignore_if_down: bool = False edge_port_geant_ga_id: str | None = None edge_port_ae_members: LAGMemberList[EdgePortAEMemberBlockProvisioning] # type: ignore[assignment] - edge_port_sbp_list: list[ServiceBindingPortProvisioning] # type: ignore[assignment] class EdgePortBlock(EdgePortBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): @@ -128,5 +120,3 @@ class EdgePortBlock(EdgePortBlockProvisioning, lifecycle=[SubscriptionLifecycle. edge_port_geant_ga_id: str | None = None #: A list of :term:`LAG` members associated with this edge port. edge_port_ae_members: LAGMemberList[EdgePortAEMemberBlock] # type: ignore[assignment] - #: A list of Service Binding Ports associated with this Edge Port - edge_port_sbp_list: list[ServiceBindingPort] # type: ignore[assignment] diff --git a/gso/products/product_blocks/geant_ip.py b/gso/products/product_blocks/geant_ip.py index c6f941795a29c2edc3c069db46c405af1ecf57a5..89ee59fb9d7bebf10d6761c9d6851e926bd411b6 100644 --- a/gso/products/product_blocks/geant_ip.py +++ b/gso/products/product_blocks/geant_ip.py @@ -4,7 +4,6 @@ from orchestrator.domain.base import ProductBlockModel from orchestrator.types import SubscriptionLifecycle from pydantic import Field -from gso.products.product_blocks.edge_port import EdgePortBlock, EdgePortBlockInactive, EdgePortBlockProvisioning from gso.products.product_blocks.service_binding_port import ( ServiceBindingPort, ServiceBindingPortInactive, @@ -19,7 +18,6 @@ class NRENAccessPortInactive( """An access port for an R&E :term:`NREN` service that is inactive.""" nren_ap_type: APType | None = None - geant_ip_ep: EdgePortBlockInactive geant_ip_sbp: ServiceBindingPortInactive @@ -27,7 +25,6 @@ class NRENAccessPortProvisioning(NRENAccessPortInactive, lifecycle=[Subscription """An access port for an R&E :term:`NREN` service that is being provisioned.""" nren_ap_type: APType - geant_ip_ep: EdgePortBlockProvisioning geant_ip_sbp: ServiceBindingPortProvisioning @@ -36,8 +33,6 @@ class NRENAccessPort(NRENAccessPortProvisioning, lifecycle=[SubscriptionLifecycl #: The type of Access Port nren_ap_type: APType - #: The Edge Port where this :term:`NREN` Access Port terminates. - geant_ip_ep: EdgePortBlock #: The corresponding :term:`SBP` of this Access Port. geant_ip_sbp: ServiceBindingPort diff --git a/gso/products/product_blocks/service_binding_port.py b/gso/products/product_blocks/service_binding_port.py index 1f031e52ebd35b53331b991e4fd616050ce7a1a9..44423f04480459e6ddc752d15da18b124f5f671a 100644 --- a/gso/products/product_blocks/service_binding_port.py +++ b/gso/products/product_blocks/service_binding_port.py @@ -10,6 +10,7 @@ from orchestrator.types import SubscriptionLifecycle from pydantic import Field from gso.products.product_blocks.bgp_session import BGPSession, BGPSessionInactive, BGPSessionProvisioning +from gso.products.product_blocks.edge_port import EdgePortBlock, EdgePortBlockInactive, EdgePortBlockProvisioning from gso.utils.shared_enums import SBPType from gso.utils.types.ip_address import IPv4AddressType, IPv6AddressType @@ -29,6 +30,7 @@ class ServiceBindingPortInactive( custom_firewall_filters: bool | None = None geant_sid: str | None = None sbp_bgp_session_list: list[BGPSessionInactive] = Field(default_factory=list) + edge_port: EdgePortBlockInactive | None = None class ServiceBindingPortProvisioning(ServiceBindingPortInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): @@ -42,6 +44,7 @@ class ServiceBindingPortProvisioning(ServiceBindingPortInactive, lifecycle=[Subs custom_firewall_filters: bool geant_sid: str sbp_bgp_session_list: list[BGPSessionProvisioning] # type: ignore[assignment] + edge_port: EdgePortBlockProvisioning # type: ignore[assignment] class ServiceBindingPort(ServiceBindingPortProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): @@ -63,3 +66,5 @@ class ServiceBindingPort(ServiceBindingPortProvisioning, lifecycle=[Subscription geant_sid: str #: The :term:`BGP` sessions associated with this service binding port. sbp_bgp_session_list: list[BGPSession] # type: ignore[assignment] + #: The Edge Port on which this :term:`SBP` resides. + edge_port: EdgePortBlock # type: ignore[assignment]