NetApp cDOT multi-SVM driver configurable NFS versions

A customer has requested the ability to selectively enable NFS versions
3, 4, and 4.1 in the cDOT multi-SVM drivers. This can be accomplished
via a config option.

Change-Id: Ia16a3bde81568096c118d61e808614d630616d0d
Implements: blueprint netapp-cdot-configure-nfs-versions
This commit is contained in:
Clinton Knight 2016-07-26 22:37:24 -04:00 committed by Goutham Pacha Ravi
parent 4e9f52022f
commit ead05120ab
7 changed files with 85 additions and 13 deletions

View File

@ -1067,12 +1067,31 @@ class NetAppCmodeClient(client_base.NetAppBaseClient):
raise exception.NetAppException(msg % security_service['type']) raise exception.NetAppException(msg % security_service['type'])
@na_utils.trace @na_utils.trace
def enable_nfs(self): def enable_nfs(self, versions):
"""Enables NFS on Vserver.""" """Enables NFS on Vserver."""
self.send_request('nfs-enable') self.send_request('nfs-enable')
self.send_request('nfs-service-modify', {'is-nfsv40-enabled': 'true'}) self._enable_nfs_protocols(versions)
self._create_default_nfs_export_rule()
api_args = { @na_utils.trace
def _enable_nfs_protocols(self, versions):
"""Set the enabled NFS protocol versions."""
nfs3 = 'true' if 'nfs3' in versions else 'false'
nfs40 = 'true' if 'nfs4.0' in versions else 'false'
nfs41 = 'true' if 'nfs4.1' in versions else 'false'
nfs_service_modify_args = {
'is-nfsv3-enabled': nfs3,
'is-nfsv40-enabled': nfs40,
'is-nfsv41-enabled': nfs41,
}
self.send_request('nfs-service-modify', nfs_service_modify_args)
@na_utils.trace
def _create_default_nfs_export_rule(self):
"""Create the default export rule for the NFS service."""
export_rule_create_args = {
'client-match': '0.0.0.0/0', 'client-match': '0.0.0.0/0',
'policy-name': 'default', 'policy-name': 'default',
'ro-rule': { 'ro-rule': {
@ -1082,7 +1101,7 @@ class NetAppCmodeClient(client_base.NetAppBaseClient):
'security-flavor': 'never', 'security-flavor': 'never',
}, },
} }
self.send_request('export-rule-create', api_args) self.send_request('export-rule-create', export_rule_create_args)
@na_utils.trace @na_utils.trace
def configure_ldap(self, security_service): def configure_ldap(self, security_service):

View File

@ -172,7 +172,8 @@ class NetAppCmodeMultiSVMFileStorageLibrary(
network_info, network_info,
ipspace_name) ipspace_name)
vserver_client.enable_nfs() vserver_client.enable_nfs(
self.configuration.netapp_enabled_share_protocols)
security_services = network_info.get('security_services') security_services = network_info.get('security_services')
if security_services: if security_services:

View File

