From 34166751ed0ff3e2ba405224656faa323282afca Mon Sep 17 00:00:00 2001
From: Karel van Klink <karel.vanklink@geant.org>
Date: Mon, 3 Jun 2024 17:36:48 +0200
Subject: [PATCH] Split off workflow steps for adding all PE routers to a P
 router

---
 gso/services/subscriptions.py            | 18 +++----
 gso/utils/workflow_steps.py              | 48 +++++++++++++++++--
 gso/workflows/iptrunk/create_iptrunk.py  |  2 +-
 gso/workflows/router/update_ibgp_mesh.py | 61 ++----------------------
 gso/workflows/router/validate_router.py  | 19 +-------
 5 files changed, 57 insertions(+), 91 deletions(-)

diff --git a/gso/services/subscriptions.py b/gso/services/subscriptions.py
index 0c402963..27f075a1 100644
--- a/gso/services/subscriptions.py
+++ b/gso/services/subscriptions.py
@@ -238,15 +238,11 @@ def get_active_pe_router_dict() -> dict[str, Any]:
     all_routers = [Router.from_subscription(r["subscription_id"]) for r in get_active_router_subscriptions()]
 
     return {
-        "all": {
-            "hosts": {
-                router.router.router_fqdn: {
-                    "lo4": str(router.router.router_lo_ipv4_address),
-                    "lo6": str(router.router.router_lo_ipv6_address),
-                    "vendor": str(router.router.vendor),
-                }
-                for router in all_routers
-                if router.router.router_role == RouterRole.PE
-            }
-        },
+        router.router.router_fqdn: {
+            "lo4": str(router.router.router_lo_ipv4_address),
+            "lo6": str(router.router.router_lo_ipv6_address),
+            "vendor": str(router.router.vendor),
+        }
+        for router in all_routers
+        if router.router.router_role == RouterRole.PE
     }
diff --git a/gso/utils/workflow_steps.py b/gso/utils/workflow_steps.py
index 6ab00644..4edb906c 100644
--- a/gso/utils/workflow_steps.py
+++ b/gso/utils/workflow_steps.py
@@ -13,7 +13,7 @@ from pydantic_forms.types import FormGenerator
 from pydantic_forms.validators import Label
 
 from gso.products.product_types.iptrunk import Iptrunk
-from gso.services.lso_client import execute_playbook
+from gso.services import lso_client, subscriptions
 from gso.settings import load_oss_params
 
 
@@ -34,7 +34,7 @@ def _deploy_base_config(
         "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Deploy base config",
     }
 
