From 5a97c6657e8c3e69743c789aa989efdfa01ddce3 Mon Sep 17 00:00:00 2001 From: Karel van Klink <karel.vanklink@geant.org> Date: Mon, 21 Oct 2024 17:39:18 +0200 Subject: [PATCH] Update validate_iptrunk WF_USABLE_MAP * Allow for iptrunk validation workflow to be run on those that are still provisioning * Update test fixture for router to deduplicate code --- gso/workflows/__init__.py | 1 + test/api/test_subscriptions.py | 36 ++--- test/cli/conftest.py | 2 +- test/cli/test_imports.py | 6 +- test/conftest.py | 3 +- test/fixtures.py | 125 ++++-------------- test/utils/test_helpers.py | 20 +-- .../iptrunk/test_create_imported_iptrunk.py | 6 +- test/workflows/iptrunk/test_create_iptrunk.py | 8 +- .../workflows/iptrunk/test_migrate_iptrunk.py | 19 ++- .../iptrunk/test_modify_trunk_interface.py | 11 +- .../iptrunk/test_terminate_iptrunk.py | 6 +- .../iptrunk/test_validate_iptrunk.py | 59 +++------ test/workflows/router/test_activate_router.py | 4 +- test/workflows/router/test_import_router.py | 4 +- .../router/test_modify_connection_stratey.py | 4 +- test/workflows/router/test_promote_p_to_pe.py | 35 +++-- .../router/test_redeploy_base_config.py | 4 +- .../workflows/router/test_terminate_router.py | 16 +-- .../workflows/router/test_update_ibgp_mesh.py | 14 +- test/workflows/router/test_validate_router.py | 9 +- 21 files changed, 161 insertions(+), 231 deletions(-) diff --git a/gso/workflows/__init__.py b/gso/workflows/__init__.py index f6a36f9b..d94174f2 100644 --- a/gso/workflows/__init__.py +++ b/gso/workflows/__init__.py @@ -22,6 +22,7 @@ WF_USABLE_MAP.update({ "terminate_iptrunk": ALL_ALIVE_STATES, "promote_p_to_pe": [SubscriptionLifecycle.ACTIVE], "validate_router": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], + "validate_iptrunk": [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE], }) # IP trunk workflows diff --git a/test/api/test_subscriptions.py b/test/api/test_subscriptions.py index 3e457a58..53de229d 100644 --- a/test/api/test_subscriptions.py +++ b/test/api/test_subscriptions.py @@ -1,15 +1,17 @@ from orchestrator.types import SubscriptionLifecycle +from gso.utils.shared_enums import Vendor + ROUTER_SUBSCRIPTION_ENDPOINT = "/api/v1/subscriptions/routers" DASHBOARD_DEVICES_ENDPOINT = "/api/v1/subscriptions/dashboard_devices" -def test_router_subscriptions_endpoint_with_valid_api_key(test_client, nokia_router_subscription_factory): - nokia_router_subscription_factory() - nokia_router_subscription_factory() - nokia_router_subscription_factory() - nokia_router_subscription_factory(status=SubscriptionLifecycle.TERMINATED) - nokia_router_subscription_factory(status=SubscriptionLifecycle.INITIAL) +def test_router_subscriptions_endpoint_with_valid_api_key(test_client, router_subscription_factory): + router_subscription_factory() + router_subscription_factory() + router_subscription_factory() + router_subscription_factory(status=SubscriptionLifecycle.TERMINATED) + router_subscription_factory(status=SubscriptionLifecycle.INITIAL) response = test_client.get( ROUTER_SUBSCRIPTION_ENDPOINT, headers={"Authorization": "Bearer another_REALY_random_AND_3cure_T0keN"} @@ -19,14 +21,14 @@ def test_router_subscriptions_endpoint_with_valid_api_key(test_client, nokia_rou assert len(response.json()) == 3 -def test_router_subscriptions_endpoint_with_invalid_api_key(test_client, nokia_router_subscription_factory): +def test_router_subscriptions_endpoint_with_invalid_api_key(test_client, router_subscription_factory): response = test_client.get(ROUTER_SUBSCRIPTION_ENDPOINT, headers={"Authorization": "Bearer fake_invalid_api_key"}) assert response.status_code == 403 assert response.json() == {"detail": "Invalid API Key"} -def test_router_subscriptions_endpoint_without_api_key(test_client, nokia_router_subscription_factory): +def test_router_subscriptions_endpoint_without_api_key(test_client, router_subscription_factory): response = test_client.get(ROUTER_SUBSCRIPTION_ENDPOINT) assert response.status_code == 403 @@ -35,14 +37,18 @@ def test_router_subscriptions_endpoint_without_api_key(test_client, nokia_router def test_dashboard_devices_endpoint_with_valid_api_key( test_client, - nokia_router_subscription_factory, + router_subscription_factory, office_router_subscription_factory, super_pop_switch_subscription_factory, ): - nokia_router_subscription_factory(router_fqdn="mx1.ams.nl.geant.net") - nokia_router_subscription_factory(router_fqdn="mx2.ams.nl.geant.net") - nokia_router_subscription_factory(status=SubscriptionLifecycle.PROVISIONING, router_fqdn="mx3.ams.nl.geant.net") - nokia_router_subscription_factory(status=SubscriptionLifecycle.INITIAL, router_fqdn="mx4.ams.nl.geant.net") + router_subscription_factory(router_fqdn="mx1.ams.nl.geant.net") + router_subscription_factory(router_fqdn="mx2.ams.nl.geant.net") + router_subscription_factory( + vendor=Vendor.NOKIA, status=SubscriptionLifecycle.PROVISIONING, router_fqdn="mx3.ams.nl.geant.net" + ) + router_subscription_factory( + vendor=Vendor.NOKIA, status=SubscriptionLifecycle.INITIAL, router_fqdn="mx4.ams.nl.geant.net" + ) office_router_subscription_factory(office_router_fqdn="office1.ams.nl.geant.net") office_router_subscription_factory( office_router_fqdn="office2.ams.nl.geant.net", status=SubscriptionLifecycle.TERMINATED @@ -75,14 +81,14 @@ def test_dashboard_devices_endpoint_with_valid_api_key( ] -def test_dashboard_devices_endpoint_with_invalid_api_key(test_client, nokia_router_subscription_factory): +def test_dashboard_devices_endpoint_with_invalid_api_key(test_client, router_subscription_factory): response = test_client.get(DASHBOARD_DEVICES_ENDPOINT, headers={"Authorization": "Bearer fake_invalid_api_key"}) assert response.status_code == 403 assert response.json() == {"detail": "Invalid API Key"} -def test_dashboard_devices_endpoint_without_api_key(test_client, nokia_router_subscription_factory): +def test_dashboard_devices_endpoint_without_api_key(test_client, router_subscription_factory): response = test_client.get(DASHBOARD_DEVICES_ENDPOINT) assert response.status_code == 403 diff --git a/test/cli/conftest.py b/test/cli/conftest.py index 92d726fa..031c5dc6 100644 --- a/test/cli/conftest.py +++ b/test/cli/conftest.py @@ -1,9 +1,9 @@ from test.fixtures import ( # noqa: F401 iptrunk_side_subscription_factory, iptrunk_subscription_factory, - nokia_router_subscription_factory, office_router_subscription_factory, opengear_subscription_factory, + router_subscription_factory, site_subscription_factory, super_pop_switch_subscription_factory, ) diff --git a/test/cli/test_imports.py b/test/cli/test_imports.py index d794d0f0..98332386 100644 --- a/test/cli/test_imports.py +++ b/test/cli/test_imports.py @@ -30,7 +30,7 @@ def temp_file(tmp_path) -> Path: @pytest.fixture() -def iptrunk_data(temp_file, nokia_router_subscription_factory, faker) -> (Path, dict): +def iptrunk_data(temp_file, router_subscription_factory, faker) -> (Path, dict): def _iptrunk_data( *, ipv4_network=None, @@ -44,8 +44,8 @@ def iptrunk_data(temp_file, nokia_router_subscription_factory, faker) -> (Path, side_a_ae_name=None, side_b_ae_name=None, ): - router_side_a = nokia_router_subscription_factory() - router_side_b = nokia_router_subscription_factory() + router_side_a = router_subscription_factory() + router_side_b = router_subscription_factory() ipv4_network = ipv4_network or str(faker.ipv4_network(max_subnet=31)) ipv6_network = ipv6_network or str(faker.ipv6_network(max_subnet=126)) diff --git a/test/conftest.py b/test/conftest.py index ea765207..1cf0d399 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -38,10 +38,9 @@ from gso.utils.types.interfaces import LAGMember, LAGMemberList from test.fixtures import ( # noqa: F401 iptrunk_side_subscription_factory, iptrunk_subscription_factory, - juniper_router_subscription_factory, - nokia_router_subscription_factory, office_router_subscription_factory, opengear_subscription_factory, + router_subscription_factory, site_subscription_factory, super_pop_switch_subscription_factory, test_workflow, diff --git a/test/fixtures.py b/test/fixtures.py index 0bb920c0..6c392855 100644 --- a/test/fixtures.py +++ b/test/fixtures.py @@ -36,8 +36,10 @@ from gso.products.product_types.router import ImportedRouterInactive, Router, Ro from gso.products.product_types.site import ImportedSiteInactive, Site, SiteInactive from gso.products.product_types.super_pop_switch import ImportedSuperPopSwitchInactive, SuperPopSwitchInactive from gso.services import subscriptions +from gso.utils.helpers import iso_from_ipv4 from gso.utils.shared_enums import Vendor from gso.utils.types.interfaces import PhysicalPortCapacity +from gso.utils.types.ip_address import IPv4AddressType, IPv6AddressType from test.workflows import WorkflowInstanceForTests @@ -110,35 +112,26 @@ def site_subscription_factory(faker, geant_partner): @pytest.fixture() -def nokia_router_subscription_factory(site_subscription_factory, faker, geant_partner): +def router_subscription_factory(site_subscription_factory, faker, geant_partner): def subscription_create( - description=None, - start_date="2023-05-24T00:00:00+00:00", - router_fqdn=None, - router_ts_port=None, - router_access_via_ts=None, - router_lo_ipv4_address=None, - router_lo_ipv6_address=None, - router_lo_iso_address=None, - router_role=RouterRole.PE, + description: str | None = None, + start_date: str | None = "2023-05-24T00:00:00+00:00", + router_fqdn: str | None = None, + router_ts_port: int | None = None, + router_lo_ipv4_address: IPv4AddressType | None = None, + router_lo_ipv6_address: IPv6AddressType | None = None, + router_lo_iso_address: str | None = None, + router_role: RouterRole | None = RouterRole.PE, router_site=None, status: SubscriptionLifecycle | None = None, partner: dict | None = None, + vendor: Vendor | None = Vendor.NOKIA, *, + router_access_via_ts: bool | None = None, is_imported: bool | None = True, ) -> UUIDstr: if partner is None: partner = geant_partner - - description = description or faker.text(max_nb_chars=30) - router_fqdn = router_fqdn or faker.domain_name(levels=4) - router_ts_port = router_ts_port or faker.random_int(min=1, max=49151) - router_access_via_ts = router_access_via_ts or faker.boolean() - router_lo_ipv4_address = router_lo_ipv4_address or ipaddress.IPv4Address(faker.ipv4()) - router_lo_ipv6_address = router_lo_ipv6_address or ipaddress.IPv6Address(faker.ipv6()) - router_lo_iso_address = router_lo_iso_address or faker.word() - router_site = router_site or site_subscription_factory() - if is_imported: product_id = subscriptions.get_product_id_by_name(ProductName.ROUTER) router_subscription = RouterInactive.from_product_id( @@ -150,85 +143,23 @@ def nokia_router_subscription_factory(site_subscription_factory, faker, geant_pa product_id, customer_id=partner["partner_id"], insync=True ) - router_subscription.router.router_fqdn = router_fqdn - router_subscription.router.router_ts_port = router_ts_port - router_subscription.router.router_access_via_ts = router_access_via_ts - router_subscription.router.router_lo_ipv4_address = router_lo_ipv4_address - router_subscription.router.router_lo_ipv6_address = router_lo_ipv6_address - router_subscription.router.router_lo_iso_address = router_lo_iso_address + router_subscription.router.router_fqdn = router_fqdn or faker.domain_name(levels=4) + router_subscription.router.router_ts_port = router_ts_port or faker.port_number(is_user=True) + router_subscription.router.router_access_via_ts = router_access_via_ts or faker.boolean() + router_subscription.router.router_lo_ipv4_address = router_lo_ipv4_address or ipaddress.IPv4Address( + faker.ipv4() + ) + router_subscription.router.router_lo_ipv6_address = router_lo_ipv6_address or ipaddress.IPv6Address( + faker.ipv6() + ) + router_subscription.router.router_lo_iso_address = router_lo_iso_address or iso_from_ipv4(faker.ipv4()) router_subscription.router.router_role = router_role - router_subscription.router.router_site = Site.from_subscription(router_site).site - router_subscription.router.vendor = Vendor.NOKIA + router_subscription.router.router_site = Site.from_subscription(router_site or site_subscription_factory()).site + router_subscription.router.vendor = vendor router_subscription = SubscriptionModel.from_other_lifecycle(router_subscription, SubscriptionLifecycle.ACTIVE) router_subscription.insync = True - router_subscription.description = description - router_subscription.start_date = start_date - - if status: - router_subscription.status = status - - router_subscription.save() - db.session.commit() - - return str(router_subscription.subscription_id) - - return subscription_create - - -@pytest.fixture() -def juniper_router_subscription_factory(site_subscription_factory, faker, geant_partner): - def subscription_create( - description=None, - start_date="2023-05-24T00:00:00+00:00", - router_fqdn=None, - router_ts_port=None, - router_access_via_ts=None, - router_lo_ipv4_address=None, - router_lo_ipv6_address=None, - router_lo_iso_address=None, - router_role=RouterRole.PE, - router_site=None, - status: SubscriptionLifecycle | None = None, - partner: dict | None = None, - *, - is_imported: bool | None = True, - ) -> UUIDstr: - if partner is None: - partner = geant_partner - - description = description or faker.text(max_nb_chars=30) - router_fqdn = router_fqdn or faker.domain_name(levels=4) - router_ts_port = router_ts_port or faker.random_int(min=1, max=49151) - router_access_via_ts = router_access_via_ts or faker.boolean() - router_lo_ipv4_address = router_lo_ipv4_address or ipaddress.IPv4Address(faker.ipv4()) - router_lo_ipv6_address = router_lo_ipv6_address or ipaddress.IPv6Address(faker.ipv6()) - router_lo_iso_address = router_lo_iso_address or faker.word() - router_site = router_site or site_subscription_factory() - - if is_imported: - product_id = subscriptions.get_product_id_by_name(ProductName.ROUTER) - router_subscription = RouterInactive.from_product_id( - product_id, customer_id=partner["partner_id"], insync=True - ) - else: - product_id = subscriptions.get_product_id_by_name(ProductName.IMPORTED_ROUTER) - router_subscription = ImportedRouterInactive.from_product_id( - product_id, customer_id=partner["partner_id"], insync=True - ) - - router_subscription.router.router_fqdn = router_fqdn - router_subscription.router.router_ts_port = router_ts_port - router_subscription.router.router_access_via_ts = router_access_via_ts - router_subscription.router.router_lo_ipv4_address = router_lo_ipv4_address - router_subscription.router.router_lo_ipv6_address = router_lo_ipv6_address - router_subscription.router.router_lo_iso_address = router_lo_iso_address - router_subscription.router.router_role = router_role - router_subscription.router.router_site = Site.from_subscription(router_site).site - router_subscription.router.vendor = Vendor.JUNIPER - - router_subscription = SubscriptionModel.from_other_lifecycle(router_subscription, SubscriptionLifecycle.ACTIVE) - router_subscription.description = description + router_subscription.description = description or faker.text(max_nb_chars=30) router_subscription.start_date = start_date if status: @@ -243,7 +174,7 @@ def juniper_router_subscription_factory(site_subscription_factory, faker, geant_ @pytest.fixture() -def iptrunk_side_subscription_factory(nokia_router_subscription_factory, faker): +def iptrunk_side_subscription_factory(router_subscription_factory, faker): def subscription_create( iptrunk_side_node=None, iptrunk_side_ae_iface=None, @@ -251,7 +182,7 @@ def iptrunk_side_subscription_factory(nokia_router_subscription_factory, faker): iptrunk_side_ae_members=None, iptrunk_side_ae_members_description=None, ) -> IptrunkSideBlock: - iptrunk_side_node_id = iptrunk_side_node or nokia_router_subscription_factory() + iptrunk_side_node_id = iptrunk_side_node or router_subscription_factory() iptrunk_side_node = Router.from_subscription(iptrunk_side_node_id).router iptrunk_side_ae_iface = iptrunk_side_ae_iface or faker.pystr() iptrunk_side_ae_geant_a_sid = iptrunk_side_ae_geant_a_sid or faker.geant_sid() diff --git a/test/utils/test_helpers.py b/test/utils/test_helpers.py index 28779cd7..0df4ced9 100644 --- a/test/utils/test_helpers.py +++ b/test/utils/test_helpers.py @@ -99,9 +99,9 @@ def test_tt_number(generate_tt_numbers): validate_tt_number(tt_number) -def test_generate_inventory_for_active_routers_with_single_active_router(nokia_router_subscription_factory): +def test_generate_inventory_for_active_routers_with_single_active_router(router_subscription_factory): """Test the generation of inventory for a single active P router.""" - router = Router.from_subscription(nokia_router_subscription_factory(router_role=RouterRole.P)) + router = Router.from_subscription(router_subscription_factory(router_role=RouterRole.P)) expected_result = { "all": { "hosts": { @@ -116,14 +116,14 @@ def test_generate_inventory_for_active_routers_with_single_active_router(nokia_r assert generate_inventory_for_active_routers(RouterRole.P) == expected_result -def test_generate_inventory_for_active_routers_with_multiple_routers(nokia_router_subscription_factory): +def test_generate_inventory_for_active_routers_with_multiple_routers(router_subscription_factory): """Test the generation of inventory for multiple active P and PE routers""" for _ in range(5): - nokia_router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory(router_role=RouterRole.P) for _ in range(3): - nokia_router_subscription_factory(router_role=RouterRole.PE) - nokia_router_subscription_factory(status=SubscriptionLifecycle.TERMINATED) - nokia_router_subscription_factory(status=SubscriptionLifecycle.INITIAL) + router_subscription_factory(router_role=RouterRole.PE) + router_subscription_factory(status=SubscriptionLifecycle.TERMINATED) + router_subscription_factory(status=SubscriptionLifecycle.INITIAL) # Test the generation of inventory for multiple active P routers. inventory = generate_inventory_for_active_routers(RouterRole.P) assert len(inventory["all"]["hosts"]) == 5 @@ -131,11 +131,11 @@ def test_generate_inventory_for_active_routers_with_multiple_routers(nokia_route assert len(inventory["all"]["hosts"]) == 3 -def test_generate_inventory_for_active_routers_with_excluded_router(nokia_router_subscription_factory): +def test_generate_inventory_for_active_routers_with_excluded_router(router_subscription_factory): """Test the generation of inventory for active P routers with an excluded router.""" for _ in range(5): - nokia_router_subscription_factory(router_role=RouterRole.P) - router = nokia_router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory(router_role=RouterRole.P) + router = router_subscription_factory(router_role=RouterRole.P) excluded_routers = [Router.from_subscription(router).router.router_fqdn] inventory = generate_inventory_for_active_routers(RouterRole.P, exclude_routers=excluded_routers) assert len(inventory["all"]["hosts"]) == 5 # 6 P routers, the last one is excluded, so 5 P routers are left. diff --git a/test/workflows/iptrunk/test_create_imported_iptrunk.py b/test/workflows/iptrunk/test_create_imported_iptrunk.py index d172dc8d..25d68d8f 100644 --- a/test/workflows/iptrunk/test_create_imported_iptrunk.py +++ b/test/workflows/iptrunk/test_create_imported_iptrunk.py @@ -13,7 +13,7 @@ from test.workflows import ( @pytest.fixture() -def workflow_input_data(faker, nokia_router_subscription_factory): +def workflow_input_data(faker, router_subscription_factory): return { "partner": "GEANT", "geant_s_sid": faker.geant_sid(), @@ -22,13 +22,13 @@ def workflow_input_data(faker, nokia_router_subscription_factory): "iptrunk_speed": PhysicalPortCapacity.FOUR_HUNDRED_GIGABIT_PER_SECOND, "iptrunk_minimum_links": 2, "iptrunk_isis_metric": 10000, - "side_a_node_id": nokia_router_subscription_factory(), + "side_a_node_id": router_subscription_factory(), "side_a_ae_iface": faker.network_interface(), "side_a_ae_geant_a_sid": faker.geant_sid(), "side_a_ae_members": [ {"interface_name": faker.network_interface(), "interface_description": faker.sentence()} for _ in range(3) ], - "side_b_node_id": nokia_router_subscription_factory(), + "side_b_node_id": router_subscription_factory(), "side_b_ae_iface": faker.network_interface(), "side_b_ae_geant_a_sid": faker.geant_sid(), "side_b_ae_members": [ diff --git a/test/workflows/iptrunk/test_create_iptrunk.py b/test/workflows/iptrunk/test_create_iptrunk.py index 267cd382..6be42fae 100644 --- a/test/workflows/iptrunk/test_create_iptrunk.py +++ b/test/workflows/iptrunk/test_create_iptrunk.py @@ -47,16 +47,16 @@ def _netbox_client_mock(): @pytest.fixture() -def input_form_wizard_data(request, juniper_router_subscription_factory, nokia_router_subscription_factory, faker): +def input_form_wizard_data(request, router_subscription_factory, faker): vendor = getattr(request, "param", Vendor.NOKIA) - router_side_a = nokia_router_subscription_factory() + router_side_a = router_subscription_factory() # Set side b router to Juniper if vendor == Vendor.JUNIPER: - router_side_b = juniper_router_subscription_factory() + router_side_b = router_subscription_factory(vendor=Vendor.JUNIPER) side_b_members = faker.link_members_juniper()[0:2] else: - router_side_b = nokia_router_subscription_factory() + router_side_b = router_subscription_factory() side_b_members = [ {"interface_name": f"Interface{interface}", "interface_description": faker.sentence()} for interface in range(2) diff --git a/test/workflows/iptrunk/test_migrate_iptrunk.py b/test/workflows/iptrunk/test_migrate_iptrunk.py index 083d85d9..525ce49b 100644 --- a/test/workflows/iptrunk/test_migrate_iptrunk.py +++ b/test/workflows/iptrunk/test_migrate_iptrunk.py @@ -25,8 +25,7 @@ def migrate_form_input( request, faker, iptrunk_subscription_factory, - juniper_router_subscription_factory, - nokia_router_subscription_factory, + router_subscription_factory, iptrunk_side_subscription_factory, ): use_juniper = getattr(request, "param", UseJuniperSide.NONE) @@ -37,31 +36,31 @@ def migrate_form_input( # Nokia -> Juniper product_id = iptrunk_subscription_factory() old_subscription = Iptrunk.from_subscription(product_id) - new_router = juniper_router_subscription_factory() + new_router = router_subscription_factory(vendor=Vendor.JUNIPER) replace_side = str(old_subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.subscription.subscription_id) new_side_ae_members = new_side_ae_members_juniper lag_name = "ae1" elif use_juniper == UseJuniperSide.SIDE_B: # Juniper -> Nokia - old_side_a_node = juniper_router_subscription_factory() + old_side_a_node = router_subscription_factory(vendor=Vendor.JUNIPER) old_side_a_node = iptrunk_side_subscription_factory(iptrunk_side_node=old_side_a_node) - old_side_b_node = juniper_router_subscription_factory() + old_side_b_node = router_subscription_factory(vendor=Vendor.JUNIPER) old_side_b_node = iptrunk_side_subscription_factory(iptrunk_side_node=old_side_b_node) product_id = iptrunk_subscription_factory(iptrunk_sides=[old_side_a_node, old_side_b_node]) old_subscription = Iptrunk.from_subscription(product_id) - new_router = nokia_router_subscription_factory() + new_router = router_subscription_factory() replace_side = str(old_subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.subscription.subscription_id) new_side_ae_members = new_side_ae_members_nokia lag_name = "lag-1" elif use_juniper == UseJuniperSide.SIDE_BOTH: # Juniper -> Juniper - old_side_a_node = juniper_router_subscription_factory() + old_side_a_node = router_subscription_factory(vendor=Vendor.JUNIPER) old_side_a_node = iptrunk_side_subscription_factory(iptrunk_side_node=old_side_a_node) - old_side_b_node = juniper_router_subscription_factory() + old_side_b_node = router_subscription_factory(vendor=Vendor.JUNIPER) old_side_b_node = iptrunk_side_subscription_factory(iptrunk_side_node=old_side_b_node) product_id = iptrunk_subscription_factory(iptrunk_sides=[old_side_a_node, old_side_b_node]) old_subscription = Iptrunk.from_subscription(product_id) - new_router = juniper_router_subscription_factory() + new_router = router_subscription_factory(vendor=Vendor.JUNIPER) replace_side = str(old_subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.subscription.subscription_id) new_side_ae_members = new_side_ae_members_juniper lag_name = "ae1" @@ -69,7 +68,7 @@ def migrate_form_input( # Nokia -> Nokia product_id = iptrunk_subscription_factory() old_subscription = Iptrunk.from_subscription(product_id) - new_router = nokia_router_subscription_factory() + new_router = router_subscription_factory() replace_side = str(old_subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.subscription.subscription_id) new_side_ae_members = new_side_ae_members_nokia lag_name = "lag-1" diff --git a/test/workflows/iptrunk/test_modify_trunk_interface.py b/test/workflows/iptrunk/test_modify_trunk_interface.py index 85c395e8..359308cd 100644 --- a/test/workflows/iptrunk/test_modify_trunk_interface.py +++ b/test/workflows/iptrunk/test_modify_trunk_interface.py @@ -21,26 +21,25 @@ def input_form_iptrunk_data( request, faker, iptrunk_subscription_factory, - juniper_router_subscription_factory, - nokia_router_subscription_factory, + router_subscription_factory, iptrunk_side_subscription_factory, ): use_juniper = getattr(request, "param", UseJuniperSide.NONE) if use_juniper == UseJuniperSide.SIDE_A: - side_node = juniper_router_subscription_factory() + side_node = router_subscription_factory(vendor=Vendor.JUNIPER) side_a_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node) side_b_node = iptrunk_side_subscription_factory() new_side_a_ae_members = faker.link_members_juniper()[0:2] new_side_b_ae_members = faker.link_members_nokia()[0:2] elif use_juniper == UseJuniperSide.SIDE_B: - side_node = juniper_router_subscription_factory() + side_node = router_subscription_factory(vendor=Vendor.JUNIPER) side_a_node = iptrunk_side_subscription_factory() side_b_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node) new_side_a_ae_members = faker.link_members_nokia()[0:2] new_side_b_ae_members = faker.link_members_juniper()[0:2] elif use_juniper == UseJuniperSide.SIDE_BOTH: - side_node_1 = juniper_router_subscription_factory() - side_node_2 = juniper_router_subscription_factory() + side_node_1 = router_subscription_factory(vendor=Vendor.JUNIPER) + side_node_2 = router_subscription_factory(vendor=Vendor.JUNIPER) side_a_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node_1) side_b_node = iptrunk_side_subscription_factory(iptrunk_side_node=side_node_2) new_side_a_ae_members = faker.link_members_juniper()[0:2] diff --git a/test/workflows/iptrunk/test_terminate_iptrunk.py b/test/workflows/iptrunk/test_terminate_iptrunk.py index 7319596f..c745a615 100644 --- a/test/workflows/iptrunk/test_terminate_iptrunk.py +++ b/test/workflows/iptrunk/test_terminate_iptrunk.py @@ -27,7 +27,7 @@ def test_successful_iptrunk_termination( iptrunk_subscription_factory, faker, data_config_filename, - nokia_router_subscription_factory, + router_subscription_factory, ): # Set up mock return values product_id = iptrunk_subscription_factory() @@ -35,8 +35,8 @@ def test_successful_iptrunk_termination( mocked_delete_interface.return_value = mocked_netbox.delete_interface() mocked_free_interface.return_value = mocked_netbox.free_interface() # Add two more routers to our fake network - nokia_router_subscription_factory(router_role=RouterRole.P) - nokia_router_subscription_factory(router_role=RouterRole.PE) + router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory(router_role=RouterRole.PE) # Run workflow oss_params = load_oss_params() diff --git a/test/workflows/iptrunk/test_validate_iptrunk.py b/test/workflows/iptrunk/test_validate_iptrunk.py index 6b132abc..88f998cd 100644 --- a/test/workflows/iptrunk/test_validate_iptrunk.py +++ b/test/workflows/iptrunk/test_validate_iptrunk.py @@ -2,9 +2,10 @@ from unittest.mock import patch import pytest from infoblox_client import objects +from orchestrator.types import SubscriptionLifecycle from gso.products.product_types.iptrunk import Iptrunk -from test.conftest import UseJuniperSide +from gso.utils.shared_enums import Vendor from test.services.conftest import MockedNetboxClient from test.workflows import ( assert_complete, @@ -14,31 +15,6 @@ from test.workflows import ( ) -@pytest.fixture() -def trunk_validation_setup( - request, - iptrunk_subscription_factory, - juniper_router_subscription_factory, - nokia_router_subscription_factory, - iptrunk_side_subscription_factory, -): - if request.param == UseJuniperSide.SIDE_A: - # Nokia -> Juniper - side_a = iptrunk_side_subscription_factory(iptrunk_side_node=nokia_router_subscription_factory()) - side_b = iptrunk_side_subscription_factory(iptrunk_side_node=juniper_router_subscription_factory()) - elif request.param == UseJuniperSide.SIDE_B: - # Juniper -> Nokia - side_a = iptrunk_side_subscription_factory(iptrunk_side_node=juniper_router_subscription_factory()) - side_b = iptrunk_side_subscription_factory(iptrunk_side_node=nokia_router_subscription_factory()) - else: - # Nokia -> Nokia - side_a = iptrunk_side_subscription_factory(iptrunk_side_node=nokia_router_subscription_factory()) - side_b = iptrunk_side_subscription_factory(iptrunk_side_node=nokia_router_subscription_factory()) - - subscription_id = iptrunk_subscription_factory(iptrunk_sides=[side_a, side_b]) - return [{"subscription_id": subscription_id}] - - @pytest.fixture() def _mocked_netbox_client(): with ( @@ -61,9 +37,9 @@ def _mocked_netbox_client(): yield -@pytest.mark.parametrize( - "trunk_validation_setup", [UseJuniperSide.NONE, UseJuniperSide.SIDE_A, UseJuniperSide.SIDE_B], indirect=True -) +@pytest.mark.parametrize("side_a_vendor", [Vendor.JUNIPER, Vendor.NOKIA]) +@pytest.mark.parametrize("side_b_vendor", [Vendor.JUNIPER, Vendor.NOKIA]) +@pytest.mark.parametrize("subscription_status", [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE]) @pytest.mark.workflow() @pytest.mark.usefixtures("_mocked_netbox_client") @patch("gso.services.infoblox.find_network_by_cidr") @@ -79,10 +55,17 @@ def test_validate_iptrunk_success( mock_find_network_by_cidr, faker, data_config_filename, - trunk_validation_setup, + iptrunk_subscription_factory, + iptrunk_side_subscription_factory, + router_subscription_factory, + side_a_vendor, + side_b_vendor, + subscription_status, ): # Mock value setup - subscription_id = trunk_validation_setup[0]["subscription_id"] + side_a = iptrunk_side_subscription_factory(iptrunk_side_node=router_subscription_factory(side_a_vendor)) + side_b = iptrunk_side_subscription_factory(iptrunk_side_node=router_subscription_factory(side_b_vendor)) + subscription_id = iptrunk_subscription_factory(iptrunk_sides=[side_a, side_b], status=subscription_status) trunk = Iptrunk.from_subscription(subscription_id).iptrunk mock_find_network_by_cidr.side_effects = [ objects.Network(connector=None, ipv4addrs=[trunk.iptrunk_ipv4_network]), @@ -207,13 +190,14 @@ def test_validate_iptrunk_success( subscription_id = state["subscription_id"] subscription = Iptrunk.from_subscription(subscription_id) - assert subscription.status == "active" + assert subscription.status == subscription_status assert mock_validate_iptrunk.call_count == 3 assert mock_find_host_by_fqdn.call_count == 2 assert mock_find_v6_host_by_fqdn.call_count == 2 assert mock_find_network_by_cidr.call_count == 2 +@pytest.mark.parametrize("subscription_status", [SubscriptionLifecycle.PROVISIONING, SubscriptionLifecycle.ACTIVE]) @pytest.mark.workflow() @pytest.mark.usefixtures("_mocked_netbox_client") @patch("gso.services.infoblox.find_network_by_cidr") @@ -231,12 +215,13 @@ def test_validate_iptrunk_skip_legacy_trunks( data_config_filename, iptrunk_subscription_factory, iptrunk_side_subscription_factory, - juniper_router_subscription_factory, + router_subscription_factory, + subscription_status, ): # Mock value setup - side_a = iptrunk_side_subscription_factory(iptrunk_side_node=juniper_router_subscription_factory()) - side_b = iptrunk_side_subscription_factory(iptrunk_side_node=juniper_router_subscription_factory()) - subscription_id = iptrunk_subscription_factory(iptrunk_sides=[side_a, side_b]) + side_a = iptrunk_side_subscription_factory(iptrunk_side_node=router_subscription_factory(vendor=Vendor.JUNIPER)) + side_b = iptrunk_side_subscription_factory(iptrunk_side_node=router_subscription_factory(vendor=Vendor.JUNIPER)) + subscription_id = iptrunk_subscription_factory(iptrunk_sides=[side_a, side_b], status=subscription_status) # Run workflow initial_router_data = [{"subscription_id": subscription_id}] @@ -247,7 +232,7 @@ def test_validate_iptrunk_skip_legacy_trunks( subscription_id = state["subscription_id"] subscription = Iptrunk.from_subscription(subscription_id) - assert subscription.status == "active" + assert subscription.status == subscription_status assert mock_get_interface_by_name.call_count == 0 assert mock_validate_iptrunk.call_count == 0 assert mock_find_host_by_fqdn.call_count == 0 diff --git a/test/workflows/router/test_activate_router.py b/test/workflows/router/test_activate_router.py index 2e60fd7c..da0c24a6 100644 --- a/test/workflows/router/test_activate_router.py +++ b/test/workflows/router/test_activate_router.py @@ -12,11 +12,11 @@ from test.workflows import ( @pytest.mark.workflow() def test_activate_router_success( - nokia_router_subscription_factory, + router_subscription_factory, faker, ): # Set up mock return values - product_id = nokia_router_subscription_factory(status="provisioning") + product_id = router_subscription_factory(status="provisioning") # Sanity check assert Router.from_subscription(product_id).status == "provisioning" diff --git a/test/workflows/router/test_import_router.py b/test/workflows/router/test_import_router.py index 20938a7e..3c06b338 100644 --- a/test/workflows/router/test_import_router.py +++ b/test/workflows/router/test_import_router.py @@ -7,8 +7,8 @@ from test.workflows import assert_complete, run_workflow @pytest.mark.workflow() -def test_import_site_success(nokia_router_subscription_factory): - imported_router = nokia_router_subscription_factory(is_imported=False) +def test_import_site_success(router_subscription_factory): + imported_router = router_subscription_factory(is_imported=False) result, _, _ = run_workflow("import_router", [{"subscription_id": imported_router}]) subscription = Router.from_subscription(imported_router) diff --git a/test/workflows/router/test_modify_connection_stratey.py b/test/workflows/router/test_modify_connection_stratey.py index 669ad10f..e460f2e9 100644 --- a/test/workflows/router/test_modify_connection_stratey.py +++ b/test/workflows/router/test_modify_connection_stratey.py @@ -6,8 +6,8 @@ from test.workflows import assert_complete, run_workflow @pytest.mark.workflow() -def test_modify_connection_strategy(responses, nokia_router_subscription_factory): - subscription_id = nokia_router_subscription_factory(router_access_via_ts=True) +def test_modify_connection_strategy(responses, router_subscription_factory): + subscription_id = router_subscription_factory(router_access_via_ts=True) subscription = Router.from_subscription(subscription_id) assert subscription.router.router_access_via_ts is True form_data = [ diff --git a/test/workflows/router/test_promote_p_to_pe.py b/test/workflows/router/test_promote_p_to_pe.py index 5e14dcaf..a0245726 100644 --- a/test/workflows/router/test_promote_p_to_pe.py +++ b/test/workflows/router/test_promote_p_to_pe.py @@ -5,6 +5,7 @@ from orchestrator.types import SubscriptionLifecycle from pydantic_forms.exceptions import FormValidationError from gso.products.product_blocks.router import RouterRole +from gso.utils.shared_enums import Vendor from test import USER_CONFIRM_EMPTY_FORM from test.services.conftest import MockedKentikClient from test.workflows import ( @@ -22,16 +23,18 @@ from test.workflows import ( def test_promote_p_to_pe_success( mock_kentik_client, mock_execute_playbook, - nokia_router_subscription_factory, + router_subscription_factory, data_config_filename, faker, ): """Test the successful promotion of a Nokia P router to a PE router.""" mock_kentik_client.return_value = MockedKentikClient - router_id = nokia_router_subscription_factory(router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE) + router_id = router_subscription_factory( + vendor=Vendor.NOKIA, router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE + ) # Add two more routers to our fake network - nokia_router_subscription_factory(router_role=RouterRole.P) - nokia_router_subscription_factory(router_role=RouterRole.PE) + router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory(router_role=RouterRole.PE) input_data = [{"subscription_id": router_id}, {"tt_number": faker.tt_number()}] result, process_stat, step_log = run_workflow("promote_p_to_pe", input_data) for _ in range(3): @@ -46,9 +49,11 @@ def test_promote_p_to_pe_success( @pytest.mark.workflow() -def test_promote_p_to_pe_juniper_router(juniper_router_subscription_factory, data_config_filename, faker): +def test_promote_p_to_pe_juniper_router(router_subscription_factory, data_config_filename, faker): """Test that the workflow does not run for a Juniper P router since this workflow is only for Nokia routers.""" - router_id = juniper_router_subscription_factory(router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE) + router_id = router_subscription_factory( + vendor=Vendor.JUNIPER, router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE + ) input_data = [{"subscription_id": router_id}, {"tt_number": faker.tt_number()}] with pytest.raises(FormValidationError) as error: run_workflow("promote_p_to_pe", input_data) @@ -60,10 +65,12 @@ def test_promote_p_to_pe_juniper_router(juniper_router_subscription_factory, dat @pytest.mark.workflow() @patch("gso.services.lso_client._send_request") def test_promote_p_to_pe_nokia_pe_router( - mock_execute_playbook, nokia_router_subscription_factory, data_config_filename, faker + mock_execute_playbook, router_subscription_factory, data_config_filename, faker ): """Test that the workflow does not run for a Nokia PE router since it is already a PE router.""" - router_id = nokia_router_subscription_factory(router_role=RouterRole.PE, status=SubscriptionLifecycle.ACTIVE) + router_id = router_subscription_factory( + vendor=Vendor.NOKIA, router_role=RouterRole.PE, status=SubscriptionLifecycle.ACTIVE + ) input_data = [{"subscription_id": router_id}, {"tt_number": faker.tt_number()}] with pytest.raises(FormValidationError) as error: run_workflow("promote_p_to_pe", input_data) @@ -72,9 +79,11 @@ def test_promote_p_to_pe_nokia_pe_router( assert error["loc"][0] == "__root__" -def test_promote_p_to_pe_missing_tt_number(nokia_router_subscription_factory): +def test_promote_p_to_pe_missing_tt_number(router_subscription_factory): """Test that a missing TT number results in a validation error.""" - router_id = nokia_router_subscription_factory(router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE) + router_id = router_subscription_factory( + vendor=Vendor.NOKIA, router_role=RouterRole.P, status=SubscriptionLifecycle.ACTIVE + ) with pytest.raises(FormValidationError) as error: run_workflow("promote_p_to_pe", [{"subscription_id": router_id}, {}]) error = error.value.errors[0] @@ -82,9 +91,11 @@ def test_promote_p_to_pe_missing_tt_number(nokia_router_subscription_factory): assert error["loc"][0] == "tt_number" -def test_promote_p_to_pe_with_invalid_router_life_cycle(nokia_router_subscription_factory, faker): +def test_promote_p_to_pe_with_invalid_router_life_cycle(router_subscription_factory, faker): """Test that the router life cycle must be ACTIVE to run this workflow.""" - router_id = nokia_router_subscription_factory(router_role=RouterRole.P, status=SubscriptionLifecycle.PROVISIONING) + router_id = router_subscription_factory( + vendor=Vendor.NOKIA, router_role=RouterRole.P, status=SubscriptionLifecycle.PROVISIONING + ) with pytest.raises(FormValidationError) as error: run_workflow("promote_p_to_pe", [{"subscription_id": router_id}, {"tt_number": faker.tt_number()}]) error = error.value.errors[0] diff --git a/test/workflows/router/test_redeploy_base_config.py b/test/workflows/router/test_redeploy_base_config.py index d624d62e..c9697cb7 100644 --- a/test/workflows/router/test_redeploy_base_config.py +++ b/test/workflows/router/test_redeploy_base_config.py @@ -15,11 +15,11 @@ from test.workflows import ( @patch("gso.services.lso_client._send_request") def test_redeploy_base_config_success( mock_provision_router, - nokia_router_subscription_factory, + router_subscription_factory, faker, ): # Set up mock return values - product_id = nokia_router_subscription_factory() + product_id = router_subscription_factory() # Run workflow initial_input_data = [{"subscription_id": product_id}, {"tt_number": faker.tt_number()}] diff --git a/test/workflows/router/test_terminate_router.py b/test/workflows/router/test_terminate_router.py index a5f4fd3d..a182cc74 100644 --- a/test/workflows/router/test_terminate_router.py +++ b/test/workflows/router/test_terminate_router.py @@ -24,15 +24,15 @@ def test_terminate_pe_router_full_success( mock_execute_playbook, remove_configuration, update_ibgp_mesh, - nokia_router_subscription_factory, + router_subscription_factory, faker, data_config_filename, ): # Prepare mock values and expected results - product_id = nokia_router_subscription_factory() + product_id = router_subscription_factory() # Add two more routers to our fake network - nokia_router_subscription_factory(router_role=RouterRole.P) - nokia_router_subscription_factory(router_role=RouterRole.PE) + router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory(router_role=RouterRole.PE) router_termination_input_form_data = { "tt_number": faker.tt_number(), "remove_configuration": remove_configuration, @@ -78,15 +78,15 @@ def test_terminate_p_router_full_success( mock_execute_playbook, remove_configuration, update_ibgp_mesh, - nokia_router_subscription_factory, + router_subscription_factory, faker, data_config_filename, ): # Prepare mock values and expected results - product_id = nokia_router_subscription_factory(router_role=RouterRole.P) + product_id = router_subscription_factory(router_role=RouterRole.P) # Add two more routers to our fake network - nokia_router_subscription_factory(router_role=RouterRole.P) - nokia_router_subscription_factory(router_role=RouterRole.PE) + router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory(router_role=RouterRole.PE) router_termination_input_form_data = { "tt_number": faker.tt_number(), "remove_configuration": remove_configuration, diff --git a/test/workflows/router/test_update_ibgp_mesh.py b/test/workflows/router/test_update_ibgp_mesh.py index e1ebb16f..023cd2cb 100644 --- a/test/workflows/router/test_update_ibgp_mesh.py +++ b/test/workflows/router/test_update_ibgp_mesh.py @@ -31,18 +31,16 @@ def test_update_ibgp_mesh_success( trunk_status, iptrunk_subscription_factory, iptrunk_side_subscription_factory, - nokia_router_subscription_factory, + router_subscription_factory, data_config_filename, faker, ): mock_librenms_device_exists.return_value = False - side_a = iptrunk_side_subscription_factory( - iptrunk_side_node=nokia_router_subscription_factory(router_role=router_role) - ) + side_a = iptrunk_side_subscription_factory(iptrunk_side_node=router_subscription_factory(router_role=router_role)) side_b = iptrunk_side_subscription_factory() # Add some extra devices to the network. - nokia_router_subscription_factory(router_role=RouterRole.P) - nokia_router_subscription_factory() + router_subscription_factory(router_role=RouterRole.P) + router_subscription_factory() ip_trunk = Iptrunk.from_subscription( iptrunk_subscription_factory(status=trunk_status, iptrunk_sides=[side_a, side_b]) @@ -85,8 +83,8 @@ def test_update_ibgp_mesh_failure(iptrunk_subscription_factory, data_config_file @pytest.mark.workflow() -def test_update_ibgp_mesh_isolated_router(nokia_router_subscription_factory, data_config_filename): - router_id = nokia_router_subscription_factory(router_role=RouterRole.P) +def test_update_ibgp_mesh_isolated_router(router_subscription_factory, data_config_filename): + router_id = router_subscription_factory(router_role=RouterRole.P) exception_message = "Selected router does not terminate any available IP trunks." with pytest.raises(FormValidationError, match=exception_message): diff --git a/test/workflows/router/test_validate_router.py b/test/workflows/router/test_validate_router.py index 22e7359a..a72063d9 100644 --- a/test/workflows/router/test_validate_router.py +++ b/test/workflows/router/test_validate_router.py @@ -5,6 +5,7 @@ from infoblox_client import objects from orchestrator.types import SubscriptionLifecycle from gso.products.product_types.router import Router +from gso.utils.shared_enums import Vendor from test.services.conftest import MockedKentikClient from test.workflows import ( assert_complete, @@ -27,7 +28,7 @@ def test_validate_nokia_router_success( mock_get_device_by_name, mock_execute_playbook, mock_find_host_by_fqdn, - nokia_router_subscription_factory, + router_subscription_factory, faker, data_config_filename, geant_partner, @@ -36,7 +37,7 @@ def test_validate_nokia_router_success( mock_validate_librenms_device.return_value = None mock_kentik_client.return_value = MockedKentikClient # Run workflow - subscription_id = nokia_router_subscription_factory(status=router_state) + subscription_id = router_subscription_factory(status=router_state) mock_fqdn = Router.from_subscription(subscription_id).router.router_fqdn mock_v4 = faker.ipv4() mock_find_host_by_fqdn.return_value = objects.HostRecord( @@ -79,13 +80,13 @@ def test_validate_nokia_router_success( @pytest.mark.workflow() def test_validate_juniper_router_success( - juniper_router_subscription_factory, + router_subscription_factory, faker, data_config_filename, geant_partner, ): # Run workflow - subscription_id = juniper_router_subscription_factory() + subscription_id = router_subscription_factory(vendor=Vendor.JUNIPER) initial_router_data = [{"subscription_id": subscription_id}] result, _, _ = run_workflow("validate_router", initial_router_data) -- GitLab