From a91e5d54fd58097aa77b32781a931bce1051872c Mon Sep 17 00:00:00 2001 From: Aleksandr Kurbatov <ak@geant.org> Date: Mon, 25 Nov 2024 19:21:20 +0000 Subject: [PATCH] `validate_router` - check BGP depending on the router role. --- gso/workflows/router/validate_router.py | 63 +++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/gso/workflows/router/validate_router.py b/gso/workflows/router/validate_router.py index ae7d29cb..f85299f6 100644 --- a/gso/workflows/router/validate_router.py +++ b/gso/workflows/router/validate_router.py @@ -52,9 +52,9 @@ def check_netbox_entry_exists(subscription: Router) -> None: client.get_device_by_name(subscription.router.router_fqdn) -@step("Verify BGP configuration on P router") +@step("Verify P BGP P-ONLY neighbors") def verify_p_ibgp(subscription: dict[str, Any]) -> LSOState: - """Perform a dry run of adding the list of all PE routers to the new P router.""" + """Verify PE neighbors in P-ONLY group on a P router.""" extra_vars = { "dry_run": True, "subscription": subscription, @@ -70,6 +70,60 @@ def verify_p_ibgp(subscription: dict[str, Any]) -> LSOState: } +@step("Verify PE BGP internal mesh neighbors") +def verify_pe_mesh_in_pe(subscription: dict[str, Any]) -> LSOState: + """Verify PE internal mesh neighbors on a PE router.""" + extra_vars = { + "dry_run": True, + "subscription": subscription, + "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"], + "is_verification_workflow": "true", + } + + if not extra_vars["pe_router_list"]: + return { + "playbook_name": "", + "inventory": {"all": {"hosts": {}}}, + "extra_vars": {}, + } + + return { + "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml", + "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}}, + "extra_vars": extra_vars, + } + + +@step("Verify PE BGP P-ONLY neighbors") +def verify_all_p_in_pe(subscription: dict[str, Any]) -> LSOState: + """Verify P neighbors in P-ONLY group on a PE router.""" + extra_vars = { + "dry_run": True, + "subscription": subscription, + "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"], + "is_verification_workflow": "true", + } + + if not extra_vars["p_router_list"]: + return { + "playbook_name": "", + "inventory": {"all": {"hosts": {}}}, + "extra_vars": {}, + } + + return { + "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml", + "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}}, + "extra_vars": extra_vars, + } + + @step("Verify correct LibreNMS entry") def check_librenms_entry_exists(subscription: Router) -> None: """Validate the LibreNMS entry for a Router. @@ -125,6 +179,7 @@ def validate_router() -> StepList: """ is_juniper_router = conditional(lambda state: state["subscription"]["router"]["vendor"] == Vendor.JUNIPER) is_pe_router = conditional(lambda state: state["subscription"]["router"]["router_role"] == RouterRole.PE) + is_p_router = conditional(lambda state: state["subscription"]["router"]["router_role"] == RouterRole.P) return ( begin @@ -137,7 +192,9 @@ def validate_router() -> StepList: >> check_librenms_entry_exists >> is_pe_router(check_kentik_entry_exists) >> anonymous_lso_interaction(verify_base_config) - >> anonymous_lso_interaction(verify_p_ibgp) + >> is_p_router(anonymous_lso_interaction(verify_p_ibgp)) + >> is_pe_router(anonymous_lso_interaction(verify_pe_mesh_in_pe)) + >> is_pe_router(anonymous_lso_interaction(verify_all_p_in_pe)) >> resync >> done ) -- GitLab