diff --git a/manila/share/drivers/generic.py b/manila/share/drivers/generic.py index d7f08a0586..0aec1f1087 100644 --- a/manila/share/drivers/generic.py +++ b/manila/share/drivers/generic.py @@ -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) diff --git a/manila/tests/share/drivers/test_generic.py b/manila/tests/share/drivers/test_generic.py index e85022d6d1..b6af70ebd1 100644 --- a/manila/tests/share/drivers/test_generic.py +++ b/manila/tests/share/drivers/test_generic.py @@ -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( diff --git a/releasenotes/notes/fix-generic-driver-using-uuid-to-mount-volumes-291208b283120224.yaml b/releasenotes/notes/fix-generic-driver-using-uuid-to-mount-volumes-291208b283120224.yaml new file mode 100644 index 0000000000..c2233e0f1f --- /dev/null +++ b/releasenotes/notes/fix-generic-driver-using-uuid-to-mount-volumes-291208b283120224.yaml @@ -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.