Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
c94cf31
Flag missing conn-fields when hook-only files change in static checks
dabla Jul 17, 2026
6113d16
Add missing Dutch translations (#68742)
DjVinnii Jul 17, 2026
f3f0901
Fix common.ai durable execution skipping Toolset-capability tools (#6…
kaxil Jul 17, 2026
174803c
Don't deactivate DAG bundles owned by other dag-processors (#69964)
sortega Jul 17, 2026
4672428
Authorize Dag reparse against the file's Dags, not the query-string d…
pierrejeambrun Jul 17, 2026
61f6925
Restore graph task and group coloring via Chakra palette tokens (#68760)
pierrejeambrun Jul 17, 2026
75a7410
Skip Go SDK CI jobs for doc-only changes under go-sdk/ (#70021)
Andrushika Jul 17, 2026
3705860
Enhance/standardize documentation for `AssetOrTimeSchedule` (#69831)
jroachgolf84 Jul 17, 2026
e633f7c
UI: Lazy-mount the pause confirmation dialog on Dag cards and rows (#…
yuseok89 Jul 17, 2026
aa064d2
Skip ts-sdk supervisor schema check for doc-only changes (#70022)
Andrushika Jul 17, 2026
62033ae
Use atomic upsert for asset run queue on MySQL to avoid deadlocks (#6…
dstandish Jul 17, 2026
77556d3
Pin task bundle manifest to the dagrun's version (#69941)
o-nikolas Jul 17, 2026
ca41c1d
Allow configuring XCom sidecar container security context (#69613)
aaron-y-chen Jul 17, 2026
dc7a45d
Add missing newsfragment to Helm Chart (#70043)
Miretpl Jul 17, 2026
cbd942b
Update doc (#70047)
Miretpl Jul 17, 2026
880e4e0
Fix `@task.llm_branch` import failure on Task SDK-only workers (#70068)
guan404ming Jul 18, 2026
f3c5839
Reject unsupported require_approval in LLM branch and schema compare …
guan404ming Jul 18, 2026
d081795
Fix stale docs.sqlalchemy.org/en/14 pooling link in config.yml (#69751)
singlaamitesh Jul 18, 2026
89da2ec
Java SDK: Throw MissingXComException instead of NPE for absent XComs …
FrankYang0529 Jul 18, 2026
ffa04b0
Rename Kafka Listener to Kafka Event Producer and update the document…
xBis7 Jul 18, 2026
9294c2c
Set stream=False for Snowflake Cortex Agent requests. (#69731)
SameerMesiah97 Jul 18, 2026
5b83784
Send Airflow CLI logs to stderr for -o commands so structured output …
dheerajturaga Jul 18, 2026
2de6789
Document task subprocess lifecycle and pre-connect log buffer (#70076)
jason810496 Jul 18, 2026
1a4d8db
Enhancing docs for `HttpEventTrigger` (#70073)
jroachgolf84 Jul 18, 2026
ebaf416
Add Amazon ECR repository operators (#69886)
AlejandroMorgante Jul 18, 2026
3a63de8
Prevent negative trigger queue delay metrics (#69971)
viiccwen Jul 18, 2026
3227d28
Bump the uv-dependency-updates group in /dev/breeze with 2 updates (#…
dependabot[bot] Jul 18, 2026
511d9ca
Bump the github-actions-updates group across 1 directory with 9 updat…
dependabot[bot] Jul 18, 2026
e2a600d
Fix CI integration tests gated by the wrong platform (#70015)
FrankYang0529 Jul 18, 2026
bc5cace
Fix mypy prek hooks skipping all files in dot-directory (#70064)
FrankYang0529 Jul 18, 2026
e89ed9d
Document 3.3.0 image databricks constraint fix in Dockerfile changelo…
potiuk Jul 19, 2026
0dec5d7
Fix DocumentLoaderOperator ignoring unknown parser on byte input (#70…
guan404ming Jul 19, 2026
8f1ef2f
Send TS SDK logs to stderr on socket disconnect (#69302)
guan404ming Jul 19, 2026
b75aeeb
Build Go SDK e2e example bundle natively in CI (#69909)
jason810496 Jul 19, 2026
048312a
i18n(ko): translate Dag list run-state filter labels (#69781)
parkhojeong Jul 19, 2026
3bc203d
Preserve output_type through human approval in LLM operators (#70075)
guan404ming Jul 19, 2026
16ba393
Clarify the dags reserialize command scope (#69810)
aaron-y-chen Jul 19, 2026
1d1a1a1
Add Task SDK, Go and Java SDK execution architecture diagrams (#69750)
potiuk Jul 19, 2026
d2537d7
Discount CI image-build time from duration-trend alerts (#69789)
potiuk Jul 19, 2026
282822f
Clarify AssetPartitionDagRun provisional-run docstring (#69982)
dstandish Jul 19, 2026
4911ddb
fix/issue-70020: Adding cap to cloudpickle (#70086)
jroachgolf84 Jul 19, 2026
cbcbd18
Bring back edge worker metric compatibility with Airflow 3.2 (#67328)
AutomationDev85 Jul 19, 2026
12db5b1
Replace vars(response) with attribute access in Azure Data Factory an…
MalteNiederstadt Jul 19, 2026
096fb69
Bump eslint (#70032)
dependabot[bot] Jul 19, 2026
4b23b08
cncf-kubernetes: fix potential race condition in trigger_reentry flow…
noah-gil Jul 19, 2026
0519f70
Upgrade http to https in PR template (#70063)
hanu-14 Jul 19, 2026
cdce9fc
Make schema_fields templated in GCSToBigQueryOperator (#69108)
nikolauspschuetz Jul 19, 2026
0ce39a0
docs: fix stale Airflow 2.0 references in dev/README.md (#69961)
nagasrisai Jul 19, 2026
ad7f7cc
Refactor get_statsd_logger to use keyword arguments for clarity and a…
ykuc Jul 19, 2026
d6059cf
Let area:e2e-tests label force the airflow-e2e-tests suite (#69993)
jason810496 Jul 19, 2026
d04c82e
Automate keeping documented "tested with" versions in sync with the t…
potiuk Jul 19, 2026
3b020ce
Fix Breeze OpenLineage integration gate stuck on stale Postgres versi…
Aaryan123456679 Jul 19, 2026
1ec7aa8
Bump @visx/shape from 3.12.0 to 4.0.0 in /airflow-core/src/airflow/ui…
dependabot[bot] Jul 19, 2026
1c31b88
Rename Task and Asset store to Task and Asset state store (#70097)
jroachgolf84 Jul 20, 2026
0b1a1cb
i18n(ko): add missing translation for triggerDag.partitionKeyHelp (#7…
aaiss0927 Jul 20, 2026
8878242
Add integration tests for coordinator-mode TypeScript tasks (#69328)
guan404ming Jul 20, 2026
017f8dd
Suppress noisy Alembic plugin setup logs (#69916)
ephraimbuddy Jul 20, 2026
1276b7a
Fix ClickHouse test_connection unit test failing with newer clickhous…
henry3260 Jul 20, 2026
604916b
Add running_pod_log_lines config option to KubernetesExecutor (#69301)
jason810496 Jul 20, 2026
c6683a2
Bump the core-ui-package-updates group across 1 directory with 4 upda…
dependabot[bot] Jul 20, 2026
d0b0095
UI: Complete Hindi (hi) translation coverage (#70111)
dkranchii Jul 20, 2026
e76df48
Document GlueJobOperator support for OpenLineage Spark injection (#69…
mobuchowski Jul 20, 2026
89e76b2
Add API endpoint for backfill dag run entries (#67381)
shivaam Jul 20, 2026
5a3c2c1
Update Weaviate examples for client 4.16 API (#67343)
henry3260 Jul 20, 2026
213776a
Restore pluggable email backend for task failure and retry alerts (#6…
potiuk Jul 20, 2026
76aaa66
Add partition_key and partition_key_regexp_pattern filters for asset …
hussein-awala Jul 20, 2026
43fcccf
Optionally emit Dag tags as metric tags (#68568)
sortega Jul 20, 2026
9028bab
Add ADR-0006: no Lang-SDK source display for mixed-language (@task.st…
jason810496 Jul 20, 2026
b23a75f
[main] Upgrade important CI environment (#69999)
github-actions[bot] Jul 20, 2026
c40eb2e
Bump the auth-ui-package-updates group across 1 directory with 9 upda…
dependabot[bot] Jul 20, 2026
df569f5
Add Asset Tab plugin (#69986)
bbovenzi Jul 20, 2026
fcd0f04
[AIP-94] Add filters and pagination to airflowctl jobs list (#68616)
henry3260 Jul 20, 2026
3f7a87b
Add AWS services toolset for agents to access 1000+ APIs (#70087)
gopidesupavan Jul 20, 2026
2561753
Fix task instance mark success downstream default (#67763)
Codingaditya17 Jul 20, 2026
c282203
Add worker-name filter to `airflow edge list-workers` (#70095)
shubhamraj-git Jul 20, 2026
2aec3fb
Fix dag.test() dropping defer-time kwargs when trigger yields an even…
seanghaeli Jul 20, 2026
e8b88c2
TriggerRunner: Add batch trigger creation duration metric (#68521)
SameerMesiah97 Jul 20, 2026
4b2173c
Bump axios in /providers/edge3/src/airflow/providers/edge3/plugins/ww…
dependabot[bot] Jul 20, 2026
0da201b
Remove airflow.utils dependency from Docker provider (#69900)
shaealh Jul 21, 2026
ff925db
Document that Code view shows only Python source for stub tasks (#70155)
jason810496 Jul 21, 2026
9a4417e
Remove deprecated dataset aliases (#70154)
viiccwen Jul 21, 2026
2b6fbc0
Use canonical serde imports in tests (#70162)
viiccwen Jul 21, 2026
e576ee3
Fix flaky static checks caused by migration-reference hook race (#70170)
jason810496 Jul 21, 2026
3bfde03
Add toolset as a provider module category (#70122)
Lee-W Jul 21, 2026
bf8c2b4
Fix toolsets python-modules check for common.ai provider (#70181)
amoghrajesh Jul 21, 2026
e25569f
Harden common.ai SQLToolset allowed_tables against function/COPY bypa…
kaxil Jul 21, 2026
8fb52e0
Merge branch 'main' into feature/flag-missing-conn-fields
dabla Jul 21, 2026
5f538df
Merge branch 'main' into feature/flag-missing-conn-fields
dabla Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion providers/.pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,10 @@ repos:
name: Validate provider.yaml files
entry: ../scripts/ci/prek/check_provider_yaml_files.py
language: python
files: ^.*/provider\.yaml$
files: >
(?x)
^.*/provider\.yaml$|
^.*/src/airflow/providers/.*/hooks/[^/]+\.py$
exclude: ^.*/.venv/.*$
require_serial: true
- id: check-cli-definition-imports
Expand Down
12 changes: 7 additions & 5 deletions scripts/ci/prek/check_provider_conn_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ def check_conn_fields_for_entry(
at all — the entry is then skipped entirely (no ``conn-fields`` check), or
- raises any other ``Exception`` to signal an unexpected failure (converted
here into an error string so callers never need to catch it).

When the hook returns widgets, the ``conn-fields`` section in the provider YAML
must exactly match. If ``conn-fields`` is absent, every widget key is treated
as missing from YAML (because any custom field missing from ``conn-fields`` will
be invisible in the new React connection UI).
"""
hook_class_name: str = conn_type_entry["hook-class-name"]
connection_type: str = conn_type_entry.get("connection-type", "?")
Expand All @@ -61,11 +66,8 @@ def check_conn_fields_for_entry(
if widget_keys is None:
return []

conn_fields = conn_type_entry.get("conn-fields")
if conn_fields is None:
# No conn-fields declared: the new UI simply exposes no custom fields for this
# connection type, which is intentional. Nothing to validate.
return []
# Treat absent conn-fields as an empty dict so any hook widget is flagged as missing.
conn_fields: dict = conn_type_entry.get("conn-fields") or {}

error = build_mismatch_error(
set(conn_fields.keys()), widget_keys, connection_type, yaml_file_path, hook_class_name
Expand Down
32 changes: 31 additions & 1 deletion scripts/ci/prek/check_provider_yaml_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
# ///
from __future__ import annotations

import pathlib
import sys

from common_prek_utils import (
Expand All @@ -33,7 +34,36 @@

initialize_breeze_prek(__name__, __file__)

files_to_test = sys.argv[1:]

def _resolve_provider_yaml_files(raw_files: list[str]) -> list[str]:
"""
Accept a mix of provider.yaml paths and Python source files.
When a Python source file is passed (e.g. a hook whose
``get_connection_form_widgets()`` was edited), map it to the
``provider.yaml`` at the root of the same provider package so the
conn-fields check runs even when only the hook changes.
All paths are relative to the ``providers/`` directory, as supplied by
prek. The first path segment is the provider package name
(e.g. ``samba/src/airflow/...`` → ``samba/provider.yaml``).
"""
result: set[str] = set()
for f in raw_files:
p = pathlib.PurePosixPath(f)
if p.name == "provider.yaml":
result.add(f)
else:
# Map any Python file to the provider.yaml of its package root.
# Path structure: <provider-pkg>/<rest...>
# e.g. samba/src/airflow/providers/samba/hooks/samba.py
parts = p.parts
if parts:
result.add(f"{parts[0]}/provider.yaml")
return sorted(result)


files_to_test = _resolve_provider_yaml_files(sys.argv[1:])
cmd_result = run_command_via_breeze_run(
["python3", "/opt/airflow/scripts/in_container/run_provider_yaml_files_check.py", *files_to_test],
backend="sqlite",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ class TestCheckConnFieldsForEntry:
pytest.param([], _get_keys(), id="empty-on-both-sides"),
pytest.param(["a"], _skip, id="skip-hook-without-get-connection-form-widgets"),
pytest.param(None, _skip, id="skip-missing-conn-fields-when-hook-has-no-widgets"),
# Hook with widgets but no conn-fields is allowed: new UI intentionally omits custom fields.
pytest.param(None, _get_keys("field_a"), id="no-conn-fields-with-hook-widgets-is-ok"),
# When hook has no custom widgets, absent conn-fields is fine.
pytest.param(None, lambda _: set(), id="no-conn-fields-no-hook-widgets-is-ok"),
],
)
def test_no_errors(self, conn_fields, get_keys):
Expand All @@ -123,6 +123,10 @@ def test_no_errors(self, conn_fields, get_keys):
),
pytest.param(["a"], _raise, "boom", id="unexpected-exception-message"),
pytest.param(["a"], _raise, HOOK_CLASS, id="unexpected-exception-mentions-hook-class"),
# absent conn-fields with hook widgets must be flagged (every widget key is "missing")
pytest.param(
None, _get_keys("auth_protocol"), "auth_protocol", id="absent-conn-fields-with-hook-widgets"
),
],
)
def test_one_error_containing(self, conn_fields, get_keys, expected_in_error):
Expand Down