From 039da651c43bdd014eac14804bfec2a252f16732 Mon Sep 17 00:00:00 2001
From: Neda Moeini <neda.moeini@geant.org>
Date: Wed, 20 Nov 2024 09:59:42 +0100
Subject: [PATCH] Update modify NrenL3CoreServic WF after BFD Settings change.

---
 .../modify_nren_l3_core_service.py            | 33 +++++-----
 .../fixtures/nren_l3_core_service_fixtures.py |  4 +-
 .../test_modify_nren_l3_core_service.py       | 62 +++++++------------
 3 files changed, 41 insertions(+), 58 deletions(-)

diff --git a/gso/workflows/nren_l3_core_service/modify_nren_l3_core_service.py b/gso/workflows/nren_l3_core_service/modify_nren_l3_core_service.py
index 835d90d2..c5ddd8ab 100644
--- a/gso/workflows/nren_l3_core_service/modify_nren_l3_core_service.py
+++ b/gso/workflows/nren_l3_core_service/modify_nren_l3_core_service.py
@@ -14,7 +14,7 @@ from pydantic import AfterValidator, BaseModel, ConfigDict, Field, computed_fiel
 from pydantic_forms.types import State
 from pydantic_forms.validators import Divider, Label
 
-from gso.products.product_blocks.bgp_session import BGPSession, IPFamily
+from gso.products.product_blocks.bgp_session import BGPSession, IPFamily, IPTypes
 from gso.products.product_blocks.nren_l3_core_service import NRENAccessPort
 from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPort
 from gso.products.product_types.edge_port import EdgePort
