From 33b4752781044639b3473892f97a6304a8cdbef4 Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Tue, 18 Jul 2023 14:29:26 +0200
Subject: [PATCH] update intake form of device termination workflow

added two checkboxes that take care of removing config, and cleaning up IPAM
made the corresponding steps in the workflow conditional, so they are skipped if unchecked
---
 gso/translations/en-GB.json              |  4 ++-
 gso/workflows/device/terminate_device.py | 32 ++++++++++++++++--------
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/gso/translations/en-GB.json b/gso/translations/en-GB.json
index 845ad732..a4ee0dfc 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 e279c372..ac81a231 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
 
@@ -20,14 +20,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")
@@ -73,19 +74,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
-- 
GitLab