This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new f5d652a8957 fix apache beam provider with missing google provider 
(#54982)
f5d652a8957 is described below

commit f5d652a8957a0914cb53fc09afd46714d38c86b8
Author: olegkachur-e <[email protected]>
AuthorDate: Wed Aug 27 13:27:53 2025 +0000

    fix apache beam provider with missing google provider (#54982)
    
    When google-provider is not installed, the 'parse_version("")' renders an 
error.
    
    Refactor to:
    
    - Do not rely on a specific provider version in conditions,
     as there is no guarantee for features to be released in both providers 
simultaneously.
    
    - Brake logic of google provider installation exists and usage
     of the newer DataflowJobStateCompleteTrigger into two separate flags.
    
    Co-authored-by: Oleg Kachur <[email protected]>
---
 .../providers/apache/beam/operators/beam.py        | 30 ++++++++++++----------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git 
a/providers/apache/beam/src/airflow/providers/apache/beam/operators/beam.py 
b/providers/apache/beam/src/airflow/providers/apache/beam/operators/beam.py
index 85d858ff45c..7765e951f41 100644
--- a/providers/apache/beam/src/airflow/providers/apache/beam/operators/beam.py
+++ b/providers/apache/beam/src/airflow/providers/apache/beam/operators/beam.py
@@ -30,8 +30,6 @@ from contextlib import ExitStack
 from functools import partial
 from typing import TYPE_CHECKING, Any
 
-from packaging.version import parse as parse_version
-
 from airflow.configuration import conf
 from airflow.exceptions import AirflowException, 
AirflowOptionalProviderFeatureException
 from airflow.providers.apache.beam.hooks.beam import BeamHook, BeamRunnerType
@@ -44,8 +42,10 @@ from airflow.version import version
 if TYPE_CHECKING:
     from airflow.utils.context import Context
 
+GOOGLE_PROVIDER = 
ProvidersManager().providers.get("apache-airflow-providers-google")
+
 
-try:
+if GOOGLE_PROVIDER:
     from airflow.providers.google.cloud.hooks.dataflow import (
         DEFAULT_DATAFLOW_LOCATION,
         DataflowHook,
@@ -55,14 +55,16 @@ try:
     from airflow.providers.google.cloud.links.dataflow import DataflowJobLink
     from airflow.providers.google.cloud.operators.dataflow import 
CheckJobRunning, DataflowConfiguration
     from airflow.providers.google.cloud.triggers.dataflow import (
-        DataflowJobStateCompleteTrigger,
         DataflowJobStatus,
         DataflowJobStatusTrigger,
     )
 
-    GOOGLE_PROVIDER_VERSION = 
ProvidersManager().providers["apache-airflow-providers-google"].version
-except ImportError:
-    GOOGLE_PROVIDER_VERSION = ""
+    try:
+        from airflow.providers.google.cloud.triggers.dataflow import 
DataflowJobStateCompleteTrigger
+
+        GOOGLE_PROVIDER_DATAFLOW_JOB_STATE_COMPLETE_TRIGGER_AVAILABLE = True
+    except ImportError:
+        GOOGLE_PROVIDER_DATAFLOW_JOB_STATE_COMPLETE_TRIGGER_AVAILABLE = False
 
 
 class BeamDataflowMixin(metaclass=ABCMeta):
@@ -80,7 +82,7 @@ class BeamDataflowMixin(metaclass=ABCMeta):
     dataflow_support_impersonation: bool = True
 
     def __init__(self):
-        if not GOOGLE_PROVIDER_VERSION:
+        if not GOOGLE_PROVIDER:
             raise AirflowOptionalProviderFeatureException(
                 "Failed to import apache-airflow-google-provider. To use the 
dataflow service please install "
                 "the appropriate version of the google provider."
@@ -346,7 +348,7 @@ class 
BeamRunPythonPipelineOperator(BeamBasePipelineOperator):
         "dataflow_config",
     )
     template_fields_renderers = {"dataflow_config": "json", 
"pipeline_options": "json"}
-    operator_extra_links = (DataflowJobLink(),) if GOOGLE_PROVIDER_VERSION 
else ()
+    operator_extra_links = (DataflowJobLink(),) if GOOGLE_PROVIDER else ()
 
     def __init__(
         self,
@@ -462,7 +464,8 @@ class 
BeamRunPythonPipelineOperator(BeamBasePipelineOperator):
                 "gcp_conn_id": self.gcp_conn_id,
             }
             trigger: DataflowJobStatusTrigger | DataflowJobStateCompleteTrigger
-            if parse_version(GOOGLE_PROVIDER_VERSION) < 
parse_version("16.0.0"):
+
+            if GOOGLE_PROVIDER_DATAFLOW_JOB_STATE_COMPLETE_TRIGGER_AVAILABLE:
                 trigger = DataflowJobStatusTrigger(
                     expected_statuses={DataflowJobStatus.JOB_STATE_DONE},
                     **trigger_args,
@@ -534,7 +537,7 @@ class BeamRunJavaPipelineOperator(BeamBasePipelineOperator):
     template_fields_renderers = {"dataflow_config": "json", 
"pipeline_options": "json"}
     ui_color = "#0273d4"
 
-    operator_extra_links = (DataflowJobLink(),) if GOOGLE_PROVIDER_VERSION 
else ()
+    operator_extra_links = (DataflowJobLink(),) if GOOGLE_PROVIDER else ()
 
     def __init__(
         self,
@@ -638,7 +641,8 @@ class BeamRunJavaPipelineOperator(BeamBasePipelineOperator):
                         "gcp_conn_id": self.gcp_conn_id,
                     }
                     trigger: DataflowJobStatusTrigger | 
DataflowJobStateCompleteTrigger
-                    if parse_version(GOOGLE_PROVIDER_VERSION) < 
parse_version("16.0.0"):
+
+                    if 
GOOGLE_PROVIDER_DATAFLOW_JOB_STATE_COMPLETE_TRIGGER_AVAILABLE:
                         trigger = DataflowJobStatusTrigger(
                             
expected_statuses={DataflowJobStatus.JOB_STATE_DONE},
                             **trigger_args,
@@ -719,7 +723,7 @@ class BeamRunGoPipelineOperator(BeamBasePipelineOperator):
         "dataflow_config",
     ]
     template_fields_renderers = {"dataflow_config": "json", 
"pipeline_options": "json"}
-    operator_extra_links = (DataflowJobLink(),) if GOOGLE_PROVIDER_VERSION 
else ()
+    operator_extra_links = (DataflowJobLink(),) if GOOGLE_PROVIDER else ()
 
     def __init__(
         self,

Reply via email to