def get_execution_dates(dag: DAG, execution_date: datetime, future: bool, past: bool, *, session: SASession = NEW_SESSION) -> List[datetime]: """Returns dates of DAG execution""" latest_execution_date = dag.get_latest_execution_date(session=session) if latest_execution_date is None: raise ValueError(f"Received non-localized date {execution_date}") execution_date = timezone.coerce_datetime(execution_date) # determine date range of dag runs and tasks to consider end_date = latest_execution_date if future else execution_date if dag.start_date: start_date = dag.start_date else: start_date = execution_date start_date = execution_date if not past else start_date if not dag.timetable.can_run: # If the DAG never schedules, need to look at existing DagRun if the user wants future or # past runs. dag_runs = dag.get_dagruns_between(start_date=start_date, end_date=end_date) dates = sorted({d.execution_date for d in dag_runs}) elif not dag.timetable.periodic: dates = [start_date] else: dates = [ info.logical_date for info in dag.iter_dagrun_infos_between( start_date, end_date, align=False) ] return dates
def get_run_ids(dag: DAG, run_id: str, future: bool, past: bool, session: SASession = NEW_SESSION): """Returns run_ids of DAG execution""" last_dagrun = dag.get_last_dagrun(include_externally_triggered=True) current_dagrun = dag.get_dagrun(run_id=run_id) first_dagrun = ( session.query(DagRun) .filter(DagRun.dag_id == dag.dag_id) .order_by(DagRun.execution_date.asc()) .first() ) if last_dagrun is None: raise ValueError(f'DagRun for {dag.dag_id} not found') # determine run_id range of dag runs and tasks to consider end_date = last_dagrun.logical_date if future else current_dagrun.logical_date start_date = current_dagrun.logical_date if not past else first_dagrun.logical_date if not dag.timetable.can_run: # If the DAG never schedules, need to look at existing DagRun if the user wants future or # past runs. dag_runs = dag.get_dagruns_between(start_date=start_date, end_date=end_date) run_ids = sorted({d.run_id for d in dag_runs}) elif not dag.timetable.periodic: run_ids = [run_id] else: dates = [ info.logical_date for info in dag.iter_dagrun_infos_between(start_date, end_date, align=False) ] run_ids = [dr.run_id for dr in DagRun.find(dag_id=dag.dag_id, execution_date=dates)] return run_ids