From cb261114968c9996a78aa4337a3f376e35204bb9 Mon Sep 17 00:00:00 2001 From: Bhavani Ravi Date: Thu, 23 Oct 2025 05:19:02 +0530 Subject: [PATCH 1/2] Migrate Docker provider to common.compat --- providers/docker/pyproject.toml | 1 + .../airflow/providers/docker/decorators/docker.py | 7 +------ .../src/airflow/providers/docker/hooks/docker.py | 4 ++-- .../airflow/providers/docker/operators/docker.py | 4 ++-- .../providers/docker/operators/docker_swarm.py | 6 +----- .../src/airflow/providers/docker/version_compat.py | 14 -------------- 6 files changed, 7 insertions(+), 29 deletions(-) diff --git a/providers/docker/pyproject.toml b/providers/docker/pyproject.toml index 3454bb9da070a..773ed98fa38d7 100644 --- a/providers/docker/pyproject.toml +++ b/providers/docker/pyproject.toml @@ -58,6 +58,7 @@ requires-python = ">=3.10" # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build`` dependencies = [ "apache-airflow>=2.10.0", + "apache-airflow-providers-common-compat>=1.8.0", "docker>=7.1.0", "python-dotenv>=0.21.0", ] diff --git a/providers/docker/src/airflow/providers/docker/decorators/docker.py b/providers/docker/src/airflow/providers/docker/decorators/docker.py index 807902d5e8170..c64c9560b592b 100644 --- a/providers/docker/src/airflow/providers/docker/decorators/docker.py +++ b/providers/docker/src/airflow/providers/docker/decorators/docker.py @@ -35,14 +35,9 @@ if TYPE_CHECKING: from typing import Literal + from airflow.providers.common.compat.sdk import Context from airflow.sdk.bases.decorator import TaskDecorator - if AIRFLOW_V_3_0_PLUS: - from airflow.sdk.definitions.context import Context - else: - # TODO: Remove once provider drops support for Airflow 2 - from airflow.utils.context import Context - Serializer = Literal["pickle", "dill", "cloudpickle"] try: diff --git a/providers/docker/src/airflow/providers/docker/hooks/docker.py b/providers/docker/src/airflow/providers/docker/hooks/docker.py index 452a45b83fb20..5f1a02f5830c3 100644 --- a/providers/docker/src/airflow/providers/docker/hooks/docker.py +++ b/providers/docker/src/airflow/providers/docker/hooks/docker.py @@ -27,10 +27,10 @@ from docker.errors import APIError, DockerException from airflow.exceptions import AirflowException, AirflowNotFoundException -from airflow.providers.docker.version_compat import BaseHook +from airflow.providers.common.compat.sdk import BaseHook if TYPE_CHECKING: - from airflow.models import Connection + from airflow.providers.common.compat.sdk import Connection class DockerHook(BaseHook): diff --git a/providers/docker/src/airflow/providers/docker/operators/docker.py b/providers/docker/src/airflow/providers/docker/operators/docker.py index dc8065d79cc6d..a2469bbfca56a 100644 --- a/providers/docker/src/airflow/providers/docker/operators/docker.py +++ b/providers/docker/src/airflow/providers/docker/operators/docker.py @@ -34,18 +34,18 @@ from docker.types import LogConfig, Mount, Ulimit from dotenv import dotenv_values +from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.docker.exceptions import ( DockerContainerFailedException, DockerContainerFailedSkipException, ) from airflow.providers.docker.hooks.docker import DockerHook -from airflow.providers.docker.version_compat import BaseOperator if TYPE_CHECKING: from docker import APIClient from docker.types import DeviceRequest - from airflow.sdk.definitions.context import Context + from airflow.providers.common.compat.sdk import Context from airflow.sdk.types import Logger diff --git a/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py b/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py index b5a3119b37d2f..dea49f36f2e39 100644 --- a/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py +++ b/providers/docker/src/airflow/providers/docker/operators/docker_swarm.py @@ -32,11 +32,7 @@ from airflow.utils.strings import get_random_string if TYPE_CHECKING: - try: - from airflow.sdk.definitions.context import Context - except ImportError: - # TODO: Remove once provider drops support for Airflow 2 - from airflow.utils.context import Context + from airflow.providers.common.compat.sdk import Context class DockerSwarmOperator(DockerOperator): diff --git a/providers/docker/src/airflow/providers/docker/version_compat.py b/providers/docker/src/airflow/providers/docker/version_compat.py index 9ce966132fd6c..a4fae50317e81 100644 --- a/providers/docker/src/airflow/providers/docker/version_compat.py +++ b/providers/docker/src/airflow/providers/docker/version_compat.py @@ -35,21 +35,7 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]: AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0) AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0) -# Version-compatible imports -# BaseOperator: Use 3.1+ due to xcom_push method missing in SDK BaseOperator 3.0.x -# This is needed for DecoratedOperator compatibility -if AIRFLOW_V_3_1_PLUS: - from airflow.sdk import ( - BaseHook, - BaseOperator, - ) -else: - from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef] - from airflow.models import BaseOperator - __all__ = [ "AIRFLOW_V_3_0_PLUS", "AIRFLOW_V_3_1_PLUS", - "BaseHook", - "BaseOperator", ] From 7081c162612d17bc93b9607e21935ce94b549b85 Mon Sep 17 00:00:00 2001 From: Bhavani Ravi Date: Fri, 24 Oct 2025 09:42:43 +0530 Subject: [PATCH 2/2] chore: keep BaseOperator in version compat --- .../src/airflow/providers/docker/operators/docker.py | 2 +- .../src/airflow/providers/docker/version_compat.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/providers/docker/src/airflow/providers/docker/operators/docker.py b/providers/docker/src/airflow/providers/docker/operators/docker.py index a2469bbfca56a..045c82d807a8f 100644 --- a/providers/docker/src/airflow/providers/docker/operators/docker.py +++ b/providers/docker/src/airflow/providers/docker/operators/docker.py @@ -34,12 +34,12 @@ from docker.types import LogConfig, Mount, Ulimit from dotenv import dotenv_values -from airflow.providers.common.compat.sdk import BaseOperator from airflow.providers.docker.exceptions import ( DockerContainerFailedException, DockerContainerFailedSkipException, ) from airflow.providers.docker.hooks.docker import DockerHook +from airflow.providers.docker.version_compat import BaseOperator if TYPE_CHECKING: from docker import APIClient diff --git a/providers/docker/src/airflow/providers/docker/version_compat.py b/providers/docker/src/airflow/providers/docker/version_compat.py index a4fae50317e81..29c46806a0a6e 100644 --- a/providers/docker/src/airflow/providers/docker/version_compat.py +++ b/providers/docker/src/airflow/providers/docker/version_compat.py @@ -35,7 +35,18 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]: AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0) AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0) +# Version-compatible imports +# BaseOperator: Use 3.1+ due to xcom_push method missing in SDK BaseOperator 3.0.x +# This is needed for DecoratedOperator compatibility +if AIRFLOW_V_3_1_PLUS: + from airflow.sdk import ( + BaseOperator, + ) +else: + from airflow.models import BaseOperator + __all__ = [ "AIRFLOW_V_3_0_PLUS", "AIRFLOW_V_3_1_PLUS", + "BaseOperator", ]