From dc5fe2f0eb19601236a54deeeee4ebc0ccd519d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Piliszek?= Date: Sun, 31 Jan 2021 17:09:04 +0100 Subject: [PATCH] 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 8e3027c5427ecfb89fe48ad38eb8189b1608d0fc) --- docker/base/set_configs.py | 2 +- .../notes/bug-1913952-a23431cef137f9c7.yaml | 6 +++++ tests/test_set_config.py | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/bug-1913952-a23431cef137f9c7.yaml diff --git a/docker/base/set_configs.py b/docker/base/set_configs.py index 572e4a001c..0cb0e414c6 100644 --- a/docker/base/set_configs.py +++ b/docker/base/set_configs.py @@ -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) diff --git a/releasenotes/notes/bug-1913952-a23431cef137f9c7.yaml b/releasenotes/notes/bug-1913952-a23431cef137f9c7.yaml new file mode 100644 index 0000000000..c1987d38e4 --- /dev/null +++ b/releasenotes/notes/bug-1913952-a23431cef137f9c7.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixes an issue with the ``kolla_set_configs --check`` command when + the compared files are non-Unicode. + `LP#1913952 `__ diff --git a/tests/test_set_config.py b/tests/test_set_config.py index 3888a38cca..34aceb0182 100644 --- a/tests/test_set_config.py +++ b/tests/test_set_config.py @@ -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)