From e8614e72e06deb5859f4cf5083f732c9512c66f4 Mon Sep 17 00:00:00 2001
From: Aleksandr Kurbatov <ak@geant.org>
Date: Tue, 10 Dec 2024 19:09:01 +0000
Subject: [PATCH] `modify_vrf_router_list`: Added LSO steps

---
 gso/workflows/vrf/modify_vrf_router_list.py | 58 ++++++++++++++++++++-
 1 file changed, 56 insertions(+), 2 deletions(-)

diff --git a/gso/workflows/vrf/modify_vrf_router_list.py b/gso/workflows/vrf/modify_vrf_router_list.py
index d198d8f9..17f888d0 100644
--- a/gso/workflows/vrf/modify_vrf_router_list.py
+++ b/gso/workflows/vrf/modify_vrf_router_list.py
@@ -1,6 +1,6 @@
 """Modify VRF to add or remove routers."""
 
-from typing import Annotated
+from typing import Annotated, Any
 
 from orchestrator.forms import FormPage
 from orchestrator.targets import Target
@@ -13,7 +13,9 @@ from pydantic_forms.validators import validate_unique_list
 
 from gso.products.product_types.router import Router
 from gso.products.product_types.vrf import VRF
+from gso.services.lso_client import LSOState, lso_interaction
 from gso.utils.helpers import active_router_selector
+from gso.utils.types.tt_number import TTNumber
 
 
 def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
@@ -25,6 +27,7 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
 
     class ModifyVRFRouterListForm(FormPage):
         model_config = ConfigDict(title=f"Modify the {subscription.vrf.vrf_name} VRF to add or remove routers.")
+        tt_number: TTNumber
 
         router_list: Annotated[
             list[RouterSelection],
@@ -51,6 +54,48 @@ def update_subscription_model(subscription: VRF, router_list: list[dict[str, UUI
     return {"subscription": subscription}
 
 
+@step("[DRY RUN] Update VRF on list of routers")
+def update_vrf_on_routers_dry(
+    subscription: dict[str, Any], process_id: UUIDstr, tt_number: str, router_list
+) -> LSOState:
+    """Deploy VRF on a list of routers - Dry run."""
+    vrf_new_router_list = [Router.from_subscription(router["router_id"]) for router in router_list]
+    inventory = {"all": {"hosts": {router.router.router_fqdn: None for router in vrf_new_router_list}}}
+    extra_vars = {
+        "subscription": subscription,
+        "dry_run": True,
+        "verb": "update",
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
+        f"Deploy config for {subscription["description"]}",
+    }
+    return {
+        "playbook_name": "gap_ansible/playbooks/vrf_update.yaml",
+        "inventory": inventory,
+        "extra_vars": extra_vars,
+    }
+
+
+@step("[FOR REAL] Update VRF on list of routers")
+def update_vrf_on_routers_real(
+    subscription: dict[str, Any], process_id: UUIDstr, tt_number: str, router_list
+) -> LSOState:
+    """Deploy VRF on a list of routers - with commit."""
+    vrf_new_router_list = [Router.from_subscription(router["router_id"]) for router in router_list]
+    inventory = {"all": {"hosts": {router.router.router_fqdn: None for router in vrf_new_router_list}}}
+    extra_vars = {
+        "subscription": subscription,
+        "dry_run": False,
+        "verb": "update",
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - "
+        f"Deploy config for {subscription["description"]}",
+    }
+    return {
+        "playbook_name": "gap_ansible/playbooks/vrf_update.yaml",
+        "inventory": inventory,
+        "extra_vars": extra_vars,
+    }
+
+
 @workflow(
     "Modify VRF router list",
     initial_input_form=wrap_modify_initial_input_form(initial_input_form_generator),
@@ -58,4 +103,13 @@ def update_subscription_model(subscription: VRF, router_list: list[dict[str, UUI
 )
 def modify_vrf_router_list() -> StepList:
     """Modify the VRF router list."""
-    return begin >> store_process_subscription(Target.MODIFY) >> unsync >> update_subscription_model >> resync >> done
+    return (
+        begin
+        >> store_process_subscription(Target.MODIFY)
+        >> unsync
+        >> lso_interaction(update_vrf_on_routers_dry)
+        >> lso_interaction(update_vrf_on_routers_real)
+        >> update_subscription_model
+        >> resync
+        >> done
+    )
-- 
GitLab