From 34166751ed0ff3e2ba405224656faa323282afca Mon Sep 17 00:00:00 2001 From: Karel van Klink <karel.vanklink@geant.org> Date: Mon, 3 Jun 2024 17:36:48 +0200 Subject: [PATCH] Split off workflow steps for adding all PE routers to a P router --- gso/services/subscriptions.py | 18 +++---- gso/utils/workflow_steps.py | 48 +++++++++++++++++-- gso/workflows/iptrunk/create_iptrunk.py | 2 +- gso/workflows/router/update_ibgp_mesh.py | 61 ++---------------------- gso/workflows/router/validate_router.py | 19 +------- 5 files changed, 57 insertions(+), 91 deletions(-) diff --git a/gso/services/subscriptions.py b/gso/services/subscriptions.py index 0c402963..27f075a1 100644 --- a/gso/services/subscriptions.py +++ b/gso/services/subscriptions.py @@ -238,15 +238,11 @@ def get_active_pe_router_dict() -> dict[str, Any]: all_routers = [Router.from_subscription(r["subscription_id"]) for r in get_active_router_subscriptions()] return { - "all": { - "hosts": { - router.router.router_fqdn: { - "lo4": str(router.router.router_lo_ipv4_address), - "lo6": str(router.router.router_lo_ipv6_address), - "vendor": str(router.router.vendor), - } - for router in all_routers - if router.router.router_role == RouterRole.PE - } - }, + router.router.router_fqdn: { + "lo4": str(router.router.router_lo_ipv4_address), + "lo6": str(router.router.router_lo_ipv6_address), + "vendor": str(router.router.vendor), + } + for router in all_routers + if router.router.router_role == RouterRole.PE } diff --git a/gso/utils/workflow_steps.py b/gso/utils/workflow_steps.py index 6ab00644..4edb906c 100644 --- a/gso/utils/workflow_steps.py +++ b/gso/utils/workflow_steps.py @@ -13,7 +13,7 @@ from pydantic_forms.types import FormGenerator from pydantic_forms.validators import Label from gso.products.product_types.iptrunk import Iptrunk -from gso.services.lso_client import execute_playbook +from gso.services import lso_client, subscriptions from gso.settings import load_oss_params @@ -34,7 +34,7 @@ def _deploy_base_config( "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Deploy base config", } - execute_playbook( + lso_client.execute_playbook( playbook_name="base_config.yaml", callback_route=callback_route, inventory=inventory, @@ -83,7 +83,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route: f"{subscription.iptrunk.geant_s_sid}", } - execute_playbook( + lso_client.execute_playbook( playbook_name="iptrunks.yaml", callback_route=callback_route, inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n" @@ -100,7 +100,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route: @step("Run show commands after base config install") def run_checks_after_base_config(subscription: dict[str, Any], callback_route: str) -> None: """Workflow step for running show commands after installing base config.""" - execute_playbook( + lso_client.execute_playbook( playbook_name="base_config_checks.yaml", callback_route=callback_route, inventory=subscription["router"]["router_fqdn"], @@ -121,3 +121,43 @@ def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator: yield SharepointPrompt return {} + + +@step("[DRY RUN] Add all PE routers to P router iBGP table") +def add_all_pe_to_p_dry(subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr) -> None: + """Perform a dry run of adding the list of all PE routers to the new P router.""" + extra_vars = { + "dry_run": True, + "subscription": subscription, + "pe_router_list": subscriptions.get_active_pe_router_dict(), + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh", + "verb": "add_pe_to_p", + } + + lso_client.execute_playbook( + playbook_name="update_ibgp_mesh.yaml", + callback_route=callback_route, + inventory=subscription["router"]["router_fqdn"], + extra_vars=extra_vars, + ) + + +@step("[FOR REAL] Add all PE routers to P router iBGP table") +def add_all_pe_to_p_real( + subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr +) -> None: + """Add the list of all PE routers to the new P router.""" + extra_vars = { + "dry_run": False, + "subscription": subscription, + "pe_router_list": subscriptions.get_active_pe_router_dict(), + "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh", + "verb": "add_pe_to_p", + } + + lso_client.execute_playbook( + playbook_name="update_ibgp_mesh.yaml", + callback_route=callback_route, + inventory=subscription["router"]["router_fqdn"], + extra_vars=extra_vars, + ) diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py index 1b543753..95703094 100644 --- a/gso/workflows/iptrunk/create_iptrunk.py +++ b/gso/workflows/iptrunk/create_iptrunk.py @@ -10,7 +10,7 @@ from orchestrator.forms.validators import Choice, Label from orchestrator.targets import Target from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr from orchestrator.utils.json import json_dumps -from orchestrator.workflow import StepList, conditional, done, init, step, workflow +from orchestrator.workflow import StepList, begin, conditional, done, step, workflow from orchestrator.workflows.steps import resync, set_status, store_process_subscription from orchestrator.workflows.utils import wrap_create_initial_input_form from pydantic import AfterValidator, ConfigDict, field_validator diff --git a/gso/workflows/router/update_ibgp_mesh.py b/gso/workflows/router/update_ibgp_mesh.py index 2d6f2d48..bf0d0416 100644 --- a/gso/workflows/router/update_ibgp_mesh.py +++ b/gso/workflows/router/update_ibgp_mesh.py @@ -17,6 +17,7 @@ from gso.services import librenms_client, lso_client, subscriptions from gso.services.lso_client import lso_interaction from gso.services.subscriptions import get_trunks_that_terminate_on_router from gso.utils.helpers import SNMPVersion +from gso.utils.workflow_steps import add_all_pe_to_p_dry, add_all_pe_to_p_real def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: @@ -61,7 +62,7 @@ def add_p_to_mesh_dry(subscription: dict[str, Any], callback_route: str, tt_numb lso_client.execute_playbook( playbook_name="update_ibgp_mesh.yaml", callback_route=callback_route, - inventory=subscriptions.get_active_pe_router_dict(), + inventory={"all": {"hosts": subscriptions.get_active_pe_router_dict()}}, extra_vars=extra_vars, ) @@ -79,63 +80,7 @@ def add_p_to_mesh_real(subscription: dict[str, Any], callback_route: str, tt_num lso_client.execute_playbook( playbook_name="update_ibgp_mesh.yaml", callback_route=callback_route, - inventory=subscriptions.get_active_pe_router_dict(), - extra_vars=extra_vars, - ) - - -@step("[DRY RUN] Add all PE routers to P router iBGP table") -def add_all_pe_to_p_dry( - subscription: dict[str, Any], pe_router_list: list[Router], callback_route: str, tt_number: str, process_id: UUIDstr -) -> None: - """Perform a dry run of adding the list of all PE routers to the new P router.""" - extra_vars = { - "dry_run": True, - "subscription": subscription, - "pe_router_list": { - router.router.router_fqdn: { - "lo4": str(router.router.router_lo_ipv4_address), - "lo6": str(router.router.router_lo_ipv6_address), - "vendor": router.router.vendor, - } - for router in pe_router_list - }, - "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh", - "verb": "add_pe_to_p", - } - - lso_client.execute_playbook( - playbook_name="update_ibgp_mesh.yaml", - callback_route=callback_route, - inventory=subscription["router"]["router_fqdn"], - extra_vars=extra_vars, - ) - - -@step("[FOR REAL] Add all PE routers to P router iBGP table") -def add_all_pe_to_p_real( - subscription: dict[str, Any], pe_router_list: list[Router], callback_route: str, tt_number: str, process_id: UUIDstr -) -> None: - """Add the list of all PE routers to the new P router.""" - extra_vars = { - "dry_run": False, - "subscription": subscription, - "pe_router_list": { - router.router.router_fqdn: { - "lo4": str(router.router.router_lo_ipv4_address), - "lo6": str(router.router.router_lo_ipv6_address), - "vendor": router.router.vendor, - } - for router in pe_router_list - }, - "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh", - "verb": "add_pe_to_p", - } - - lso_client.execute_playbook( - playbook_name="update_ibgp_mesh.yaml", - callback_route=callback_route, - inventory=subscription["router"]["router_fqdn"], + inventory={"all": {"hosts": subscriptions.get_active_pe_router_dict()}}, extra_vars=extra_vars, ) diff --git a/gso/workflows/router/validate_router.py b/gso/workflows/router/validate_router.py index a1fed75d..072d2f50 100644 --- a/gso/workflows/router/validate_router.py +++ b/gso/workflows/router/validate_router.py @@ -16,6 +16,7 @@ from gso.services.librenms_client import LibreNMSClient from gso.services.lso_client import anonymous_lso_interaction, execute_playbook from gso.services.netbox_client import NetboxClient from gso.utils.shared_enums import Vendor +from gso.utils.workflow_steps import add_all_pe_to_p_dry @step("Prepare required keys in state") @@ -78,22 +79,6 @@ def verify_base_config(subscription: Router, callback_route: str) -> None: ) -@step("Validate iBGP mesh configuration") -def validate_ibgp_mesh_config(subscription: Router, callback_route: str) -> None: - """Workflow step for running a playbook that check iBGP mesh configuration.""" - execute_playbook( - playbook_name="ibgp_checks.yaml", - callback_route=callback_route, - inventory=subscription.router.router_fqdn, - extra_vars={ - "wfo_trunk_json": subscription, - "verb": "deploy", - "dry_run": "true", - "is_verification_workflow": "true", - }, - ) - - @workflow( "Validate router configuration", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None) ) @@ -118,7 +103,7 @@ def validate_router() -> StepList: >> check_netbox_entry_exists >> check_librenms_entry_exists >> anonymous_lso_interaction(verify_base_config) - >> anonymous_lso_interaction(validate_ibgp_mesh_config) + >> anonymous_lso_interaction(add_all_pe_to_p_dry) >> resync >> done ) -- GitLab