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=[