diff --git a/gso/workflows/router/promote_p_to_pe.py b/gso/workflows/router/promote_p_to_pe.py index e593844db3c599f82b6f3ff89e5c44b7fc6cd321..e53484d4f734bd7513564bfbe439e953faf97ada 100644 --- a/gso/workflows/router/promote_p_to_pe.py +++ b/gso/workflows/router/promote_p_to_pe.py @@ -10,7 +10,7 @@ from orchestrator.targets import Target from orchestrator.types import FormGenerator, State, UUIDstr from orchestrator.utils.errors import ProcessFailureError from orchestrator.utils.json import json_dumps -from orchestrator.workflow import StepList, begin, done, inputstep, step, workflow +from orchestrator.workflow import StepList, begin, conditional, done, inputstep, step, workflow from orchestrator.workflows.steps import resync, store_process_subscription, unsync from orchestrator.workflows.utils import wrap_modify_initial_input_form from pydantic import ConfigDict, model_validator @@ -158,7 +158,7 @@ def create_kentik_device(subscription: Router) -> State: return {"kentik_device": kentik_device} -@step("[DRY RUN] Update SDP mesh") +@step("[DRY RUN] Include new PE into SDP mesh on other Nokia PEs") def update_sdp_mesh_dry(subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr) -> None: """Perform a dry run for updating the SDP mesh with the new router.""" extra_vars = { @@ -167,20 +167,19 @@ def update_sdp_mesh_dry(subscription: dict[str, Any], callback_route: str, tt_nu "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " f"Update the SDP mesh for L2circuits(epipes) config on PE NOKIA routers", "verb": "update_sdp_mesh", - "pe_router_list": generate_inventory_for_active_routers(router_role=RouterRole.PE, router_vendor=Vendor.NOKIA)[ - "all" - ]["hosts"], + "pe_router_list": {subscription["router"]["router_fqdn"]: {"lo4": str(subscription["router"]["router_lo_ipv4_address"]), + "lo6": str(subscription["router"]["router_lo_ipv6_address"])}} } lso_client.execute_playbook( playbook_name="update_pe_sdp_mesh.yaml", callback_route=callback_route, - inventory=generate_inventory_for_active_routers(RouterRole.PE), + inventory=generate_inventory_for_active_routers(router_role=RouterRole.PE, router_vendor=Vendor.NOKIA), extra_vars=extra_vars, ) -@step("[FOR REAL] Update SDP mesh") +@step("[FOR REAL] Include new PE into SDP mesh on other Nokia PEs") def update_sdp_mesh_real( subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr ) -> None: @@ -191,29 +190,28 @@ def update_sdp_mesh_real( "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " f"Update the SDP mesh for l2circuits(epipes) config on PE NOKIA routers", "verb": "update_sdp_mesh", - "pe_router_list": generate_inventory_for_active_routers(router_role=RouterRole.PE, router_vendor=Vendor.NOKIA)[ - "all" - ]["hosts"], + "pe_router_list": {subscription["router"]["router_fqdn"]: {"lo4": str(subscription["router"]["router_lo_ipv4_address"]), + "lo6": str(subscription["router"]["router_lo_ipv6_address"])}} } lso_client.execute_playbook( playbook_name="update_pe_sdp_mesh.yaml", callback_route=callback_route, - inventory=generate_inventory_for_active_routers(RouterRole.PE), + inventory=generate_inventory_for_active_routers(router_role=RouterRole.PE, router_vendor=Vendor.NOKIA), extra_vars=extra_vars, ) -@step("[DRY RUN] Remove P from P") +@step("[DRY RUN] Remove P from all PEs") def remove_p_from_pe_dry( subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr ) -> None: - """Perform a dry run of removing the P routers from the PE router.""" + """Perform a dry run of removing the P router from all the PE routers.""" extra_vars = { "dry_run": True, "subscription": subscription, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " - f"Remove P only roter neighbour {subscription["router"]["router_fqdn"]} from P only group", + f"Remove P-only router neighbour {subscription["router"]["router_fqdn"]} from PE routers P-only group", "verb": "remove_p_from_pe", } @@ -225,16 +223,16 @@ def remove_p_from_pe_dry( ) -@step("[FOR REAL] Remove P from PE") +@step("[FOR REAL] Remove P from all PEs") def remove_p_from_pe_real( subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr ) -> None: - """Remove the P routers from the PE router.""" + """Remove the P router from all the PE routers.""" extra_vars = { "dry_run": False, "subscription": subscription, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " - f"Remove P only roter neighbour {subscription["router"]["router_fqdn"]} from P only group", + f"Remove P-only router neighbour {subscription["router"]["router_fqdn"]} from PE routers P-only group", "verb": "remove_p_from_pe", } @@ -299,7 +297,7 @@ def add_pe_to_pe_mesh_dry( "dry_run": True, "subscription": subscription, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " - f"Add promoted router to all PE routers in iGEANT/iGEANT.", + f"Add promoted router to all PE routers in iGEANT/iGEANT6.", "verb": "add_pe_to_pe_mesh", } @@ -320,7 +318,7 @@ def add_pe_to_pe_mesh_real( "dry_run": False, "subscription": subscription, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " - f"Add promoted router to all PE routers in iGEANT/iGEANT.", + f"Add promoted router to all PE routers in iGEANT/iGEANT6.", "verb": "add_pe_to_pe_mesh", } @@ -482,7 +480,7 @@ def add_pe_to_all_p_dry(subscription: dict[str, Any], callback_route: str, tt_nu "subscription": subscription, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " f"Add promoted router to all PE routers in iGEANT/iGEANT6", - "verb": "add_pe_to_p", + "verb": "add_pe_to_all_p", } lso_client.execute_playbook( @@ -503,7 +501,7 @@ def add_pe_to_all_p_real( "subscription": subscription, "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " f"Add promoted router to all PE routers in iGEANT/iGEANT6", - "verb": "add_pe_to_p", + "verb": "add_pe_to_all_p", } lso_client.execute_playbook( @@ -563,17 +561,20 @@ def delete_default_routes_real( ) def promote_p_to_pe() -> StepList: """Promote a P router to a PE router.""" + router_is_juniper = conditional(lambda state: state["subscription"]["router"]["vendor"] == Vendor.JUNIPER) + router_is_pe = conditional(lambda state: state["subscription"]["router"]["router_role"] == RouterRole.PE) + return ( begin >> store_process_subscription(Target.MODIFY) + >> router_is_juniper(done) + >> router_is_pe(done) >> unsync >> lso_interaction(set_isis_overload) >> lso_interaction(deploy_pe_base_config_dry) >> lso_interaction(deploy_pe_base_config_real) >> prompt_insert_in_earl >> create_kentik_device - >> lso_interaction(update_sdp_mesh_dry) - >> lso_interaction(update_sdp_mesh_real) >> lso_interaction(remove_p_from_pe_dry) >> lso_interaction(remove_p_from_pe_real) >> lso_interaction(add_pe_mesh_to_pe_dry) @@ -584,14 +585,16 @@ def promote_p_to_pe() -> StepList: >> lso_interaction(deploy_routing_instances_dry) >> lso_interaction(deploy_routing_instances_real) >> lso_interaction(check_l3_services) - >> lso_interaction(remove_isis_overload) - >> update_subscription_model + >> lso_interaction(update_sdp_mesh_dry) + >> lso_interaction(update_sdp_mesh_real) >> lso_interaction(add_all_p_to_pe_dry) >> lso_interaction(add_all_p_to_pe_real) >> lso_interaction(add_pe_to_all_p_dry) >> lso_interaction(add_pe_to_all_p_real) >> lso_interaction(delete_default_routes_dry) >> lso_interaction(delete_default_routes_real) + >> lso_interaction(remove_isis_overload) + >> update_subscription_model >> resync >> done )