Browse Source

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 c5320eb223)
changes/28/751728/1
Mark Goddard 1 month ago
parent
commit
c6835b12a6
3 changed files with 53 additions and 5 deletions
  1. +6
    -5
      docker/base/set_configs.py
  2. +6
    -0
      releasenotes/notes/fix-config-check-c973c462761a4fa9.yaml
  3. +41
    -0
      tests/test_set_config.py

+ 6
- 5
docker/base/set_configs.py View File

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



+ 6
- 0
releasenotes/notes/fix-config-check-c973c462761a4fa9.yaml View File

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

+ 41
- 0
tests/test_set_config.py View File

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

Loading…
Cancel
Save