eladkal opened a new pull request, #53959:
URL: https://github.com/apache/airflow/pull/53959

   This trigger rule is useful for cases where we must verify all upstream is 
done with execution but we only need one of them to be successful.
   
   Verified also with example dag:
   
   ```
   from datetime import datetime
   from airflow import DAG
   from airflow.operators.bash import BashOperator
   from airflow.operators.python import PythonOperator
   from airflow.providers.standard.operators.empty import EmptyOperator
   from airflow.utils.trigger_rule import TriggerRule
   from airflow.exceptions import AirflowSkipException
   from airflow.sdk.definitions.edges import EdgeModifier
   
   default_args = {
       'owner': 'airflow',
       'start_date': datetime(2023, 2, 1)
   }
   
   def always_skip_function():
       raise AirflowSkipException("This task is intentionally skipped.")
   
   with DAG('1min_file', schedule=None, catchup=True, 
default_args=default_args):
   
       # Test case 1: One success, one failure -> Expected state: None
       a_success = EmptyOperator(task_id="a_success")
       a_fails = BashOperator(
           task_id='a_fails',
           bash_command='exit 1',  # A non-zero exit code indicates failure
       )
       rule_1 = EmptyOperator(task_id="rule_1", 
trigger_rule=TriggerRule.ALL_DONE_MIN_ONE_SUCCESS)
   
       a_success >> EdgeModifier("expect rule_1 to be successful") >> rule_1
       a_fails >> EdgeModifier("expect rule_1 to be successful") >> rule_1
   
       # Test case 2: Two successes -> Expected state: None
       b_success = EmptyOperator(task_id="b_success")
       b_success2 = EmptyOperator(task_id="b_success2")
       rule_2 = EmptyOperator(task_id="rule_2", 
trigger_rule=TriggerRule.ALL_DONE_MIN_ONE_SUCCESS)
   
       b_success >> EdgeModifier("expect rule_2 to be successful") >>  rule_2
       b_success2 >> EdgeModifier("expect rule_2 to be successful") >> rule_2
   
       # Test case 3: One success, one skip -> Expected state: SKIPPED
       c_success = EmptyOperator(task_id="c_success")
       c_skip = PythonOperator(
           task_id='c_skip',
           python_callable=always_skip_function,
       )
       rule_3 = EmptyOperator(task_id="rule_3", 
trigger_rule=TriggerRule.ALL_DONE_MIN_ONE_SUCCESS)
   
       c_success  >> EdgeModifier("expect rule_3 to be skipped") >> rule_3
       c_skip >> EdgeModifier("expect rule_3 to be skipped") >>  rule_3
   
       # Test case 4: All failures -> Expected state: UPSTREAM_FAILED
       d_fails1 = BashOperator(
           task_id='d_fails1',
           bash_command='exit 1',
       )
       d_fails2 = BashOperator(
           task_id='d_fails2',
           bash_command='exit 1',
       )
       rule_4 = EmptyOperator(task_id="rule_4", 
trigger_rule=TriggerRule.ALL_DONE_MIN_ONE_SUCCESS)
   
       d_fails1 >> EdgeModifier("expect rule_4 to be upstream failed") >> rule_4
       d_fails2 >> EdgeModifier("expect rule_4 to be upstream failed") >> rule_4
   
   
       # Test case 5: upstream failure cascade -> Expected state: 
UPSTREAM_FAILED
       e_fails3 = BashOperator(
           task_id='d_fails3',
           bash_command='exit 1',
       )
       e_upstream_failed = EmptyOperator(task_id="e_upstream")
   
       rule_5 = EmptyOperator(task_id="rule_5", 
trigger_rule=TriggerRule.ALL_DONE_MIN_ONE_SUCCESS)
   
       e_fails3 >> e_upstream_failed >> EdgeModifier("expect rule_5 to be 
upstream failed") >> rule_5
   ```
   
   
   
   <img width="1142" height="837" alt="Screenshot 2025-07-31 at 11 14 51" 
src="https://github.com/user-attachments/assets/33c2c547-71b2-4128-858d-1dd6b1621999";
 />
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to