Make kolla_set_configs open files in binary mode

This fixes comparisons when files are not Unicode-encoded.

A relevant unit test is included.
It can be used as a base for other _cmp_file method unit tests
if the need arises.

Change-Id: Ic638516eb92d24ad247a7866fd1b5e2ac0400388
Closes-Bug: #1913952
(cherry picked from commit 8e3027c542)
This commit is contained in:
Radosław Piliszek 2021-01-31 17:09:04 +01:00
parent 0e260fe703
commit dc5fe2f0eb
3 changed files with 30 additions and 1 deletions

View File

@ -164,7 +164,7 @@ class ConfigFile(object):
not os.path.exists(dest)):
return False
# check content
with open(source) as f1, open(dest) as f2:
with open(source, 'rb') as f1, open(dest, 'rb') as f2:
if f1.read() != f2.read():
LOG.error('The content of source file(%s) and'
' dest file(%s) are not equal.', source, dest)

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Fixes an issue with the ``kolla_set_configs --check`` command when
the compared files are non-Unicode.
`LP#1913952 <https://launchpad.net/bugs/1913952>`__

View File

@ -329,3 +329,26 @@ class ConfigFileTest(base.BaseTestCase):
mock_cmp_dir.assert_called_once_with(
'/var/lib/kolla/config_files/bar', '/foo')
mock_cmp_file.assert_not_called()
@mock.patch('grp.getgrgid', autospec=True)
@mock.patch('pwd.getpwuid', autospec=True)
@mock.patch('os.stat', autospec=True)
@mock.patch('builtins.open', new_callable=mock.mock_open)
@mock.patch('os.path.exists', autospec=True)
def test_cmp_file_opens_both_files_rb(self, mock_os_exists, mock_open,
mock_os_stat, mock_pwd_getpwuid,
mock_grp_getgrgid):
config_file = set_configs.ConfigFile(
'/var/lib/kolla/config_files/bar', '/foo', 'user1', '0644')
mock_os_exists.return_value = True
mock_os_stat.return_value.st_mode = int('0o100644', 8)
mock_pwd_getpwuid.return_value.pw_name = 'user1'
mock_grp_getgrgid.return_value.gr_name = 'user1'
self.assertIs(True,
config_file._cmp_file('/fake/file1', '/fake/file2'))
self.assertEqual([mock.call('/fake/file1', 'rb'),
mock.call('/fake/file2', 'rb')],
mock_open.call_args_list)