Brick connector revised fix for NFS drivers

This change fixes the error that comes
while getting brick connector and attaching volumes
in case of NFS drivers in cinder. The attribute for
mount point base was not passed to attach_volume method
as the connector initialization logic is common for all
types of protocols. It is fixed by populating
the required parameter in the RemoteFsConnector
by extracting it from connection properties. The infrastructure
for fixing this situation for remote fs drivers is implemented
in this fix. The drivers need to override the method
_get_mount_point_base in their implementation. NFS driver
implements it. GlusterFs implementation of the method to follow
in a separate patch. Hence marking it partial fix.

Change-Id: Id61a437fca1870529fa8b85f7fc2f73eae665294
Partial-Bug: #1238085
(cherry picked from commit 1cd3626306)
This commit is contained in:
Navneet Singh 2013-10-20 18:30:36 +05:30
parent ad05556a2f
commit b15118a78d
5 changed files with 49 additions and 10 deletions

View File

@ -797,6 +797,21 @@ class RemoteFsConnector(InitiatorConnector):
execute=putils.execute, execute=putils.execute,
device_scan_attempts=DEVICE_SCAN_ATTEMPTS_DEFAULT, device_scan_attempts=DEVICE_SCAN_ATTEMPTS_DEFAULT,
*args, **kwargs): *args, **kwargs):
kwargs = kwargs or {}
conn = kwargs.get('conn')
if conn:
mount_point_base = conn.get('mount_point_base')
if mount_type.lower() == 'nfs':
kwargs['nfs_mount_point_base'] =\
kwargs.get('nfs_mount_point_base') or\
mount_point_base
elif mount_type.lower() == 'glusterfs':
kwargs['glusterfs_mount_point_base'] =\
kwargs.get('glusterfs_mount_point_base') or\
mount_point_base
else:
LOG.warn(_("Connection details not present."
" RemoteFsClient may not initialize properly."))
self._remotefsclient = remotefs.RemoteFsClient(mount_type, root_helper, self._remotefsclient = remotefs.RemoteFsClient(mount_type, root_helper,
execute=execute, execute=execute,
*args, **kwargs) *args, **kwargs)
@ -822,7 +837,7 @@ class RemoteFsConnector(InitiatorConnector):
""" """
mnt_flags = [] mnt_flags = []
if 'options' in connection_properties: if connection_properties.get('options'):
mnt_flags = connection_properties['options'].split() mnt_flags = connection_properties['options'].split()
nfs_share = connection_properties['export'] nfs_share = connection_properties['export']

View File

@ -787,7 +787,8 @@ class CoraidDriverImageTestCases(CoraidDriverTestCase):
utils.brick_get_connector('aoe', utils.brick_get_connector('aoe',
device_scan_attempts=3, device_scan_attempts=3,
use_multipath=False).\ use_multipath=False,
conn=mox.IgnoreArg()).\
AndReturn(aoe_initiator) AndReturn(aoe_initiator)
aoe_initiator\ aoe_initiator\

View File

@ -794,7 +794,8 @@ def brick_get_connector_properties():
def brick_get_connector(protocol, driver=None, def brick_get_connector(protocol, driver=None,
execute=processutils.execute, execute=processutils.execute,
use_multipath=False, use_multipath=False,
device_scan_attempts=3): device_scan_attempts=3,
*args, **kwargs):
"""Wrapper to get a brick connector object. """Wrapper to get a brick connector object.
This automatically populates the required protocol as well This automatically populates the required protocol as well
as the root_helper needed to execute commands. as the root_helper needed to execute commands.
@ -806,7 +807,8 @@ def brick_get_connector(protocol, driver=None,
execute=execute, execute=execute,
use_multipath=use_multipath, use_multipath=use_multipath,
device_scan_attempts= device_scan_attempts=
device_scan_attempts) device_scan_attempts,
*args, **kwargs)
def require_driver_initialized(func): def require_driver_initialized(func):

View File

@ -375,7 +375,8 @@ class VolumeDriver(object):
connector = utils.brick_get_connector(protocol, connector = utils.brick_get_connector(protocol,
use_multipath=use_multipath, use_multipath=use_multipath,
device_scan_attempts= device_scan_attempts=
device_scan_attempts) device_scan_attempts,
conn=conn)
device = connector.connect_volume(conn['data']) device = connector.connect_volume(conn['data'])
host_device = device['path'] host_device = device['path']

View File

@ -90,9 +90,25 @@ class RemoteFsDriver(driver.VolumeDriver):
data['options'] = self.shares[volume['provider_location']] data['options'] = self.shares[volume['provider_location']]
return { return {
'driver_volume_type': self.driver_volume_type, 'driver_volume_type': self.driver_volume_type,
'data': data 'data': data,
'mount_point_base': self._get_mount_point_base()
} }
def _get_mount_point_base(self):
"""Returns the mount point base for the remote fs.
This method facilitates returning mount point base
for the specific remote fs. Override this method
in the respective driver to return the entry to be
used while attach/detach using brick in cinder.
If not overridden then it returns None without
raising exception to continue working for cases
when not used with brick.
"""
LOG.debug(_("Driver specific implementation needs to return"
" mount_point_base."))
return None
def create_volume(self, volume): def create_volume(self, volume):
"""Creates a volume. """Creates a volume.
@ -371,15 +387,16 @@ class NfsDriver(RemoteFsDriver):
super(NfsDriver, self).__init__(*args, **kwargs) super(NfsDriver, self).__init__(*args, **kwargs)
self.configuration.append_config_values(volume_opts) self.configuration.append_config_values(volume_opts)
root_helper = utils.get_root_helper() root_helper = utils.get_root_helper()
base = getattr(self.configuration, # base bound to instance is used in RemoteFsConnector.
'nfs_mount_point_base', self.base = getattr(self.configuration,
CONF.nfs_mount_point_base) 'nfs_mount_point_base',
CONF.nfs_mount_point_base)
opts = getattr(self.configuration, opts = getattr(self.configuration,
'nfs_mount_options', 'nfs_mount_options',
CONF.nfs_mount_options) CONF.nfs_mount_options)
self._remotefsclient = remotefs.RemoteFsClient( self._remotefsclient = remotefs.RemoteFsClient(
'nfs', root_helper, execute=execute, 'nfs', root_helper, execute=execute,
nfs_mount_point_base=base, nfs_mount_point_base=self.base,
nfs_mount_options=opts) nfs_mount_options=opts)
def set_execute(self, execute): def set_execute(self, execute):
@ -531,3 +548,6 @@ class NfsDriver(RemoteFsDriver):
'*snapshot*', mount_point, run_as_root=True) '*snapshot*', mount_point, run_as_root=True)
total_allocated = float(du.split()[0]) total_allocated = float(du.split()[0])
return total_size, total_available, total_allocated return total_size, total_available, total_allocated
def _get_mount_point_base(self):
return self.base