diff --git a/gso/workflows/iptrunk/terminate_iptrunk.py b/gso/workflows/iptrunk/terminate_iptrunk.py index c0a0da62cd549962164e6d9cc6afb787a7f63f79..16e6d7b05075361bd0b2caed6d1631e347998e49 100644 --- a/gso/workflows/iptrunk/terminate_iptrunk.py +++ b/gso/workflows/iptrunk/terminate_iptrunk.py @@ -10,6 +10,7 @@ from orchestrator.workflows.utils import wrap_modify_initial_input_form from gso.products.product_types.iptrunk import Iptrunk from gso.services import infoblox, provisioning_proxy +from gso.services.netbox_client import NetBoxClient from gso.services.provisioning_proxy import pp_interaction from gso.utils.helpers import set_isis_to_90000 @@ -58,6 +59,56 @@ def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr, tt_num } +@step("Unreserve involved physical interfaces") +def unreserve_physical_interfaces(subscription: Iptrunk) -> State: + router_sideA = NetBoxClient().get_device_by_name(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node) + router_sideB = NetBoxClient().get_device_by_name(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node) + sideA_members = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members + sideB_members = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members + for sideA_member in sideA_members: + NetBoxClient().unreserve_interface(router_sideA, sideA_member) + for sideB_member in sideB_members: + NetBoxClient().unreserve_interface(router_sideB, sideB_member) + return {"subscription": subscription} + + +@step("Deallocate involved physical interfaces") +def deallocate_physical_interfaces(subscription: Iptrunk) -> State: + router_sideA = NetBoxClient().get_device_by_name(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node) + router_sideB = NetBoxClient().get_device_by_name(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node) + sideA_members = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members + sideB_members = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members + for sideA_member in sideA_members: + NetBoxClient().deallocate_interface(router_sideA, sideA_member) + for sideB_member in sideB_members: + NetBoxClient().deallocate_interface(router_sideB, sideB_member) + return {"subscription": subscription} + + +@step("Unattach physical interfaces from respective LAG") +def unattach_physical_interfaces(subscription: Iptrunk) -> State: + router_sideA = NetBoxClient().get_device_by_name(subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node) + router_sideB = NetBoxClient().get_device_by_name(subscription.iptrunk.iptrunk_sides[1].iptrunk_side_node) + sideA_members = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_members + sideB_members = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_members + sideA_ae_iface = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface + sideB_ae_iface = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface + for sideA_member in sideA_members: + NetBoxClient().unattach_interface_from_lag(router_sideA, sideA_ae_iface, sideA_member) + for sideB_member in sideB_members: + NetBoxClient().unattach_interface_from_lag(router_sideB, sideB_ae_iface, sideB_member) + return {"subscription": subscription} + + +@step("Delete involved LAGs") +def delete_lags(subscription: Iptrunk) -> State: + sideA_ae_iface = subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface + sideB_ae_iface = subscription.iptrunk.iptrunk_sides[1].iptrunk_side_ae_iface + NetBoxClient().delete_device(sideA_ae_iface) + NetBoxClient().delete_device(sideB_ae_iface) + return {"subscription": subscription} + + @step("Deprovision IPv4 networks") def deprovision_ip_trunk_ipv4(subscription: Iptrunk) -> dict: infoblox.delete_network(ipaddress.IPv4Network(subscription.iptrunk.iptrunk_ipv4_network)) diff --git a/utils/netboxcli.py b/utils/netboxcli.py index 6b69c5b15cda35ef23bfd3f2071e9169b2861604..18b0b1d3e046d1ae7edc5b89b4318edf26711f00 100644 --- a/utils/netboxcli.py +++ b/utils/netboxcli.py @@ -179,7 +179,6 @@ def free_interface(fqdn: str, iface: str) -> None: freed_iface = NetboxClient().free_interface(fqdn, iface) click.echo(freed_iface) - @action.command() @click.option("--fqdn", help="Device name from where to get interface to edit") @click.option("--iface", help="Interface name to edit")