From ab9ed2c161294bf1967e3de71939d9ba5cdaeefa Mon Sep 17 00:00:00 2001
From: Mohammad Torkashvand <mohammad.torkashvand@geant.org>
Date: Tue, 29 Apr 2025 17:48:07 +0200
Subject: [PATCH 1/2] add start and terminate workflow tasks for routers

---
 ...b_add_moodi_run_and_terminate_workflow_.py | 45 +++++++++++++++++++
 gso/workflows/__init__.py                     |  2 +
 gso/workflows/router/run_moodi.py             | 34 ++++++++++++++
 gso/workflows/router/terminate_moodi.py       | 34 ++++++++++++++
 4 files changed, 115 insertions(+)
 create mode 100644 gso/migrations/versions/2025-04-29_e86c16d809ab_add_moodi_run_and_terminate_workflow_.py
 create mode 100644 gso/workflows/router/run_moodi.py
 create mode 100644 gso/workflows/router/terminate_moodi.py

diff --git a/gso/migrations/versions/2025-04-29_e86c16d809ab_add_moodi_run_and_terminate_workflow_.py b/gso/migrations/versions/2025-04-29_e86c16d809ab_add_moodi_run_and_terminate_workflow_.py
new file mode 100644
index 000000000..6bbdc287d
--- /dev/null
+++ b/gso/migrations/versions/2025-04-29_e86c16d809ab_add_moodi_run_and_terminate_workflow_.py
@@ -0,0 +1,45 @@
+"""add moodi run and terminate workflow tasks for routers.
+
+Revision ID: e86c16d809ab
+Revises: a3177c5f9641
+Create Date: 2025-04-29 17:14:51.627317
+
+"""
+import sqlalchemy as sa
+from alembic import op
+
+# revision identifiers, used by Alembic.
+revision = 'e86c16d809ab'
+down_revision = 'a3177c5f9641'
+branch_labels = None
+depends_on = None
+
+
+from orchestrator.migrations.helpers import create_workflow, delete_workflow
+
+new_workflows = [
+    {
+        "name": "run_moodi",
+        "target": "SYSTEM",
+        "description": "Run Moodi Service",
+        "product_type": "Router"
+    },
+    {
+        "name": "terminate_moodi",
+        "target": "SYSTEM",
+        "description": "Terminate Moodi Service",
+        "product_type": "Router"
+    }
+]
+
+
+def upgrade() -> None:
+    conn = op.get_bind()
+    for workflow in new_workflows:
+        create_workflow(conn, workflow)
+
+
+def downgrade() -> None:
+    conn = op.get_bind()
+    for workflow in new_workflows:
+        delete_workflow(conn, workflow["name"])
diff --git a/gso/workflows/__init__.py b/gso/workflows/__init__.py
index 8b1f4065d..bc4fe9bcd 100644
--- a/gso/workflows/__init__.py
+++ b/gso/workflows/__init__.py
@@ -54,6 +54,8 @@ LazyWorkflowInstance("gso.workflows.router.create_imported_router", "create_impo
 LazyWorkflowInstance("gso.workflows.router.validate_router", "validate_router")
 LazyWorkflowInstance("gso.workflows.router.promote_p_to_pe", "promote_p_to_pe")
 LazyWorkflowInstance("gso.workflows.router.modify_kentik_license", "modify_router_kentik_license")
+LazyWorkflowInstance("gso.workflows.router.run_moodi", "run_moodi")
+LazyWorkflowInstance("gso.workflows.router.terminate_moodi", "terminate_moodi")
 
 #  Switch workflows
 LazyWorkflowInstance("gso.workflows.switch.create_switch", "create_switch")
diff --git a/gso/workflows/router/run_moodi.py b/gso/workflows/router/run_moodi.py
new file mode 100644
index 000000000..96f82988a
--- /dev/null
+++ b/gso/workflows/router/run_moodi.py
@@ -0,0 +1,34 @@
+"""Run Moodi monitoring service."""
+
+from orchestrator.targets import Target
+from orchestrator.workflow import StepList, begin, conditional, done, step, workflow
+from orchestrator.workflows.steps import store_process_subscription
+from orchestrator.workflows.utils import wrap_modify_initial_input_form
+from pydantic_forms.types import State, UUIDstr
+
+from gso.products.product_types.router import Router
+from gso.utils.shared_enums import Vendor
+from gso.utils.workflow_steps import start_moodi
+
+
+@step("Prepare required keys in state")
+def prepare_state(subscription_id: UUIDstr) -> State:
+    """Add required keys to the state for the workflow to run successfully."""
+    router = Router.from_subscription(subscription_id)
+
+    return {"subscription": router}
+
+
+@workflow("Run Moodi Service", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None))
+def run_moodi() -> StepList:
+    """Run Moodi monitoring service."""
+    is_juniper_router = conditional(lambda state: state["subscription"]["router"]["vendor"] == Vendor.JUNIPER)
+
+    return (
+        begin
+        >> store_process_subscription(Target.SYSTEM)
+        >> prepare_state
+        >> is_juniper_router(done)
+        >> start_moodi()
+        >> done
+    )
diff --git a/gso/workflows/router/terminate_moodi.py b/gso/workflows/router/terminate_moodi.py
new file mode 100644
index 000000000..dc21510bd
--- /dev/null
+++ b/gso/workflows/router/terminate_moodi.py
@@ -0,0 +1,34 @@
+"""Terminate Moodi monitoring service."""
+
+from orchestrator.targets import Target
+from orchestrator.workflow import StepList, begin, conditional, done, step, workflow
+from orchestrator.workflows.steps import store_process_subscription
+from orchestrator.workflows.utils import wrap_modify_initial_input_form
+from pydantic_forms.types import State, UUIDstr
+
+from gso.products.product_types.router import Router
+from gso.utils.shared_enums import Vendor
+from gso.utils.workflow_steps import stop_moodi
+
+
+@step("Prepare required keys in state")
+def prepare_state(subscription_id: UUIDstr) -> State:
+    """Add required keys to the state for the workflow to run successfully."""
+    router = Router.from_subscription(subscription_id)
+
+    return {"subscription": router}
+
+
+@workflow("Terminate Moodi Service", target=Target.SYSTEM, initial_input_form=wrap_modify_initial_input_form(None))
+def terminate_moodi() -> StepList:
+    """Terminate Moodi monitoring service."""
+    is_juniper_router = conditional(lambda state: state["subscription"]["router"]["vendor"] == Vendor.JUNIPER)
+
+    return (
+        begin
+        >> store_process_subscription(Target.SYSTEM)
+        >> prepare_state
+        >> is_juniper_router(done)
+        >> stop_moodi()
+        >> done
+    )
-- 
GitLab


From 2ce178063619978ec640fb7d500368d50dd47174 Mon Sep 17 00:00:00 2001
From: Mohammad Torkashvand <mohammad.torkashvand@geant.org>
Date: Tue, 29 Apr 2025 17:55:47 +0200
Subject: [PATCH 2/2] add translation for start/terminate moodi wfs

---
 gso/translations/en-GB.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gso/translations/en-GB.json b/gso/translations/en-GB.json
index b1d6a36a4..6944d9de2 100644
--- a/gso/translations/en-GB.json
+++ b/gso/translations/en-GB.json
@@ -145,6 +145,8 @@
         "promote_p_to_pe": "Promote P to PE",
         "redeploy_base_config": "Redeploy base config",
         "redeploy_vrf": "Redeploy VRF router list",
+        "start_moodi": "Start Moodi",
+        "terminate_moodi": "Terminate Moodi",
         "task_check_site_connectivity": "Check NETCONF connectivity of a Site",
         "task_clean_old_tasks": "Remove old cleanup tasks",
         "task_create_partners": "Create partner task",
-- 
GitLab