Skip to content

Commit b7e059b

Browse files
committed
Run fab provider tests in v2-11-test
Since we are releasing fab provider from v2-11-test we should also run fab provider tests there. This chang consists of: * migrating to FAB 4.5.3 (includes scrypt algorithm fix) * monkeypatching flask-session so that it works well with new flask-sqlalchey * caching initial$aization of Session class from flask-session and AirflowDatabaseSessionInterface so that DB connection is not created multiple times during tests * fixing imports from tests
1 parent 1d9cf9e commit b7e059b

File tree

57 files changed

+298
-567
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+298
-567
lines changed

.github/workflows/ci.yml

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -466,26 +466,26 @@ jobs:
466466
debug-resources: ${{ needs.build-info.outputs.debug-resources }}
467467
use-uv: ${{ needs.build-info.outputs.use-uv }}
468468

469-
tests-integration-system:
470-
name: Integration and System Tests
471-
needs: [build-info, build-ci-images]
472-
uses: ./.github/workflows/integration-system-tests.yml
473-
permissions:
474-
contents: read
475-
packages: read
476-
with:
477-
runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
478-
testable-core-integrations: ${{ needs.build-info.outputs.testable-core-integrations }}
479-
testable-providers-integrations: ${{ needs.build-info.outputs.testable-providers-integrations }}
480-
run-system-tests: ${{ needs.build-info.outputs.run-tests }}
481-
default-python-version: ${{ needs.build-info.outputs.default-python-version }}
482-
default-postgres-version: ${{ needs.build-info.outputs.default-postgres-version }}
483-
default-mysql-version: ${{ needs.build-info.outputs.default-mysql-version }}
484-
skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
485-
run-coverage: ${{ needs.build-info.outputs.run-coverage }}
486-
debug-resources: ${{ needs.build-info.outputs.debug-resources }}
487-
use-uv: ${{ needs.build-info.outputs.use-uv }}
488-
if: needs.build-info.outputs.run-tests == 'true'
469+
# tests-integration-system:
470+
# name: Integration and System Tests
471+
# needs: [build-info, build-ci-images]
472+
# uses: ./.github/workflows/integration-system-tests.yml
473+
# permissions:
474+
# contents: read
475+
# packages: read
476+
# with:
477+
# runs-on-as-json-public: ${{ needs.build-info.outputs.runs-on-as-json-public }}
478+
# testable-core-integrations: ${{ needs.build-info.outputs.testable-core-integrations }}
479+
# testable-providers-integrations: ${{ needs.build-info.outputs.testable-providers-integrations }}
480+
# run-system-tests: ${{ needs.build-info.outputs.run-tests }}
481+
# default-python-version: ${{ needs.build-info.outputs.default-python-version }}
482+
# default-postgres-version: ${{ needs.build-info.outputs.default-postgres-version }}
483+
# default-mysql-version: ${{ needs.build-info.outputs.default-mysql-version }}
484+
# skip-providers-tests: ${{ needs.build-info.outputs.skip-providers-tests }}
485+
# run-coverage: ${{ needs.build-info.outputs.run-coverage }}
486+
# debug-resources: ${{ needs.build-info.outputs.debug-resources }}
487+
# use-uv: ${{ needs.build-info.outputs.use-uv }}
488+
# if: needs.build-info.outputs.run-tests == 'true'
489489

490490
tests-with-lowest-direct-resolution:
491491
name: "Lowest direct dependency providers tests"

.github/workflows/test-provider-packages.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,12 @@ jobs:
9999
- name: "Prepare provider documentation"
100100
run: >
101101
breeze release-management prepare-provider-documentation --include-not-ready-providers
102-
--non-interactive
102+
--non-interactive fab
103103
if: matrix.package-format == 'wheel'
104104
- name: "Prepare provider packages: ${{ matrix.package-format }}"
105105
run: >
106106
breeze release-management prepare-provider-packages --include-not-ready-providers
107-
--version-suffix-for-pypi dev0 --package-format ${{ matrix.package-format }}
107+
--version-suffix-for-pypi dev0 --package-format ${{ matrix.package-format }} fab
108108
- name: "Prepare airflow package: ${{ matrix.package-format }}"
109109
run: >
110110
breeze release-management prepare-airflow-package --version-suffix-for-pypi dev0

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,7 @@ repos:
11111111
stages: ['manual']
11121112
name: Run mypy for providers (manual)
11131113
language: python
1114-
entry: ./scripts/ci/pre_commit/mypy_folder.py providers/src/airflow/providers
1114+
entry: ./scripts/ci/pre_commit/mypy_folder.py airflow/providers/fab
11151115
pass_filenames: false
11161116
files: ^.*\.py$
11171117
require_serial: true

airflow/api_connexion/security.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,14 @@
4545

4646
def check_authentication() -> None:
4747
"""Check that the request has valid authorization information."""
48-
for auth in get_airflow_app().api_auth:
48+
airflow_app = get_airflow_app()
49+
for auth in airflow_app.api_auth:
4950
response = auth.requires_authentication(Response)()
5051
if response.status_code == 200:
5152
return
5253

