apache / apache/airflow

Honor [scheduler] create_cron_data_intervals when serializing cron schedules in the Go SDK

Open
#67,938 0 comments 0 reactions 1 assignee Claimed by @jason810496 View on GitHub
area:core area:serialization go-sdk kind:feature on hold priority:low
Dominant language
Python
Stars
46.9k
Forks
17.8k
Avg merge
2d 9h
Merged PRs (30d)
472

Description

### Background

The Go bundle serializer always emits `CronTriggerTimetable` for a cron `schedule`, which only matches the **default** deployment (`[scheduler] create_cron_data_intervals = False`). When a deployment sets it to `True`, Python's `_create_timetable` (`task-sdk/src/airflow/sdk/definitions/dag.py`) produces `CronDataIntervalTimetable` instead, so a Go-authored DAG diverges from the equivalent Python DAG.

The Go bundle binary cannot read `airflow.cfg`, so it has no way to branch on the flag today. The relevant scheduler settings must be delivered from the supervisor (Python `ExecutableCoordinator`) to the lang-SDK over the coordinator protocol first.

Current hardcoded branch in `go-sdk/pkg/execution/serde.go` (`serializeTimetable`):

```go
default:
return map[string]any{
"__type": "airflow.timetables.trigger.CronTriggerTimetable",
"__var": map[string]any{
"expression": *schedule,
"timezone": "UTC",
"interval": 0.0,
"run_immediately": false,
},
}
```

### What needs to happen

1. Extend the coordinator protocol so the supervisor sends `create_cron_data_intervals` (and `create_delta_data_intervals`, once timedelta schedules are supported) to the bundle — e.g. as fields on `DagFileParseRequest`.
2. In `serializeTimetable`, emit `CronDataIntervalTimetable` (`{expression, timezone}`) when `create_cron_data_intervals` is `True` and `CronTriggerTimetable` when `False`, mirroring `_create_timetable`.
3. Carry the DAG timezone over the same channel; `serializeTimetable` currently hardcodes `"UTC"`.

### Acceptance criteria

- A cron-scheduled Go DAG serializes to the same timetable `__type` and `__var` as the equivalent Python DAG under both values of `create_cron_data_intervals`.
- DAG timezone is no longer hardcoded to `"UTC"`.
- The `TODO` on `serializeTimetable` in `go-sdk/pkg/execution/serde.go` is removed.

### Context

- Originating PR: #67155 (Go-SDK Dag/Task specs and downstream wiring in the authoring API) — serde parity review.
- Related: #66942 (Cross-SDK DagSerialization compatibility CI for the Go SDK) — a CI harness like that would catch this divergence automatically.
- Python reference: `_create_timetable` in `task-sdk/src/airflow/sdk/definitions/dag.py`; config default in `airflow-core/src/airflow/config_templates/config.yml` (`create_cron_data_intervals`, default `False`).

---
Drafted-by: Claude Code (Opus 4.8); reviewed by @jason810496 before posting

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.