diff --git a/gso/translations/en-GB.json b/gso/translations/en-GB.json index 845ad7320d7e87cdd38aa78a51eacc61f9270eec..a4ee0dfcac2820a0b39239c9a188b36e710750c6 100644 --- a/gso/translations/en-GB.json +++ b/gso/translations/en-GB.json @@ -29,7 +29,9 @@ "iptrunk_sideB_ae_iface": "Aggregated Ethernet interface name", "iptrunk_sideB_ae_geant_a_sid": "GÉANT A-SID", "iptrunk_sideB_ae_members": "Aggregated Ethernet member interface names", - "iptrunk_sideB_ae_members_descriptions": "Aggregated Ethernet member interface descriptions" + "iptrunk_sideB_ae_members_descriptions": "Aggregated Ethernet member interface descriptions", + "remove_configuration": "Remove configuration from the device", + "clean_up_ipam": "Clean up related entries in IPAM" } }, "workflow": { diff --git a/gso/workflows/device/terminate_device.py b/gso/workflows/device/terminate_device.py index b7564d2a197a652c8b77edc830a5e374488b4459..1ad4a487dab6920a0455ab99c02f8a5a30cc4542 100644 --- a/gso/workflows/device/terminate_device.py +++ b/gso/workflows/device/terminate_device.py @@ -5,7 +5,7 @@ from orchestrator.forms import FormPage from orchestrator.forms.validators import Label from orchestrator.targets import Target from orchestrator.types import FormGenerator, SubscriptionLifecycle, UUIDstr -from orchestrator.workflow import StepList, done, init, step, workflow +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 @@ -21,14 +21,15 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: subscription = Device.from_subscription(subscription_id) class TerminateForm(FormPage): - are_you_sure: Label = f"Are you sure you want to remove {subscription.description}?" # type: ignore + termination_label: Label = ( + f"Please confirm whether configuration should get removed from the {subscription.device_type}, and " + "whether IPAM resources should be released." # type: ignore + ) + remove_configuration: bool = True + clean_up_ipam: bool = True - return TerminateForm # type: ignore - - -def _deprovision_in_user_management_system(fqdn: str) -> None: - logger.debug(fqdn) - pass + user_input = yield TerminateForm + return user_input.dict() @step("Deprovision loopback IPs from IPAM/DNS") @@ -74,19 +75,28 @@ def deprovision_lt_ips(subscription: Device) -> dict[str, V4ServiceNetwork | V6S } +@step("Remove configuration from device") +def remove_config_from_device() -> None: + pass + + @workflow( "Terminate device", initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator), target=Target.TERMINATE, ) def terminate_device() -> StepList: + run_ipam_steps = conditional(lambda state: state.get("clean_up_ipam", True)) + run_config_steps = conditional(lambda state: state.get("remove_configuration", True)) + + ipam_steps = StepList([deprovision_loopback_ips, deprovision_si_ips, deprovision_lt_ips]) + return ( init >> store_process_subscription(Target.TERMINATE) >> unsync - >> deprovision_loopback_ips - >> deprovision_si_ips - >> deprovision_lt_ips + >> run_ipam_steps(ipam_steps) + >> run_config_steps(remove_config_from_device) >> set_status(SubscriptionLifecycle.TERMINATED) >> resync >> done