diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b51af4214dd..1244035ffdc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ These changes are available in the [master branch](https://github.com/PrefectHQ/ - Validate configuration objects on initial load - [#1136](https://github.com/PrefectHQ/prefect/pull/1136) - Add `auto_generated` property to Tasks for convenient filtering - [#1135](https://github.com/PrefectHQ/prefect/pull/1135) - Disable dask work-stealing in kubernetes via scheduler config - [#1166](https://github.com/PrefectHQ/prefect/pull/1166) +- Implement backoff retry settings on Client calls - [#1187](https://github.com/PrefectHQ/prefect/pull/1187) ### Task Library diff --git a/src/prefect/client/client.py b/src/prefect/client/client.py index e72c6f03060c..f9bed5383725 100644 --- a/src/prefect/client/client.py +++ b/src/prefect/client/client.py @@ -3,6 +3,9 @@ import json import logging import os + +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.util.retry import Retry from typing import TYPE_CHECKING, Any, Dict, List, NamedTuple, Optional, Union import pendulum @@ -209,12 +212,20 @@ def _request( # write this as a function to allow reuse in next try/except block def request_fn() -> "requests.models.Response": headers = {"Authorization": "Bearer {}".format(self.token)} + session = requests.Session() + retries = Retry( + total=6, + backoff_factor=1, + status_forcelist=[500, 502, 503, 504], + method_whitelist=["DELETE", "GET", "POST"], + ) + session.mount("https://", HTTPAdapter(max_retries=retries)) if method == "GET": - response = requests.get(url, headers=headers, params=params) + response = session.get(url, headers=headers, params=params) elif method == "POST": - response = requests.post(url, headers=headers, json=params) + response = session.post(url, headers=headers, json=params) elif method == "DELETE": - response = requests.delete(url, headers=headers) + response = session.delete(url, headers=headers) else: raise ValueError("Invalid method: {}".format(method)) diff --git a/tests/cli/test_auth.py b/tests/cli/test_auth.py index bd63ea1721d2..129d8c362451 100644 --- a/tests/cli/test_auth.py +++ b/tests/cli/test_auth.py @@ -47,7 +47,9 @@ def test_auth_add(monkeypatch): json=MagicMock(return_value=dict(data=dict(hello="hi"))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -60,7 +62,7 @@ def test_auth_add(monkeypatch): assert "Auth token added to Prefect config" in result.output -def test_auth_add_failes_query(monkeypatch): +def test_auth_add_failed_query(monkeypatch): with tempfile.TemporaryDirectory() as temp_dir: file = "{}/temp_config.toml".format(temp_dir) @@ -73,7 +75,9 @@ def test_auth_add_failes_query(monkeypatch): json=MagicMock(return_value=dict(data=dict(hello=None))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} diff --git a/tests/cli/test_describe.py b/tests/cli/test_describe.py index 5504d8203dd0..3d92d9dbe755 100644 --- a/tests/cli/test_describe.py +++ b/tests/cli/test_describe.py @@ -40,7 +40,9 @@ def test_describe_flows(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow=[{"name": "flow"}]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -76,7 +78,9 @@ def test_describe_flows_not_found(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(flow=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -96,7 +100,9 @@ def test_describe_flows_populated(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow=[{"name": "flow"}]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -141,7 +147,9 @@ def test_describe_tasks(monkeypatch): ) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -176,7 +184,9 @@ def test_describe_tasks_flow_not_found(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(flow=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -193,7 +203,9 @@ def test_describe_tasks_not_found(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow=[{"tasks": []}]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -215,7 +227,9 @@ def test_describe_flow_runs(monkeypatch): ) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -255,7 +269,9 @@ def test_describe_flow_runs_not_found(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow_run=[]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -277,7 +293,9 @@ def test_describe_flow_runs_populated(monkeypatch): ) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} diff --git a/tests/cli/test_execute.py b/tests/cli/test_execute.py index d345ff9d644e..85796acf3595 100644 --- a/tests/cli/test_execute.py +++ b/tests/cli/test_execute.py @@ -39,7 +39,9 @@ def test_execute_cloud_flow_not_found(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow_run=[]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} diff --git a/tests/cli/test_get.py b/tests/cli/test_get.py index b900d39f12a9..587267edd03a 100644 --- a/tests/cli/test_get.py +++ b/tests/cli/test_get.py @@ -36,7 +36,9 @@ def test_get_flows(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(flow=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -75,7 +77,9 @@ def test_get_flows_populated(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(flow=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -122,7 +126,9 @@ def test_get_projects(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(project=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -163,7 +169,9 @@ def test_get_projects_populated(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(project=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -200,7 +208,9 @@ def test_get_flow_runs(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow_run=[]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -245,7 +255,9 @@ def test_get_flow_runs_populated(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow_run=[]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -292,7 +304,9 @@ def test_get_tasks(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(task=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -335,7 +349,9 @@ def test_get_tasks_populated(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(task=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -403,7 +419,9 @@ def test_get_logs(monkeypatch): ) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -446,7 +464,9 @@ def test_get_logs_info(monkeypatch): ) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -478,7 +498,9 @@ def test_get_logs_fails(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow_run=[]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} diff --git a/tests/cli/test_run.py b/tests/cli/test_run.py index de37f2cfd641..c61840912b2a 100644 --- a/tests/cli/test_run.py +++ b/tests/cli/test_run.py @@ -34,7 +34,9 @@ def test_run_cloud(monkeypatch): json=MagicMock(return_value=dict(data=dict(flow=[{"id": "flow"}]))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) create_flow_run = MagicMock(resurn_value="id") monkeypatch.setattr( @@ -67,7 +69,9 @@ def test_run_cloud_fails(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(data=dict(flow=[])))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} diff --git a/tests/client/test_client.py b/tests/client/test_client.py index 43942886de26..d0cbbe757bfb 100644 --- a/tests/client/test_client.py +++ b/tests/client/test_client.py @@ -92,7 +92,9 @@ def test_client_doesnt_login_if_no_tokens_available(monkeypatch, cloud): ) mock_file = mock_open() monkeypatch.setattr("builtins.open", mock_file) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) config = { "cloud.graphql": "http://my-cloud.foo", @@ -145,7 +147,9 @@ def test_client_raises_if_login_fails(monkeypatch): def test_client_posts_raises_with_no_token(monkeypatch): post = MagicMock() - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": None} ): @@ -159,7 +163,9 @@ def test_client_posts_to_graphql_server(monkeypatch): post = MagicMock( return_value=MagicMock(json=MagicMock(return_value=dict(success=True))) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -179,6 +185,9 @@ def test_client_posts_retries_if_token_needs_refreshing(monkeypatch): json=MagicMock(return_value=dict(token="new-token")), ) ) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) monkeypatch.setattr("requests.post", post) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} @@ -198,7 +207,9 @@ def test_client_posts_graphql_to_graphql_server(monkeypatch): json=MagicMock(return_value=dict(data=dict(success=True))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -218,7 +229,10 @@ def test_client_graphql_retries_if_token_needs_refreshing(monkeypatch): json=MagicMock(return_value=dict(token="new-token")), ) ) + session = MagicMock() + session.return_value.post = post monkeypatch.setattr("requests.post", post) + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -238,7 +252,9 @@ def test_graphql_errors_get_raised(monkeypatch): json=MagicMock(return_value=dict(data="42", errors="GraphQL issue!")) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -262,7 +278,9 @@ def test_client_deploy(monkeypatch, compressed): "data": {"project": [{"id": "proj-id"}], "createFlow": {"id": "long-id"}} } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -288,7 +306,9 @@ def test_client_deploy_builds_flow(monkeypatch, compressed): "data": {"project": [{"id": "proj-id"}], "createFlow": {"id": "long-id"}} } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -326,7 +346,9 @@ def test_client_deploy_optionally_avoids_building_flow(monkeypatch, compressed): "data": {"project": [{"id": "proj-id"}], "createFlow": {"id": "long-id"}} } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -353,7 +375,9 @@ def test_client_deploy_optionally_avoids_building_flow(monkeypatch, compressed): def test_client_deploy_with_bad_proj_name(monkeypatch): response = {"data": {"project": []}} post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -405,7 +429,9 @@ def test_get_flow_run_info(monkeypatch): json=MagicMock(return_value=dict(data=json.loads(response))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -463,7 +489,9 @@ def test_get_flow_run_info_with_nontrivial_payloads(monkeypatch): json=MagicMock(return_value=dict(data=json.loads(response))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -496,7 +524,9 @@ def test_get_flow_run_info_raises_informative_error(monkeypatch): json=MagicMock(return_value=dict(data=json.loads(response))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -509,7 +539,9 @@ def test_get_flow_run_info_raises_informative_error(monkeypatch): def test_set_flow_run_state(monkeypatch): response = {"data": {"setFlowRunState": {"id": 1}}} post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -526,7 +558,9 @@ def test_set_flow_run_state_with_error(monkeypatch): "errors": [{"message": "something went wrong"}], } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -562,7 +596,9 @@ def test_get_task_run_info(monkeypatch): json=MagicMock(return_value=dict(data=json.loads(response))) ) ) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -584,7 +620,9 @@ def test_get_task_run_info_with_error(monkeypatch): "errors": [{"message": "something went wrong"}], } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -602,7 +640,9 @@ def test_set_task_run_state(monkeypatch): response = {"data": {"setTaskRunState": None}} post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -618,7 +658,9 @@ def test_set_task_run_state_serializes(monkeypatch): response = {"data": {"setTaskRunState": None}} post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): @@ -638,7 +680,9 @@ def test_set_task_run_state_with_error(monkeypatch): } post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.graphql": "http://my-cloud.foo", "cloud.auth_token": "secret_token"} ): diff --git a/tests/client/test_secrets.py b/tests/client/test_secrets.py index 2622873b3857..fe2a33413b61 100644 --- a/tests/client/test_secrets.py +++ b/tests/client/test_secrets.py @@ -47,7 +47,9 @@ def test_secret_value_depends_on_use_local_secrets(): def test_secrets_use_client(monkeypatch): response = {"data": {"secretValue": "1234"}} post = MagicMock(return_value=MagicMock(json=MagicMock(return_value=response))) - monkeypatch.setattr("requests.post", post) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) with set_temporary_config( {"cloud.auth_token": "secret_token", "cloud.use_local_secrets": False} ): diff --git a/tests/engine/cloud/test_cloud_flows.py b/tests/engine/cloud/test_cloud_flows.py index 567ed22c2693..78b49ebdca65 100644 --- a/tests/engine/cloud/test_cloud_flows.py +++ b/tests/engine/cloud/test_cloud_flows.py @@ -569,6 +569,11 @@ def test_deep_map_with_a_retry(monkeypatch): t2.max_retries = 1 t2.retry_delay = datetime.timedelta(seconds=0) + session = MagicMock() + session.return_value.post = post + monkeypatch.setattr("requests.Session", session) + monkeypatch.setattr("requests.post", post) + client = MockedCloudClient( flow_runs=[FlowRun(id=flow_run_id)], task_runs=[