Merge "Windows: case insensitive path comparisons"

This commit is contained in:
Jenkins 2017-06-27 02:19:35 +00:00 committed by Gerrit Code Review
commit 51b56b7ffa
5 changed files with 38 additions and 12 deletions

View File

@ -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')

View File

@ -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',

View File

@ -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)

View File

@ -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

View 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)