5354
# Even if the current_user is anonymous, the AUTH_ROLE_PUBLIC might still have permission.
54-
appbuilder = get_airflow_app().appbuilder
55+
appbuilder = airflow_app.appbuilder
5556
if appbuilder.get_app.config.get("AUTH_ROLE_PUBLIC", None):
5657
return
5758

airflow/providers/fab/auth_manager/cli_commands/db_command.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
from __future__ import annotations
1818

1919
from airflow import settings
20-
from airflow.cli.commands.db_command import run_db_downgrade_command, run_db_migrate_command
20+
from airflow.cli.commands.db_command import ( # type:ignore [attr-defined]
21+
run_db_downgrade_command,
22+
run_db_migrate_command,
23+
)
2124
from airflow.providers.fab.auth_manager.models.db import _REVISION_HEADS_MAP, FABDBManager
2225
from airflow.utils import cli as cli_utils
2326
from airflow.utils.providers_configuration_loader import providers_configuration_loaded

airflow/providers/fab/auth_manager/cli_commands/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def _return_appbuilder(app: Flask) -> AirflowAppBuilder:
4242
"""Return an appbuilder instance for the given app."""
4343
init_appbuilder(app)
4444
init_plugins(app)
45-
init_airflow_session_interface(app)
45+
init_airflow_session_interface(app, None)
4646
return app.appbuilder # type: ignore[attr-defined]
4747

4848

airflow/providers/fab/auth_manager/fab_auth_manager.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595
)
9696
from airflow.providers.common.compat.assets import AssetDetails
9797
from airflow.providers.fab.auth_manager.security_manager.override import FabAirflowSecurityManagerOverride
98-
from airflow.security.permissions import RESOURCE_ASSET
98+
from airflow.security.permissions import RESOURCE_ASSET # type: ignore[attr-defined]
9999
else:
100100
from airflow.providers.common.compat.security.permissions import RESOURCE_ASSET
101101

@@ -403,9 +403,7 @@ def get_url_logout(self):
403403

404404
def get_url_user_profile(self) -> str | None:
405405
"""Return the url to a page displaying info about the current user."""
406-
if not self.security_manager.user_view or self.appbuilder.get_app.config.get(
407-
"AUTH_ROLE_PUBLIC", None
408-
):
406+
if not self.security_manager.user_view:
409407
return None
410408
return url_for(f"{self.security_manager.user_view.endpoint}.userinfo")
411409

airflow/providers/fab/auth_manager/security_manager/override.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@
6969
from flask_login import LoginManager
7070
from itsdangerous import want_bytes
7171
from markupsafe import Markup
72-
from packaging.version import Version
7372
from sqlalchemy import and_, func, inspect, literal, or_, select
7473
from sqlalchemy.exc import MultipleResultsFound
7574
from sqlalchemy.orm import Session, joinedload
@@ -850,7 +849,8 @@ def _init_config(self):
850849
app.config.setdefault("AUTH_ROLES_SYNC_AT_LOGIN", False)
851850
app.config.setdefault("AUTH_API_LOGIN_ALLOW_MULTIPLE_PROVIDERS", False)
852851

853-
# Werkzeug prior to 3.0.0 does not support scrypt
852+
from packaging.version import Version
853+
854854
parsed_werkzeug_version = Version(importlib.metadata.version("werkzeug"))
855855
if parsed_werkzeug_version < Version("3.0.0"):
856856
app.config.setdefault(
@@ -861,9 +861,10 @@ def _init_config(self):
861861
else:
862862
app.config.setdefault(
863863
"AUTH_DB_FAKE_PASSWORD_HASH_CHECK",
864-
"scrypt:32768:8:1$wiDa0ruWlIPhp9LM$6e409d093e62ad54df2af895d0e125b05ff6cf6414"
865-
"8350189ffc4bcc71286edf1b8ad94a442c00f890224bf2b32153d0750c89ee9"
866-
"401e62f9dcee5399065e4e5",
864+
"scrypt:32768:8:1$wiDa0ruWlIPhp9LM$6e40"
865+
"9d093e62ad54df2af895d0e125b05ff6cf6414"
866+
"8350189ffc4bcc71286edf1b8ad94a442c00f8"
867+
"90224bf2b32153d0750c89ee9401e62f9dcee5399065e4e5",
867868
)
868869

869870
# LDAP Config

airflow/providers/fab/provider.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ dependencies:
6262
# Every time we update FAB version here, please make sure that you review the classes and models in
6363
# `airflow/providers/fab/auth_manager/security_manager/override.py` with their upstream counterparts.
6464
# In particular, make sure any breaking changes, for example any new methods, are accounted for.
65-
- flask-appbuilder==4.5.3
65+
- flask-appbuilder==4.5.4
6666
- google-re2>=1.0
6767
- jmespath>=0.7.0
6868

airflow/www/app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def create_app(config=None, testing=False):
187187
init_jinja_globals(flask_app)
188188
init_xframe_protection(flask_app)
189189
init_cache_control(flask_app)
190-
init_airflow_session_interface(flask_app)
190+
init_airflow_session_interface(flask_app, db)
191191
init_check_user_active(flask_app)
192192
return flask_app
193193

0 commit comments

Comments
 (0)