Merge "Windows: case insensitive path comparisons"
This commit is contained in:
commit
51b56b7ffa
@ -65,6 +65,7 @@ class ExecuteTestCase(test.TestCase):
|
|||||||
root_helper=mock_helper)
|
root_helper=mock_helper)
|
||||||
|
|
||||||
|
|
||||||
|
@ddt.ddt
|
||||||
class GenericUtilsTestCase(test.TestCase):
|
class GenericUtilsTestCase(test.TestCase):
|
||||||
def test_as_int(self):
|
def test_as_int(self):
|
||||||
test_obj_int = '2'
|
test_obj_int = '2'
|
||||||
@ -282,6 +283,21 @@ class GenericUtilsTestCase(test.TestCase):
|
|||||||
self.assertEqual('sudo cinder-rootwrap /path/to/conf',
|
self.assertEqual('sudo cinder-rootwrap /path/to/conf',
|
||||||
utils.get_root_helper())
|
utils.get_root_helper())
|
||||||
|
|
||||||
|
@ddt.data({'path_a': 'test', 'path_b': 'test', 'exp_eq': True})
|
||||||
|
@ddt.data({'path_a': 'test', 'path_b': 'other', 'exp_eq': False})
|
||||||
|
@ddt.unpack
|
||||||
|
@mock.patch('os.path.normcase')
|
||||||
|
def test_paths_normcase_equal(self, mock_normcase, path_a,
|
||||||
|
path_b, exp_eq):
|
||||||
|
# os.path.normcase will lower the path string on Windows
|
||||||
|
# while doing nothing on other platforms.
|
||||||
|
mock_normcase.side_effect = lambda x: x
|
||||||
|
|
||||||
|
result = utils.paths_normcase_equal(path_a, path_b)
|
||||||
|
self.assertEqual(exp_eq, result)
|
||||||
|
|
||||||
|
mock_normcase.assert_has_calls([mock.call(path_a), mock.call(path_b)])
|
||||||
|
|
||||||
|
|
||||||
class TemporaryChownTestCase(test.TestCase):
|
class TemporaryChownTestCase(test.TestCase):
|
||||||
@mock.patch('os.stat')
|
@mock.patch('os.stat')
|
||||||
|
@ -435,7 +435,7 @@ class RemoteFsSnapDriverTestCase(test.TestCase):
|
|||||||
|
|
||||||
@ddt.data([None, '/fake_basedir'],
|
@ddt.data([None, '/fake_basedir'],
|
||||||
['/fake_basedir/cb2016/fake_vol_name', '/fake_basedir'],
|
['/fake_basedir/cb2016/fake_vol_name', '/fake_basedir'],
|
||||||
['/fake_basedir/cb2016/fake_vol_name.vhd', '/fake_basedir'],
|
['/fake_basedir/cb2016/fake_vol_name.VHD', '/fake_basedir'],
|
||||||
['/fake_basedir/cb2016/fake_vol_name.404f-404',
|
['/fake_basedir/cb2016/fake_vol_name.404f-404',
|
||||||
'/fake_basedir'],
|
'/fake_basedir'],
|
||||||
['/fake_basedir/cb2016/fake_vol_name.tmp-snap-404f-404',
|
['/fake_basedir/cb2016/fake_vol_name.tmp-snap-404f-404',
|
||||||
|
@ -1133,3 +1133,7 @@ def get_log_levels(prefix):
|
|||||||
return {k: logging.logging.getLevelName(v.logger.getEffectiveLevel())
|
return {k: logging.logging.getLevelName(v.logger.getEffectiveLevel())
|
||||||
for k, v in logging._loggers.items()
|
for k, v in logging._loggers.items()
|
||||||
if k and k.startswith(prefix)}
|
if k and k.startswith(prefix)}
|
||||||
|
|
||||||
|
|
||||||
|
def paths_normcase_equal(path_a, path_b):
|
||||||
|
return os.path.normcase(path_a) == os.path.normcase(path_b)
|
||||||
|
@ -747,7 +747,8 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
'volname': volume_name,
|
'volname': volume_name,
|
||||||
'valid_ext': valid_ext,
|
'valid_ext': valid_ext,
|
||||||
}
|
}
|
||||||
if not re.match(backing_file_template, info.backing_file):
|
if not re.match(backing_file_template, info.backing_file,
|
||||||
|
re.IGNORECASE):
|
||||||
msg = _("File %(path)s has invalid backing file "
|
msg = _("File %(path)s has invalid backing file "
|
||||||
"%(bfile)s, aborting.") % {'path': path,
|
"%(bfile)s, aborting.") % {'path': path,
|
||||||
'bfile': info.backing_file}
|
'bfile': info.backing_file}
|
||||||
@ -803,8 +804,9 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
volume, active_file_path)
|
volume, active_file_path)
|
||||||
higher_file = next((os.path.basename(f['filename'])
|
higher_file = next((os.path.basename(f['filename'])
|
||||||
for f in backing_chain
|
for f in backing_chain
|
||||||
if f.get('backing-filename', '') ==
|
if utils.paths_normcase_equal(
|
||||||
snapshot_file),
|
f.get('backing-filename', ''),
|
||||||
|
snapshot_file)),
|
||||||
None)
|
None)
|
||||||
return higher_file
|
return higher_file
|
||||||
|
|
||||||
@ -1008,7 +1010,7 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
active_file = self.get_active_image_from_info(snapshot.volume)
|
active_file = self.get_active_image_from_info(snapshot.volume)
|
||||||
snapshot_path = os.path.join(
|
snapshot_path = os.path.join(
|
||||||
self._local_volume_dir(snapshot.volume), snapshot_file)
|
self._local_volume_dir(snapshot.volume), snapshot_file)
|
||||||
if (snapshot_file == active_file):
|
if utils.paths_normcase_equal(snapshot_file, active_file):
|
||||||
return
|
return
|
||||||
|
|
||||||
LOG.info('Deleting stale snapshot: %s', snapshot.id)
|
LOG.info('Deleting stale snapshot: %s', snapshot.id)
|
||||||
@ -1094,7 +1096,8 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
|
|
||||||
base_id = None
|
base_id = None
|
||||||
for key, value in snap_info.items():
|
for key, value in snap_info.items():
|
||||||
if value == base_file and key != 'active':
|
if utils.paths_normcase_equal(value,
|
||||||
|
base_file) and key != 'active':
|
||||||
base_id = key
|
base_id = key
|
||||||
break
|
break
|
||||||
if base_id is None:
|
if base_id is None:
|
||||||
@ -1114,7 +1117,7 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
snapshot,
|
snapshot,
|
||||||
online_delete_info)
|
online_delete_info)
|
||||||
|
|
||||||
if snapshot_file == active_file:
|
if utils.paths_normcase_equal(snapshot_file, active_file):
|
||||||
# There is no top file
|
# There is no top file
|
||||||
# T0 | T1 |
|
# T0 | T1 |
|
||||||
# base | snapshot_file | None
|
# base | snapshot_file | None
|
||||||
@ -1140,7 +1143,8 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
raise exception.RemoteFSException(msg)
|
raise exception.RemoteFSException(msg)
|
||||||
|
|
||||||
higher_id = next((i for i in snap_info
|
higher_id = next((i for i in snap_info
|
||||||
if snap_info[i] == higher_file
|
if utils.paths_normcase_equal(snap_info[i],
|
||||||
|
higher_file)
|
||||||
and i != 'active'),
|
and i != 'active'),
|
||||||
None)
|
None)
|
||||||
if higher_id is None:
|
if higher_id is None:
|
||||||
@ -1450,7 +1454,8 @@ class RemoteFSSnapDriverBase(RemoteFSDriver):
|
|||||||
info_path = self._local_path_volume_info(snapshot.volume)
|
info_path = self._local_path_volume_info(snapshot.volume)
|
||||||
snap_info = self._read_info_file(info_path)
|
snap_info = self._read_info_file(info_path)
|
||||||
|
|
||||||
if info['active_file'] == info['snapshot_file']:
|
if utils.paths_normcase_equal(info['active_file'],
|
||||||
|
info['snapshot_file']):
|
||||||
# blockRebase/Pull base into active
|
# blockRebase/Pull base into active
|
||||||
# info['base'] => snapshot_file
|
# info['base'] => snapshot_file
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@ from cinder import exception
|
|||||||
from cinder.i18n import _
|
from cinder.i18n import _
|
||||||
from cinder.image import image_utils
|
from cinder.image import image_utils
|
||||||
from cinder import interface
|
from cinder import interface
|
||||||
|
from cinder import utils
|
||||||
from cinder.volume.drivers import remotefs as remotefs_drv
|
from cinder.volume.drivers import remotefs as remotefs_drv
|
||||||
|
|
||||||
VERSION = '1.1.0'
|
VERSION = '1.1.0'
|
||||||
@ -439,9 +440,9 @@ class WindowsSmbfsDriver(remotefs_drv.RemoteFSPoolMixin,
|
|||||||
merged_img_path = os.path.join(
|
merged_img_path = os.path.join(
|
||||||
self._local_volume_dir(snapshot.volume),
|
self._local_volume_dir(snapshot.volume),
|
||||||
file_to_merge)
|
file_to_merge)
|
||||||
if snap_info['active'] == file_to_merge:
|
if utils.paths_normcase_equal(snap_info['active'], file_to_merge):
|
||||||
new_active_file_path = self._vhdutils.get_vhd_parent_path(
|
new_active_file_path = self._vhdutils.get_vhd_parent_path(
|
||||||
merged_img_path)
|
merged_img_path).lower()
|
||||||
snap_info['active'] = os.path.basename(new_active_file_path)
|
snap_info['active'] = os.path.basename(new_active_file_path)
|
||||||
|
|
||||||
self._delete(merged_img_path)
|
self._delete(merged_img_path)
|
||||||
@ -456,7 +457,7 @@ class WindowsSmbfsDriver(remotefs_drv.RemoteFSPoolMixin,
|
|||||||
active_file_path = os.path.join(self._local_volume_dir(volume),
|
active_file_path = os.path.join(self._local_volume_dir(volume),
|
||||||
active_file)
|
active_file)
|
||||||
|
|
||||||
if active_file_path != volume_path:
|
if not utils.paths_normcase_equal(active_file_path, volume_path):
|
||||||
msg = _('Extend volume is only supported for this '
|
msg = _('Extend volume is only supported for this '
|
||||||
'driver when no snapshots exist.')
|
'driver when no snapshots exist.')
|
||||||
raise exception.InvalidVolume(msg)
|
raise exception.InvalidVolume(msg)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user