diff --git a/drivers/NFSSR.py b/drivers/NFSSR.py index a0c3d2446..dbfae8080 100755 --- a/drivers/NFSSR.py +++ b/drivers/NFSSR.py @@ -112,7 +112,7 @@ def validate_remotepath(self, scan): def check_server(self): try: - if PROBEVERSION in self.dconf: + if not nfs.is_nfs_4(self.nfsversion) and PROBEVERSION in self.dconf: sv = nfs.get_supported_nfs_versions(self.remoteserver) if len(sv): self.nfsversion = sv[0] diff --git a/drivers/nfs.py b/drivers/nfs.py index 461698584..46ebb9a9f 100644 --- a/drivers/nfs.py +++ b/drivers/nfs.py @@ -56,6 +56,8 @@ class NfsException(Exception): def __init__(self, errstr): self.errstr = errstr +def is_nfs_4(nfsversion): + return validate_nfsversion(nfsversion) and nfsversion != DEFAULT_NFSVERSION def check_server_tcp(server, nfsversion=DEFAULT_NFSVERSION): """Make sure that NFS over TCP/IP V3 is supported on the server. @@ -63,6 +65,10 @@ def check_server_tcp(server, nfsversion=DEFAULT_NFSVERSION): Returns True if everything is OK False otherwise. """ + + if is_nfs_4(nfsversion): + return True + try: sv = get_supported_nfs_versions(server) return (True if nfsversion in sv else False) @@ -71,13 +77,16 @@ def check_server_tcp(server, nfsversion=DEFAULT_NFSVERSION): inst.code) -def check_server_service(server): +def check_server_service(server, nfsversion=DEFAULT_NFSVERSION): """Ensure NFS service is up and available on the remote server. Returns False if fails to detect service after NFS_SERVICE_RETRY * NFS_SERVICE_WAIT """ + if is_nfs_4(nfsversion): + return True + retries = 0 errlist = [errno.EPERM, errno.EPIPE, errno.EIO] @@ -132,7 +141,7 @@ def soft_mount(mountpoint, remoteserver, remotepath, transport, useroptions='', # Wait for NFS service to be available try: - if not check_server_service(remoteserver): + if not check_server_service(remoteserver, nfsversion): raise util.CommandException( code=errno.EOPNOTSUPP, reason='No NFS service on server: `%s`' % remoteserver diff --git a/tests/test_nfs.py b/tests/test_nfs.py index d86b37341..f531ccd34 100644 --- a/tests/test_nfs.py +++ b/tests/test_nfs.py @@ -15,18 +15,16 @@ def test_check_server_tcp(self, pread): @mock.patch('util.pread', autospec=True) def test_check_server_tcp_nfsversion(self, pread): - nfs.check_server_tcp('aServer', 'aNfsversion') + nfs.check_server_tcp('aServer', '3') pread.assert_called_once_with(['/usr/sbin/rpcinfo', '-s', 'aServer'], quiet=False, text=True) @mock.patch('util.pread', autospec=True) def test_check_server_tcp_nfsversion_error(self, pread): - pread.side_effect = util.CommandException - with self.assertRaises(nfs.NfsException): nfs.check_server_tcp('aServer', 'aNfsversion') - pread.assert_called_once_with(['/usr/sbin/rpcinfo', '-s', 'aServer'], quiet=False, text=True) + pread.assert_not_called() @mock.patch('time.sleep', autospec=True) # Can't use autospec due to http://bugs.python.org/issue17826 @@ -104,7 +102,7 @@ def test_soft_mount(self, pread, check_server_service, makedirs): nfs.soft_mount('mountpoint', 'remoteserver', 'remotepath', 'transport', timeout=None) - check_server_service.assert_called_once_with('remoteserver') + check_server_service.assert_called_once_with('remoteserver', '3') pread.assert_called_once_with(self.get_soft_mount_pread('mount.nfs', '3')) @@ -115,7 +113,7 @@ def test_soft_mount_ipv6(self, pread, check_server_service, makedirs): nfs.soft_mount('mountpoint', 'remoteserver', 'remotepath', 'tcp6', timeout=None) - check_server_service.assert_called_once_with('remoteserver') + check_server_service.assert_called_once_with('remoteserver', '3') pread.assert_called_once_with(self.get_soft_mount_pread('mount.nfs', '3', True)) @@ -127,7 +125,7 @@ def test_soft_mount_nfsversion_3(self, pread, nfs.soft_mount('mountpoint', 'remoteserver', 'remotepath', 'transport', timeout=None, nfsversion='3') - check_server_service.assert_called_once_with('remoteserver') + check_server_service.assert_called_once_with('remoteserver', '3') pread.assert_called_with(self.get_soft_mount_pread('mount.nfs', '3')) @@ -139,7 +137,7 @@ def test_soft_mount_nfsversion_4(self, pread, nfs.soft_mount('mountpoint', 'remoteserver', 'remotepath', 'transport', timeout=None, nfsversion='4') - check_server_service.assert_called_once_with('remoteserver') + check_server_service.assert_called_once_with('remoteserver', '4') pread.assert_called_with(self.get_soft_mount_pread('mount.nfs', '4'))