Newer
Older

Simone Spinelli
committed
import ipaddress
from orchestrator.forms import FormPage
from orchestrator.forms.validators import Label
from orchestrator.targets import Target
from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
Karel van Klink
committed
from orchestrator.workflow import StepList, conditional, done, init, step, workflow
from orchestrator.workflows.steps import resync, set_status, store_process_subscription, unsync
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
Karel van Klink
committed
from gso.services.provisioning_proxy import pp_interaction
from gso.workflows.iptrunk.utils import set_isis_to_90000
Karel van Klink
committed
def initial_input_form_generator() -> FormGenerator:
class TerminateForm(FormPage):
Karel van Klink
committed
termination_label: Label = (
"Please confirm whether configuration should get removed from the A and B sides of the trunk, and whether "
"IPAM resources should be released." # type: ignore
)
Karel van Klink
committed
remove_configuration: bool = True
clean_up_ipam: bool = True
Karel van Klink
committed
user_input = yield TerminateForm
return user_input.dict()

Simone Spinelli
committed
@step("Drain traffic from trunk")
def drain_traffic_from_ip_trunk(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.provision_ip_trunk(subscription, process_id, tt_number, "isis_interface", False)

Simone Spinelli
committed
return {
"subscription": subscription,
"label_text": "This is setting the ISIS metric of the trunk to 9000. Press refresh to get the results."
"When traffic is drained, confirm to continue.",

Simone Spinelli
committed
}
@step("Deprovision IP trunk [DRY RUN]")
def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.deprovision_ip_trunk(subscription, process_id, tt_number, True)

Simone Spinelli
committed
return {
"subscription": subscription,
"label_text": "[DRY RUN] Terminating IP trunk, please refresh to get the results of the playbook.",

Simone Spinelli
committed
}

Simone Spinelli
committed
@step("Deprovision IP trunk [FOR REAL]")
def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str) -> State:
provisioning_proxy.deprovision_ip_trunk(subscription, process_id, tt_number, False)

Simone Spinelli
committed
return {
"subscription": subscription,
"label_text": "[COMMIT] Terminating IP trunk, please refresh to get the results of the playbook.",

Simone Spinelli
committed
}
@step("Deprovision IPv4 networks")
def deprovision_ip_trunk_ipv4(subscription: Iptrunk) -> dict:
infoblox.delete_network(ipaddress.IPv4Network(subscription.iptrunk.iptrunk_ipv4_network))
return {"subscription": subscription}

Simone Spinelli
committed
@step("Deprovision IPv6 networks")
def deprovision_ip_trunk_ipv6(subscription: Iptrunk) -> dict:
infoblox.delete_network(ipaddress.IPv6Network(subscription.iptrunk.iptrunk_ipv6_network))
return {"subscription": subscription}

Simone Spinelli
committed
"Terminate IPtrunk",
initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
target=Target.TERMINATE,
)
run_config_steps = conditional(lambda state: state["remove_configuration"])
run_ipam_steps = conditional(lambda state: state["clean_up_ipam"])
Karel van Klink
committed
config_steps = (
init
>> pp_interaction(set_isis_to_90000, 3)
Karel van Klink
committed
>> pp_interaction(deprovision_ip_trunk_dry, 3)
>> pp_interaction(deprovision_ip_trunk_real, 3)
)
ipam_steps = init >> deprovision_ip_trunk_ipv4 >> deprovision_ip_trunk_ipv6
Karel van Klink
committed

Simone Spinelli
committed
init
>> store_process_subscription(Target.TERMINATE)
>> unsync
Karel van Klink
committed
>> run_config_steps(config_steps)
>> run_ipam_steps(ipam_steps)

Simone Spinelli
committed
>> set_status(SubscriptionLifecycle.TERMINATED)
>> resync
>> done