@@ -61,11 +61,12 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
     class BFDInputModel(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: BFDInputModel
+        bfd_enabled: bool = False
         has_custom_policies: bool = False
         authentication_key: str | None
         multipath_enabled: bool = False
@@ -75,6 +76,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
     class IPv4BGPPeer(BaseBGPPeer):
         peer_address: IPv4AddressType
         add_v4_multicast: bool = Field(default=False, exclude=True)
+        ip_type: IPTypes = IPTypes.IPV4
 
         @computed_field  # type: ignore[misc]
         @property
@@ -84,6 +86,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
     class IPv6BGPPeer(BaseBGPPeer):
         peer_address: IPv6AddressType
         add_v6_multicast: bool = Field(default=False, exclude=True)
+        ip_type: IPTypes = IPTypes.IPV6
 
         @computed_field  # type: ignore[misc]
         @property
@@ -150,12 +153,14 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
             v4_bfd_settings: BFDInputModel = BFDInputModel(
                 bfd_enabled=current_sbp.v4_bfd_settings.bfd_enabled,
                 bfd_multiplier=current_sbp.v4_bfd_settings.bfd_multiplier,
-                bfd_interval=current_sbp.v4_bfd_settings.bfd_interval,
+                bfd_interval_rx=current_sbp.v4_bfd_settings.bfd_interval_rx,
+                bfd_interval_tx=current_sbp.v4_bfd_settings.bfd_interval_tx,
             )
             v6_bfd_settings: BFDInputModel = BFDInputModel(
                 bfd_enabled=current_sbp.v6_bfd_settings.bfd_enabled,
                 bfd_multiplier=current_sbp.v6_bfd_settings.bfd_multiplier,
-                bfd_interval=current_sbp.v6_bfd_settings.bfd_interval,
+                bfd_interval_rx=current_sbp.v6_bfd_settings.bfd_interval_rx,
+                bfd_interval_tx=current_sbp.v6_bfd_settings.bfd_interval_tx,
             )
             divider: Divider = Field(None, exclude=True)
             v4_bgp_peer: IPv4BGPPeer = IPv4BGPPeer(
@@ -249,18 +254,12 @@ def modify_existing_sbp_blocks(subscription: NRENL3CoreService, modified_sbp_lis
         )
 
         v4_peer = next(peer for peer in current_sbp.bgp_session_list if IPFamily.V4UNICAST in peer.families)
-        v4_peer_bfd_settings = modified_sbp_data["v4_bgp_peer"].pop("bfd_settings")
-        for attribute in v4_peer_bfd_settings:
-            setattr(v4_peer.bfd_settings, attribute, v4_peer_bfd_settings[attribute])
         for attribute in modified_sbp_data["v4_bgp_peer"]:
             setattr(v4_peer, attribute, modified_sbp_data["v4_bgp_peer"][attribute])
         for attribute in modified_sbp_data["v4_bfd_settings"]:
             setattr(current_sbp.v4_bfd_settings, attribute, modified_sbp_data["v4_bfd_settings"][attribute])
 
         v6_peer = next(peer for peer in current_sbp.bgp_session_list if IPFamily.V6UNICAST in peer.families)
-        v6_peer_bfd_settings = modified_sbp_data["v6_bgp_peer"].pop("bfd_settings")
-        for attribute in v6_peer_bfd_settings:
-            setattr(v6_peer.bfd_settings, attribute, v6_peer_bfd_settings[attribute])
         for attribute in modified_sbp_data["v6_bgp_peer"]:
             setattr(v6_peer, attribute, modified_sbp_data["v6_bgp_peer"][attribute])
         for attribute in modified_sbp_data["v6_bfd_settings"]:
@@ -283,14 +282,10 @@ def create_new_sbp_blocks(subscription: NRENL3CoreService, added_service_binding
     """Add new two :term:`SBP` to the :term:`NREN` L3 Core Service subscription."""
     for sbp_input in added_service_binding_ports:
         edge_port = EdgePort.from_subscription(sbp_input["edge_port_id"])
-        bgp_session_list = []
-        for session in sbp_input["bgp_peers"]:
-            bfd_settings = BFDSettings.new(subscription_id=uuid4(), **session.pop("bfd_settings"))
-            bgp_session_list.append(
-                BGPSession.new(
-                    subscription_id=uuid4(), **session, bfd_settings=bfd_settings, rtbh_enabled=True, is_multi_hop=True
-                )
-            )
+        bgp_session_list = [
+            BGPSession.new(subscription_id=uuid4(), **session, rtbh_enabled=True, is_multi_hop=True)
+            for session in sbp_input["bgp_peers"]
+        ]
         v4_bfd_settings = BFDSettings.new(subscription_id=uuid4(), **sbp_input.pop("v4_bfd_settings"))
         v6_bfd_settings = BFDSettings.new(subscription_id=uuid4(), **sbp_input.pop("v6_bfd_settings"))
         service_binding_port = ServiceBindingPort.new(
diff --git a/test/fixtures/nren_l3_core_service_fixtures.py b/test/fixtures/nren_l3_core_service_fixtures.py
index 15306c1a..64c01463 100644
--- a/test/fixtures/nren_l3_core_service_fixtures.py
+++ b/test/fixtures/nren_l3_core_service_fixtures.py
@@ -7,7 +7,7 @@ from orchestrator.domain import SubscriptionModel
 from orchestrator.types import SubscriptionLifecycle, UUIDstr
 
 from gso.products import ProductName
-from gso.products.product_blocks.bgp_session import BGPSession, IPFamily
+from gso.products.product_blocks.bgp_session import BGPSession, IPFamily, IPTypes
 from gso.products.product_blocks.nren_l3_core_service import NRENAccessPort
 from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPort
 from gso.products.product_types.edge_port import EdgePort
@@ -55,6 +55,7 @@ def bgp_session_subscription_factory(faker):
         is_passive: bool | None = False,
         rtbh_enabled: bool | None = False,
         bfd_enabled: bool | None = False,
+        ip_type: IPTypes | None = None,
     ):
         return BGPSession.new(
             subscription_id=uuid4(),
@@ -68,6 +69,7 @@ def bgp_session_subscription_factory(faker):
             is_multi_hop=is_multi_hop,
             rtbh_enabled=rtbh_enabled,
             is_passive=is_passive,
+            ip_type=ip_type if ip_type else faker.random_element(elements=[IPTypes.IPV4, IPTypes.IPV6]),
         )
 
     return create_bgp_session
diff --git a/test/workflows/nren_l3_core_service/test_modify_nren_l3_core_service.py b/test/workflows/nren_l3_core_service/test_modify_nren_l3_core_service.py
index be5caf91..e12c4fca 100644
--- a/test/workflows/nren_l3_core_service/test_modify_nren_l3_core_service.py
+++ b/test/workflows/nren_l3_core_service/test_modify_nren_l3_core_service.py
@@ -77,12 +77,12 @@ def test_modify_nren_l3_core_service_add_new_edge_port_success(
             "v4_bgp_peer": {
                 "authentication_key": faker.password(),
                 "peer_address": faker.ipv4(),
-                "bfd_settings": {"bfd_enabled": False},
+                "bfd_enabled": False,
             },
             "v6_bgp_peer": {
                 "authentication_key": faker.password(),
                 "peer_address": faker.ipv6(),
-                "bfd_settings": {"bfd_enabled": False},
+                "bfd_enabled": False,
             },
             "v4_bfd_settings": {"bfd_enabled": False},
             "v6_bfd_settings": {"bfd_enabled": False},
@@ -108,20 +108,18 @@ def sbp_input_form_data(faker):
             "custom_firewall_filters": True,
             "v4_bfd_settings": {
                 "bfd_enabled": True,
-                "bfd_interval": faker.pyint(),
+                "bfd_interval_rx": faker.pyint(),
+                "bfd_interval_tx": faker.pyint(),
                 "bfd_multiplier": faker.pyint(),
             },
             "v6_bfd_settings": {
                 "bfd_enabled": True,
-                "bfd_interval": faker.pyint(),
+                "bfd_interval_rx": faker.pyint(),
+                "bfd_interval_tx": faker.pyint(),
                 "bfd_multiplier": faker.pyint(),
             },
             "v4_bgp_peer": {
-                "bfd_settings": {
-                    "bfd_enabled": True,
-                    "bfd_interval": faker.pyint(),
-                    "bfd_multiplier": faker.pyint(),
-                },
+                "bfd_enabled": True,
                 "has_custom_policies": True,
                 "authentication_key": faker.password(),
                 "multipath_enabled": True,
@@ -131,11 +129,7 @@ def sbp_input_form_data(faker):
                 "add_v4_multicast": True,
             },
             "v6_bgp_peer": {
-                "bfd_settings": {
-                    "bfd_enabled": True,
-                    "bfd_interval": faker.pyint(),
-                    "bfd_multiplier": faker.pyint(),
-                },
+                "bfd_enabled": True,
                 "has_custom_policies": True,
                 "authentication_key": faker.password(),
                 "multipath_enabled": True,
@@ -194,16 +188,8 @@ def test_modify_nren_l3_core_service_modify_edge_port_success(
         )
 
         assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[0].bfd_settings.bfd_enabled
-            == new_sbp_data[i]["v4_bgp_peer"]["bfd_settings"]["bfd_enabled"]
-        )
-        assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[0].bfd_settings.bfd_interval
-            == new_sbp_data[i]["v4_bgp_peer"]["bfd_settings"]["bfd_interval"]
-        )
-        assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[0].bfd_settings.bfd_multiplier
-            == new_sbp_data[i]["v4_bgp_peer"]["bfd_settings"]["bfd_multiplier"]
+            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[0].bfd_enabled
+            == new_sbp_data[i]["v4_bgp_peer"]["bfd_enabled"]
         )
         assert (
             subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[0].has_custom_policies
@@ -238,16 +224,8 @@ def test_modify_nren_l3_core_service_modify_edge_port_success(
         )
 
         assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[1].bfd_settings.bfd_enabled
-            == new_sbp_data[i]["v6_bgp_peer"]["bfd_settings"]["bfd_enabled"]
-        )
-        assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[1].bfd_settings.bfd_interval
-            == new_sbp_data[i]["v6_bgp_peer"]["bfd_settings"]["bfd_interval"]
-        )
-        assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[1].bfd_settings.bfd_multiplier
-            == new_sbp_data[i]["v6_bgp_peer"]["bfd_settings"]["bfd_multiplier"]
+            subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[1].bfd_enabled
+            == new_sbp_data[i]["v6_bgp_peer"]["bfd_enabled"]
         )
         assert (
             subscription.nren_l3_core_service.nren_ap_list[i].sbp.bgp_session_list[1].has_custom_policies
@@ -285,8 +263,12 @@ def test_modify_nren_l3_core_service_modify_edge_port_success(
             == new_sbp_data[i]["v4_bfd_settings"]["bfd_enabled"]
         )
         assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_interval
-            == new_sbp_data[i]["v4_bfd_settings"]["bfd_interval"]
+            subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_interval_rx
+            == new_sbp_data[i]["v4_bfd_settings"]["bfd_interval_rx"]
+        )
+        assert (
+                subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_interval_tx
+                == new_sbp_data[i]["v4_bfd_settings"]["bfd_interval_tx"]
         )
         assert (
             subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_multiplier
@@ -297,8 +279,12 @@ def test_modify_nren_l3_core_service_modify_edge_port_success(
             == new_sbp_data[i]["v6_bfd_settings"]["bfd_enabled"]
         )
         assert (
-            subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_interval
-            == new_sbp_data[i]["v6_bfd_settings"]["bfd_interval"]
+            subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_interval_rx
+            == new_sbp_data[i]["v6_bfd_settings"]["bfd_interval_rx"]
+        )
+        assert (
+                subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_interval_tx
+                == new_sbp_data[i]["v6_bfd_settings"]["bfd_interval_tx"]
         )
         assert (
             subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_multiplier
-- 
GitLab