Skip to content
Snippets Groups Projects
Verified Commit 6786759d authored by Neda Moeini's avatar Neda Moeini Committed by Karel van Klink
Browse files

Update import and created_import NrenL3CoreService WF after BFD Settings change.

parent 039da651
Branches
No related tags found
1 merge request!298Add BFD configuration to Service binding ports
...@@ -245,8 +245,6 @@ class NRENL3CoreServiceImportModel(BaseModel): ...@@ -245,8 +245,6 @@ class NRENL3CoreServiceImportModel(BaseModel):
"""Base BGP Peer model.""" """Base BGP Peer model."""
bfd_enabled: bool = False bfd_enabled: bool = False
bfd_interval: int | None = None
bfd_multiplier: int | None = None
has_custom_policies: bool = False has_custom_policies: bool = False
authentication_key: str | None authentication_key: str | None
multipath_enabled: bool = False multipath_enabled: bool = False
...@@ -257,6 +255,14 @@ class NRENL3CoreServiceImportModel(BaseModel): ...@@ -257,6 +255,14 @@ class NRENL3CoreServiceImportModel(BaseModel):
is_multi_hop: bool is_multi_hop: bool
rtbh_enabled: bool # whether Remote Triggered Blackhole is enabled rtbh_enabled: bool # whether Remote Triggered Blackhole is enabled
class BFDSettingsModel(BaseModel):
"""BFD Settings model."""
bfd_enabled: bool = False
bfd_interval_rx: int | None = None
bfd_interval_tx: int | None = None
bfd_multiplier: int | None = None
class ServiceBindingPort(BaseModel): class ServiceBindingPort(BaseModel):
"""Service Binding model.""" """Service Binding model."""
...@@ -273,6 +279,8 @@ class NRENL3CoreServiceImportModel(BaseModel): ...@@ -273,6 +279,8 @@ class NRENL3CoreServiceImportModel(BaseModel):
ipv6_mask: IPV6Netmask ipv6_mask: IPV6Netmask
is_multi_hop: bool = True is_multi_hop: bool = True
bgp_peers: list["NRENL3CoreServiceImportModel.BaseBGPPeer"] bgp_peers: list["NRENL3CoreServiceImportModel.BaseBGPPeer"]
v4_bfd_settings: "NRENL3CoreServiceImportModel.BFDSettingsModel"
v6_bfd_settings: "NRENL3CoreServiceImportModel.BFDSettingsModel"
partner: str partner: str
service_binding_ports: list[ServiceBindingPort] service_binding_ports: list[ServiceBindingPort]
......
...@@ -12,9 +12,9 @@ from pydantic import BaseModel ...@@ -12,9 +12,9 @@ from pydantic import BaseModel
from pydantic_forms.types import UUIDstr from pydantic_forms.types import UUIDstr
from gso.products import ProductName from gso.products import ProductName
from gso.products.product_blocks.bgp_session import BFDSettings, BGPSession, IPFamily from gso.products.product_blocks.bgp_session import BGPSession, IPFamily, IPTypes
from gso.products.product_blocks.nren_l3_core_service import NRENAccessPortInactive from gso.products.product_blocks.nren_l3_core_service import NRENAccessPortInactive
from gso.products.product_blocks.service_binding_port import ServiceBindingPortInactive from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPortInactive
from gso.products.product_types.edge_port import EdgePort from gso.products.product_types.edge_port import EdgePort
from gso.products.product_types.nren_l3_core_service import ImportedNRENL3CoreServiceInactive, NRENL3CoreServiceType from gso.products.product_types.nren_l3_core_service import ImportedNRENL3CoreServiceInactive, NRENL3CoreServiceType
from gso.services.partners import get_partner_by_name from gso.services.partners import get_partner_by_name
...@@ -27,13 +27,14 @@ from gso.utils.types.virtual_identifiers import VLAN_ID ...@@ -27,13 +27,14 @@ from gso.utils.types.virtual_identifiers import VLAN_ID
def initial_input_form_generator() -> FormGenerator: def initial_input_form_generator() -> FormGenerator:
"""Take all information passed to this workflow by the :term:`API` endpoint that was called.""" """Take all information passed to this workflow by the :term:`API` endpoint that was called."""
class BFDSettings(BaseModel): class BFDSettingsModel(BaseModel):
bfd_enabled: bool = False 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 bfd_multiplier: int | None = None
class BaseBGPPeer(BaseModel): class BaseBGPPeer(BaseModel):
bfd_settings: BFDSettings bfd_enabled: bool = False
has_custom_policies: bool = False has_custom_policies: bool = False
authentication_key: str | None authentication_key: str | None
multipath_enabled: bool = False multipath_enabled: bool = False
...@@ -59,6 +60,8 @@ def initial_input_form_generator() -> FormGenerator: ...@@ -59,6 +60,8 @@ def initial_input_form_generator() -> FormGenerator:
rtbh_enabled: bool = True rtbh_enabled: bool = True
is_multi_hop: bool = True is_multi_hop: bool = True
bgp_peers: list[BaseBGPPeer] bgp_peers: list[BaseBGPPeer]
v4_bfd_settings: BFDSettingsModel
v6_bfd_settings: BFDSettingsModel
class ImportNRENL3CoreServiceForm(FormPage): class ImportNRENL3CoreServiceForm(FormPage):
partner: str partner: str
...@@ -88,15 +91,22 @@ def initialize_subscription(subscription: ImportedNRENL3CoreServiceInactive, ser ...@@ -88,15 +91,22 @@ def initialize_subscription(subscription: ImportedNRENL3CoreServiceInactive, ser
for service_binding_port in service_binding_ports: for service_binding_port in service_binding_ports:
edge_port_subscription = EdgePort.from_subscription(service_binding_port.pop("edge_port")) edge_port_subscription = EdgePort.from_subscription(service_binding_port.pop("edge_port"))
bgp_peers = service_binding_port.pop("bgp_peers") bgp_peers = service_binding_port.pop("bgp_peers")
sbp_bgp_session_list = [] sbp_bgp_session_list = [
for session in bgp_peers: BGPSession.new(
bfd_settings = BFDSettings.new(subscription_id=uuid4(), **session.pop("bfd_settings")) subscription_id=uuid4(),
sbp_bgp_session_list.append(BGPSession.new(subscription_id=uuid4(), bfd_settings=bfd_settings, **session)) ip_type=IPTypes.IPV4
if session["families"] in {IPFamily.V4UNICAST, IPFamily.V4MULTICAST}
else IPTypes.IPV6,
**session,
)
for session in bgp_peers
]
service_binding_port_subscription = ServiceBindingPortInactive.new( service_binding_port_subscription = ServiceBindingPortInactive.new(
subscription_id=uuid4(), subscription_id=uuid4(),
edge_port=edge_port_subscription.edge_port, edge_port=edge_port_subscription.edge_port,
sbp_bgp_session_list=sbp_bgp_session_list, sbp_bgp_session_list=sbp_bgp_session_list,
v4_bfd_settings=BFDSettings.new(subscription_id=uuid4(), **(service_binding_port.pop("v4_bfd_settings"))),
v6_bfd_settings=BFDSettings.new(subscription_id=uuid4(), **(service_binding_port.pop("v6_bfd_settings"))),
**service_binding_port, **service_binding_port,
) )
subscription.nren_l3_core_service.nren_ap_list.append( subscription.nren_l3_core_service.nren_ap_list.append(
......
...@@ -13,7 +13,7 @@ from orchestrator.workflows.utils import wrap_create_initial_input_form ...@@ -13,7 +13,7 @@ from orchestrator.workflows.utils import wrap_create_initial_input_form
from pydantic import BaseModel, ConfigDict, Field, computed_field from pydantic import BaseModel, ConfigDict, Field, computed_field
from pydantic_forms.validators import Divider from pydantic_forms.validators import Divider
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 NRENAccessPortInactive from gso.products.product_blocks.nren_l3_core_service import NRENAccessPortInactive
from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPortInactive from gso.products.product_blocks.service_binding_port import BFDSettings, ServiceBindingPortInactive
from gso.products.product_types.edge_port import EdgePort from gso.products.product_types.edge_port import EdgePort
...@@ -72,6 +72,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -72,6 +72,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
class IPv4BGPPeer(BaseBGPPeer): class IPv4BGPPeer(BaseBGPPeer):
peer_address: IPv4AddressType peer_address: IPv4AddressType
add_v4_multicast: bool = Field(default=False, exclude=True) add_v4_multicast: bool = Field(default=False, exclude=True)
ip_type: IPTypes = IPTypes.IPV4
@computed_field # type: ignore[misc] @computed_field # type: ignore[misc]
@property @property
...@@ -81,6 +82,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -81,6 +82,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
class IPv6BGPPeer(BaseBGPPeer): class IPv6BGPPeer(BaseBGPPeer):
peer_address: IPv6AddressType peer_address: IPv6AddressType
add_v6_multicast: bool = Field(default=False, exclude=True) add_v6_multicast: bool = Field(default=False, exclude=True)
ip_type: IPTypes = IPTypes.IPV6
@computed_field # type: ignore[misc] @computed_field # type: ignore[misc]
@property @property
......
...@@ -313,21 +313,19 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc ...@@ -313,21 +313,19 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc
"ipv6_mask": faker.ipv6_netmask(), "ipv6_mask": faker.ipv6_netmask(),
"v4_bfd_settings": { "v4_bfd_settings": {
"bfd_enabled": True, "bfd_enabled": True,
"bfd_interval": faker.pyint(), "bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(), "bfd_multiplier": faker.pyint(),
}, },
"v6_bfd_settings": { "v6_bfd_settings": {
"bfd_enabled": True, "bfd_enabled": True,
"bfd_interval": faker.pyint(), "bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(), "bfd_multiplier": faker.pyint(),
}, },
"bgp_peers": [ "bgp_peers": [
{ {
"bfd_settings": { "bfd_enabled": True,
"bfd_enabled": True,
"bfd_interval": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"has_custom_policies": True, "has_custom_policies": True,
"authentication_key": faker.password(), "authentication_key": faker.password(),
"multipath_enabled": False, "multipath_enabled": False,
...@@ -339,11 +337,7 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc ...@@ -339,11 +337,7 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc
"rtbh_enabled": True, "rtbh_enabled": True,
}, },
{ {
"bfd_settings": { "bfd_enabled": True,
"bfd_enabled": True,
"bfd_interval": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"has_custom_policies": True, "has_custom_policies": True,
"authentication_key": faker.password(), "authentication_key": faker.password(),
"multipath_enabled": False, "multipath_enabled": False,
...@@ -368,8 +362,6 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc ...@@ -368,8 +362,6 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc
"bgp_peers": [ "bgp_peers": [
{ {
"bfd_enabled": True, "bfd_enabled": True,
"bfd_interval": faker.pyint(),
"bfd_multiplier": faker.pyint(),
"has_custom_policies": True, "has_custom_policies": True,
"authentication_key": faker.password(), "authentication_key": faker.password(),
"multipath_enabled": False, "multipath_enabled": False,
...@@ -382,8 +374,6 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc ...@@ -382,8 +374,6 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc
}, },
{ {
"bfd_enabled": True, "bfd_enabled": True,
"bfd_interval": faker.pyint(),
"bfd_multiplier": faker.pyint(),
"has_custom_policies": True, "has_custom_policies": True,
"authentication_key": faker.password(), "authentication_key": faker.password(),
"multipath_enabled": False, "multipath_enabled": False,
...@@ -395,6 +385,18 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc ...@@ -395,6 +385,18 @@ def nren_l3_core_service_data(temp_file, faker, partner_factory, edge_port_subsc
"rtbh_enabled": True, "rtbh_enabled": True,
}, },
], ],
"v4_bfd_settings": {
"bfd_enabled": True,
"bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"v6_bfd_settings": {
"bfd_enabled": True,
"bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
}, },
], ],
} }
...@@ -721,6 +723,18 @@ def test_import_nren_l3_core_service_with_invalid_edge_port( ...@@ -721,6 +723,18 @@ def test_import_nren_l3_core_service_with_invalid_edge_port(
"rtbh_enabled": True, "rtbh_enabled": True,
}, },
], ],
"v4_bfd_settings": {
"bfd_enabled": True,
"bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"v6_bfd_settings": {
"bfd_enabled": True,
"bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
}, },
{ {
"edge_port": edge_port_subscription_factory(), "edge_port": edge_port_subscription_factory(),
...@@ -749,6 +763,18 @@ def test_import_nren_l3_core_service_with_invalid_edge_port( ...@@ -749,6 +763,18 @@ def test_import_nren_l3_core_service_with_invalid_edge_port(
"rtbh_enabled": True, "rtbh_enabled": True,
}, },
], ],
"v4_bfd_settings": {
"bfd_enabled": True,
"bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"v6_bfd_settings": {
"bfd_enabled": True,
"bfd_interval_rx": faker.pyint(),
"bfd_interval_tx": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
}, },
] ]
) )
......
...@@ -29,21 +29,19 @@ def test_create_imported_nren_l3_core_service_success( ...@@ -29,21 +29,19 @@ def test_create_imported_nren_l3_core_service_success(
"custom_firewall_filters": faker.boolean(), "custom_firewall_filters": faker.boolean(),
"v4_bfd_settings": { "v4_bfd_settings": {
"bfd_enabled": True, "bfd_enabled": True,
"bfd_interval": faker.pyint(), "bfd_interval_tx": faker.pyint(),
"bfd_interval_rx": faker.pyint(),
"bfd_multiplier": faker.pyint(), "bfd_multiplier": faker.pyint(),
}, },
"v6_bfd_settings": { "v6_bfd_settings": {
"bfd_enabled": True, "bfd_enabled": True,
"bfd_interval": faker.pyint(), "bfd_interval_tx": faker.pyint(),
"bfd_interval_rx": faker.pyint(),
"bfd_multiplier": faker.pyint(), "bfd_multiplier": faker.pyint(),
}, },
"bgp_peers": [ "bgp_peers": [
{ {
"bfd_settings": { "bfd_enabled": faker.boolean(),
"bfd_enabled": True,
"bfd_interval": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"has_custom_policies": faker.boolean(), "has_custom_policies": faker.boolean(),
"authentication_key": faker.password(), "authentication_key": faker.password(),
"multipath_enabled": faker.boolean(), "multipath_enabled": faker.boolean(),
...@@ -55,11 +53,7 @@ def test_create_imported_nren_l3_core_service_success( ...@@ -55,11 +53,7 @@ def test_create_imported_nren_l3_core_service_success(
"rtbh_enabled": faker.boolean(), "rtbh_enabled": faker.boolean(),
}, },
{ {
"bfd_settings": { "bfd_enabled": faker.boolean(),
"bfd_enabled": faker.boolean(),
"bfd_interval": faker.pyint(),
"bfd_multiplier": faker.pyint(),
},
"has_custom_policies": faker.boolean(), "has_custom_policies": faker.boolean(),
"authentication_key": faker.password(), "authentication_key": faker.password(),
"multipath_enabled": faker.boolean(), "multipath_enabled": faker.boolean(),
......
...@@ -4,7 +4,6 @@ import pytest ...@@ -4,7 +4,6 @@ import pytest
from orchestrator.types import SubscriptionLifecycle from orchestrator.types import SubscriptionLifecycle
from gso.products import ProductName from gso.products import ProductName
from gso.products.product_blocks.bgp_session import IPTypes
from gso.products.product_types.nren_l3_core_service import NRENL3CoreService from gso.products.product_types.nren_l3_core_service import NRENL3CoreService
from gso.services.subscriptions import get_product_id_by_name from gso.services.subscriptions import get_product_id_by_name
from gso.utils.shared_enums import APType from gso.utils.shared_enums import APType
...@@ -22,7 +21,6 @@ def base_bgp_peer_input(faker): ...@@ -22,7 +21,6 @@ def base_bgp_peer_input(faker):
"multipath_enabled": faker.boolean(), "multipath_enabled": faker.boolean(),
"send_default_route": faker.boolean(), "send_default_route": faker.boolean(),
"is_passive": faker.boolean(), "is_passive": faker.boolean(),
"ip_type": faker.random_element(elements=[IPTypes.IPV4, IPTypes.IPV6]),
} }
return _base_bgp_peer_input return _base_bgp_peer_input
......
...@@ -267,8 +267,8 @@ def test_modify_nren_l3_core_service_modify_edge_port_success( ...@@ -267,8 +267,8 @@ def test_modify_nren_l3_core_service_modify_edge_port_success(
== new_sbp_data[i]["v4_bfd_settings"]["bfd_interval_rx"] == new_sbp_data[i]["v4_bfd_settings"]["bfd_interval_rx"]
) )
assert ( assert (
subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_interval_tx 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"] == new_sbp_data[i]["v4_bfd_settings"]["bfd_interval_tx"]
) )
assert ( assert (
subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_multiplier subscription.nren_l3_core_service.nren_ap_list[i].sbp.v4_bfd_settings.bfd_multiplier
...@@ -283,8 +283,8 @@ def test_modify_nren_l3_core_service_modify_edge_port_success( ...@@ -283,8 +283,8 @@ def test_modify_nren_l3_core_service_modify_edge_port_success(
== new_sbp_data[i]["v6_bfd_settings"]["bfd_interval_rx"] == new_sbp_data[i]["v6_bfd_settings"]["bfd_interval_rx"]
) )
assert ( assert (
subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_interval_tx 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"] == new_sbp_data[i]["v6_bfd_settings"]["bfd_interval_tx"]
) )
assert ( assert (
subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_multiplier subscription.nren_l3_core_service.nren_ap_list[i].sbp.v6_bfd_settings.bfd_multiplier
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment