11from __future__ import annotations
22
3- from typing import TYPE_CHECKING , Any , Awaitable , Callable
3+ from typing import TYPE_CHECKING , Any , overload
44
55from prefect .client .schemas import StateType
66from prefect .deployments import run_deployment
77
88from infrahub .workflows .initialization import setup_task_manager
9+ from infrahub .workflows .models import WorkflowInfo
910
1011from . import InfrahubWorkflow , Return
1112
@@ -23,23 +24,41 @@ async def initialize(self, service: InfrahubServices) -> None:
2324 if await service .component .is_primary_api ():
2425 await setup_task_manager ()
2526
26- async def execute (
27+ @overload
28+ async def execute_workflow (
2729 self ,
28- workflow : WorkflowDefinition | None = None ,
29- function : Callable [..., Awaitable [Return ]] | None = None ,
30- ** kwargs : Any ,
31- ) -> Return :
32- if workflow :
33- response : FlowRun = await run_deployment (name = workflow .full_name , parameters = kwargs or {}) # type: ignore[return-value, misc]
34- if not response .state :
35- raise RuntimeError ("Unable to read state from the response" )
30+ workflow : WorkflowDefinition ,
31+ expected_return : type [Return ],
32+ parameters : dict [str , Any ] | None = ...,
33+ ) -> Return : ...
3634
37- if response .state .type == StateType .CRASHED :
38- raise RuntimeError (response .state .message )
35+ @overload
36+ async def execute_workflow (
37+ self ,
38+ workflow : WorkflowDefinition ,
39+ expected_return : None = ...,
40+ parameters : dict [str , Any ] | None = ...,
41+ ) -> Any : ...
42+
43+ async def execute_workflow (
44+ self ,
45+ workflow : WorkflowDefinition ,
46+ expected_return : type [Return ] | None = None ,
47+ parameters : dict [str , Any ] | None = None ,
48+ ) -> Any :
49+ response : FlowRun = await run_deployment (name = workflow .full_name , poll_interval = 1 , parameters = parameters or {}) # type: ignore[return-value, misc]
50+ if not response .state :
51+ raise RuntimeError ("Unable to read state from the response" )
3952
40- return await response .state .result (raise_on_failure = True , fetch = True ) # type: ignore[call-overload]
53+ if response .state .type == StateType .CRASHED :
54+ raise RuntimeError (response .state .message )
4155
42- if function :
43- return await function (** kwargs )
56+ return await response .state .result (raise_on_failure = True , fetch = True ) # type: ignore[call-overload]
4457
45- raise ValueError ("either a workflow definition or a flow must be provided" )
58+ async def submit_workflow (
59+ self ,
60+ workflow : WorkflowDefinition ,
61+ parameters : dict [str , Any ] | None = None ,
62+ ) -> WorkflowInfo :
63+ flow_run = await run_deployment (name = workflow .full_name , timeout = 0 , parameters = parameters or {}) # type: ignore[return-value, misc]
64+ return WorkflowInfo .from_flow (flow_run = flow_run )
0 commit comments