Skip to content
Snippets Groups Projects

Add iBGP workflow and LibreNMS client

Merged Karel van Klink requested to merge feature/add-ibgp-workflow into develop
3 files
+ 36
51
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -13,7 +13,7 @@ from pydantic import root_validator
from gso.products.product_blocks.router import RouterRole
from gso.products.product_types.router import Router
from gso.services import librenms_client, provisioning_proxy, subscriptions
from gso.services.provisioning_proxy import indifferent_pp_interaction, pp_interaction
from gso.services.provisioning_proxy import pp_interaction
from gso.services.subscriptions import get_active_trunks_that_terminate_on_router
from gso.utils.helpers import SNMPVersion
@@ -30,6 +30,8 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
class Config:
title = f"Add {subscription.router.router_fqdn} to the iBGP mesh?"
tt_number: str
@root_validator(allow_reuse=True)
def router_has_a_trunk(cls, values: dict[str, Any]) -> dict[str, Any]:
if len(get_active_trunks_that_terminate_on_router(subscription_id)) == 0:
@@ -38,9 +40,9 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
return values
yield AddBGPSessionForm
user_input = yield AddBGPSessionForm
return {"subscription": subscription}
return user_input.dict()
@step("Calculate list of all active PE routers")
@@ -65,20 +67,21 @@ def _generate_pe_inventory(pe_router_list: list[Router]) -> dict[str, Any]:
"vendor": router.router.vendor,
}
for router in pe_router_list
},
},
"all": {
"hosts": {router.router.router_fqdn: None for router in pe_router_list},
}
},
"all": {"hosts": {router.router.router_fqdn: None for router in pe_router_list}},
}
@step("[DRY RUN] Add P router to iBGP mesh")
def add_p_to_mesh_dry(subscription: Router, callback_route: str, pe_router_list: list[Router]) -> State:
def add_p_to_mesh_dry(
subscription: Router, callback_route: str, pe_router_list: list[Router], tt_number: str, process_id: UUIDstr
) -> None:
"""Perform a dry run of adding the new P router to the PE router mesh."""
extra_vars = {
"dry_run": True,
"subscription": subscription,
"commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
}
provisioning_proxy.execute_playbook(
@@ -88,15 +91,16 @@ def add_p_to_mesh_dry(subscription: Router, callback_route: str, pe_router_list:
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("[FOR REAL] Add P router to iBGP mesh")
def add_p_to_mesh_real(subscription: Router, callback_route: str, pe_router_list: list[Router]) -> State:
def add_p_to_mesh_real(
subscription: Router, callback_route: str, pe_router_list: list[Router], tt_number: str, process_id: UUIDstr
) -> None:
"""Add the P router to the mesh of PE routers."""
extra_vars = {
"dry_run": False,
"subscription": subscription,
"commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
}
provisioning_proxy.execute_playbook(
@@ -106,11 +110,11 @@ def add_p_to_mesh_real(subscription: Router, callback_route: str, pe_router_list
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("[DRY RUN] Add all PE routers to P router iBGP table")
def add_all_pe_to_p_dry(subscription: Router, pe_router_list: list[Router], callback_route: str) -> State:
def add_all_pe_to_p_dry(
subscription: Router, 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,
@@ -122,26 +126,21 @@ def add_all_pe_to_p_dry(subscription: Router, pe_router_list: list[Router], call
}
for router in pe_router_list
},
}
inventory = {
"all": {
"hosts": {router.router.router_fqdn: None for router in pe_router_list},
},
"commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
}
provisioning_proxy.execute_playbook(
playbook_name="update_ibgp_mesh.yaml",
callback_route=callback_route,
inventory=inventory,
inventory=subscription.router.router_fqdn,
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("[FOR REAL] Add all PE routers to P router iBGP table")
def add_all_pe_to_p_real(subscription: Router, pe_router_list: list[Router], callback_route: str) -> State:
def add_all_pe_to_p_real(
subscription: Router, 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,
@@ -153,44 +152,27 @@ def add_all_pe_to_p_real(subscription: Router, pe_router_list: list[Router], cal
}
for router in pe_router_list
},
}
inventory = {
"all": {
"hosts": {router.router.router_fqdn: None for router in pe_router_list},
},
"commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
}
provisioning_proxy.execute_playbook(
playbook_name="update_ibgp_mesh.yaml",
callback_route=callback_route,
inventory=inventory,
inventory=subscription.router.router_fqdn,
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("Verify iBGP session health")
def check_ibgp_session(subscription: Router, callback_route: str) -> State:
def check_ibgp_session(subscription: Router, callback_route: str) -> None:
"""Run a playbook using the provisioning proxy, to check the health of the new iBGP session."""
inventory = {
"all": {
"hosts": {
subscription.router.router_fqdn: None,
},
},
}
provisioning_proxy.execute_playbook(
playbook_name="check_ibgp.yaml",
callback_route=callback_route,
inventory=inventory,
inventory=subscription.router.router_fqdn,
extra_vars={},
)
return {"subscription": subscription}
@step("Add the router to LibreNMS")
def add_device_to_librenms(subscription: Router) -> State:
@@ -232,7 +214,7 @@ def update_ibgp_mesh() -> StepList:
>> pp_interaction(add_p_to_mesh_real)
>> pp_interaction(add_all_pe_to_p_dry)
>> pp_interaction(add_all_pe_to_p_real)
>> indifferent_pp_interaction(check_ibgp_session)
>> pp_interaction(check_ibgp_session)
>> add_device_to_librenms
>> update_subscription_model
>> resync
Loading