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

eladkal 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 8ee215945aa Apply timeout_seconds and connection proxies to dbt Cloud 
sync requests (#74684)
8ee215945aa is described below

commit 8ee215945aaac87433f4398b05aed6e2b4e10338
Author: Hemkumar Chheda <[email protected]>
AuthorDate: Thu Nov 5 11:06:48 2026 +0530

    Apply timeout_seconds and connection proxies to dbt Cloud sync requests 
(#74684)
    
    Since apache-airflow-providers-http 5.3.2, HttpHook.run() reads the timeout
    from self.merged_extra (#51893) and proxies from session.proxies (#51746).
    Both are set by HttpHook.get_conn(), which DbtCloudHook overrides, so dbt
    Cloud requests went out with no timeout and without the connection's
    proxies. A request whose response never arrived blocked the task forever.
    
    closes: #74678
    
    Co-authored-by: Claude <[email protected]>
---
 .../dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py  |  8 +++++++-
 providers/dbt/cloud/tests/unit/dbt/cloud/hooks/test_dbt.py  | 13 +++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py 
b/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py
index b0d64de7b0c..bd6f66a40af 100644
--- a/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py
+++ b/providers/dbt/cloud/src/airflow/providers/dbt/cloud/hooks/dbt.py
@@ -404,13 +404,19 @@ class DbtCloudHook(HttpHook):
             self.__dict__["connection"] = self._require_password(conn)
         return self.__dict__["connection"]
 
-    def get_conn(self, *args, **kwargs) -> Session:
+    def get_conn(
+        self, headers: dict[Any, Any] | None = None, extra_options: dict[str, 
Any] | None = None
+    ) -> Session:
         tenant = self._get_tenant_domain(self.connection)
         self.base_url = f"https://{tenant}/";
 
         session = Session()
         session.auth = self.auth_type(self.connection.password)
 
+        # HttpHook.run() reads the timeout from self.merged_extra and proxies 
from the session.
+        self.merged_extra = dict(extra_options or {})
+        session.proxies = self.merged_extra.get("proxies", {})
+
         return session
 
     def _paginate(
diff --git a/providers/dbt/cloud/tests/unit/dbt/cloud/hooks/test_dbt.py 
b/providers/dbt/cloud/tests/unit/dbt/cloud/hooks/test_dbt.py
index 59fd1c953c7..f7faedce5a8 100644
--- a/providers/dbt/cloud/tests/unit/dbt/cloud/hooks/test_dbt.py
+++ b/providers/dbt/cloud/tests/unit/dbt/cloud/hooks/test_dbt.py
@@ -1433,6 +1433,19 @@ class TestDbtCloudHook:
         assert "proxies" in extra_options
         assert extra_options["proxies"] == EXTRA_PROXIES["proxies"]
 
+    def test_timeout_and_proxies_reach_the_request(self, requests_mock):
+        """timeout_seconds and connection proxies are applied to the sent 
request."""
+        requests_mock.get(
+            
f"{SINGLE_TENANT_URL}api/v2/accounts/{DEFAULT_ACCOUNT_ID}/jobs/{JOB_ID}",
+            json={"data": {"id": JOB_ID}},
+        )
+        hook = DbtCloudHook(PROXY_CONN, timeout_seconds=60)
+
+        hook.get_job(job_id=JOB_ID, account_id=DEFAULT_ACCOUNT_ID)
+
+        assert requests_mock.last_request.timeout == 60
+        assert requests_mock.last_request.proxies.get("https") == 
EXTRA_PROXIES["proxies"]["https"]
+
     @pytest.mark.parametrize(
         argnames=("exception", "expected"),
         argvalues=[

Reply via email to