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 0000000000000000000000000000000000000000..6bbdc287d0b1ff1436323e3b9b3ef79915fa4878 --- /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 8b1f4065d11869daa09e3ab124caf4b7484a89e0..bc4fe9bcdcf9bf582559c28b279b4754818abd87 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 0000000000000000000000000000000000000000..96f82988a2317d4d06aa2db89cd45815f15ae2e7 --- /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 0000000000000000000000000000000000000000..dc21510bddb70831bb87acfddddd47b3eb4ee074 --- /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 + )