@ -58,6 +58,12 @@ netapp_basicauth_opts = [
secret=True), ] secret=True), ]
netapp_provisioning_opts = [ netapp_provisioning_opts = [
cfg.ListOpt('netapp_enabled_share_protocols',
default=['nfs3', 'nfs4.0'],
help='The NFS protocol versions that will be enabled. '
'Supported values include nfs3, nfs4.0, nfs4.1. This '
'option only applies when the option '
'driver_handles_share_servers is set to True. '),
cfg.StrOpt('netapp_volume_name_template', cfg.StrOpt('netapp_volume_name_template',
deprecated_name='netapp_nas_volume_name_template', deprecated_name='netapp_nas_volume_name_template',
help='NetApp volume name template.', help='NetApp volume name template.',

View File

@ -37,6 +37,7 @@ VSERVER_NAME = 'fake_vserver'
VSERVER_NAME_2 = 'fake_vserver_2' VSERVER_NAME_2 = 'fake_vserver_2'
ADMIN_VSERVER_NAME = 'fake_admin_vserver' ADMIN_VSERVER_NAME = 'fake_admin_vserver'
NODE_VSERVER_NAME = 'fake_node_vserver' NODE_VSERVER_NAME = 'fake_node_vserver'
NFS_VERSIONS = ['nfs3', 'nfs4.0']
ROOT_VOLUME_AGGREGATE_NAME = 'fake_root_aggr' ROOT_VOLUME_AGGREGATE_NAME = 'fake_root_aggr'
ROOT_VOLUME_NAME = 'fake_root_volume' ROOT_VOLUME_NAME = 'fake_root_volume'
SHARE_AGGREGATE_NAME = 'fake_aggr1' SHARE_AGGREGATE_NAME = 'fake_aggr1'

View File

@ -1927,10 +1927,46 @@ class NetAppClientCmodeTestCase(test.TestCase):
def test_enable_nfs(self): def test_enable_nfs(self):
self.mock_object(self.client, 'send_request') self.mock_object(self.client, 'send_request')
self.mock_object(self.client, '_enable_nfs_protocols')
self.mock_object(self.client, '_create_default_nfs_export_rule')
self.client.enable_nfs() self.client.enable_nfs(fake.NFS_VERSIONS)
self.client.send_request.assert_called_once_with('nfs-enable')
self.client._enable_nfs_protocols.assert_called_once_with(
fake.NFS_VERSIONS)
self.client._create_default_nfs_export_rule.assert_called_once_with()
@ddt.data((True, True, True), (True, False, False), (False, True, True))
@ddt.unpack
def test_enable_nfs_protocols(self, v3, v40, v41):
self.mock_object(self.client, 'send_request')
versions = []
if v3:
versions.append('nfs3')
if v40:
versions.append('nfs4.0')
if v41:
versions.append('nfs4.1')
self.client._enable_nfs_protocols(versions)
nfs_service_modify_args = {
'is-nfsv3-enabled': 'true' if v3 else 'false',
'is-nfsv40-enabled': 'true' if v40 else 'false',
'is-nfsv41-enabled': 'true' if v41 else 'false',
}
self.client.send_request.assert_called_once_with(
'nfs-service-modify', nfs_service_modify_args)
def test_create_default_nfs_export_rule(self):
self.mock_object(self.client, 'send_request')
self.client._create_default_nfs_export_rule()
nfs_service_modify_args = {'is-nfsv40-enabled': 'true'}
export_rule_create_args = { export_rule_create_args = {
'client-match': '0.0.0.0/0', 'client-match': '0.0.0.0/0',
'policy-name': 'default', 'policy-name': 'default',
@ -1941,11 +1977,8 @@ class NetAppClientCmodeTestCase(test.TestCase):
'security-flavor': 'never' 'security-flavor': 'never'
} }
} }
self.client.send_request.assert_called_once_with(
self.client.send_request.assert_has_calls([ 'export-rule-create', export_rule_create_args)
mock.call('nfs-enable'),
mock.call('nfs-service-modify', nfs_service_modify_args),
mock.call('export-rule-create', export_rule_create_args)])
def test_configure_ldap(self): def test_configure_ldap(self):

View File

@ -273,6 +273,8 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
def test_create_vserver(self): def test_create_vserver(self):
versions = ['fake_v1', 'fake_v2']
self.library.configuration.netapp_enabled_share_protocols = versions
vserver_id = fake.NETWORK_INFO['server_id'] vserver_id = fake.NETWORK_INFO['server_id']
vserver_name = fake.VSERVER_NAME_TEMPLATE % vserver_id vserver_name = fake.VSERVER_NAME_TEMPLATE % vserver_id
vserver_client = mock.Mock() vserver_client = mock.Mock()
@ -306,7 +308,7 @@ class NetAppFileStorageLibraryTestCase(test.TestCase):
vserver_name, vserver_client, fake.NETWORK_INFO, fake.IPSPACE) vserver_name, vserver_client, fake.NETWORK_INFO, fake.IPSPACE)
self.library._create_vserver_admin_lif.assert_called_with( self.library._create_vserver_admin_lif.assert_called_with(
vserver_name, vserver_client, fake.NETWORK_INFO, fake.IPSPACE) vserver_name, vserver_client, fake.NETWORK_INFO, fake.IPSPACE)
self.assertTrue(vserver_client.enable_nfs.called) vserver_client.enable_nfs.assert_called_once_with(versions)
self.library._client.setup_security_services.assert_called_with( self.library._client.setup_security_services.assert_called_with(
fake.NETWORK_INFO['security_services'], vserver_client, fake.NETWORK_INFO['security_services'], vserver_client,
vserver_name) vserver_name)

View File

@ -0,0 +1,10 @@
---
features:
- NFS Versions can be configured when using the NetApp cDOT driver with
driver mode ``driver_handles_share_servers = True``.
upgrade:
- Added new configuration option ``netapp_enabled_share_protocols``
to configure NFS versions with the NetApp cDOT driver operating in
driver mode ``driver_handles_share_servers = True``. If this option is not
specified, new share servers (NetApp vServers) will be created supporting
NFS Version 3 and NFS Version 4.0.