From bb4fe1fc825f7b6e5ad5a3c4df8517a0a6c78e5e Mon Sep 17 00:00:00 2001
From: Mohammad Torkashvand <mohammad.torkashvand@geant.org>
Date: Fri, 18 Oct 2024 15:03:02 +0200
Subject: [PATCH] add moodi start and stop steps

---
 gso/oss-params-example.json                   |  3 ++
 gso/settings.py                               |  7 +++
 gso/utils/workflow_steps.py                   | 54 +++++++++++++++----
 gso/workflows/iptrunk/create_iptrunk.py       | 12 ++---
 gso/workflows/iptrunk/deploy_twamp.py         |  6 +--
 gso/workflows/iptrunk/migrate_iptrunk.py      | 32 +++++------
 gso/workflows/iptrunk/modify_isis_metric.py   |  4 +-
 .../iptrunk/modify_trunk_interface.py         | 10 ++--
 gso/workflows/iptrunk/terminate_iptrunk.py    |  4 +-
 gso/workflows/iptrunk/validate_iptrunk.py     |  8 +--
 gso/workflows/router/promote_p_to_pe.py       | 20 +++----
 gso/workflows/router/terminate_router.py      | 16 +++---
 gso/workflows/router/update_ibgp_mesh.py      | 10 ++--
 gso/workflows/router/validate_router.py       |  4 +-
 14 files changed, 116 insertions(+), 74 deletions(-)

diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json
index a1bbe5d0..95ad8c02 100644
--- a/gso/oss-params-example.json
+++ b/gso/oss-params-example.json
@@ -123,5 +123,8 @@
   },
   "SENTRY": {
     "DSN": "https://sentry-dsn-url"
+  },
+  "MOODI": {
+    "host": "moodi.test.gap.geant.org"
   }
 }
diff --git a/gso/settings.py b/gso/settings.py
index b7b62186..0979dcb3 100644
--- a/gso/settings.py
+++ b/gso/settings.py
@@ -211,6 +211,12 @@ class SentryParams(BaseSettings):
     DSN: str
 
 
+class MoodiParams(BaseSettings):
+    """Settings for Moodi."""
+
+    host: str
+
+
 class OSSParams(BaseSettings):
     """The set of parameters required for running :term:`GSO`."""
 
@@ -225,6 +231,7 @@ class OSSParams(BaseSettings):
     SHAREPOINT: SharepointParams
     KENTIK: KentikParams
     SENTRY: SentryParams | None = None
+    MOODI: MoodiParams
 
 
 def load_oss_params() -> OSSParams:
diff --git a/gso/utils/workflow_steps.py b/gso/utils/workflow_steps.py
index 6d7a166f..1cbd0fd9 100644
--- a/gso/utils/workflow_steps.py
+++ b/gso/utils/workflow_steps.py
@@ -35,7 +35,7 @@ def _deploy_base_config(
     }
 
     return {
-        "playbook_name": "base_config.yaml",
+        "playbook_name": "gap_ansible/playbooks/base_config.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -67,7 +67,7 @@ def _update_sdp_mesh(
     }
 
     return {
-        "playbook_name": "update_pe_sdp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_pe_sdp_mesh.yaml",
         "inventory": inventory,
         "extra_vars": extra_vars,
     }
@@ -100,7 +100,7 @@ def _update_sdp_single_pe(
         }
 
     return {
-        "playbook_name": "update_pe_sdp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_pe_sdp_mesh.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -132,7 +132,7 @@ def _add_pe_mesh_to_pe(
         }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -157,7 +157,7 @@ def _add_pe_to_pe_mesh(
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": inventory,
         "extra_vars": extra_vars,
     }
@@ -188,7 +188,7 @@ def _add_all_p_to_pe(
         }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -213,7 +213,7 @@ def _add_pe_to_all_p(
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": inventory,
         "extra_vars": extra_vars,
     }
