This is an automated email from the ASF dual-hosted git repository.
kaxilnaik 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 6751c9635f8 Improve speed of SSH & SFTP tests (#45938)
6751c9635f8 is described below
commit 6751c9635f86838086bbdfc52a17ad6818fbd03a
Author: Kaxil Naik <[email protected]>
AuthorDate: Wed Jan 22 23:52:27 2025 +0530
Improve speed of SSH & SFTP tests (#45938)
Before:
> 4 passed, 1 warning in 64.03s (0:01:04)
After:
> 4 passed, 1 warning in 4.60s
To run them:
```
pytest
providers/tests/sftp/operators/test_sftp.py::TestSFTPOperator::test_arg_checking
providers/tests/ssh/hooks/test_ssh.py::TestSSHHook::test_command_timeout_not_set
providers/tests/ssh/hooks/test_ssh.py::TestSSHHook::test_command_timeout_success
providers/tests/ssh/hooks/test_ssh.py::TestSSHHook::test_command_timeout_fail
```
---
providers/src/airflow/providers/ssh/hooks/ssh.py | 9 ++++-----
providers/tests/sftp/operators/test_sftp.py | 6 +++++-
providers/tests/ssh/hooks/test_ssh.py | 19 ++++++++++---------
3 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/providers/src/airflow/providers/ssh/hooks/ssh.py
b/providers/src/airflow/providers/ssh/hooks/ssh.py
index 3502459c644..c88f2a1de8e 100644
--- a/providers/src/airflow/providers/ssh/hooks/ssh.py
+++ b/providers/src/airflow/providers/ssh/hooks/ssh.py
@@ -37,7 +37,6 @@ from airflow.hooks.base import BaseHook
from airflow.utils.platform import getuser
from airflow.utils.types import NOTSET, ArgNotSet
-TIMEOUT_DEFAULT = 10
CMD_TIMEOUT = 10
@@ -113,7 +112,7 @@ class SSHHook(BaseHook):
key_file: str | None = None,
port: int | None = None,
conn_timeout: int | None = None,
- cmd_timeout: int | ArgNotSet | None = NOTSET,
+ cmd_timeout: float | ArgNotSet | None = NOTSET,
keepalive_interval: int = 30,
banner_timeout: float = 30.0,
disabled_algorithms: dict | None = None,
@@ -175,7 +174,7 @@ class SSHHook(BaseHook):
if "cmd_timeout" in extra_options and self.cmd_timeout is
NOTSET:
if extra_options["cmd_timeout"]:
- self.cmd_timeout = int(extra_options["cmd_timeout"])
+ self.cmd_timeout = float(extra_options["cmd_timeout"])
else:
self.cmd_timeout = None
@@ -427,11 +426,11 @@ class SSHHook(BaseHook):
command: str,
get_pty: bool,
environment: dict | None,
- timeout: int | ArgNotSet | None = NOTSET,
+ timeout: float | ArgNotSet | None = NOTSET,
) -> tuple[int, bytes, bytes]:
self.log.info("Running command: %s", command)
- cmd_timeout: int | None
+ cmd_timeout: float | None
if not isinstance(timeout, ArgNotSet):
cmd_timeout = timeout
elif not isinstance(self.cmd_timeout, ArgNotSet):
diff --git a/providers/tests/sftp/operators/test_sftp.py
b/providers/tests/sftp/operators/test_sftp.py
index 34bd5b9b6ed..c0d2c03db8e 100644
--- a/providers/tests/sftp/operators/test_sftp.py
+++ b/providers/tests/sftp/operators/test_sftp.py
@@ -314,7 +314,11 @@ class TestSFTPOperator:
assert content_received == self.test_remote_file_content
@mock.patch.dict("os.environ", {"AIRFLOW_CONN_" + TEST_CONN_ID.upper():
"ssh://test_id@localhost"})
- def test_arg_checking(self):
+
@mock.patch("airflow.providers.sftp.operators.sftp.SFTPHook.retrieve_directory")
+ @mock.patch("airflow.providers.sftp.operators.sftp.SFTPHook.retrieve_file")
+
@mock.patch("airflow.providers.sftp.operators.sftp.SFTPHook.create_directory")
+ @mock.patch("airflow.providers.sftp.operators.sftp.SFTPHook.store_file")
+ def test_arg_checking(self, mock_store_file, mock_create_dir,
mock_retrieve_file, mock_retrieve_dir):
dag = DAG(
dag_id="unit_tests_sftp_op_arg_checking",
schedule=None,
diff --git a/providers/tests/ssh/hooks/test_ssh.py
b/providers/tests/ssh/hooks/test_ssh.py
index e09f2eeee0a..d778a46411b 100644
--- a/providers/tests/ssh/hooks/test_ssh.py
+++ b/providers/tests/ssh/hooks/test_ssh.py
@@ -829,30 +829,28 @@ class TestSSHHook:
)
assert ret == (0, b"airflow\n", b"")
- @pytest.mark.flaky(reruns=5)
def test_command_timeout_success(self):
hook = SSHHook(
ssh_conn_id="ssh_default",
conn_timeout=30,
- cmd_timeout=15,
+ cmd_timeout=2,
banner_timeout=100,
)
with hook.get_conn() as client:
ret = hook.exec_ssh_client_command(
client,
- "sleep 10; echo airflow",
+ "sleep 0.1; echo airflow",
False,
None,
)
assert ret == (0, b"airflow\n", b"")
- @pytest.mark.flaky(reruns=5)
def test_command_timeout_fail(self):
hook = SSHHook(
ssh_conn_id="ssh_default",
conn_timeout=30,
- cmd_timeout=5,
+ cmd_timeout=0.001,
banner_timeout=100,
)
@@ -860,12 +858,12 @@ class TestSSHHook:
with pytest.raises(AirflowException):
hook.exec_ssh_client_command(
client,
- "sleep 10",
+ "sleep 1",
False,
None,
)
- def test_command_timeout_not_set(self):
+ def test_command_timeout_not_set(self, monkeypatch):
hook = SSHHook(
ssh_conn_id="ssh_default",
conn_timeout=30,
@@ -873,12 +871,15 @@ class TestSSHHook:
banner_timeout=100,
)
+ # Mock the timeout to not wait for that many seconds
+ monkeypatch.setattr("airflow.providers.ssh.hooks.ssh.CMD_TIMEOUT",
0.001)
+
with hook.get_conn() as client:
- # sleeping for 20 sec which is longer than default timeout of 10
seconds
+ # sleeping for more secs than default timeout
# to validate that no timeout is applied
hook.exec_ssh_client_command(
client,
- "sleep 20",
+ "sleep 0.1",
environment=False,
get_pty=None,
)