예제 #1
0
 def test_gauge_executor_metrics(self, mock_stats_gauge, mock_trigger_tasks, mock_sync):
     executor = LocalExecutor()
     executor.heartbeat()
     calls = [mock.call('executor.open_slots', mock.ANY),
              mock.call('executor.queued_tasks', mock.ANY),
              mock.call('executor.running_tasks', mock.ANY)]
     mock_stats_gauge.assert_has_calls(calls)
    def test_scheduler_task(self):
        TEST_DAG_FOLDER = os.environ['AIRFLOW__CORE__DAGS_FOLDER']
        DEFAULT_DATE = timezone.datetime(2020, 1, 1)
        dag_id = 'test_event_based_dag'
        task_id = 'sleep_1000_secs'

        with create_session() as session:
            dag_bag = DagBag(
                dag_folder=TEST_DAG_FOLDER,
                include_examples=False,
            )

            dag = dag_bag.get_dag(dag_id)
            task = dag.get_task(task_id)
            dag.create_dagrun(
                run_id="sleep_1000_secs_run",
                state=State.RUNNING,
                execution_date=DEFAULT_DATE,
                start_date=DEFAULT_DATE,
                session=session,
            )
            ti = TaskInstance(task=task, execution_date=DEFAULT_DATE)
            ti.state = State.SCHEDULED
            dag_model = DagModel(
                dag_id=dag_id,
                is_paused=False,
                concurrency=5,
                has_task_concurrency_limits=False,
            )
            session.merge(dag_model)
            session.merge(ti)
            session.commit()
        executor = LocalExecutor(2)
        executor.start()
        executor.heartbeat()
        executor.schedule_task(ti.key, SchedulingAction.START)
        executor.heartbeat()
        time.sleep(30)

        #  wait for task instance started
        ti.refresh_from_db()
        self.assertEqual(ti.state, State.RUNNING)
        process = psutil.Process(ti.pid)
        self.assertIsNotNone(process)
        child = process.children(recursive=False)
        self.assertEqual(1, len(child))
        grandchild = child[0].children(recursive=False)
        self.assertEqual(1, len(grandchild))
        tes = self._check_task_execution(ti)
        self.assertEqual(1, len(tes))

        #  restart the task instance
        executor.schedule_task(ti.key, SchedulingAction.RESTART)
        executor.heartbeat()
        time.sleep(30)

        self.assertFalse(self._check_process_exist(process.pid))
        self.assertFalse(self._check_process_exist(child[0].pid))
        self.assertFalse(self._check_process_exist(grandchild[0].pid))

        ti.refresh_from_db()
        self.assertEqual(ti.state, State.RUNNING)
        process = psutil.Process(ti.pid)
        self.assertIsNotNone(process)
        child = process.children(recursive=False)
        self.assertEqual(1, len(child))
        grandchild = child[0].children(recursive=False)
        self.assertEqual(1, len(grandchild))
        tes = self._check_task_execution(ti)
        self.assertEqual(2, len(tes))
        self.assertEqual(2, tes[0].seq_num)

        executor.schedule_task(ti.key, SchedulingAction.STOP)
        ti.refresh_from_db()
        time.sleep(10)
        self.assertEqual(State.KILLED, ti.state)
        self.assertFalse(self._check_process_exist(process.pid))
        self.assertFalse(self._check_process_exist(child[0].pid))
        self.assertFalse(self._check_process_exist(grandchild[0].pid))
        self._check_task_execution(ti)

        executor.end()