Skip to content

Commit

Permalink
Support NFSv4 only environment
Browse files Browse the repository at this point in the history
Do not call `rpcinfo` nor `showmount` when
`device-config:nfsversion` is a NFSv4 version.

This modification requires the user to already
know `nfsversion>=4` and the `serverpath`.

See: xapi-project#551
And: xcp-ng/xcp#135

Signed-off-by: BenjiReis <[email protected]>
  • Loading branch information
benjamreis committed May 2, 2023
1 parent 877403d commit b7cc0d2
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
2 changes: 1 addition & 1 deletion drivers/NFSSR.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
13 changes: 11 additions & 2 deletions drivers/nfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,19 @@ 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.
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)
Expand All @@ -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]

Expand Down Expand Up @@ -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
Expand Down
14 changes: 6 additions & 8 deletions tests/test_nfs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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'))

Expand All @@ -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))

Expand All @@ -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'))

Expand All @@ -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'))

Expand Down

0 comments on commit b7cc0d2

Please sign in to comment.