@@ -69,44 +69,50 @@ def serialize(self) -> tuple[str, dict[str, Any]]:
6969 },
7070 )
7171
72+ def _build_trigger_event (self , pipeline_status : str ) -> TriggerEvent | None :
73+ """Build TriggerEvent based on pipeline status. Returns None if status is not terminal."""
74+ if pipeline_status == AzureDataFactoryPipelineRunStatus .FAILED :
75+ return TriggerEvent ({"status" : "error" , "message" : f"Pipeline run { self .run_id } has Failed." })
76+ if pipeline_status == AzureDataFactoryPipelineRunStatus .CANCELLED :
77+ return TriggerEvent (
78+ {"status" : "error" , "message" : f"Pipeline run { self .run_id } has been Cancelled." }
79+ )
80+ if pipeline_status == AzureDataFactoryPipelineRunStatus .SUCCEEDED :
81+ return TriggerEvent (
82+ {"status" : "success" , "message" : f"Pipeline run { self .run_id } has been Succeeded." }
83+ )
84+ return None
85+
7286 async def run (self ) -> AsyncIterator [TriggerEvent ]:
7387 """Make async connection to Azure Data Factory, polls for the pipeline run status."""
74- hook = AzureDataFactoryAsyncHook (azure_data_factory_conn_id = self .azure_data_factory_conn_id )
7588 executed_after_token_refresh = False
7689 try :
77- while True :
78- try :
79- pipeline_status = await hook .get_adf_pipeline_run_status (
80- run_id = self .run_id ,
81- resource_group_name = self .resource_group_name ,
82- factory_name = self .factory_name ,
83- )
84- executed_after_token_refresh = False
85- if pipeline_status == AzureDataFactoryPipelineRunStatus .FAILED :
86- yield TriggerEvent (
87- {"status" : "error" , "message" : f"Pipeline run { self .run_id } has Failed." }
90+ async with AzureDataFactoryAsyncHook (
91+ azure_data_factory_conn_id = self .azure_data_factory_conn_id
92+ ) as hook :
93+ while True :
94+ try :
95+ pipeline_status = await hook .get_adf_pipeline_run_status (
96+ run_id = self .run_id ,
97+ resource_group_name = self .resource_group_name ,
98+ factory_name = self .factory_name ,
8899 )
89- return
90- elif pipeline_status == AzureDataFactoryPipelineRunStatus .CANCELLED :
91- msg = f"Pipeline run { self .run_id } has been Cancelled."
92- yield TriggerEvent ({"status" : "error" , "message" : msg })
93- return
94- elif pipeline_status == AzureDataFactoryPipelineRunStatus .SUCCEEDED :
95- msg = f"Pipeline run { self .run_id } has been Succeeded."
96- yield TriggerEvent ({"status" : "success" , "message" : msg })
97- return
98- await asyncio .sleep (self .poke_interval )
99- except ServiceRequestError :
100- # conn might expire during long running pipeline.
101- # If exception is caught, it tries to refresh connection once.
102- # If it still doesn't fix the issue,
103- # than the execute_after_token_refresh would still be False
104- # and an exception will be raised
105- if executed_after_token_refresh :
100+ executed_after_token_refresh = False
101+ event = self ._build_trigger_event (pipeline_status )
102+ if event :
103+ yield event
104+ return
105+ await asyncio .sleep (self .poke_interval )
106+ except ServiceRequestError :
107+ # conn might expire during long running pipeline.
108+ # If exception is caught, it tries to refresh connection once.
109+ # If it still doesn't fix the issue,
110+ # than the execute_after_token_refresh would still be False
111+ # and an exception will be raised
112+ if not executed_after_token_refresh :
113+ raise
106114 await hook .refresh_conn ()
107115 executed_after_token_refresh = False
108- else :
109- raise
110116 except Exception as e :
111117 yield TriggerEvent ({"status" : "error" , "message" : str (e )})
112118
@@ -160,84 +166,93 @@ def serialize(self) -> tuple[str, dict[str, Any]]:
160166 },
161167 )
162168
169+ def _build_trigger_event (self , pipeline_status : str ) -> TriggerEvent | None :
170+ """Build TriggerEvent based on pipeline status. Returns None if status is not terminal."""
171+ if pipeline_status in AzureDataFactoryPipelineRunStatus .FAILURE_STATES :
172+ return TriggerEvent (
173+ {
174+ "status" : "error" ,
175+ "message" : f"The pipeline run { self .run_id } has { pipeline_status } ." ,
176+ "run_id" : self .run_id ,
177+ }
178+ )
179+ if pipeline_status == AzureDataFactoryPipelineRunStatus .SUCCEEDED :
180+ return TriggerEvent (
181+ {
182+ "status" : "success" ,
183+ "message" : f"The pipeline run { self .run_id } has { pipeline_status } ." ,
184+ "run_id" : self .run_id ,
185+ }
186+ )
187+ return None
188+
163189 async def run (self ) -> AsyncIterator [TriggerEvent ]:
164190 """Make async connection to Azure Data Factory, polls for the pipeline run status."""
165- hook = AzureDataFactoryAsyncHook (azure_data_factory_conn_id = self .azure_data_factory_conn_id )
166- try :
167- pipeline_status = await hook .get_adf_pipeline_run_status (
168- run_id = self .run_id ,
169- resource_group_name = self .resource_group_name ,
170- factory_name = self .factory_name ,
171- )
172- executed_after_token_refresh = True
173- if self .wait_for_termination :
174- while self .end_time > time .time ():
175- try :
176- pipeline_status = await hook .get_adf_pipeline_run_status (
177- run_id = self .run_id ,
178- resource_group_name = self .resource_group_name ,
179- factory_name = self .factory_name ,
180- )
181- executed_after_token_refresh = True
182- if pipeline_status in AzureDataFactoryPipelineRunStatus .FAILURE_STATES :
183- yield TriggerEvent (
184- {
185- "status" : "error" ,
186- "message" : f"The pipeline run { self .run_id } has { pipeline_status } ." ,
187- "run_id" : self .run_id ,
188- }
191+ async with AzureDataFactoryAsyncHook (
192+ azure_data_factory_conn_id = self .azure_data_factory_conn_id
193+ ) as hook :
194+ try :
195+ pipeline_status = await hook .get_adf_pipeline_run_status (
196+ run_id = self .run_id ,
197+ resource_group_name = self .resource_group_name ,
198+ factory_name = self .factory_name ,
199+ )
200+ executed_after_token_refresh = True
201+ if self .wait_for_termination :
202+ while self .end_time > time .time ():
203+ try :
204+ pipeline_status = await hook .get_adf_pipeline_run_status (
205+ run_id = self .run_id ,
206+ resource_group_name = self .resource_group_name ,
207+ factory_name = self .factory_name ,
189208 )
190- return
191- elif pipeline_status == AzureDataFactoryPipelineRunStatus .SUCCEEDED :
192- yield TriggerEvent (
193- {
194- "status" : "success" ,
195- "message" : f"The pipeline run { self .run_id } has { pipeline_status } ." ,
196- "run_id" : self .run_id ,
197- }
209+ executed_after_token_refresh = True
210+ event = self ._build_trigger_event (pipeline_status )
211+ if event :
212+ yield event
213+ return
214+ self .log .info (
215+ "Sleeping for %s. The pipeline state is %s." ,
216+ self .check_interval ,
217+ pipeline_status ,
198218 )
199- return
200- self .log .info (
201- "Sleeping for %s. The pipeline state is %s." , self .check_interval , pipeline_status
202- )
203- await asyncio .sleep (self .check_interval )
204- except ServiceRequestError :
205- # conn might expire during long running pipeline.
206- # If exception is caught, it tries to refresh connection once.
207- # If it still doesn't fix the issue,
208- # than the execute_after_token_refresh would still be False
209- # and an exception will be raised
210- if executed_after_token_refresh :
219+ await asyncio .sleep (self .check_interval )
220+ except ServiceRequestError :
221+ # conn might expire during long running pipeline.
222+ # If exception is caught, it tries to refresh connection once.
223+ # If it still doesn't fix the issue,
224+ # than the execute_after_token_refresh would still be False
225+ # and an exception will be raised
226+ if not executed_after_token_refresh :
227+ raise
211228 await hook .refresh_conn ()
212229 executed_after_token_refresh = False
213- else :
214- raise
215230
216- yield TriggerEvent (
217- {
218- "status" : "error" ,
219- "message" : f"Timeout: The pipeline run { self .run_id } has { pipeline_status } ." ,
220- "run_id" : self .run_id ,
221- }
222- )
223- else :
224- yield TriggerEvent (
225- {
226- "status" : "success" ,
227- "message" : f"The pipeline run { self .run_id } has { pipeline_status } status." ,
228- "run_id" : self .run_id ,
229- }
230- )
231- except Exception as e :
232- self .log .exception (e )
233- if self .run_id :
234- try :
235- self .log .info ("Cancelling pipeline run %s" , self .run_id )
236- await hook .cancel_pipeline_run (
237- run_id = self .run_id ,
238- resource_group_name = self .resource_group_name ,
239- factory_name = self .factory_name ,
231+ yield TriggerEvent (
232+ {
233+ "status" : "error" ,
234+ "message" : f"Timeout: The pipeline run { self .run_id } has { pipeline_status } ." ,
235+ "run_id" : self .run_id ,
236+ }
240237 )
241- except Exception :
242- self .log .exception ("Failed to cancel pipeline run %s" , self .run_id )
243- yield TriggerEvent ({"status" : "error" , "message" : str (e ), "run_id" : self .run_id })
238+ else :
239+ yield TriggerEvent (
240+ {
241+ "status" : "success" ,
242+ "message" : f"The pipeline run { self .run_id } has { pipeline_status } status." ,
243+ "run_id" : self .run_id ,
244+ }
245+ )
246+ except Exception as e :
247+ self .log .exception (e )
248+ if self .run_id :
249+ try :
250+ self .log .info ("Cancelling pipeline run %s" , self .run_id )
251+ await hook .cancel_pipeline_run (
252+ run_id = self .run_id ,
253+ resource_group_name = self .resource_group_name ,
254+ factory_name = self .factory_name ,
255+ )
256+ except Exception :
257+ self .log .exception ("Failed to cancel pipeline run %s" , self .run_id )
258+ yield TriggerEvent ({"status" : "error" , "message" : str (e ), "run_id" : self .run_id })
0 commit comments