diff --git a/airflow/www/templates/airflow/task_instance.html b/airflow/www/templates/airflow/task_instance.html index f7faff3a538cb..9c5953ae28e8b 100644 --- a/airflow/www/templates/airflow/task_instance.html +++ b/airflow/www/templates/airflow/task_instance.html @@ -39,6 +39,9 @@

{{ url_for(endpoint, dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }} {%- endif -%} {% endmacro -%} +
  • + + Grid
  • Task Instance Details
  • diff --git a/airflow/www/views.py b/airflow/www/views.py index 9907d6d628af1..306926c163ae0 100644 --- a/airflow/www/views.py +++ b/airflow/www/views.py @@ -1395,6 +1395,7 @@ def rendered_templates(self, session): show_trigger_form_if_no_params=conf.getboolean( "webserver", "show_trigger_form_if_no_params" ), + dag_run_id=dag_run.run_id if dag_run else "", html_dict=html_dict, dag=dag, task_id=task_id, @@ -1460,6 +1461,7 @@ def rendered_templates(self, session): "airflow/ti_code.html", show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), html_dict=html_dict, + dag_run_id=dag_run.run_id if dag_run else "", dag=dag, task_id=task_id, task_display_name=task.task_display_name, @@ -1524,6 +1526,7 @@ def rendered_k8s(self, *, session: Session = NEW_SESSION): return self.render_template( "airflow/ti_code.html", show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), + dag_run_id=dag_run.run_id if dag_run else "", html_dict={"k8s": content}, dag=dag, task_id=task_id, @@ -1650,6 +1653,7 @@ def log(self, session: Session = NEW_SESSION): show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), logs=logs, dag=dag_model, + dag_run_id=ti.run_id if ti else "", title="Log by attempts", dag_id=dag_id, task_id=task_id, @@ -1806,6 +1810,7 @@ def include_task_attrs(attr_name): show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), task_attrs=task_attrs, ti_attrs=ti_attrs, + dag_run_id=ti.run_id if ti else "", failed_dep_reasons=failed_dep_reasons or no_failed_deps_result, task_id=task_id, execution_date=execution_date, @@ -1858,6 +1863,7 @@ def xcom(self, session: Session = NEW_SESSION): show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"), attributes=attributes, task_id=task_id, + dag_run_id=ti.run_id if ti else "", task_display_name=ti.task_display_name, execution_date=execution_date, map_index=map_index, diff --git a/tests/www/views/test_views_tasks.py b/tests/www/views/test_views_tasks.py index d3001d1236234..2b893c40f671d 100644 --- a/tests/www/views/test_views_tasks.py +++ b/tests/www/views/test_views_tasks.py @@ -159,22 +159,42 @@ def client_ti_without_dag_edit(app): ], id="delete-dag-button-normal", ), + pytest.param( + f"task?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", + ["Grid"], + id="task-grid-button", + ), pytest.param( f"task?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", ["Task Instance Details"], id="task", ), + pytest.param( + f"log?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", + ["Grid"], + id="log-grid-button", + ), pytest.param( f"xcom?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", ["XCom"], id="xcom", ), + pytest.param( + f"xcom?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", + ["Grid"], + id="xcom-grid-button", + ), pytest.param("xcom/list", ["List XComs"], id="xcom-list"), pytest.param( f"rendered-templates?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", ["Rendered Template"], id="rendered-templates", ), + pytest.param( + f"rendered-templates?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}", + ["Grid"], + id="rendered-templates-grid-button", + ), pytest.param( "object/graph_data?dag_id=example_bash_operator", ["runme_1"],