From cc0126b7c75b9cbccb20b7a211e1f735de7f61b7 Mon Sep 17 00:00:00 2001 From: Alexander Millin Date: Thu, 14 Mar 2024 11:14:47 +0300 Subject: [PATCH] Fix incorrect serialisation of the FixedTimezone This issue introduced in Airflow 2.8. When the `start_date` of a DAG is specified with a fixed timezone, its serialisation will not be correct and this causes the scheduler to crash. --- airflow/serialization/serialized_objects.py | 2 +- tests/serialization/test_dag_serialization.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/airflow/serialization/serialized_objects.py b/airflow/serialization/serialized_objects.py index d113cae9e2a45..a27772ee10142 100644 --- a/airflow/serialization/serialized_objects.py +++ b/airflow/serialization/serialized_objects.py @@ -483,7 +483,7 @@ def serialize( return cls._encode(var.timestamp(), type_=DAT.DATETIME) elif isinstance(var, datetime.timedelta): return cls._encode(var.total_seconds(), type_=DAT.TIMEDELTA) - elif isinstance(var, Timezone): + elif isinstance(var, (Timezone, FixedTimezone)): return cls._encode(encode_timezone(var), type_=DAT.TIMEZONE) elif isinstance(var, relativedelta.relativedelta): return cls._encode(encode_relativedelta(var), type_=DAT.RELATIVEDELTA) diff --git a/tests/serialization/test_dag_serialization.py b/tests/serialization/test_dag_serialization.py index 4c466592d1b68..e99f4641d538d 100644 --- a/tests/serialization/test_dag_serialization.py +++ b/tests/serialization/test_dag_serialization.py @@ -27,7 +27,7 @@ import pickle import re import sys -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone as dt_timezone from glob import glob from pathlib import Path from textwrap import dedent @@ -710,7 +710,16 @@ def validate_deserialized_task( datetime(2019, 7, 30, tzinfo=timezone.utc), datetime(2019, 8, 1, tzinfo=timezone.utc), ), - (pendulum.datetime(2019, 8, 1, tz="UTC"), None, pendulum.datetime(2019, 8, 1, tz="UTC")), + ( + datetime(2019, 8, 1, tzinfo=dt_timezone(timedelta(hours=1))), + datetime(2019, 7, 30, tzinfo=dt_timezone(timedelta(hours=1))), + datetime(2019, 8, 1, tzinfo=dt_timezone(timedelta(hours=1))), + ), + ( + pendulum.datetime(2019, 8, 1, tz="UTC"), + None, + pendulum.datetime(2019, 8, 1, tz="UTC"), + ), ], ) def test_deserialization_start_date(self, dag_start_date, task_start_date, expected_task_start_date):