covaliov opened a new issue #19869:
URL: https://github.com/apache/airflow/issues/19869
### Apache Airflow version
2.2.2 (latest released)
### Operating System
Darwin Kernel Version 21.1.0 RELEASE_ARM64_T8101 arm64
### Versions of Apache Airflow Providers
_No response_
### Deployment
Virtualenv installation
### Deployment details
python_version | 3.9.7 (default, Sep 16 2021, 23:53:23) [Clang 12.0.0 ]
### What happened
The following error is displayed in Web UI:
```
Broken DAG: [<EDITED>/scripts/airflow/dags/master/sample_dag/sample_dag.py]
Traceback (most recent call last):
File
"<EDITED>/miniconda3/envs/dev-airflow/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py",
line 271, in serialize_to_json
serialized_object[key] = _encode_timetable(value)
File
"<EDITED>/miniconda3/envs/dev-airflow/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py",
line 152, in _encode_timetable
raise _TimetableNotRegistered(importable_string)
airflow.serialization.serialized_objects._TimetableNotRegistered: Timetable
class 'workday.AfterWorkdayTimetable' is not registered
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File
"<EDITED>/miniconda3/envs/dev-airflow/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py",
line 937, in to_dict
json_dict = {"__version": cls.SERIALIZER_VERSION, "dag":
cls.serialize_dag(var)}
File
"<EDITED>/miniconda3/envs/dev-airflow/lib/python3.9/site-packages/airflow/serialization/serialized_objects.py",
line 849, in serialize_dag
raise SerializationError(f'Failed to serialize DAG {dag.dag_id!r}: {e}')
airflow.exceptions.SerializationError: Failed to serialize DAG
'learning_example_workday_timetable': Timetable class
'workday.AfterWorkdayTimetable' is not registered
```
### What you expected to happen
For the custom timetable to be implemented and used by DAG.
### How to reproduce
Following instructions from [Custom DAG Scheduling with
Timetables](https://airflow.apache.org/docs/apache-airflow/stable/howto/timetable.html)
with following new DAG to implement:
```python
import datetime
from airflow import DAG
from airflow import plugins_manager
from airflow.operators.dummy import DummyOperator
from workday import AfterWorkdayTimetable
with DAG(
dag_id="learning_example_workday_timetable",
start_date=datetime.datetime(2021,11,20),
timetable=AfterWorkdayTimetable(),
tags=["example","learning","timetable"],
) as dag:
DummyOperator(task_id="run_this")
```
### Anything else
I have tried digging through the code and believe the issue is in this line:
https://github.com/apache/airflow/blob/fb478c00cdc5e78d5e85fe5ac103707c829be2fb/airflow/serialization/serialized_objects.py#L149
Perhaps the [Custom DAG Scheduling with
Timetables](https://airflow.apache.org/docs/apache-airflow/stable/howto/timetable.html)
expects an `__eq__` implemented in the `AfterWorkdayTimetable` class but it
would appear that the `AfterWorkdayTimetable` class imported through the DAG
and the `AfterWorkdayTimetable` class imported through `plugin_manager` have
different `id()`'s:
https://github.com/apache/airflow/blob/fb478c00cdc5e78d5e85fe5ac103707c829be2fb/airflow/serialization/serialized_objects.py#L129
The only way I could get it to import successfully was via the following
sequence of import statements since
[_get_registered_timetable](https://github.com/apache/airflow/blob/fb478c00cdc5e78d5e85fe5ac103707c829be2fb/airflow/serialization/serialized_objects.py#L124)
uses a lazy import:
```python
import datetime
from airflow import DAG
from airflow import plugins_manager
from airflow.operators.dummy import DummyOperator
plugins_manager.initialize_timetables_plugins()
from workday import AfterWorkdayTimetable
```
I also had the webserver and scheduler restarted and confirmed the plugin is
seen via cli:
```bash
airflow plugins
✔ dev-airflow
19:01:43
name | source
=========================+===========================
workday_timetable_plugin | $PLUGINS_FOLDER/workday.py
```
### Are you willing to submit PR?
- [ ] Yes I am willing to submit a PR!
### Code of Conduct
- [X] I agree to follow this project's [Code of
Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]