@@ -320,7 +320,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, tt_number: str)
 
     return {
         "subscription": subscription,
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -338,7 +338,7 @@ def set_isis_to_max(subscription: Iptrunk, process_id: UUIDstr, tt_number: str)
 def run_checks_after_base_config(subscription: dict[str, Any]) -> LSOState:
     """Workflow step for running show commands after installing base config."""
     return {
-        "playbook_name": "base_config_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/base_config_checks.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": {"wfo_router_json": subscription},
     }
@@ -354,7 +354,7 @@ def check_pe_ibgp(subscription: dict[str, Any]) -> LSOState:
     }
 
     return {
-        "playbook_name": "check_ibgp.yaml",
+        "playbook_name": "gap_ansible/playbooks/check_ibgp.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -370,7 +370,7 @@ def check_l3_services(subscription: dict[str, Any]) -> LSOState:
     }
 
     return {
-        "playbook_name": "check_l3_services.yaml",
+        "playbook_name": "gap_ansible/playbooks/check_l3_services.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -389,3 +389,35 @@ def prompt_sharepoint_checklist_url(checklist_url: str) -> FormGenerator:
     yield SharepointPrompt
 
     return {}
+
+
+@step("Start Moodi")
+def start_moodi(subscription: dict[str, Any]) -> LSOState:
+    """Start monitoring on demand using Moodi Telemetry stack."""
+    return {
+        "playbook_name": "moodi_telemetry/playbooks/start_moodi.yaml",
+        "inventory": {
+            "all": {
+                "hosts": {
+                    "moodi.test.gap.geant.org": None
+                }
+            }
+        },
+        "extra_vars": {"subscription": subscription},
+    }
+
+
+@step("Stop Moodi")
+def stop_moodi() -> LSOState:
+    """Stop monitoring on demand."""
+    return {
+        "playbook_name": "moodi_telemetry/playbooks/stop_moodi.yaml",
+        "inventory": {
+            "all": {
+                "hosts": {
+                    "moodi.test.gap.geant.org": None
+                }
+            }
+        },
+        "extra_vars": None,
+    }
diff --git a/gso/workflows/iptrunk/create_iptrunk.py b/gso/workflows/iptrunk/create_iptrunk.py
index ae3c6a74..e1040118 100644
--- a/gso/workflows/iptrunk/create_iptrunk.py
+++ b/gso/workflows/iptrunk/create_iptrunk.py
@@ -337,7 +337,7 @@ def provision_ip_trunk_iface_dry(subscription: IptrunkInactive, process_id: UUID
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -363,7 +363,7 @@ def provision_ip_trunk_iface_real(subscription: IptrunkInactive, process_id: UUI
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -382,7 +382,7 @@ def check_ip_trunk_connectivity(subscription: IptrunkInactive) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "ping"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {"all": {"hosts": {subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn: None}}},
         "extra_vars": extra_vars,
     }
@@ -401,7 +401,7 @@ def provision_ip_trunk_isis_iface_dry(subscription: IptrunkInactive, process_id:
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -427,7 +427,7 @@ def provision_ip_trunk_isis_iface_real(subscription: IptrunkInactive, process_id
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -446,7 +446,7 @@ def check_ip_trunk_isis(subscription: IptrunkInactive) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "isis"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {"all": {"hosts": {subscription.iptrunk.iptrunk_sides[0].iptrunk_side_node.router_fqdn: None}}},
         "extra_vars": extra_vars,
     }
diff --git a/gso/workflows/iptrunk/deploy_twamp.py b/gso/workflows/iptrunk/deploy_twamp.py
index b43de54c..dbbe55ee 100644
--- a/gso/workflows/iptrunk/deploy_twamp.py
+++ b/gso/workflows/iptrunk/deploy_twamp.py
@@ -44,7 +44,7 @@ def deploy_twamp_dry(subscription: Iptrunk, process_id: UUIDstr, tt_number: str)
     }
 
     return {
-        "playbook_name": "deploy_twamp.yaml",
+        "playbook_name": "gap_ansible/playbooks/deploy_twamp.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -69,7 +69,7 @@ def deploy_twamp_real(subscription: Iptrunk, process_id: UUIDstr, tt_number: str
     }
 
     return {
-        "playbook_name": "deploy_twamp.yaml",
+        "playbook_name": "gap_ansible/playbooks/deploy_twamp.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -91,7 +91,7 @@ def check_twamp_status(subscription: Iptrunk) -> LSOState:
     }
 
     return {
-        "playbook_name": "deploy_twamp.yaml",
+        "playbook_name": "gap_ansible/playbooks/deploy_twamp.yaml",
         "inventory": {
             "all": {
                 "hosts": {
diff --git a/gso/workflows/iptrunk/migrate_iptrunk.py b/gso/workflows/iptrunk/migrate_iptrunk.py
index 3c04fb8e..5a7cafb0 100644
--- a/gso/workflows/iptrunk/migrate_iptrunk.py
+++ b/gso/workflows/iptrunk/migrate_iptrunk.py
@@ -208,7 +208,7 @@ def check_ip_trunk_optical_levels_pre(subscription: Iptrunk) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "optical_pre"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -235,7 +235,7 @@ def check_ip_trunk_optical_levels_post(
     }
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -262,7 +262,7 @@ def check_ip_trunk_lldp(
     }
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -300,7 +300,7 @@ def disable_old_config_dry(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -339,7 +339,7 @@ def disable_old_config_real(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -378,7 +378,7 @@ def deploy_new_config_dry(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -417,7 +417,7 @@ def deploy_new_config_real(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -447,7 +447,7 @@ def update_remaining_side_bfd_dry(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -475,7 +475,7 @@ def update_remaining_side_bfd_real(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -497,7 +497,7 @@ def check_ip_trunk_bfd(subscription: Iptrunk, new_node: Router, replace_index: i
     }
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -529,7 +529,7 @@ def check_ip_trunk_connectivity(subscription: Iptrunk, replace_index: int) -> LS
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "ping"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -566,7 +566,7 @@ def deploy_new_isis(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -586,7 +586,7 @@ def check_ip_trunk_isis(subscription: Iptrunk, replace_index: int) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "isis"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -631,7 +631,7 @@ def restore_isis_metric(
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -669,7 +669,7 @@ def delete_old_config_dry(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -708,7 +708,7 @@ def delete_old_config_real(
     }
 
     return {
-        "playbook_name": "iptrunks_migration.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_migration.yaml",
         "inventory": {
             "all": {
                 "hosts": {
diff --git a/gso/workflows/iptrunk/modify_isis_metric.py b/gso/workflows/iptrunk/modify_isis_metric.py
index d95a6eb6..7d775107 100644
--- a/gso/workflows/iptrunk/modify_isis_metric.py
+++ b/gso/workflows/iptrunk/modify_isis_metric.py
@@ -49,7 +49,7 @@ def provision_ip_trunk_isis_iface_dry(subscription: Iptrunk, process_id: UUIDstr
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -75,7 +75,7 @@ def provision_ip_trunk_isis_iface_real(subscription: Iptrunk, process_id: UUIDst
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py
index 0dcc5d83..16de2462 100644
--- a/gso/workflows/iptrunk/modify_trunk_interface.py
+++ b/gso/workflows/iptrunk/modify_trunk_interface.py
@@ -191,7 +191,7 @@ def check_ip_trunk_connectivity(subscription: Iptrunk) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "ping"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -209,7 +209,7 @@ def check_ip_trunk_lldp(subscription: Iptrunk) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "lldp"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -321,7 +321,7 @@ def provision_ip_trunk_iface_dry(
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/gap_ansible/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -350,7 +350,7 @@ def provision_ip_trunk_iface_real(
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -464,7 +464,7 @@ def check_ip_trunk_optical_levels_post(subscription: Iptrunk) -> LSOState:
     extra_vars = {"wfo_ip_trunk_json": json.loads(json_dumps(subscription)), "check": "optical_post"}
 
     return {
-        "playbook_name": "iptrunks_checks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks_checks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
diff --git a/gso/workflows/iptrunk/terminate_iptrunk.py b/gso/workflows/iptrunk/terminate_iptrunk.py
index 549bc3c2..9b5cf71a 100644
--- a/gso/workflows/iptrunk/terminate_iptrunk.py
+++ b/gso/workflows/iptrunk/terminate_iptrunk.py
@@ -63,7 +63,7 @@ def deprovision_ip_trunk_dry(subscription: Iptrunk, process_id: UUIDstr, tt_numb
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -89,7 +89,7 @@ def deprovision_ip_trunk_real(subscription: Iptrunk, process_id: UUIDstr, tt_num
     }
 
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
diff --git a/gso/workflows/iptrunk/validate_iptrunk.py b/gso/workflows/iptrunk/validate_iptrunk.py
index 7832487f..4ca96f8b 100644
--- a/gso/workflows/iptrunk/validate_iptrunk.py
+++ b/gso/workflows/iptrunk/validate_iptrunk.py
@@ -23,7 +23,7 @@ def validate_router_config(subscription: Iptrunk) -> LSOState:
     extra_vars = {"wfo_trunk_json": json.loads(json_dumps(subscription)), "verb": "validate"}
 
     return {
-        "playbook_name": "base_config.yaml",
+        "playbook_name": "gap_ansible/playbooks/base_config.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -137,7 +137,7 @@ def verify_netbox_entries(subscription: Iptrunk) -> None:
 def verify_iptrunk_config(subscription: Iptrunk) -> LSOState:
     """Check for configuration drift on the relevant routers."""
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -160,7 +160,7 @@ def verify_iptrunk_config(subscription: Iptrunk) -> LSOState:
 def check_ip_trunk_isis(subscription: Iptrunk) -> LSOState:
     """Run an Ansible playbook to check for any :term:`ISIS` configuration drift."""
     return {
-        "playbook_name": "iptrunks.yaml",
+        "playbook_name": "gap_ansible/playbooks/iptrunks.yaml",
         "inventory": {
             "all": {
                 "hosts": {
@@ -183,7 +183,7 @@ def check_ip_trunk_isis(subscription: Iptrunk) -> LSOState:
 def verify_twamp_config(subscription: Iptrunk) -> LSOState:
     """Check for configuration drift of TWAMP."""
     return {
-        "playbook_name": "deploy_twamp.yaml",
+        "playbook_name": "gap_ansible/playbooks/deploy_twamp.yaml",
         "inventory": {
             "all": {
                 "hosts": {
diff --git a/gso/workflows/router/promote_p_to_pe.py b/gso/workflows/router/promote_p_to_pe.py
index 101e4c65..a82b4823 100644
--- a/gso/workflows/router/promote_p_to_pe.py
+++ b/gso/workflows/router/promote_p_to_pe.py
@@ -72,7 +72,7 @@ def set_isis_overload(subscription: dict[str, Any], tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -91,7 +91,7 @@ def deploy_pe_base_config_dry(subscription: dict[str, Any], tt_number: str, proc
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -110,7 +110,7 @@ def deploy_pe_base_config_real(subscription: dict[str, Any], tt_number: str, pro
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -176,7 +176,7 @@ def remove_p_from_pe_dry(subscription: dict[str, Any], tt_number: str, process_i
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.PE),
         "extra_vars": extra_vars,
     }
@@ -194,7 +194,7 @@ def remove_p_from_pe_real(subscription: dict[str, Any], tt_number: str, process_
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.PE),
         "extra_vars": extra_vars,
     }
@@ -211,7 +211,7 @@ def deploy_routing_instances_dry(subscription: dict[str, Any], tt_number: str, p
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -228,7 +228,7 @@ def deploy_routing_instances_real(subscription: dict[str, Any], tt_number: str,
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -245,7 +245,7 @@ def remove_isis_overload(subscription: dict[str, Any], tt_number: str, process_i
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -271,7 +271,7 @@ def delete_default_routes_dry(subscription: dict[str, Any], tt_number: str, proc
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -289,7 +289,7 @@ def delete_default_routes_real(subscription: dict[str, Any], tt_number: str, pro
     }
 
     return {
-        "playbook_name": "promote_p_to_pe.yaml",
+        "playbook_name": "gap_ansible/playbooks/promote_p_to_pe.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
diff --git a/gso/workflows/router/terminate_router.py b/gso/workflows/router/terminate_router.py
index 56f927d8..9bc48f8c 100644
--- a/gso/workflows/router/terminate_router.py
+++ b/gso/workflows/router/terminate_router.py
@@ -80,7 +80,7 @@ def remove_config_from_router_dry(subscription: Router, process_id: UUIDstr, tt_
     }
 
     return {
-        "playbook_name": "base_config.yaml",
+        "playbook_name": "gap_ansible/playbooks/base_config.yaml",
         "inventory": {"all": {"hosts": {subscription.router.router_fqdn: None}}},
         "extra_vars": extra_vars,
     }
@@ -98,7 +98,7 @@ def remove_config_from_router_real(subscription: Router, process_id: UUIDstr, tt
     }
 
     return {
-        "playbook_name": "base_config.yaml",
+        "playbook_name": "gap_ansible/playbooks/base_config.yaml",
         "inventory": {"all": {"hosts": {subscription.router.router_fqdn: None}}},
         "extra_vars": extra_vars,
     }
@@ -123,7 +123,7 @@ def remove_p_from_all_pe_dry(subscription: Router, tt_number: str, process_id: U
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.PE),
         "extra_vars": extra_vars,
     }
@@ -141,7 +141,7 @@ def remove_p_from_all_pe_real(subscription: Router, tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.PE),
         "extra_vars": extra_vars,
     }
@@ -159,7 +159,7 @@ def remove_pe_from_all_pe_dry(subscription: Router, tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(
             RouterRole.PE, exclude_routers=[subscription.router.router_fqdn]
         ),
@@ -179,7 +179,7 @@ def remove_pe_from_all_pe_real(subscription: Router, tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(
             RouterRole.PE, exclude_routers=[subscription.router.router_fqdn]
         ),
@@ -199,7 +199,7 @@ def remove_pe_from_all_p_dry(subscription: Router, tt_number: str, process_id: U
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.P),
         "extra_vars": extra_vars,
     }
@@ -217,7 +217,7 @@ def remove_pe_from_all_p_real(subscription: Router, tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.P),
         "extra_vars": extra_vars,
     }
diff --git a/gso/workflows/router/update_ibgp_mesh.py b/gso/workflows/router/update_ibgp_mesh.py
index e79c0274..298c0878 100644
--- a/gso/workflows/router/update_ibgp_mesh.py
+++ b/gso/workflows/router/update_ibgp_mesh.py
@@ -78,7 +78,7 @@ def add_p_to_mesh_dry(subscription: dict[str, Any], tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.PE),
         "extra_vars": extra_vars,
     }
@@ -95,7 +95,7 @@ def add_p_to_mesh_real(subscription: dict[str, Any], tt_number: str, process_id:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": generate_inventory_for_active_routers(RouterRole.PE),
         "extra_vars": extra_vars,
     }
@@ -112,7 +112,7 @@ def add_all_pe_to_p_dry(subscription: dict[str, Any]) -> LSOState:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -130,7 +130,7 @@ def add_all_pe_to_p_real(subscription: dict[str, Any], tt_number: str, process_i
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -140,7 +140,7 @@ def add_all_pe_to_p_real(subscription: dict[str, Any], tt_number: str, process_i
 def check_ibgp_session(subscription: Router) -> LSOState:
     """Run a playbook using the provisioning proxy, to check the health of the new iBGP session."""
     return {
-        "playbook_name": "check_ibgp.yaml",
+        "playbook_name": "gap_ansible/playbooks/check_ibgp.yaml",
         "inventory": {"all": {"hosts": {subscription.router.router_fqdn: None}}},
         "extra_vars": {},
     }
diff --git a/gso/workflows/router/validate_router.py b/gso/workflows/router/validate_router.py
index ab6e3059..2403c52f 100644
--- a/gso/workflows/router/validate_router.py
+++ b/gso/workflows/router/validate_router.py
@@ -64,7 +64,7 @@ def verify_p_ibgp(subscription: dict[str, Any]) -> LSOState:
     }
 
     return {
-        "playbook_name": "update_ibgp_mesh.yaml",
+        "playbook_name": "gap_ansible/playbooks/update_ibgp_mesh.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": extra_vars,
     }
@@ -100,7 +100,7 @@ def check_kentik_entry_exists(subscription: Router) -> None:
 def verify_base_config(subscription: dict[str, Any]) -> LSOState:
     """Workflow step for running a playbook that checks whether base config has drifted."""
     return {
-        "playbook_name": "base_config.yaml",
+        "playbook_name": "gap_ansible/playbooks/base_config.yaml",
         "inventory": {"all": {"hosts": {subscription["router"]["router_fqdn"]: None}}},
         "extra_vars": {
             "wfo_router_json": subscription,
-- 
GitLab