From a1ad59ed03c7ecd82de055da41bdc1a113386eb9 Mon Sep 17 00:00:00 2001 From: joshua postel Date: Wed, 21 Aug 2019 12:49:17 -0400 Subject: [PATCH 1/3] ssh: add minimal support for gss_auth Fixes #2327 --- dvc/config.py | 2 ++ dvc/remote/ssh/__init__.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/dvc/config.py b/dvc/config.py index 87311842f3..c7925aec21 100644 --- a/dvc/config.py +++ b/dvc/config.py @@ -253,6 +253,7 @@ class Config(object): # pylint: disable=too-many-instance-attributes SECTION_REMOTE_TIMEOUT = "timeout" SECTION_REMOTE_PASSWORD = "password" SECTION_REMOTE_ASK_PASSWORD = "ask_password" + SECTION_REMOTE_GSS_AUTH = "gss_auth" SECTION_REMOTE_NO_TRAVERSE = "no_traverse" SECTION_REMOTE_SCHEMA = { SECTION_REMOTE_URL: str, @@ -273,6 +274,7 @@ class Config(object): # pylint: disable=too-many-instance-attributes Optional(SECTION_REMOTE_TIMEOUT): Use(int), Optional(SECTION_REMOTE_PASSWORD): str, Optional(SECTION_REMOTE_ASK_PASSWORD): BOOL_SCHEMA, + Optional(SECTION_REMOTE_GSS_AUTH): BOOL_SCHEMA, Optional(SECTION_AZURE_CONNECTION_STRING): str, Optional(SECTION_OSS_ACCESS_KEY_ID): str, Optional(SECTION_OSS_ACCESS_KEY_SECRET): str, diff --git a/dvc/remote/ssh/__init__.py b/dvc/remote/ssh/__init__.py index 086a2fd717..d6f034fd41 100644 --- a/dvc/remote/ssh/__init__.py +++ b/dvc/remote/ssh/__init__.py @@ -87,6 +87,7 @@ def __init__(self, repo, config): self.ask_password = config.get( Config.SECTION_REMOTE_ASK_PASSWORD, False ) + self.gss_auth = config.get(Config.SECTION_REMOTE_GSS_AUTH, False) @staticmethod def ssh_config_filename(): @@ -145,6 +146,7 @@ def ssh(self, path_info): key_filename=self.keyfile, timeout=self.timeout, password=self.password, + gss_auth=self.gss_auth, ) def exists(self, path_info): From cc87531df3e8534d82be17c76c455f402176701a Mon Sep 17 00:00:00 2001 From: joshua postel Date: Wed, 21 Aug 2019 13:20:38 -0400 Subject: [PATCH 2/3] tests: added test for ssh gss_auth Fixes #2327 --- tests/unit/remote/ssh/test_ssh.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/unit/remote/ssh/test_ssh.py b/tests/unit/remote/ssh/test_ssh.py index b48bf082ca..0dee1ac3ee 100644 --- a/tests/unit/remote/ssh/test_ssh.py +++ b/tests/unit/remote/ssh/test_ssh.py @@ -160,3 +160,25 @@ def test_ssh_keyfile(mock_file, mock_exists, config, expected_keyfile): mock_exists.assert_called_with(RemoteSSH.ssh_config_filename()) mock_file.assert_called_with(RemoteSSH.ssh_config_filename()) assert remote.keyfile == expected_keyfile + + +@pytest.mark.parametrize( + "config,expected_gss_auth", + [ + ({"url": "ssh://example.com", "gss_auth": True}, True), + ({"url": "ssh://example.com", "gss_auth": False}, False), + ({"url": "ssh://not_in_ssh_config.com"}, False), + ], +) +@patch("os.path.exists", return_value=True) +@patch( + "{}.open".format(builtin_module_name), + new_callable=mock_open, + read_data=mock_ssh_config, +) +def test_ssh_gss_auth(mock_file, mock_exists, config, expected_gss_auth): + remote = RemoteSSH(None, config) + + mock_exists.assert_called_with(RemoteSSH.ssh_config_filename()) + mock_file.assert_called_with(RemoteSSH.ssh_config_filename()) + assert remote.gss_auth == expected_gss_auth From cbc5e1b52d3cddc14e9b80550fbf05e2b9933405 Mon Sep 17 00:00:00 2001 From: joshua postel Date: Wed, 21 Aug 2019 14:10:53 -0400 Subject: [PATCH 3/3] setup.py: add gssapi requirement Fixes #2327 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e98ef6be8c..0edd7e9725 100644 --- a/setup.py +++ b/setup.py @@ -75,7 +75,7 @@ def run(self): s3 = ["boto3==1.9.115"] azure = ["azure-storage-blob==2.1.0"] oss = ["oss2==2.6.1"] -ssh = ["paramiko>=2.5.0"] +ssh = ["paramiko[gssapi]>=2.5.0"] hdfs = ["pyarrow==0.14.0"] all_remotes = gs + s3 + azure + ssh + oss