Skip to content
Snippets Groups Projects
Commit 34166751 authored by Karel van Klink's avatar Karel van Klink :smiley_cat: Committed by Neda Moeini
Browse files

Split off workflow steps for adding all PE routers to a P router

parent c5bb90cd
No related branches found
No related tags found
1 merge request!139Feature/add validation workflows
...@@ -238,15 +238,11 @@ def get_active_pe_router_dict() -> dict[str, Any]: ...@@ -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()] all_routers = [Router.from_subscription(r["subscription_id"]) for r in get_active_router_subscriptions()]
return { return {
"all": { router.router.router_fqdn: {
"hosts": { "lo4": str(router.router.router_lo_ipv4_address),
router.router.router_fqdn: { "lo6": str(router.router.router_lo_ipv6_address),
"lo4": str(router.router.router_lo_ipv4_address), "vendor": str(router.router.vendor),
"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
for router in all_routers
if router.router.router_role == RouterRole.PE
}
},
} }
...@@ -13,7 +13,7 @@ from pydantic_forms.types import FormGenerator ...@@ -13,7 +13,7 @@ from pydantic_forms.types import FormGenerator
from pydantic_forms.validators import Label from pydantic_forms.validators import Label
from gso.products.product_types.iptrunk import Iptrunk 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 from gso.settings import load_oss_params
...@@ -34,7 +34,7 @@ def _deploy_base_config( ...@@ -34,7 +34,7 @@ def _deploy_base_config(
"commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - 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", playbook_name="base_config.yaml",
callback_route=callback_route, callback_route=callback_route,
inventory=inventory, inventory=inventory,
...@@ -83,7 +83,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route: ...@@ -83,7 +83,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route:
f"{subscription.iptrunk.geant_s_sid}", f"{subscription.iptrunk.geant_s_sid}",
} }
execute_playbook( lso_client.execute_playbook(
playbook_name="iptrunks.yaml", playbook_name="iptrunks.yaml",
callback_route=callback_route, callback_route=callback_route,
inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n" 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: ...@@ -100,7 +100,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route:
@step("Run show commands after base config install") @step("Run show commands after base config install")
def run_checks_after_base_config(subscription: dict[str, Any], callback_route: str) -> None: def run_checks_after_base_config(subscription: dict[str, Any], callback_route: str) -> None:
"""Workflow step for running show commands after installing base config.""" """Workflow step for running show commands after installing base config."""
execute_playbook( lso_client.execute_playbook(
playbook_name="base_config_checks.yaml", playbook_name="base_config_checks.yaml",
callback_route=callback_route, callback_route=callback_route,
inventory=subscription["router"]["router_fqdn"], inventory=subscription["router"]["router_fqdn"],
...@@ -121,3 +121,43 @@ def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator: ...@@ -121,3 +121,43 @@ def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator:
yield SharepointPrompt yield SharepointPrompt
return {} 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,
)
...@@ -10,7 +10,7 @@ from orchestrator.forms.validators import Choice, Label ...@@ -10,7 +10,7 @@ from orchestrator.forms.validators import Choice, Label
from orchestrator.targets import Target from orchestrator.targets import Target
from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
from orchestrator.utils.json import json_dumps 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.steps import resync, set_status, store_process_subscription
from orchestrator.workflows.utils import wrap_create_initial_input_form from orchestrator.workflows.utils import wrap_create_initial_input_form
from pydantic import AfterValidator, ConfigDict, field_validator from pydantic import AfterValidator, ConfigDict, field_validator
......
...@@ -17,6 +17,7 @@ from gso.services import librenms_client, lso_client, subscriptions ...@@ -17,6 +17,7 @@ from gso.services import librenms_client, lso_client, subscriptions
from gso.services.lso_client import lso_interaction from gso.services.lso_client import lso_interaction
from gso.services.subscriptions import get_trunks_that_terminate_on_router from gso.services.subscriptions import get_trunks_that_terminate_on_router
from gso.utils.helpers import SNMPVersion 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: 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 ...@@ -61,7 +62,7 @@ def add_p_to_mesh_dry(subscription: dict[str, Any], callback_route: str, tt_numb
lso_client.execute_playbook( lso_client.execute_playbook(
playbook_name="update_ibgp_mesh.yaml", playbook_name="update_ibgp_mesh.yaml",
callback_route=callback_route, callback_route=callback_route,
inventory=subscriptions.get_active_pe_router_dict(), inventory={"all": {"hosts": subscriptions.get_active_pe_router_dict()}},
extra_vars=extra_vars, extra_vars=extra_vars,
) )
...@@ -79,63 +80,7 @@ def add_p_to_mesh_real(subscription: dict[str, Any], callback_route: str, tt_num ...@@ -79,63 +80,7 @@ def add_p_to_mesh_real(subscription: dict[str, Any], callback_route: str, tt_num
lso_client.execute_playbook( lso_client.execute_playbook(
playbook_name="update_ibgp_mesh.yaml", playbook_name="update_ibgp_mesh.yaml",
callback_route=callback_route, callback_route=callback_route,
inventory=subscriptions.get_active_pe_router_dict(), inventory={"all": {"hosts": 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"],
extra_vars=extra_vars, extra_vars=extra_vars,
) )
......
...@@ -16,6 +16,7 @@ from gso.services.librenms_client import LibreNMSClient ...@@ -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.lso_client import anonymous_lso_interaction, execute_playbook
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
from gso.utils.shared_enums import Vendor 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") @step("Prepare required keys in state")
...@@ -78,22 +79,6 @@ def verify_base_config(subscription: Router, callback_route: str) -> None: ...@@ -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( @workflow(
"Validate router configuration", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None) "Validate router configuration", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None)
) )
...@@ -118,7 +103,7 @@ def validate_router() -> StepList: ...@@ -118,7 +103,7 @@ def validate_router() -> StepList:
>> check_netbox_entry_exists >> check_netbox_entry_exists
>> check_librenms_entry_exists >> check_librenms_entry_exists
>> anonymous_lso_interaction(verify_base_config) >> anonymous_lso_interaction(verify_base_config)
>> anonymous_lso_interaction(validate_ibgp_mesh_config) >> anonymous_lso_interaction(add_all_pe_to_p_dry)
>> resync >> resync
>> done >> done
) )
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment