summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Goddard <mark@stackhpc.com>2020-08-06 10:50:25 +0100
committerMark Goddard <mark@stackhpc.com>2020-09-14 10:09:05 +0000
commitc6835b12a6f1e8f715aa5c69383a8d1836551496 (patch)
tree235bcdbe25f5824275c00d6dcce4549da20d8bea
parenta34ac859df196a7eef3a7ee6bf4d954841dcf313 (diff)
downloadkolla-c6835b12a6f1e8f715aa5c69383a8d1836551496.tar.gz
kolla-c6835b12a6f1e8f715aa5c69383a8d1836551496.zip
Fix kolla_set_configs --check with a directory
There are several issues with kolla_set_configs --check: 1. We calculate the destination path incorrectly when comparing a file in a directory, due to passing arguments to os.path.relpath in the wrong order 2. For directories that have not changed, we also attempt to compare them as files, which fails when they are open()ed. 3. If the config JSON does not have a config_files key, it fails with a KeyError. The first two issues affect the fluentd container, which specifies directories as the source, without using a glob. The third affects OVN containers. This patch fixes these issues. Closes-Bug: #1890567 Change-Id: I8921befe51da4282121443849177a7ca5ebe8822 (cherry picked from commit c5320eb22386c34d83435fa0b9aa03b178996b52)
-rw-r--r--docker/base/set_configs.py11
-rw-r--r--releasenotes/notes/fix-config-check-c973c462761a4fa9.yaml6
-rw-r--r--tests/test_set_config.py41
3 files changed, 53 insertions, 5 deletions
diff --git a/docker/base/set_configs.py b/docker/base/set_configs.py
index 9176a510d..dea1ac139 100644
--- a/docker/base/set_configs.py
+++ b/docker/base/set_configs.py
@@ -196,8 +196,8 @@ class ConfigFile(object):
return False
for file_ in files:
full_path = os.path.join(root, file_)
- dest_full_path = os.path.join(dest, os.path.relpath(source,
- full_path))
+ dest_full_path = os.path.join(dest, os.path.relpath(full_path,
+ source))
if not self._cmp_file(full_path, dest_full_path):
return False
return True
@@ -217,8 +217,9 @@ class ConfigFile(object):
# otherwise means copy the source to dest
if dest.endswith(os.sep):
dest = os.path.join(dest, os.path.basename(source))
- if os.path.isdir(source) and not self._cmp_dir(source, dest):
- bad_state_files.append(source)
+ if os.path.isdir(source):
+ if not self._cmp_dir(source, dest):
+ bad_state_files.append(source)
elif not self._cmp_file(source, dest):
bad_state_files.append(source)
if len(bad_state_files) != 0:
@@ -396,7 +397,7 @@ def execute_config_strategy(config):
def execute_config_check(config):
- for data in config['config_files']:
+ for data in config.get('config_files', []):
config_file = ConfigFile(**data)
config_file.check()
diff --git a/releasenotes/notes/fix-config-check-c973c462761a4fa9.yaml b/releasenotes/notes/fix-config-check-c973c462761a4fa9.yaml
new file mode 100644
index 000000000..ee87646df
--- /dev/null
+++ b/releasenotes/notes/fix-config-check-c973c462761a4fa9.yaml
@@ -0,0 +1,6 @@
+---
+fixes:
+ - |
+ Fixes an issue with the ``kolla_set_configs --check`` command when the
+ source is a directory. `LP#1890567
+ <https://bugs.launchpad.net/kolla/+bug/1890567>`__
diff --git a/tests/test_set_config.py b/tests/test_set_config.py
index e4706c99d..b7a3bfdae 100644
--- a/tests/test_set_config.py
+++ b/tests/test_set_config.py
@@ -287,3 +287,44 @@ class ConfigFileTest(base.BaseTestCase):
'/foo/bar.conf'),
mock.call('/var/lib/kolla/config_files/bar.yml',
'/foo/bar.yml')])
+
+ @mock.patch.object(set_configs.ConfigFile, '_cmp_file')
+ @mock.patch.object(set_configs.ConfigFile, '_cmp_dir')
+ @mock.patch('os.path.isdir', return_value=False)
+ @mock.patch('glob.glob')
+ def test_check_source_dir(self, mock_glob, mock_isdir, mock_cmp_dir,
+ mock_cmp_file):
+ config_file = set_configs.ConfigFile(
+ '/var/lib/kolla/config_files/bar', '/foo', 'user1', '0644')
+
+ mock_glob.return_value = ['/var/lib/kolla/config_files/bar']
+ mock_isdir.return_value = True
+ mock_cmp_dir.return_value = True
+
+ config_file.check()
+
+ mock_isdir.assert_called_once_with('/var/lib/kolla/config_files/bar')
+ mock_cmp_dir.assert_called_once_with(
+ '/var/lib/kolla/config_files/bar', '/foo')
+ mock_cmp_file.assert_not_called()
+
+ @mock.patch.object(set_configs.ConfigFile, '_cmp_file')
+ @mock.patch.object(set_configs.ConfigFile, '_cmp_dir')
+ @mock.patch('os.path.isdir', return_value=False)
+ @mock.patch('glob.glob')
+ def test_check_source_dir_no_equal(self, mock_glob, mock_isdir,
+ mock_cmp_dir, mock_cmp_file):
+ config_file = set_configs.ConfigFile(
+ '/var/lib/kolla/config_files/bar', '/foo', 'user1', '0644')
+
+ mock_glob.return_value = ['/var/lib/kolla/config_files/bar']
+ mock_isdir.return_value = True
+ mock_cmp_dir.return_value = False
+
+ self.assertRaises(set_configs.ConfigFileBadState,
+ config_file.check)
+
+ mock_isdir.assert_called_once_with('/var/lib/kolla/config_files/bar')
+ mock_cmp_dir.assert_called_once_with(
+ '/var/lib/kolla/config_files/bar', '/foo')
+ mock_cmp_file.assert_not_called()