Skip to content
Snippets Groups Projects

Run pre and post checks when trunk capacity changes

Merged Karel van Klink requested to merge feature/iptrunk-capacity-add-checks into develop
Files
2
@@ -34,6 +34,8 @@ from gso.utils.helpers import (
validate_tt_number,
)
from gso.utils.shared_enums import IPv4AddressType, IPv6AddressType, Vendor
from gso.workflows.iptrunk.migrate_iptrunk import check_ip_trunk_optical_levels_pre
from gso.workflows.iptrunk.validate_iptrunk import check_ip_trunk_isis
T = TypeVar("T", bound=LAGMember)
@@ -175,6 +177,69 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
)
@step("Determine whether we should be running interface checks")
def determine_change_in_capacity(
subscription: Iptrunk, iptrunk_speed: str, side_a_ae_members: list[LAGMember], side_b_ae_members: list[LAGMember]
) -> State:
"""Determine whether we should run pre- and post-checks on the IP trunk.
This can be caused by the following conditions:
* The total capacity of the trunk changes
* The amount of interfaces changes
* One or more interface names have changed on side A
* One or more interface names have changed on side B
"""
capacity_has_changed = (
iptrunk_speed != subscription.iptrunk.iptrunk_speed
or len(side_a_ae_members) != len(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members)
or any(
old_interface.interface_name != new_interface.interface_name
for old_interface, new_interface in zip(
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members, side_a_ae_members, strict=False
)
)
or any(
old_interface.interface_name != new_interface.interface_name
for old_interface, new_interface in zip(
subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members, side_b_ae_members, strict=False
)
)
)
return {"capacity_has_changed": capacity_has_changed}
@step("Check IP connectivity of the trunk")
def check_ip_trunk_connectivity(subscription: Iptrunk, callback_route: str) -> State:
"""Check successful connectivity across a trunk."""
extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "ping"}
execute_playbook(
playbook_name="iptrunks_checks.yaml",
callback_route=callback_route,
inventory=subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn,
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("Check LLDP on the trunk endpoints")
def check_ip_trunk_lldp(subscription: Iptrunk, callback_route: str) -> State:
"""Check LLDP on trunk endpoints."""
extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "lldp"}
execute_playbook(
playbook_name="iptrunks_checks.yaml",
callback_route=callback_route,
inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n"
f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n",
extra_vars=extra_vars,
)
return {"subscription": subscription}
@step("Update subscription")
def modify_iptrunk_subscription(
subscription: Iptrunk,
@@ -397,6 +462,22 @@ def allocate_interfaces_in_netbox_side_b(subscription: Iptrunk, previous_ae_memb
_netbox_allocate_interfaces(subscription.iptrunk.iptrunk_sides[1], previous_ae_members[1])
@step("Check Optical POST levels on the trunk endpoint")
def check_ip_trunk_optical_levels_post(subscription: Iptrunk, callback_route: str) -> State:
"""Check Optical POST levels on the trunk."""
extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "optical_post"}
execute_playbook(
playbook_name="iptrunks_checks.yaml",
callback_route=callback_route,
inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n"
f"{subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node.router_fqdn}\n",
extra_vars=extra_vars,
)
return {"subscription": subscription}
@workflow(
"Modify IP Trunk interface",
initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
@@ -422,10 +503,17 @@ def modify_trunk_interface() -> StepList:
)
== Vendor.NOKIA
)
capacity_has_changed = conditional(lambda state: state["capacity_has_changed"])
return (
begin
>> store_process_subscription(Target.MODIFY)
>> unsync
>> determine_change_in_capacity
>> capacity_has_changed(lso_interaction(check_ip_trunk_lldp))
>> capacity_has_changed(lso_interaction(check_ip_trunk_optical_levels_pre))
>> capacity_has_changed(lso_interaction(check_ip_trunk_connectivity))
>> capacity_has_changed(lso_interaction(check_ip_trunk_isis))
>> modify_iptrunk_subscription
>> side_a_is_nokia(netbox_update_interfaces_side_a)
>> side_b_is_nokia(netbox_update_interfaces_side_b)
@@ -433,6 +521,10 @@ def modify_trunk_interface() -> StepList:
>> lso_interaction(provision_ip_trunk_iface_real)
>> side_a_is_nokia(allocate_interfaces_in_netbox_side_a)
>> side_b_is_nokia(allocate_interfaces_in_netbox_side_b)
>> capacity_has_changed(lso_interaction(check_ip_trunk_lldp))
>> capacity_has_changed(lso_interaction(check_ip_trunk_optical_levels_post))
>> capacity_has_changed(lso_interaction(check_ip_trunk_connectivity))
>> capacity_has_changed(lso_interaction(check_ip_trunk_isis))
>> resync
>> done
)
Loading