This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch v3-0-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-0-test by this push:
new f62c41d38b1 Move webserver config to fab provider (#50774) (#50848)
f62c41d38b1 is described below
commit f62c41d38b148412607de079e589c93d4ae2bd3e
Author: Pierre Jeambrun <[email protected]>
AuthorDate: Wed May 21 16:14:33 2025 +0200
Move webserver config to fab provider (#50774) (#50848)
* Move webserver navbar config to fab provider
* Remove x_frame_enabled config
(cherry picked from commit 649309e4e5fdf18e33334a4be140069c0f9581f6)
---
.../api_fastapi/core_api/datamodels/ui/config.py | 4 ---
.../api_fastapi/core_api/openapi/_private_ui.yaml | 16 ----------
.../api_fastapi/core_api/routes/ui/config.py | 4 ---
.../src/airflow/cli/commands/config_command.py | 20 +++++++++++++
.../src/airflow/config_templates/config.yml | 35 ----------------------
airflow-core/src/airflow/configuration.py | 4 +++
.../airflow/ui/openapi-gen/requests/schemas.gen.ts | 20 -------------
.../airflow/ui/openapi-gen/requests/types.gen.ts | 4 ---
.../src/airflow/ui/src/mocks/handlers/config.ts | 4 ---
.../api_fastapi/core_api/routes/ui/test_config.py | 8 -----
providers/fab/docs/auth-manager/security.rst | 11 -------
providers/fab/provider.yaml | 31 ++++++++++++++++++-
providers/fab/pyproject.toml | 6 ++--
.../fab/src/airflow/providers/fab/__init__.py | 2 +-
.../src/airflow/providers/fab/get_provider_info.py | 28 +++++++++++++++++
providers/fab/src/airflow/providers/fab/www/app.py | 3 +-
.../fab/www/extensions/init_jinja_globals.py | 8 ++---
.../providers/fab/www/extensions/init_security.py | 19 ------------
providers/fab/tests/unit/fab/decorators.py | 1 -
pyproject.toml | 4 +--
.../ci/pre_commit/update_airflow_pyproject_toml.py | 2 +-
21 files changed, 94 insertions(+), 140 deletions(-)
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py
b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py
index e7c39b3f3a1..addafaf0bc7 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/datamodels/ui/config.py
@@ -24,10 +24,6 @@ from airflow.api_fastapi.common.types import UIAlert
class ConfigResponse(BaseModel):
"""configuration serializer."""
- navbar_color: str
- navbar_text_color: str
- navbar_hover_color: str
- navbar_text_hover_color: str
page_size: int
auto_refresh_interval: int
hide_paused_dags_by_default: bool
diff --git
a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
index c59d75f0f5d..8b3a5103e86 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
+++ b/airflow-core/src/airflow/api_fastapi/core_api/openapi/_private_ui.yaml
@@ -728,18 +728,6 @@ components:
description: Base Node serializer for responses.
ConfigResponse:
properties:
- navbar_color:
- type: string
- title: Navbar Color
- navbar_text_color:
- type: string
- title: Navbar Text Color
- navbar_hover_color:
- type: string
- title: Navbar Hover Color
- navbar_text_hover_color:
- type: string
- title: Navbar Text Hover Color
page_size:
type: integer
title: Page Size
@@ -783,10 +771,6 @@ components:
title: Dashboard Alert
type: object
required:
- - navbar_color
- - navbar_text_color
- - navbar_hover_color
- - navbar_text_hover_color
- page_size
- auto_refresh_interval
- hide_paused_dags_by_default
diff --git a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py
b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py
index 9a0ee08eca9..7c61c8b93d4 100644
--- a/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py
+++ b/airflow-core/src/airflow/api_fastapi/core_api/routes/ui/config.py
@@ -30,7 +30,6 @@ from airflow.settings import DASHBOARD_UIALERTS
config_router = AirflowRouter(tags=["Config"])
WEBSERVER_CONFIG_KEYS = [
- "navbar_color",
"page_size",
"auto_refresh_interval",
"hide_paused_dags_by_default",
@@ -39,9 +38,6 @@ WEBSERVER_CONFIG_KEYS = [
"require_confirmation_dag_change",
"enable_swagger_ui",
"instance_name_has_markup",
- "navbar_text_color",
- "navbar_hover_color",
- "navbar_text_hover_color",
]
diff --git a/airflow-core/src/airflow/cli/commands/config_command.py
b/airflow-core/src/airflow/cli/commands/config_command.py
index 381fdc848fd..2d817bbf40c 100644
--- a/airflow-core/src/airflow/cli/commands/config_command.py
+++ b/airflow-core/src/airflow/cli/commands/config_command.py
@@ -386,6 +386,26 @@ CONFIGS_CHANGES = [
config=ConfigParameter("webserver", "expose_hostname"),
renamed_to=ConfigParameter("fab", "expose_hostname"),
),
+ ConfigChange(
+ config=ConfigParameter("webserver", "navbar_color"),
+ renamed_to=ConfigParameter("fab", "navbar_color"),
+ ),
+ ConfigChange(
+ config=ConfigParameter("webserver", "navbar_text_color"),
+ renamed_to=ConfigParameter("fab", "navbar_text_color"),
+ ),
+ ConfigChange(
+ config=ConfigParameter("webserver", "navbar_hover_color"),
+ renamed_to=ConfigParameter("fab", "navbar_hover_color"),
+ ),
+ ConfigChange(
+ config=ConfigParameter("webserver", "navbar_text_hover_color"),
+ renamed_to=ConfigParameter("fab", "navbar_text_hover_color"),
+ ),
+ ConfigChange(
+ config=ConfigParameter("webserver", "x_frame_enabled"),
+ was_deprecated=False,
+ ),
ConfigChange(
config=ConfigParameter("webserver", "base_url"),
renamed_to=ConfigParameter("api", "base_url"),
diff --git a/airflow-core/src/airflow/config_templates/config.yml
b/airflow-core/src/airflow/config_templates/config.yml
index 122b67174e5..8a96de68a6f 100644
--- a/airflow-core/src/airflow/config_templates/config.yml
+++ b/airflow-core/src/airflow/config_templates/config.yml
@@ -1771,34 +1771,6 @@ webserver:
type: string
example: ~
default: "50"
- navbar_color:
- description: |
- Define the color of navigation bar
- version_added: ~
- type: string
- example: ~
- default: "#fff"
- navbar_text_color:
- description: |
- Define the color of text in the navigation bar
- version_added: 2.8.0
- type: string
- example: ~
- default: "#51504f"
- navbar_hover_color:
- description: |
- Define the color of navigation bar links when hovered
- version_added: 2.9.0
- type: string
- example: ~
- default: "#eee"
- navbar_text_hover_color:
- description: |
- Define the color of text in the navigation bar when hovered
- version_added: 2.9.0
- type: string
- example: ~
- default: "#51504f"
default_wrap:
description: |
Default setting for wrap toggle on DAG code and TI log views.
@@ -1806,13 +1778,6 @@ webserver:
type: boolean
example: ~
default: "False"
- x_frame_enabled:
- description: |
- Allow the UI to be rendered in a frame
- version_added: 1.10.8
- type: boolean
- example: ~
- default: "True"
instance_name:
description: |
Sets a custom page title for the DAGs overview page and site title for
all pages
diff --git a/airflow-core/src/airflow/configuration.py
b/airflow-core/src/airflow/configuration.py
index 592a060307d..aa1a147c3bc 100644
--- a/airflow-core/src/airflow/configuration.py
+++ b/airflow-core/src/airflow/configuration.py
@@ -358,6 +358,10 @@ class AirflowConfigParser(ConfigParser):
("api", "expose_config"): ("webserver", "expose_config", "3.0.1"),
("fab", "access_denied_message"): ("webserver",
"access_denied_message", "3.0.2"),
("fab", "expose_hostname"): ("webserver", "expose_hostname", "3.0.2"),
+ ("fab", "navbar_color"): ("webserver", "navbar_color", "3.0.2"),
+ ("fab", "navbar_text_color"): ("webserver", "navbar_text_color",
"3.0.2"),
+ ("fab", "navbar_hover_color"): ("webserver", "navbar_hover_color",
"3.0.2"),
+ ("fab", "navbar_text_hover_color"): ("webserver",
"navbar_text_hover_color", "3.0.2"),
}
# A mapping of new section -> (old section, since_version).
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
index 809715e9037..9523ab47ad2 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/schemas.gen.ts
@@ -5793,22 +5793,6 @@ export const $BaseNodeResponse = {
export const $ConfigResponse = {
properties: {
- navbar_color: {
- type: "string",
- title: "Navbar Color",
- },
- navbar_text_color: {
- type: "string",
- title: "Navbar Text Color",
- },
- navbar_hover_color: {
- type: "string",
- title: "Navbar Hover Color",
- },
- navbar_text_hover_color: {
- type: "string",
- title: "Navbar Text Hover Color",
- },
page_size: {
type: "integer",
title: "Page Size",
@@ -5867,10 +5851,6 @@ export const $ConfigResponse = {
},
type: "object",
required: [
- "navbar_color",
- "navbar_text_color",
- "navbar_hover_color",
- "navbar_text_hover_color",
"page_size",
"auto_refresh_interval",
"hide_paused_dags_by_default",
diff --git a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
index d3dccd5f902..6f78cfe07da 100644
--- a/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow-core/src/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -1449,10 +1449,6 @@ export type type =
* configuration serializer.
*/
export type ConfigResponse = {
- navbar_color: string;
- navbar_text_color: string;
- navbar_hover_color: string;
- navbar_text_hover_color: string;
page_size: number;
auto_refresh_interval: number;
hide_paused_dags_by_default: boolean;
diff --git a/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts
b/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts
index 79dfc7d634a..cbfb9298f8d 100644
--- a/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts
+++ b/airflow-core/src/airflow/ui/src/mocks/handlers/config.ts
@@ -29,10 +29,6 @@ export const handlers: Array<HttpHandler> = [
hide_paused_dags_by_default: false,
instance_name: "Airflow",
instance_name_has_markup: false,
- navbar_color: "#fff",
- navbar_hover_color: "#eee",
- navbar_text_color: "#51504f",
- navbar_text_hover_color: "#51504f",
page_size: 15,
require_confirmation_dag_change: false,
test_connection: "Disabled",
diff --git
a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py
b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py
index 1deb5f46967..c9987d5d69f 100644
--- a/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py
+++ b/airflow-core/tests/unit/api_fastapi/core_api/routes/ui/test_config.py
@@ -23,10 +23,6 @@ import pytest
pytestmark = pytest.mark.db_test
mock_config_response = {
- "navbar_color": "#fff",
- "navbar_text_color": "#51504f",
- "navbar_hover_color": "#eee",
- "navbar_text_hover_color": "#51504f",
"page_size": 100,
"auto_refresh_interval": 3,
"hide_paused_dags_by_default": False,
@@ -51,10 +47,6 @@ def mock_config_data():
with patch("airflow.configuration.conf.as_dict") as mock_conf:
mock_conf.return_value = {
"webserver": {
- "navbar_color": "#fff",
- "navbar_text_color": "#51504f",
- "navbar_hover_color": "#eee",
- "navbar_text_hover_color": "#51504f",
"page_size": "100",
"auto_refresh_interval": "3",
"hide_paused_dags_by_default": "false",
diff --git a/providers/fab/docs/auth-manager/security.rst
b/providers/fab/docs/auth-manager/security.rst
index cd07d24c556..9f2bf0a9e4c 100644
--- a/providers/fab/docs/auth-manager/security.rst
+++ b/providers/fab/docs/auth-manager/security.rst
@@ -22,17 +22,6 @@ FAB auth manager UI security options
This guide only applies to FAB auth manager UI pages. These pages are
accessible under category "Security" in the
menu.
-Rendering Airflow UI in a Web Frame from another site
-------------------------------------------------------
-
-Using Airflow in a web frame is enabled by default. To disable this (and
prevent click jacking attacks)
-set the below:
-
-.. code-block:: ini
-
- [webserver]
- x_frame_enabled = False
-
Disable Deployment Exposure Warning
---------------------------------------
diff --git a/providers/fab/provider.yaml b/providers/fab/provider.yaml
index 9c7d63f76a6..618a15e95f0 100644
--- a/providers/fab/provider.yaml
+++ b/providers/fab/provider.yaml
@@ -32,7 +32,8 @@ source-date-epoch: 1741121873
# note that those versions are maintained by release manager - do not update
them manually
versions:
- - 2.0.3
+ - 2.2.0
+ - 2.1.0
- 2.0.2
- 2.0.1
- 2.0.0
@@ -57,6 +58,34 @@ config:
fab:
description: This section contains configs specific to FAB provider.
options:
+ navbar_color:
+ description: |
+ Define the color of navigation bar
+ version_added: 2.2.0
+ type: string
+ example: ~
+ default: "#fff"
+ navbar_text_color:
+ description: |
+ Define the color of text in the navigation bar
+ version_added: 2.2.0
+ type: string
+ example: ~
+ default: "#51504f"
+ navbar_hover_color:
+ description: |
+ Define the color of navigation bar links when hovered
+ version_added: 2.2.0
+ type: string
+ example: ~
+ default: "#eee"
+ navbar_text_hover_color:
+ description: |
+ Define the color of text in the navigation bar when hovered
+ version_added: 2.2.0
+ type: string
+ example: ~
+ default: "#51504f"
access_denied_message:
description: |
The message displayed when a user attempts to execute actions beyond
their authorised privileges.
diff --git a/providers/fab/pyproject.toml b/providers/fab/pyproject.toml
index e75eaa30eaa..905be02a20c 100644
--- a/providers/fab/pyproject.toml
+++ b/providers/fab/pyproject.toml
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
[project]
name = "apache-airflow-providers-fab"
-version = "2.0.3"
+version = "2.2.0"
description = "Provider package apache-airflow-providers-fab for Apache
Airflow"
readme = "README.rst"
authors = [
@@ -127,8 +127,8 @@ apache-airflow-providers-common-sql = {workspace = true}
apache-airflow-providers-standard = {workspace = true}
[project.urls]
-"Documentation" =
"https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0.3"
-"Changelog" =
"https://airflow.apache.org/docs/apache-airflow-providers-fab/2.0.3/changelog.html"
+"Documentation" =
"https://airflow.apache.org/docs/apache-airflow-providers-fab/2.2.0"
+"Changelog" =
"https://airflow.apache.org/docs/apache-airflow-providers-fab/2.2.0/changelog.html"
"Bug Tracker" = "https://github.com/apache/airflow/issues"
"Source Code" = "https://github.com/apache/airflow"
"Slack Chat" = "https://s.apache.org/airflow-slack"
diff --git a/providers/fab/src/airflow/providers/fab/__init__.py
b/providers/fab/src/airflow/providers/fab/__init__.py
index daa81fc76b6..3293cf2d8b0 100644
--- a/providers/fab/src/airflow/providers/fab/__init__.py
+++ b/providers/fab/src/airflow/providers/fab/__init__.py
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
__all__ = ["__version__"]
-__version__ = "2.0.3"
+__version__ = "2.2.0"
if
packaging.version.parse(packaging.version.parse(airflow_version).base_version)
< packaging.version.parse(
"3.0.2"
diff --git a/providers/fab/src/airflow/providers/fab/get_provider_info.py
b/providers/fab/src/airflow/providers/fab/get_provider_info.py
index a811deb5cec..21891f7ec15 100644
--- a/providers/fab/src/airflow/providers/fab/get_provider_info.py
+++ b/providers/fab/src/airflow/providers/fab/get_provider_info.py
@@ -30,6 +30,34 @@ def get_provider_info():
"fab": {
"description": "This section contains configs specific to FAB
provider.",
"options": {
+ "navbar_color": {
+ "description": "Define the color of navigation bar\n",
+ "version_added": "2.2.0",
+ "type": "string",
+ "example": None,
+ "default": "#fff",
+ },
+ "navbar_text_color": {
+ "description": "Define the color of text in the
navigation bar\n",
+ "version_added": "2.2.0",
+ "type": "string",
+ "example": None,
+ "default": "#51504f",
+ },
+ "navbar_hover_color": {
+ "description": "Define the color of navigation bar
links when hovered\n",
+ "version_added": "2.2.0",
+ "type": "string",
+ "example": None,
+ "default": "#eee",
+ },
+ "navbar_text_hover_color": {
+ "description": "Define the color of text in the
navigation bar when hovered\n",
+ "version_added": "2.2.0",
+ "type": "string",
+ "example": None,
+ "default": "#51504f",
+ },
"access_denied_message": {
"description": "The message displayed when a user
attempts to execute actions beyond their authorised privileges.\n",
"version_added": "2.0.3",
diff --git a/providers/fab/src/airflow/providers/fab/www/app.py
b/providers/fab/src/airflow/providers/fab/www/app.py
index be29f28bd67..3632cf2df49 100644
--- a/providers/fab/src/airflow/providers/fab/www/app.py
+++ b/providers/fab/src/airflow/providers/fab/www/app.py
@@ -33,7 +33,7 @@ from airflow.logging_config import configure_logging
from airflow.providers.fab.www.extensions.init_appbuilder import
init_appbuilder
from airflow.providers.fab.www.extensions.init_jinja_globals import
init_jinja_globals
from airflow.providers.fab.www.extensions.init_manifest_files import
configure_manifest_files
-from airflow.providers.fab.www.extensions.init_security import init_api_auth,
init_xframe_protection
+from airflow.providers.fab.www.extensions.init_security import init_api_auth
from airflow.providers.fab.www.extensions.init_session import
init_airflow_session_interface
from airflow.providers.fab.www.extensions.init_views import (
init_api_auth_provider,
@@ -101,7 +101,6 @@ def create_app(enable_plugins: bool):
init_api_auth_provider(flask_app)
init_api_error_handlers(flask_app)
init_jinja_globals(flask_app, enable_plugins=enable_plugins)
- init_xframe_protection(flask_app)
init_airflow_session_interface(flask_app)
return flask_app
diff --git
a/providers/fab/src/airflow/providers/fab/www/extensions/init_jinja_globals.py
b/providers/fab/src/airflow/providers/fab/www/extensions/init_jinja_globals.py
index 35aa5c71413..6ef21a18502 100644
---
a/providers/fab/src/airflow/providers/fab/www/extensions/init_jinja_globals.py
+++
b/providers/fab/src/airflow/providers/fab/www/extensions/init_jinja_globals.py
@@ -52,10 +52,10 @@ def init_jinja_globals(app, enable_plugins: bool):
extra_globals = {
"server_timezone": server_timezone,
"hostname": hostname,
- "navbar_color": conf.get("webserver", "NAVBAR_COLOR"),
- "navbar_text_color": conf.get("webserver", "NAVBAR_TEXT_COLOR"),
- "navbar_hover_color": conf.get("webserver", "NAVBAR_HOVER_COLOR"),
- "navbar_text_hover_color": conf.get("webserver",
"NAVBAR_TEXT_HOVER_COLOR"),
+ "navbar_color": conf.get("fab", "NAVBAR_COLOR"),
+ "navbar_text_color": conf.get("fab", "NAVBAR_TEXT_COLOR"),
+ "navbar_hover_color": conf.get("fab", "NAVBAR_HOVER_COLOR"),
+ "navbar_text_hover_color": conf.get("fab",
"NAVBAR_TEXT_HOVER_COLOR"),
"airflow_version": airflow_version,
"git_version": git_version,
"show_plugin_message": enable_plugins,
diff --git
a/providers/fab/src/airflow/providers/fab/www/extensions/init_security.py
b/providers/fab/src/airflow/providers/fab/www/extensions/init_security.py
index 6f628808080..8d85885d4ab 100644
--- a/providers/fab/src/airflow/providers/fab/www/extensions/init_security.py
+++ b/providers/fab/src/airflow/providers/fab/www/extensions/init_security.py
@@ -25,25 +25,6 @@ from airflow.exceptions import AirflowException
log = logging.getLogger(__name__)
-def init_xframe_protection(app):
- """
- Add X-Frame-Options header.
-
- Use it to avoid click-jacking attacks, by ensuring that their content is
not embedded into other sites.
-
- See also:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
- """
- x_frame_enabled = conf.getboolean("webserver", "X_FRAME_ENABLED",
fallback=True)
- if x_frame_enabled:
- return
-
- def apply_caching(response):
- response.headers["X-Frame-Options"] = "DENY"
- return response
-
- app.after_request(apply_caching)
-
-
def init_api_auth(app):
"""Load authentication backends."""
auth_backends = conf.get(
diff --git a/providers/fab/tests/unit/fab/decorators.py
b/providers/fab/tests/unit/fab/decorators.py
index f359563e2ea..77c9b077e77 100644
--- a/providers/fab/tests/unit/fab/decorators.py
+++ b/providers/fab/tests/unit/fab/decorators.py
@@ -37,7 +37,6 @@ def dont_initialize_flask_app_submodules(_func=None, *,
skip_all_except=None):
"init_api_auth_provider",
"init_api_error_handlers",
"init_jinja_globals",
- "init_xframe_protection",
"init_airflow_session_interface",
"init_appbuilder",
]
diff --git a/pyproject.toml b/pyproject.toml
index 92c3010f1d8..a9d2e33b2c8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -209,7 +209,7 @@ packages = []
"apache-airflow-providers-exasol>=4.6.1"
]
"fab" = [
- "apache-airflow-providers-fab>=2.0.3" # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
+ "apache-airflow-providers-fab>=2.2.0" # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
]
"facebook" = [
"apache-airflow-providers-facebook>=3.7.0"
@@ -418,7 +418,7 @@ packages = []
"apache-airflow-providers-edge3>=1.0.0",
"apache-airflow-providers-elasticsearch>=5.5.2",
"apache-airflow-providers-exasol>=4.6.1",
- "apache-airflow-providers-fab>=2.0.3", # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
+ "apache-airflow-providers-fab>=2.2.0", # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
"apache-airflow-providers-facebook>=3.7.0",
"apache-airflow-providers-ftp>=3.12.0",
"apache-airflow-providers-git>=0.0.2", # Set from MIN_VERSION_OVERRIDE in
update_airflow_pyproject_toml.py
diff --git a/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
b/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
index 9f77d05deb1..6dc8853026f 100755
--- a/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
+++ b/scripts/ci/pre_commit/update_airflow_pyproject_toml.py
@@ -56,7 +56,7 @@ CUT_OFF_TIMEDELTA = timedelta(days=6 * 30)
# minimum versions for compatibility with Airflow 3
MIN_VERSION_OVERRIDE: dict[str, Version] = {
"amazon": parse_version("2.1.3"),
- "fab": parse_version("2.0.3"),
+ "fab": parse_version("2.2.0"),
"openlineage": parse_version("2.1.3"),
"git": parse_version("0.0.2"),
"common.messaging": parse_version("1.0.1"),