1fanwang opened a new pull request, #71157: URL: https://github.com/apache/airflow/pull/71157
The `cncf.kubernetes` options `[kubernetes_executor] async_pod_creation` and `pod_creation_max_concurrency` are tagged `version_added: 10.20.0`, but they ship in 10.21.0. I added both in https://github.com/apache/airflow/pull/68480 and got the version wrong. Two consequences: * The 10.21.0 configuration reference renders "New in version 10.20.0" for both options, pointing users at a release where they do not exist. * `version_added` is also what keeps a newer option off an older version's config page: `conf_constants.py` drops any option whose `version_added` is greater than the package version being built. At `10.20.0` the filter does not drop these two, so a 10.20.0 docs build lists options the 10.20.0 code has never heard of. Found while verifying `cncf-kubernetes 10.21.0rc1` for https://github.com/apache/airflow/issues/70953. Three other options in the same section carry `version_added: 10.20.0` legitimately; only these two are wrong. The value was right when I wrote it and went stale in review. 10.19.0 was the latest release when the PR was opened on 2026-06-12, so 10.20.0 was the next version. 10.20.0 was then cut on 2026-07-23 while the PR was still open, and the PR merged six days later, which put it in 10.21.0. `version_added` is hand-written and nothing revalidates it: the schema accepts any string, no pre-commit or breeze check compares it against the version being released, and the `versions:` list only gains its entry at release-prep time. Any PR that adds a config option and stays open across a release boundary hits this. related: https://github.com/apache/airflow/issues/70953 ### Testing done The two options do not exist anywhere in the released 10.20.0 provider, and do exist in 10.21.0rc1. Both wheels installed from PyPI / the RC SVN dist into separate virtualenvs. <details><summary>Raw logs</summary> ```console $ .venv/bin/python -c "import importlib.metadata as m; print(m.version('apache-airflow-providers-cncf-kubernetes'))" 10.21.0rc1 $ .venv-prev/bin/python -c "import importlib.metadata as m; print(m.version('apache-airflow-providers-cncf-kubernetes'))" 10.20.0 # every option in the k8s provider.yaml claiming version_added: 10.20.0 $ git show providers-cncf-kubernetes/10.21.0rc1:providers/cncf/kubernetes/provider.yaml > /tmp/rc1_provider.yaml $ python3 -c " import yaml d = yaml.safe_load(open('/tmp/rc1_provider.yaml')) for sec, body in d['config'].items(): for name, opt in body['options'].items(): if opt.get('version_added') == '10.20.0': print(f'{sec}.{name}') " kubernetes_executor.running_pod_log_lines kubernetes_executor.async_pod_creation kubernetes_executor.pod_creation_max_concurrency kubernetes_executor.pod_launch_failure_retries kubernetes_executor.pod_launch_failure_excluded_container_reasons # are those five actually present in the released 10.20.0 provider? $ for opt in async_pod_creation pod_creation_max_concurrency running_pod_log_lines \ pod_launch_failure_retries pod_launch_failure_excluded_container_reasons; do n=$(grep -rl "$opt" .venv-prev/lib/python3*/site-packages/airflow/providers/cncf/kubernetes/ | wc -l) echo "10.20.0 $opt -> $n file(s)" done 10.20.0 async_pod_creation -> 0 file(s) 10.20.0 pod_creation_max_concurrency -> 0 file(s) 10.20.0 running_pod_log_lines -> 4 file(s) 10.20.0 pod_launch_failure_retries -> 4 file(s) 10.20.0 pod_launch_failure_excluded_container_reasons -> 4 file(s) # same two options in 10.21.0rc1 $ for opt in async_pod_creation pod_creation_max_concurrency; do n=$(grep -rl "$opt" .venv/lib/python3*/site-packages/airflow/providers/cncf/kubernetes/ | wc -l) echo "10.21.0rc1 $opt -> $n file(s)" done 10.21.0rc1 async_pod_creation -> 7 file(s) 10.21.0rc1 pod_creation_max_concurrency -> 8 file(s) ``` </details> <details><summary>How the value went stale</summary> ```console # latest release when the PR was opened on 2026-06-12 $ git show 8e63d9bbc77^:providers/cncf/kubernetes/provider.yaml | grep -A3 '^versions:' versions: - 10.19.0 - 10.18.0 - 10.17.1 # 10.20.0 was cut while the PR was open, and the PR merged after it $ git log -1 --format=%cI 8e63d9bbc77 # the commit adding "- 10.20.0" to versions: 2026-07-23T22:48:43+03:00 $ gh pr view 68480 --repo apache/airflow --json createdAt,mergedAt created: 2026-06-12T19:09:23Z merged: 2026-07-29T09:58:47Z $ git merge-base --is-ancestor 8e63d9bbc77 703a0570c84 && echo "merged after 10.20.0 was cut" merged after 10.20.0 was cut # nothing validates the field $ grep -rn version_added dev/breeze/src/ scripts/ | grep -viE 'jinja|template|\.rst' (no output) $ python3 -c "import json; print(json.load(open('airflow-core/src/airflow/provider.yaml.schema.json'))['definitions']['option']['properties']['version_added'])" {'type': ['string', 'null']} ``` </details> `get_provider_info.py` carries the same field and is generated from `provider.yaml` by breeze at package-prep time (`_prepare_get_provider_info_py_file` in `dev/breeze/src/airflow_breeze/utils/packages.py`), so both are updated together. -- 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]
