apache / airflow

Apache Airflow - A platform to programmatically author, schedule, and monitor workflows
https://airflow.apache.org/
Apache License 2.0
35.3k stars 13.79k forks source link

Error when Adding a new record in Dag Run #38816

Open MyLong opened 2 months ago

MyLong commented 2 months ago

Apache Airflow version

2.9.0b2

If "Other Airflow 2 version" selected, which one?

2.9.0rc3

What happened?

When Add a new record in Browse-DAG Runs, if there is note exists, the system will show Ooops! The logs are blew: airflow-webserver_1 | [2024-04-08T02:19:22.622+0000] {app.py:1744} ERROR - Exception on /dagrun/add [GET] airflow-webserver_1 | Traceback (most recent call last): airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 2529, in wsgi_app airflow-webserver_1 | response = self.full_dispatch_request() airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1825, in full_dispatch_request airflow-webserver_1 | rv = self.handle_user_exception(e) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1823, in full_dispatch_request airflow-webserver_1 | rv = self.dispatch_request() airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask/app.py", line 1799, in dispatch_request airflow-webserver_1 | return self.ensure_sync(self.view_functions[rule.endpoint])(view_args) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/airflow/www/decorators.py", line 159, in wrapper airflow-webserver_1 | return f(*args, *kwargs) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/security/decorators.py", line 137, in wraps airflow-webserver_1 | return f(self, args, kwargs) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/views.py", line 590, in add airflow-webserver_1 | return self.render_template( airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/baseviews.py", line 342, in render_template airflow-webserver_1 | return render_template( airflow-webserver_1 | ^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask/templating.py", line 147, in render_template airflow-webserver_1 | return _render(app, template, context) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask/templating.py", line 130, in _render airflow-webserver_1 | rv = template.render(context) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/jinja2/environment.py", line 1301, in render airflow-webserver_1 | self.environment.handle_exception() airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/jinja2/environment.py", line 936, in handle_exception airflow-webserver_1 | raise rewrite_traceback_stack(source=source) airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/general/model/add.html", line 2, in top-level template code airflow-webserver_1 | {% import 'appbuilder/general/lib.html' as lib %} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/base.html", line 1, in top-level template code airflow-webserver_1 | {% extends base_template %} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/airflow/www/templates/airflow/main.html", line 21, in top-level template code airflow-webserver_1 | {% from 'airflow/_messages.html' import show_message %} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/baselayout.html", line 2, in top-level template code airflow-webserver_1 | {% import 'appbuilder/baselib.html' as baselib %} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/init.html", line 42, in top-level template code airflow-webserver_1 | {% block body %} airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/baselayout.html", line 19, in block 'body' airflow-webserver_1 | {% block content %} airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/general/model/add.html", line 7, in block 'content' airflow-webserver_1 | {% block add_form %} airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/general/model/add.html", line 8, in block 'add_form' airflow-webserver_1 | {{ widgets.get('add')(form_action=form_action)|safe }} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/widgets.py", line 37, in call airflow-webserver_1 | return template.render(args) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/jinja2/environment.py", line 1301, in render airflow-webserver_1 | self.environment.handle_exception() airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/jinja2/environment.py", line 936, in handle_exception airflow-webserver_1 | raise rewrite_traceback_stack(source=source) airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/general/widgets/form.html", line 45, in top-level template code airflow-webserver_1 | {{ lib.render_field(field, begin_sep_label, end_sep_label, begin_sep_field, end_sep_field) }} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/jinja2/runtime.py", line 777, in _invoke airflow-webserver_1 | rv = self._func(*arguments) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/templates/appbuilder/general/lib.html", line 251, in template airflow-webserver_1 | {{ field(kwargs)|safe }} airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/wtforms/fields/core.py", line 176, in call airflow-webserver_1 | return self.meta.render_field(self, kwargs) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/wtforms/meta.py", line 64, in render_field airflow-webserver_1 | return field.widget(field, render_kw) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/flask_appbuilder/fieldwidgets.py", line 162, in call airflow-webserver_1 | return super(Select2Widget, self).call(field, kwargs) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/wtforms/widgets/core.py", line 390, in call airflow-webserver_1 | html.append(self.render_option(val, label, selected, render_kw)) airflow-webserver_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/wtforms/widgets/core.py", line 403, in render_option airflow-webserver_1 | return Markup(f"<option {html_params(**options)}>{escape(label)}") airflow-webserver_1 | ^^^^^^^^^^^^^ airflow-webserver_1 | File "/home/airflow/.local/lib/python3.12/site-packages/airflow/models/dagrun.py", line 1651, in repr airflow-webserver_1 | prefix = f"<{self.class.name}: {self.dag_id}.{self.dagrun_id} {self.run_id}" airflow-webserver_1 | ^^^^^^^^^^^ airflow-webserver_1 | AttributeError: 'DagRunNote' object has no attribute 'dag_id'

What you think should happen instead?

No response

How to reproduce

  1. add a note to arbitrary DAG Run in Dag Run details. image

  2. Browse->DAG Runs, click the plus button to add a new record image

  3. you will see the ooops

Operating System

Ubuntu 22.04 LTS

Versions of Apache Airflow Providers

No response

Deployment

Docker-Compose

Deployment details

docker-compose version 1.29.2

Anything else?

seems the __repr__ function uses the wrong field key.

class DagRunNote(Base):
    __tablename__ = "dag_run_note"

    user_id = Column(
        Integer,
        ForeignKey("ab_user.id", name="dag_run_note_user_fkey"),
        nullable=True,
    )
    dag_run_id = Column(Integer, primary_key=True, nullable=False)
    content = Column(String(1000).with_variant(Text(1000), "mysql"))
    created_at = Column(UtcDateTime, default=timezone.utcnow, nullable=False)
    updated_at = Column(UtcDateTime, default=timezone.utcnow, onupdate=timezone.utcnow, nullable=False)

    dag_run = relationship("DagRun", back_populates="dag_run_note")

    __table_args__ = (
        PrimaryKeyConstraint("dag_run_id", name="dag_run_note_pkey"),
        ForeignKeyConstraint(
            (dag_run_id,),
            ["dag_run.id"],
            name="dag_run_note_dr_fkey",
            ondelete="CASCADE",
        ),
    )

    def __init__(self, content, user_id=None):
        self.content = content
        self.user_id = user_id

    def __repr__(self):
        prefix = f"<{self.__class__.__name__}: {self.dag_id}.{self.dagrun_id} {self.run_id}"
        if self.map_index != -1:
            prefix += f" map_index={self.map_index}"
        return prefix + ">"

Are you willing to submit PR?

Code of Conduct

boring-cyborg[bot] commented 2 months ago

Thanks for opening your first issue here! Be sure to follow the issue template! If you are willing to raise PR to address this issue please do so, no need to wait for approval.