From 052717b48319cdcde2f10a9dc07419c8d325ed26 Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Thu, 14 Nov 2024 12:39:02 +0000
Subject: [PATCH] BFD settings changes

- BFD model should have separate interval setting for RX and TX, hence
`bfd_interval` -> `bfd_interval_rx`, `bfd_interval_tx`;
- BFD model is only relevant to the SBP interface (with all attributes);
- BGP session will only have a simple flag `bfd_enabled` with default
`False`;
- BFD class models moved from `bgp_session.py` to
`service_binding_port.py`.
---
 gso/products/product_blocks/bgp_session.py    | 34 ++----------------
 .../product_blocks/service_binding_port.py    | 35 +++++++++++++++++--
 .../create_nren_l3_core_service.py            |  8 ++---
 3 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/gso/products/product_blocks/bgp_session.py b/gso/products/product_blocks/bgp_session.py
index d6ef9a33..44ab45af 100644
--- a/gso/products/product_blocks/bgp_session.py
+++ b/gso/products/product_blocks/bgp_session.py
@@ -19,34 +19,6 @@ class IPFamily(strEnum):
     V6MULTICAST = "v6multicast"
 
 
-class BFDSettingsInactive(
-    ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="BFDSettings"
-):
-    """Settings for :term:`BFD`, see :class:`BFDSettings`."""
-
-    bfd_enabled: bool = False
-    bfd_interval: int | None = None
-    bfd_multiplier: int | None = None
-
-
-class BFDSettingsProvisioning(BFDSettingsInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
-    """Settings for :term:`BFD`, see :class:`BFDSettings`."""
-
-    bfd_enabled: bool
-    bfd_interval: int | None
-    bfd_multiplier: int | None
-
-
-class BFDSettings(BFDSettingsProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
-    """A set of settings for :term:`BFD`."""
-
-    #: Whether :term:`BFD` is enabled.
-    bfd_enabled: bool
-    #: The :term:`BFD` interval, if enabled.
-    bfd_interval: int | None
-    #: The :term:`BFD` multiplier, if enabled.
-    bfd_multiplier: int | None
-
 
 class BGPSessionInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="BGPSession"):
     """A :term:`BGP` session that is currently inactive. See :class:`BGPSession`."""
@@ -60,7 +32,7 @@ class BGPSessionInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INI
     is_multi_hop: bool = False
     is_passive: bool = False
     rtbh_enabled: bool = False
-    bfd_settings: BFDSettingsInactive
+    bfd_enabled: bool = False
 
 
 class BGPSessionProvisioning(BGPSessionInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
@@ -75,7 +47,7 @@ class BGPSessionProvisioning(BGPSessionInactive, lifecycle=[SubscriptionLifecycl
     is_multi_hop: bool
     is_passive: bool
     rtbh_enabled: bool
-    bfd_settings: BFDSettingsProvisioning
+    bfd_enabled: bool
 
 
 class BGPSession(BGPSessionProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
@@ -100,4 +72,4 @@ class BGPSession(BGPSessionProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE
     #: Whether Remote Triggered Blackhole is enabled
     rtbh_enabled: bool
     #: Settings for :term:`BFD`.
-    bfd_settings: BFDSettings
+    bfd_enabled: bool
diff --git a/gso/products/product_blocks/service_binding_port.py b/gso/products/product_blocks/service_binding_port.py
index 92fb14e2..9ded332c 100644
--- a/gso/products/product_blocks/service_binding_port.py
+++ b/gso/products/product_blocks/service_binding_port.py
@@ -8,9 +8,6 @@ from orchestrator.types import SubscriptionLifecycle
 from pydantic import Field
 
 from gso.products.product_blocks.bgp_session import (
-    BFDSettings,
-    BFDSettingsInactive,
-    BFDSettingsProvisioning,
     BGPSession,
     BGPSessionInactive,
     BGPSessionProvisioning,
@@ -20,6 +17,38 @@ from gso.utils.shared_enums import SBPType
 from gso.utils.types.ip_address import IPv4AddressType, IPV4Netmask, IPv6AddressType, IPV6Netmask
 from gso.utils.types.virtual_identifiers import VLAN_ID
 
+class BFDSettingsInactive(
+    ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="BFDSettings"
+):
+    """Settings for :term:`BFD`, see :class:`BFDSettings`."""
+
+    bfd_enabled: bool = False
+    bfd_interval_rx: int | None = None
+    bfd_interval_tx: int | None = None
+    bfd_multiplier: int | None = None
+
+
+class BFDSettingsProvisioning(BFDSettingsInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]):
+    """Settings for :term:`BFD`, see :class:`BFDSettings`."""
+
+    bfd_enabled: bool
+    bfd_interval_rx: int | None = None
+    bfd_interval_tx: int | None = None
+    bfd_multiplier: int | None
+
+
+class BFDSettings(BFDSettingsProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]):
+    """A set of settings for :term:`BFD`."""
+
+    #: Whether :term:`BFD` is enabled.
+    bfd_enabled: bool
+    #: The :term:`BFD` interval RX, if enabled.
+    bfd_interval_rx: int | None
+    #: The :term:`BFD` interval TX, if enabled.
+    bfd_interval_tx: int | None
+    #: The :term:`BFD` multiplier, if enabled.
+    bfd_multiplier: int | None
+
 
 class ServiceBindingPortInactive(
     ProductBlockModel, lifecycle=[SubscriptionLifecycle.INITIAL], product_block_name="ServiceBindingPort"
diff --git a/gso/workflows/nren_l3_core_service/create_nren_l3_core_service.py b/gso/workflows/nren_l3_core_service/create_nren_l3_core_service.py
index 7639ff28..89b3eb98 100644
--- a/gso/workflows/nren_l3_core_service/create_nren_l3_core_service.py
+++ b/gso/workflows/nren_l3_core_service/create_nren_l3_core_service.py
@@ -57,11 +57,12 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
 
     class BFDSettingsForm(BaseModel):
         bfd_enabled: bool = False
-        bfd_interval: int | None = None
+        bfd_interval_rx: int | None = None
+        bfd_interval_tx: int | None = None
         bfd_multiplier: int | None = None
 
     class BaseBGPPeer(BaseModel):
-        bfd_settings: BFDSettingsForm = BFDSettingsForm(bfd_enabled=False)
+        bfd_enabled: bool = False
         has_custom_policies: bool = False
         authentication_key: str | None = None
         multipath_enabled: bool = False
@@ -139,11 +140,10 @@ def initialize_subscription(
     """Take all user inputs and use them to populate the subscription model."""
     edge_port_fqdn_list = []
     edge_port_subscription = EdgePort.from_subscription(edge_port["edge_port"])
+    print(binding_port_input["bgp_peers"])
     sbp_bgp_session_list = [
         BGPSession.new(
             subscription_id=uuid4(),
-            bfd_settings=BFDSettings.new(subscription_id=uuid4(), **(session.pop("bfd_settings"))),
-            **session,
             rtbh_enabled=True,
             is_multi_hop=True,
         )
-- 
GitLab