-    execute_playbook(
+    lso_client.execute_playbook(
         playbook_name="base_config.yaml",
         callback_route=callback_route,
         inventory=inventory,
@@ -83,7 +83,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route:
         f"{subscription.iptrunk.geant_s_sid}",
     }
 
-    execute_playbook(
+    lso_client.execute_playbook(
         playbook_name="iptrunks.yaml",
         callback_route=callback_route,
         inventory=f"{subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn}\n"
@@ -100,7 +100,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, callback_route:
 @step("Run show commands after base config install")
 def run_checks_after_base_config(subscription: dict[str, Any], callback_route: str) -> None:
     """Workflow step for running show commands after installing base config."""
-    execute_playbook(
+    lso_client.execute_playbook(
         playbook_name="base_config_checks.yaml",
         callback_route=callback_route,
         inventory=subscription["router"]["router_fqdn"],
@@ -121,3 +121,43 @@ def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator:
     yield SharepointPrompt
 
     return {}
+
+
+@step("[DRY RUN] Add all PE routers to P router iBGP table")
+def add_all_pe_to_p_dry(subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr) -> None:
+    """Perform a dry run of adding the list of all PE routers to the new P router."""
+    extra_vars = {
+        "dry_run": True,
+        "subscription": subscription,
+        "pe_router_list": subscriptions.get_active_pe_router_dict(),
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
+        "verb": "add_pe_to_p",
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="update_ibgp_mesh.yaml",
+        callback_route=callback_route,
+        inventory=subscription["router"]["router_fqdn"],
+        extra_vars=extra_vars,
+    )
+
+
+@step("[FOR REAL] Add all PE routers to P router iBGP table")
+def add_all_pe_to_p_real(
+    subscription: dict[str, Any], callback_route: str, tt_number: str, process_id: UUIDstr
+) -> None:
+    """Add the list of all PE routers to the new P router."""
+    extra_vars = {
+        "dry_run": False,
+        "subscription": subscription,
+        "pe_router_list": subscriptions.get_active_pe_router_dict(),
+        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
+        "verb": "add_pe_to_p",
+    }
+
+    lso_client.execute_playbook(
+        playbook_name="update_ibgp_mesh.yaml",
+        callback_route=callback_route,
+        inventory=subscription["router"]["router_fqdn"],
+        extra_vars=extra_vars,
+    )
diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py
index 1b543753..95703094 100644
--- a/gso/workflows/iptrunk/create_iptrunk.py
+++ b/gso/workflows/iptrunk/create_iptrunk.py
@@ -10,7 +10,7 @@ from orchestrator.forms.validators import Choice, Label
 from orchestrator.targets import Target
 from orchestrator.types import FormGenerator, State, SubscriptionLifecycle, UUIDstr
 from orchestrator.utils.json import json_dumps
-from orchestrator.workflow import StepList, conditional, done, init, step, workflow
+from orchestrator.workflow import StepList, begin, conditional, done, step, workflow
 from orchestrator.workflows.steps import resync, set_status, store_process_subscription
 from orchestrator.workflows.utils import wrap_create_initial_input_form
 from pydantic import AfterValidator, ConfigDict, field_validator
diff --git a/gso/workflows/router/update_ibgp_mesh.py b/gso/workflows/router/update_ibgp_mesh.py
index 2d6f2d48..bf0d0416 100644
--- a/gso/workflows/router/update_ibgp_mesh.py
+++ b/gso/workflows/router/update_ibgp_mesh.py
@@ -17,6 +17,7 @@ from gso.services import librenms_client, lso_client, subscriptions
 from gso.services.lso_client import lso_interaction
 from gso.services.subscriptions import get_trunks_that_terminate_on_router
 from gso.utils.helpers import SNMPVersion
+from gso.utils.workflow_steps import add_all_pe_to_p_dry, add_all_pe_to_p_real
 
 
 def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
@@ -61,7 +62,7 @@ def add_p_to_mesh_dry(subscription: dict[str, Any], callback_route: str, tt_numb
     lso_client.execute_playbook(
         playbook_name="update_ibgp_mesh.yaml",
         callback_route=callback_route,
-        inventory=subscriptions.get_active_pe_router_dict(),
+        inventory={"all": {"hosts": subscriptions.get_active_pe_router_dict()}},
         extra_vars=extra_vars,
     )
 
@@ -79,63 +80,7 @@ def add_p_to_mesh_real(subscription: dict[str, Any], callback_route: str, tt_num
     lso_client.execute_playbook(
         playbook_name="update_ibgp_mesh.yaml",
         callback_route=callback_route,
-        inventory=subscriptions.get_active_pe_router_dict(),
-        extra_vars=extra_vars,
-    )
-
-
-@step("[DRY RUN] Add all PE routers to P router iBGP table")
-def add_all_pe_to_p_dry(
-    subscription: dict[str, Any], pe_router_list: list[Router], callback_route: str, tt_number: str, process_id: UUIDstr
-) -> None:
-    """Perform a dry run of adding the list of all PE routers to the new P router."""
-    extra_vars = {
-        "dry_run": True,
-        "subscription": subscription,
-        "pe_router_list": {
-            router.router.router_fqdn: {
-                "lo4": str(router.router.router_lo_ipv4_address),
-                "lo6": str(router.router.router_lo_ipv6_address),
-                "vendor": router.router.vendor,
-            }
-            for router in pe_router_list
-        },
-        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
-        "verb": "add_pe_to_p",
-    }
-
-    lso_client.execute_playbook(
-        playbook_name="update_ibgp_mesh.yaml",
-        callback_route=callback_route,
-        inventory=subscription["router"]["router_fqdn"],
-        extra_vars=extra_vars,
-    )
-
-
-@step("[FOR REAL] Add all PE routers to P router iBGP table")
-def add_all_pe_to_p_real(
-    subscription: dict[str, Any], pe_router_list: list[Router], callback_route: str, tt_number: str, process_id: UUIDstr
-) -> None:
-    """Add the list of all PE routers to the new P router."""
-    extra_vars = {
-        "dry_run": False,
-        "subscription": subscription,
-        "pe_router_list": {
-            router.router.router_fqdn: {
-                "lo4": str(router.router.router_lo_ipv4_address),
-                "lo6": str(router.router.router_lo_ipv6_address),
-                "vendor": router.router.vendor,
-            }
-            for router in pe_router_list
-        },
-        "commit_comment": f"GSO_PROCESS_ID: {process_id} - TT_NUMBER: {tt_number} - Update iBGP mesh",
-        "verb": "add_pe_to_p",
-    }
-
-    lso_client.execute_playbook(
-        playbook_name="update_ibgp_mesh.yaml",
-        callback_route=callback_route,
-        inventory=subscription["router"]["router_fqdn"],
+        inventory={"all": {"hosts": subscriptions.get_active_pe_router_dict()}},
         extra_vars=extra_vars,
     )
 
diff --git a/gso/workflows/router/validate_router.py b/gso/workflows/router/validate_router.py
index a1fed75d..072d2f50 100644
--- a/gso/workflows/router/validate_router.py
+++ b/gso/workflows/router/validate_router.py
@@ -16,6 +16,7 @@ from gso.services.librenms_client import LibreNMSClient
 from gso.services.lso_client import anonymous_lso_interaction, execute_playbook
 from gso.services.netbox_client import NetboxClient
 from gso.utils.shared_enums import Vendor
+from gso.utils.workflow_steps import add_all_pe_to_p_dry
 
 
 @step("Prepare required keys in state")
@@ -78,22 +79,6 @@ def verify_base_config(subscription: Router, callback_route: str) -> None:
     )
 
 
-@step("Validate iBGP mesh configuration")
-def validate_ibgp_mesh_config(subscription: Router, callback_route: str) -> None:
-    """Workflow step for running a playbook that check iBGP mesh configuration."""
-    execute_playbook(
-        playbook_name="ibgp_checks.yaml",
-        callback_route=callback_route,
-        inventory=subscription.router.router_fqdn,
-        extra_vars={
-            "wfo_trunk_json": subscription,
-            "verb": "deploy",
-            "dry_run": "true",
-            "is_verification_workflow": "true",
-        },
-    )
-
-
 @workflow(
     "Validate router configuration", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None)
 )
@@ -118,7 +103,7 @@ def validate_router() -> StepList:
         >> check_netbox_entry_exists
         >> check_librenms_entry_exists
         >> anonymous_lso_interaction(verify_base_config)
-        >> anonymous_lso_interaction(validate_ibgp_mesh_config)
+        >> anonymous_lso_interaction(add_all_pe_to_p_dry)
         >> resync
         >> done
     )
-- 
GitLab