diff --git a/gso/utils/workflow_steps.py b/gso/utils/workflow_steps.py index 92ef947f174ba24d665124a474551a2b1788dd84..06b3e4ef9d876c51f6ffba1a0e3ce6aa2f65e96f 100644 --- a/gso/utils/workflow_steps.py +++ b/gso/utils/workflow_steps.py @@ -12,7 +12,6 @@ from pydantic_forms.core import FormPage from pydantic_forms.types import FormGenerator from pydantic_forms.validators import Label -from gso.products.product_blocks import router from gso.products.product_blocks.router import RouterRole from gso.products.product_types.iptrunk import Iptrunk from gso.services import lso_client @@ -95,8 +94,10 @@ def _update_sdp_single_pe( 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.RouterRole.PE, exclude_routers=[subscription["router"]["router_fqdn"]] - ), + router_role=RouterRole.PE, + router_vendor=Vendor.NOKIA, + exclude_routers=[subscription["router"]["router_fqdn"]], + )["all"]["hosts"], } lso_client.execute_playbook( @@ -107,6 +108,267 @@ def _update_sdp_single_pe( ) +def _add_pe_mesh_to_pe( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, + *, + dry_run: bool, +) -> None: + inventory = subscription["router"]["router_fqdn"] + extra_vars = { + "dry_run": dry_run, + "subscription": subscription, + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " + f"Add list of PE routers into iGEANT/iGEANT6 groups of the PE router", + "verb": "add_pe_mesh_to_pe", + "pe_router_list": generate_inventory_for_active_routers( + router_role=RouterRole.PE, exclude_routers=[subscription["router"]["router_fqdn"]] + )["all"]["hosts"], + } + + lso_client.execute_playbook( + playbook_name="update_ibgp_mesh.yaml", + callback_route=callback_route, + inventory=inventory, + extra_vars=extra_vars, + ) + + +def _add_pe_to_pe_mesh( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, + *, + dry_run: bool, +) -> None: + inventory = generate_inventory_for_active_routers( + router_role=RouterRole.PE, exclude_routers=[subscription["router"]["router_fqdn"]] + ) + extra_vars = { + "dry_run": dry_run, + "subscription": subscription, + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - " + f"Add the PE router to all PE routers in iGEANT/iGEANT6.", + "verb": "add_pe_to_pe_mesh", + } + + lso_client.execute_playbook( + playbook_name="update_ibgp_mesh.yaml", + callback_route=callback_route, + inventory=inventory, + extra_vars=extra_vars, + ) + + +def _add_all_p_to_pe( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, + *, + dry_run: bool, +) -> None: + inventory = subscription["router"]["router_fqdn"] + extra_vars = { + "dry_run": dry_run, + "subscription": subscription, + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Add all P-routers to this new PE", + "verb": "add_all_p_to_pe", + "p_router_list": generate_inventory_for_active_routers( + router_role=RouterRole.P, exclude_routers=[subscription["router"]["router_fqdn"]] + )["all"]["hosts"], + } + + lso_client.execute_playbook( + playbook_name="update_ibgp_mesh.yaml", + callback_route=callback_route, + inventory=inventory, + extra_vars=extra_vars, + ) + + +def _add_pe_to_all_p( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, + *, + dry_run: bool, +) -> None: + inventory = generate_inventory_for_active_routers( + router_role=RouterRole.P, exclude_routers=[subscription["router"]["router_fqdn"]] + ) + extra_vars = { + "dry_run": dry_run, + "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_all_p", + } + + lso_client.execute_playbook( + playbook_name="update_ibgp_mesh.yaml", + callback_route=callback_route, + inventory=inventory, + extra_vars=extra_vars, + ) + + +@step("[DRY RUN] Add the PE to all P routers") +def add_pe_to_all_p_dry( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a dry run of adding the PE router to all P routers.""" + _add_pe_to_all_p( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=True, + ) + + return {"subscription": subscription} + + +@step("[FOR REAL] Add the PE to all P routers") +def add_pe_to_all_p_real( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a real run of adding the PE router to all P routers.""" + _add_pe_to_all_p( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=False, + ) + + return {"subscription": subscription} + + +@step("[DRY RUN] Add all P routers to the PE") +def add_all_p_to_pe_dry( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a dry run of adding all P routers to the PE router.""" + _add_all_p_to_pe( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=True, + ) + + return {"subscription": subscription} + + +@step("[FOR REAL] Add all P routers to the PE") +def add_all_p_to_pe_real( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a real run of adding all P routers to the PE router.""" + _add_all_p_to_pe( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=False, + ) + + return {"subscription": subscription} + + +@step("[DRY RUN] Add the PE to PE mesh") +def add_pe_to_pe_mesh_dry( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a dry run of adding the PE router to all PE routers in iGEANT/iGEANT6.""" + _add_pe_to_pe_mesh( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=True, + ) + + return {"subscription": subscription} + + +@step("[FOR REAL] Add the PE to PE mesh") +def add_pe_to_pe_mesh_real( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a dry run of adding the PE router to all PE routers in iGEANT/iGEANT6.""" + _add_pe_to_pe_mesh( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=False, + ) + + return {"subscription": subscription} + + +@step("[DRY RUN] Add PE mesh to the PE") +def add_pe_mesh_to_pe_dry( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a dry run of adding list of PE routers into iGEANT/iGEANT6 of the router.""" + _add_pe_mesh_to_pe( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=True, + ) + + return {"subscription": subscription} + + +@step("[FOR REAL] Add PE mesh to the PE") +def add_pe_mesh_to_pe_real( + subscription: dict[str, Any], + callback_route: str, + tt_number: str, + process_id: UUIDstr, +) -> State: + """Perform a real run of adding list of PE routers into iGEANT/iGEANT6 of the router.""" + _add_pe_mesh_to_pe( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=False, + ) + + return {"subscription": subscription} + + @step("[DRY RUN] Deploy base config") def deploy_base_config_dry( subscription: dict[str, Any], @@ -133,42 +395,66 @@ def deploy_base_config_real( return {"subscription": subscription} -@step("[DRY RUN] Include new PE into SDP mesh on other Nokia PEs") +@step("[DRY RUN] Include the 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 ) -> State: """Perform a dry run of including new PE router in SDP mesh on other NOKIA PE routers.""" - _update_sdp_mesh(subscription, tt_number, callback_route, process_id, dry_run=True) + _update_sdp_mesh( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=True, + ) return {"subscription": subscription} -@step("[FOR REAL] Include new PE into SDP mesh on other Nokia PEs") +@step("[FOR REAL] Include the 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 ) -> State: """Include new PE router in SDP mesh on other NOKIA PE routers.""" - _update_sdp_mesh(subscription, tt_number, callback_route, process_id, dry_run=False) + _update_sdp_mesh( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=False, + ) return {"subscription": subscription} -@step("[DRY RUN] Configure SDP on a new PE to all other Nokia PEs") +@step("[DRY RUN] Configure SDP on the PE to all other Nokia PEs") def update_sdp_single_pe_dry( subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr ) -> State: """Perform a dry run of configuring SDP on a new PE router to all other NOKIA PE routers.""" - _update_sdp_single_pe(subscription, tt_number, callback_route, process_id, dry_run=True) + _update_sdp_single_pe( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=True, + ) return {"subscription": subscription} -@step("[FOR REAL] Configure SDP on a new PE to all other Nokia PEs") +@step("[FOR REAL] Configure SDP on the PE to all other Nokia PEs") def update_sdp_single_pe_real( subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr ) -> State: """Configure SDP on a new PE router to all other NOKIA PE routers.""" - _update_sdp_single_pe(subscription, tt_number, callback_route, process_id, dry_run=False) + _update_sdp_single_pe( + subscription=subscription, + tt_number=tt_number, + callback_route=callback_route, + process_id=process_id, + dry_run=False, + ) return {"subscription": subscription} @@ -213,6 +499,40 @@ def run_checks_after_base_config(subscription: dict[str, Any], callback_route: s ) +@step("Check PE iBGP sessions") +def check_pe_ibgp(subscription: dict[str, Any], callback_route: str) -> None: + """Check the iBGP session.""" + extra_vars = { + "dry_run": False, + "subscription": subscription, + "verb": "check_pe_ibgp", + } + + lso_client.execute_playbook( + playbook_name="check_ibgp.yaml", + callback_route=callback_route, + inventory=subscription["router"]["router_fqdn"], + extra_vars=extra_vars, + ) + + +@step("Check L3 VPRN services") +def check_l3_services(subscription: dict[str, Any], callback_route: str) -> None: + """Check L3 services.""" + extra_vars = { + "dry_run": False, + "subscription": subscription, + "verb": "check_base_ris", + } + + lso_client.execute_playbook( + playbook_name="check_l3_services.yaml", + callback_route=callback_route, + inventory=subscription["router"]["router_fqdn"], + extra_vars=extra_vars, + ) + + @inputstep("Prompt for new SharePoint checklist", assignee=Assignee.SYSTEM) def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator: """Prompt the operator with the checklist in SharePoint for approving a new subscription."""