fix manila to use device uuid instead of name for mounting

Closes-bug: #2091102

Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b
This commit is contained in:
Yaguang Tang
2024-12-05 23:43:11 +08:00
parent 037ffdfb2f
commit d23862fcff
3 changed files with 37 additions and 5 deletions

View File

@@ -286,7 +286,7 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver):
return True
return False
def _add_mount_permanently(self, share_id, server_details):
def _add_mount_permanently(self, share_id, device_path, server_details):
"""Add mount permanently for mounted filesystems."""
try:
self._ssh_exec(
@@ -294,6 +294,17 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver):
['grep', share_id, const.MOUNT_FILE_TEMP,
'|', 'sudo', 'tee', '-a', const.MOUNT_FILE],
)
output, __ = self._ssh_exec(
server_details,
['lsblk', '-o', 'uuid', '-n', device_path])
if output:
device_uuid = f"UUID={output.strip()}"
self._ssh_exec(
server_details,
['sudo', 'sed', '-i', "s@{}@{}@".format(device_path,
device_uuid),
const.MOUNT_FILE]
)
except exception.ProcessExecutionError as e:
LOG.error("Failed to add 'Share-%(share_id)s' mount "
"permanently on server '%(instance_id)s'.",
@@ -363,7 +374,8 @@ class GenericShareDriver(driver.ExecuteMixin, driver.ShareDriver):
'&&', 'sudo', 'mount', device_path, mount_path,
)
self._ssh_exec(server_details, mount_cmd)
self._add_mount_permanently(share.id, server_details)
self._add_mount_permanently(share.id, device_path,
server_details)
else:
LOG.warning("Mount point '%(path)s' already exists on "
"server '%(server)s'.", log_data)

View File

@@ -305,6 +305,7 @@ class GenericShareDriverTestCase(test.TestCase):
server = {'instance_id': 'fake_server_id'}
mount_path = self._driver._get_mount_path(self.share)
volume = {'mountpoint': 'fake_mount_point'}
device_path = volume['mountpoint']
self.mock_object(self._driver, '_is_device_mounted',
mock.Mock(return_value=False))
self.mock_object(self._driver, '_add_mount_permanently')
@@ -316,7 +317,7 @@ class GenericShareDriverTestCase(test.TestCase):
self._driver._is_device_mounted.assert_called_once_with(
mount_path, server, volume)
self._driver._add_mount_permanently.assert_called_once_with(
self.share.id, server)
self.share.id, device_path, server)
self._driver._ssh_exec.assert_called_once_with(
server, (
'sudo', 'mkdir', '-p', mount_path,
@@ -490,17 +491,29 @@ class GenericShareDriverTestCase(test.TestCase):
self.assertFalse(result)
def test_add_mount_permanently(self):
self.mock_object(self._driver, '_ssh_exec')
self._driver._add_mount_permanently(self.share.id, self.server)
device_path = '/fake/mount/path'
device_uuid = 'fake_disk_uuid'
formated_device_uuid = f"UUID={device_uuid}"
self.mock_object(self._driver, '_ssh_exec',
mock.Mock(return_value=(device_uuid, '')))
self._driver._add_mount_permanently(self.share.id, device_path,
self.server)
self._driver._ssh_exec.assert_has_calls([
mock.call(
self.server,
['grep', self.share.id, const.MOUNT_FILE_TEMP,
'|', 'sudo', 'tee', '-a', const.MOUNT_FILE]),
mock.call(self.server, ['lsblk', '-o', 'uuid',
'-n', device_path]),
mock.call(
self.server,
['sudo', 'sed', '-i', "s@{}@{}@".format(device_path,
formated_device_uuid), const.MOUNT_FILE]),
mock.call(self.server, ['sudo', 'mount', '-a'])
])
def test_add_mount_permanently_raise_error_on_add(self):
device_path = 'fake_device_path'
self.mock_object(
self._driver, '_ssh_exec',
mock.Mock(side_effect=exception.ProcessExecutionError))
@@ -508,6 +521,7 @@ class GenericShareDriverTestCase(test.TestCase):
exception.ShareBackendException,
self._driver._add_mount_permanently,
self.share.id,
device_path,
self.server
)
self._driver._ssh_exec.assert_called_once_with(

View File

@@ -0,0 +1,6 @@
---
fixes:
- |
Generic driver - volumes mounted to the service instance are now mounted
via its uuid (/dev/disk/by-uuid/...) instead of canonical paths (/dev/vdb)
to prevent messing up the shares after restarts.