Skip to content

TimeSensorAsync breaks if target_time is timezone-aware #24736

@Gollum999

Description

@Gollum999

Apache Airflow version

2.3.2 (latest released)

What happened

TimeSensorAsync fails with the following error if target_time is aware:

[2022-06-29, 05:09:11 CDT] {taskinstance.py:1889} ERROR - Task failed with exception
Traceback (most recent call last):
  File "/opt/conda/envs/production/lib/python3.9/site-packages/airflow/sensors/time_sensor.py", line 60, in execute
    trigger=DateTimeTrigger(moment=self.target_datetime),
  File "/opt/conda/envs/production/lib/python3.9/site-packages/airflow/triggers/temporal.py", line 42, in __init__
    raise ValueError(f"The passed datetime must be using Pendulum's UTC, not {moment.tzinfo!r}")
ValueError: The passed datetime must be using Pendulum's UTC, not Timezone('America/Chicago')

What you think should happen instead

Given the fact that TimeSensor correctly handles timezones (#9882), this seems like a bug. TimeSensorAsync should be a drop-in replacement for TimeSensor, and therefore should have the same timezone behavior.

How to reproduce

#!/usr/bin/env python3
import datetime

from airflow.decorators import dag
from airflow.sensors.time_sensor import TimeSensor, TimeSensorAsync
import pendulum


@dag(
    start_date=datetime.datetime(2022, 6, 29),
    schedule_interval='@daily',
)
def time_sensor_dag():
    naive_time1 = datetime.time( 0,  1)
    aware_time1 = datetime.time( 0,  1).replace(tzinfo=pendulum.local_timezone())
    naive_time2 = pendulum.time(23, 59)
    aware_time2 = pendulum.time(23, 59).replace(tzinfo=pendulum.local_timezone())

    TimeSensor(task_id='naive_time1', target_time=naive_time1, mode='reschedule')
    TimeSensor(task_id='naive_time2', target_time=naive_time2, mode='reschedule')
    TimeSensor(task_id='aware_time1', target_time=aware_time1, mode='reschedule')
    TimeSensor(task_id='aware_time2', target_time=aware_time2, mode='reschedule')

    TimeSensorAsync(task_id='async_naive_time1', target_time=naive_time1)
    TimeSensorAsync(task_id='async_naive_time2', target_time=naive_time2)
    TimeSensorAsync(task_id='async_aware_time1', target_time=aware_time1)  # fails
    TimeSensorAsync(task_id='async_aware_time2', target_time=aware_time2)  # fails

dag = time_sensor_dag()

This can also happen if the target_time is naive and core.default_timezone = system.

Operating System

CentOS Stream 8

Versions of Apache Airflow Providers

N/A

Deployment

Other

Deployment details

Standalone

Anything else

No response

Are you willing to submit PR?

  • Yes I am willing to submit a PR!

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions