Пример #1
0
 def clear_dag_runs(dag_id, start_date, end_date):
     """
     Clears all the DagRuns and corrects the DagStats for an interval passed in the clear command because the
     clear command only clears the TaskInstances.
     :param dag_id: Dag id name. String.
     :param start_date: Start date. String of form %Y-%m-%d %H:%M:%S.
     :param end_date: End date. String of form %Y-%m-%d %H:%M:%S.
     :return: None.
     """
     start_date = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
     end_date = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
     session = Session()
     try:
         dagrun_query = session.query(DagRun) \
             .filter(DagRun.dag_id == dag_id) \
             .filter(DagRun.execution_date >= start_date) \
             .filter(DagRun.execution_date < end_date)
         dagrun_query_result = dagrun_query.all()
         # remove dagruns with this state for clear command
         for result in dagrun_query_result:
             session.delete(result)
         # fix DagStats
         for state in State.dag_states:
             removed_state_counts = dagrun_query.filter(
                 DagRun.state == state).count()
             dagstat_query = session.query(DagStat) \
                 .filter(DagStat.dag_id == dag_id) \
                 .filter(DagStat.state == state)
             dagstat_query_result = dagstat_query.first(
             )  # only one row every time
             dagstat_query_result.count = max(
                 dagstat_query_result.count - removed_state_counts, 0)
         session.commit()
     except:
         session.rollback()
     finally:
         session.close()