diff --git a/test/conftest.py b/test/conftest.py index 5b1e91f17ff182286d05db81dddd1e9f2b73f891..d27d20d4be345b085598189156d82a0cd13659d7 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -36,13 +36,17 @@ from gso.main import init_gso_app from gso.services.partners import PartnerSchema, create_partner from gso.utils.types.interfaces import LAGMember, LAGMemberList from test.fixtures import ( # noqa: F401 + bgp_session_subscription_factory, edge_port_subscription_factory, + geant_ip_subscription_factory, iptrunk_side_subscription_factory, iptrunk_subscription_factory, + nren_access_port_factory, office_router_subscription_factory, opengear_subscription_factory, router_subscription_factory, site_subscription_factory, + service_binding_port_factory, super_pop_switch_subscription_factory, ) diff --git a/test/fixtures/__init__.py b/test/fixtures/__init__.py index 2269a6b867b32a9adc6179b0f814e89b82cd2352..a5849b0d4e1023676adf6e87d2d34690579fb807 100644 --- a/test/fixtures/__init__.py +++ b/test/fixtures/__init__.py @@ -1,4 +1,10 @@ from test.fixtures.edge_port_fixtures import edge_port_subscription_factory +from test.fixtures.geant_ip_fixtures import ( + bgp_session_subscription_factory, + geant_ip_subscription_factory, + nren_access_port_factory, + service_binding_port_factory, +) from test.fixtures.iptrunk_fixtures import iptrunk_side_subscription_factory, iptrunk_subscription_factory from test.fixtures.office_router_fixtures import office_router_subscription_factory from test.fixtures.opengear_fixtures import opengear_subscription_factory @@ -16,4 +22,8 @@ __all__ = [ "opengear_subscription_factory", "site_subscription_factory", "super_pop_switch_subscription_factory", + "geant_ip_subscription_factory", + "bgp_session_subscription_factory", + "service_binding_port_factory", + "nren_access_port_factory", ] diff --git a/test/fixtures/geant_ip_fixtures.py b/test/fixtures/geant_ip_fixtures.py new file mode 100644 index 0000000000000000000000000000000000000000..0a703a121ca6860235619dd3d74fb0a6282b11b4 --- /dev/null +++ b/test/fixtures/geant_ip_fixtures.py @@ -0,0 +1,153 @@ +import random +from uuid import uuid4 + +import pytest +from orchestrator.db import db +from orchestrator.domain import SubscriptionModel +from orchestrator.types import SubscriptionLifecycle, UUIDstr + +from gso.products import EdgePort, ProductName +from gso.products.product_blocks.bgp_session import BGPSession, IPFamily +from gso.products.product_blocks.geant_ip import NRENAccessPort +from gso.products.product_blocks.service_binding_port import ServiceBindingPort +from gso.products.product_types.geant_ip import GeantIPInactive +from gso.services import subscriptions +from gso.utils.shared_enums import APType, SBPType +from gso.utils.types.ip_address import IPAddress + + +@pytest.fixture() +def bgp_session_subscription_factory(faker): + def create_bgp_session( + peer_address: IPAddress | None = None, + bfd_interval: int = 2, + bfd_multiplier: int = 2, + families: list[IPFamily] | None = None, + authentication_key: str | None = None, + *, + is_multi_hop: bool = False, + has_custom_policies: bool = False, + bfd_enabled: bool = True, + multipath_enabled: bool | None = True, + send_default_route: bool | None = True, + ): + return BGPSession.new( + subscription_id=uuid4(), + peer_address=peer_address or faker.ipv4(), + bfd_enabled=bfd_enabled, + families=families or [IPFamily.V4UNICAST], + has_custom_policies=has_custom_policies, + authentication_key=authentication_key or faker.password(), + multipath_enabled=multipath_enabled, + send_default_route=send_default_route, + is_multi_hop=is_multi_hop, + bfd_interval=bfd_interval, + bfd_multiplier=bfd_multiplier, + ) + + return create_bgp_session + + +@pytest.fixture() +def service_binding_port_factory(faker, bgp_session_subscription_factory): + def create_service_binding_port( + sbp_bgp_session_list: list | None = None, + geant_sid: str | None = None, + sbp_type: SBPType = SBPType.L3, + ipv4_address: str | None = None, + ipv6_address: str | None = None, + vlan_id: int | None = None, + *, + custom_firewall_filters: bool = False, + is_tagged: bool = False, + ): + return ServiceBindingPort.new( + subscription_id=uuid4(), + is_tagged=is_tagged, + vlan_id=vlan_id or faker.pyint(min_value=1, max_value=4096), + sbp_type=sbp_type, + ipv4_address=ipv4_address or faker.ipv4(), + ipv6_address=ipv6_address or faker.ipv6(), + custom_firewall_filters=custom_firewall_filters, + geant_sid=geant_sid or faker.geant_sid(), + sbp_bgp_session_list=sbp_bgp_session_list or [bgp_session_subscription_factory() for _ in range(2)], + ) + + return create_service_binding_port + + +@pytest.fixture() +def nren_access_port_factory(faker, edge_port_subscription_factory): + def create_nren_access_port( + nren_ap_type: APType | None = None, + edge_port: UUIDstr | None = None, + ): + edge_port = edge_port or edge_port_subscription_factory() + geant_ip_ep = EdgePort.from_subscription(edge_port).edge_port + return NRENAccessPort.new( + subscription_id=uuid4(), + nren_ap_type=nren_ap_type or random.choice(list(APType)), # noqa: S311 + geant_ip_ep=geant_ip_ep, + ) + + return create_nren_access_port + + +@pytest.fixture() +def geant_ip_subscription_factory( + faker, + partner_factory, + edge_port_subscription_factory, + bgp_session_subscription_factory, + service_binding_port_factory, + nren_access_port_factory, +): + def create_geant_ip_subscription( + description=None, + partner: dict | None = None, + nren_ap_list: list[NRENAccessPort] | None = None, + start_date="2023-05-24T00:00:00+00:00", + status: SubscriptionLifecycle | None = None, + ) -> UUIDstr: + product_id = subscriptions.get_product_id_by_name(ProductName.GEANT_IP) + partner = partner or partner_factory(name=faker.company(), email=faker.email()) + + # Create GEANT IP subscription with product_id and partner details + geant_ip_subscription = GeantIPInactive.from_product_id( + product_id, customer_id=partner["partner_id"], insync=True + ) + + # Default nren_ap_list creation with primary and backup access ports + nren_ap_list = nren_ap_list or [ + nren_access_port_factory(nren_ap_type=APType.PRIMARY, + edge_port=edge_port_subscription_factory(partner=partner)), + nren_access_port_factory(nren_ap_type=APType.BACKUP, + edge_port=edge_port_subscription_factory(partner=partner)), + ] + + # Assign and save edge port and service binding ports + for nren_ap in nren_ap_list: + edge_port = nren_ap.geant_ip_ep + edge_port.edge_port_sbp_list = [ + service_binding_port_factory(), + service_binding_port_factory(), + ] + + # Update subscription with description, start date, and status + geant_ip_subscription = SubscriptionModel.from_other_lifecycle( + geant_ip_subscription, + SubscriptionLifecycle.ACTIVE, + ) + + if status: + geant_ip_subscription.status = status + geant_ip_subscription.description = description or faker.text(max_nb_chars=30) + geant_ip_subscription.start_date = start_date + geant_ip_subscription.status = status or SubscriptionLifecycle.ACTIVE + geant_ip_subscription.save() + + db.session.commit() + + return str(geant_ip_subscription.subscription_id) + + return create_geant_ip_subscription