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 bd3dca49c15 fix(providers/google): support sovereign console links 
(#70001)
bd3dca49c15 is described below

commit bd3dca49c15e71558313616a50315181c1bb2078
Author: auyua9 <[email protected]>
AuthorDate: Wed Aug 19 03:20:15 2026 +0800

    fix(providers/google): support sovereign console links (#70001)
---
 .../google/src/airflow/providers/google/cloud/bundles/gcs.py  |  2 +-
 .../providers/google/cloud/log/stackdriver_task_handler.py    |  6 ++++--
 providers/google/tests/unit/google/cloud/bundles/test_gcs.py  | 11 +++++++++++
 .../unit/google/cloud/log/test_stackdriver_task_handler.py    |  5 +++--
 4 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/providers/google/src/airflow/providers/google/cloud/bundles/gcs.py 
b/providers/google/src/airflow/providers/google/cloud/bundles/gcs.py
index e9806276a82..adb394ea103 100644
--- a/providers/google/src/airflow/providers/google/cloud/bundles/gcs.py
+++ b/providers/google/src/airflow/providers/google/cloud/bundles/gcs.py
@@ -154,7 +154,7 @@ class GCSDagBundle(BaseDagBundle):
             # _view_url_template attribute. Should be removed when we drop 
support for Airflow 3.0
             return self._view_url_template
         # 
https://console.cloud.google.com/storage/browser/<bucket-name>/<prefix>
-        url = 
f"https://console.cloud.google.com/storage/browser/{self.bucket_name}";
+        url = 
f"https://console.cloud.{GoogleBaseHook.get_high_value_cookie_domain()}/storage/browser/{self.bucket_name}"
         if self.prefix:
             url += f"/{self.prefix}"
 
diff --git 
a/providers/google/src/airflow/providers/google/cloud/log/stackdriver_task_handler.py
 
b/providers/google/src/airflow/providers/google/cloud/log/stackdriver_task_handler.py
index 6c1772a8849..e6cb6c7e2c2 100644
--- 
a/providers/google/src/airflow/providers/google/cloud/log/stackdriver_task_handler.py
+++ 
b/providers/google/src/airflow/providers/google/cloud/log/stackdriver_task_handler.py
@@ -45,6 +45,7 @@ from airflow.exceptions import 
AirflowProviderDeprecationWarning
 from airflow.providers.common.compat.sdk import conf
 from airflow.providers.google.cloud.utils.credentials_provider import 
get_credentials_and_project_id
 from airflow.providers.google.common.consts import CLIENT_INFO
+from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
 from airflow.providers.google.version_compat import AIRFLOW_V_3_0_PLUS
 from airflow.utils.log.file_task_handler import FileTaskHandler
 from airflow.utils.log.logging_mixin import LoggingMixin
@@ -362,7 +363,7 @@ class StackdriverTaskHandler(logging.Handler):
     LABEL_DAG_ID = LABEL_DAG_ID
     LABEL_LOGICAL_DATE = LABEL_LOGICAL_DATE
     LABEL_TRY_NUMBER = LABEL_TRY_NUMBER
-    LOG_VIEWER_BASE_URL = "https://console.cloud.google.com/logs/viewer";
+    LOG_VIEWER_BASE_URL = "https://console.cloud.{domain}/logs/viewer";
     LOG_NAME = "Google Stackdriver"
 
     trigger_supported = True
@@ -545,7 +546,8 @@ class StackdriverTaskHandler(logging.Handler):
             "advancedFilter": log_filter,
         }
 
-        url = f"{self.LOG_VIEWER_BASE_URL}?{urlencode(url_query_string)}"
+        log_viewer_url = 
self.LOG_VIEWER_BASE_URL.format(domain=GoogleBaseHook.get_high_value_cookie_domain())
+        url = f"{log_viewer_url}?{urlencode(url_query_string)}"
         return url
 
     def close(self) -> None:
diff --git a/providers/google/tests/unit/google/cloud/bundles/test_gcs.py 
b/providers/google/tests/unit/google/cloud/bundles/test_gcs.py
index 12a9b1ca549..07b46265923 100644
--- a/providers/google/tests/unit/google/cloud/bundles/test_gcs.py
+++ b/providers/google/tests/unit/google/cloud/bundles/test_gcs.py
@@ -70,6 +70,17 @@ class TestGCSDagBundle:
             url == 
f"https://console.cloud.google.com/storage/browser/{GCS_BUCKET_NAME}/{GCS_BUCKET_PREFIX}";
         )
 
+    def test_view_url_template_uses_high_value_cookie_domain(self, 
monkeypatch):
+        monkeypatch.setenv("GOOGLE_CLOUD_HIGH_VALUE_COOKIE_DOMAIN", 
"googleapis.cn")
+        bundle = GCSDagBundle(
+            name="test", gcp_conn_id=GCP_CONN_ID, prefix=GCS_BUCKET_PREFIX, 
bucket_name=GCS_BUCKET_NAME
+        )
+
+        assert (
+            bundle.view_url_template()
+            == 
f"https://console.cloud.googleapis.cn/storage/browser/{GCS_BUCKET_NAME}/{GCS_BUCKET_PREFIX}";
+        )
+
     def test_supports_versioning(self):
         bundle = GCSDagBundle(
             name="test", gcp_conn_id=GCP_CONN_ID, prefix=GCS_BUCKET_PREFIX, 
bucket_name=GCS_BUCKET_NAME
diff --git 
a/providers/google/tests/unit/google/cloud/log/test_stackdriver_task_handler.py 
b/providers/google/tests/unit/google/cloud/log/test_stackdriver_task_handler.py
index c66ff24421b..d93030bfcaf 100644
--- 
a/providers/google/tests/unit/google/cloud/log/test_stackdriver_task_handler.py
+++ 
b/providers/google/tests/unit/google/cloud/log/test_stackdriver_task_handler.py
@@ -755,8 +755,9 @@ class TestStackdriverLoggingHandlerTask:
 
     
@mock.patch("airflow.providers.google.cloud.log.stackdriver_task_handler.get_credentials_and_project_id")
     
@mock.patch("airflow.providers.google.cloud.log.stackdriver_task_handler.LoggingServiceV2Client")
-    def test_should_return_valid_external_url(self, mock_client, 
mock_get_creds_and_project_id):
+    def test_should_return_valid_external_url(self, mock_client, 
mock_get_creds_and_project_id, monkeypatch):
         mock_get_creds_and_project_id.return_value = ("creds", "project_id")
+        monkeypatch.setenv("GOOGLE_CLOUD_HIGH_VALUE_COOKIE_DOMAIN", 
"googleapis.cn")
 
         stackdriver_task_handler = 
StackdriverTaskHandler(gcp_key_path="KEY_PATH")
         url = stackdriver_task_handler.get_external_log_url(self.ti, 
self.ti.try_number)
@@ -764,7 +765,7 @@ class TestStackdriverLoggingHandlerTask:
         parsed_url = urlsplit(url)
         parsed_qs = parse_qs(parsed_url.query)
         assert parsed_url.scheme == "https"
-        assert parsed_url.netloc == "console.cloud.google.com"
+        assert parsed_url.netloc == "console.cloud.googleapis.cn"
         assert parsed_url.path == "/logs/viewer"
         assert {"project", "interval", "resource", "advancedFilter"} == 
set(parsed_qs.keys())
         assert "global" in parsed_qs["resource"]

Reply via email to