diff --git a/gso/migrations/versions/2025-06-02_f16525338855_add_commertial_peers_ix_port_private_.py b/gso/migrations/versions/2025-06-02_f16525338855_add_commertial_peers_ix_port_private_.py new file mode 100644 index 0000000000000000000000000000000000000000..23bfb0b8a4f8d4c04788ab7f40fa724f633f5301 --- /dev/null +++ b/gso/migrations/versions/2025-06-02_f16525338855_add_commertial_peers_ix_port_private_.py @@ -0,0 +1,39 @@ +"""Add Commertial peers, IX port, private peer port and transit proivder port WFs. + +Revision ID: f16525338855 +Revises: fb88e4914b47 +Create Date: 2025-06-02 11:36:48.053232 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'f16525338855' +down_revision = 'fb88e4914b47' +branch_labels = None +depends_on = None + + +from orchestrator.migrations.helpers import create_workflow, delete_workflow + +new_workflows = [ + { + "name": "create_ix_port", + "target": "CREATE", + "description": "Create IX Port Service", + "product_type": "IXPort" + } +] + + +def upgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + create_workflow(conn, workflow) + + +def downgrade() -> None: + conn = op.get_bind() + for workflow in new_workflows: + delete_workflow(conn, workflow["name"]) diff --git a/gso/products/product_blocks/l3_interface_port.py b/gso/products/product_blocks/l3_interface_port.py index 8712c47201a59fcc08f9762a907f59d397ba58df..4b391451272054dcb3b459a14292b5e84b29ba64 100644 --- a/gso/products/product_blocks/l3_interface_port.py +++ b/gso/products/product_blocks/l3_interface_port.py @@ -22,11 +22,11 @@ class L3InterfacePortBlockInactive( ipv4_mask: IPv4Netmask | None = None ipv6_address: IPv6AddressType | None = None ipv6_mask: IPv6Netmask | None = None - custom_firewall_filters: bool - gs_id: str - edge_port: EdgePortBlockInactive - v4_bfd_settings: BFDSettings - v6_bfd_settings: BFDSettings + custom_firewall_filters: bool | None = None + gs_id: str | None = None + edge_port: EdgePortBlockInactive | None = None + v4_bfd_settings: BFDSettings | None = None + v6_bfd_settings: BFDSettings | None = None class L3InterfacePortBlockProvisioning( diff --git a/gso/workflows/ix_port/__init__.py b/gso/workflows/ix_port/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..85bbeef0438bfd6fb761f2db260c994cbfd8bd5b --- /dev/null +++ b/gso/workflows/ix_port/__init__.py @@ -0,0 +1 @@ +"""All workflows that can be executed on IX Port.""" diff --git a/gso/workflows/ix_port/create_ix_port.py b/gso/workflows/ix_port/create_ix_port.py index d5fbccd39a921ebd24b71abe7fcaacfaf7a52885..b30e1f68065a57ca154305a120d1e1752d6c13e3 100644 --- a/gso/workflows/ix_port/create_ix_port.py +++ b/gso/workflows/ix_port/create_ix_port.py @@ -8,7 +8,7 @@ from orchestrator.types import SubscriptionLifecycle from orchestrator.workflow import StepList, begin, done from orchestrator.workflows.steps import resync, set_status, store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form -from pydantic import ConfigDict, Field +from pydantic import ConfigDict, Field, BaseModel from pydantic_forms.types import FormGenerator, State, UUIDstr from pydantic_forms.validators import Divider @@ -35,6 +35,13 @@ def initial_input_generator(product_name: str) -> FormGenerator: partner: partner_choice() initial_user_input = yield InitialIXPortForm + class BFDSettingsForm(BaseModel): + bfd_enabled: bool = False + bfd_interval_rx: int | None = Field(default=None, examples=["BFD RX defaults"]) + bfd_interval_tx: int | None = None + bfd_multiplier: int | None = None + + class ConfigureIXPortForm(SubmitFormPage): model_config = ConfigDict(title=f"{product_name} - Configure IX Port") @@ -51,8 +58,8 @@ def initial_input_generator(product_name: str) -> FormGenerator: ipv6_mask: IPv6Netmask | None = None custom_firewall_filters: bool = False divider2: Divider = Field(None, exclude=True) - v4_bfd_settings: BFDSettings - v6_bfd_settings: BFDSettings + v4_bfd_settings: BFDSettingsForm + v6_bfd_settings: BFDSettingsForm config_input = yield ConfigureIXPortForm @@ -78,8 +85,8 @@ def initialize_subscription( ipv6_address: IPv6AddressType | None, ipv6_mask: IPv6Netmask | None, custom_firewall_filters: bool, - v4_bfd_settings: BFDSettings, - v6_bfd_settings: BFDSettings, + v4_bfd_settings: dict, + v6_bfd_settings: dict, ) -> State: """Initialize the IXPort subscription object.""" @@ -94,8 +101,8 @@ def initialize_subscription( ipv6_address=ipv6_address, ipv6_mask=ipv6_mask, custom_firewall_filters=custom_firewall_filters, - v4_bfd_settings=v4_bfd_settings, - v6_bfd_settings=v6_bfd_settings, + v4_bfd_settings=BFDSettings.new(subscription_id=uuid4(), **(v4_bfd_settings)), + v6_bfd_settings=BFDSettings.new(subscription_id=uuid4(), **(v6_bfd_settings)), ) subscription = IXPort.from_other_lifecycle(subscription, SubscriptionLifecycle.PROVISIONING)