Skip to content

Sets in parameters cause "TypeError: Object of type set is not JSON serializable" #19096

Description

@MatrixManAtYrService

Apache Airflow version

2.2.1 (latest released)

Operating System

Debian Buster (docker)

Versions of Apache Airflow Providers

n/a

Deployment

Astronomer

Deployment details

Using astro dev start

No problems with:

FROM quay.io/astronomer/ap-airflow:2.1.4-buster-onbuild

Problems occur with:

FROM quay.io/astronomer/ap-airflow:2.2.0-buster-onbuild

The DAG:

@task(params={"a": {1, 2, 3}, "b": {3, 4, 5}})
def intersect(intersection):
    print(intersection)

@dag(
    schedule_interval="@daily",
    start_date=days_ago(1),
    default_args={"owner": "airflow"},
)
def set_params():
    intersect("{{ params.a.intersection(params.b).pop() }}")

the_dag = set_params()

What happened

The DAG parses and runs fine on 2.1.4, but when I upgrade to 2.2.0 I see an error at the top of the DAGs list:

Screen Shot 2021-10-19 at 10 08 41 PM

The dag is still listed (from successful runs in 2.1.4) and when I click it I see a new error:

Python version: 3.9.7
Airflow version: 2.2.0+astro.2
Node: 10b491f393be
-------------------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.9/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/local/lib/python3.9/site-packages/airflow/www/auth.py", line 51, in decorated
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/airflow/www/decorators.py", line 109, in view_func
    return f(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/airflow/www/decorators.py", line 72, in wrapper
    return f(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/airflow/utils/session.py", line 70, in wrapper
    return func(*args, session=session, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/airflow/www/views.py", line 2259, in tree
    dag = current_app.dag_bag.get_dag(dag_id)
  File "/usr/local/lib/python3.9/site-packages/airflow/utils/session.py", line 70, in wrapper
    return func(*args, session=session, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/airflow/models/dagbag.py", line 186, in get_dag
    self._add_dag_from_db(dag_id=dag_id, session=session)
  File "/usr/local/lib/python3.9/site-packages/airflow/models/dagbag.py", line 261, in _add_dag_from_db
    dag = row.dag
  File "/usr/local/lib/python3.9/site-packages/airflow/models/serialized_dag.py", line 180, in dag
    dag = SerializedDAG.from_dict(self.data)  # type: Any
  File "/usr/local/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py", line 916, in from_dict
    return cls.deserialize_dag(serialized_obj['dag'])
  File "/usr/local/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py", line 830, in deserialize_dag
    v = {task["task_id"]: SerializedBaseOperator.deserialize_operator(task) for task in v}
  File "/usr/local/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py", line 830, in <dictcomp>
    v = {task["task_id"]: SerializedBaseOperator.deserialize_operator(task) for task in v}
  File "/usr/local/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py", line 587, in deserialize_operator
    v = cls._deserialize_operator_params(v)
  File "/usr/local/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py", line 729, in _deserialize_operator_params
    param_class = import_string(v['__class'])
KeyError: '__class'

What you expected to happen

The dag runs the same as it did in 2.1.4

How to reproduce

Run the above DAG in 2.2.0

Anything else

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions