
Previously with the config_files structure of config.json, the group name was automatically set to the one of the user name. It is now possible to set the group name in the same fashion than the 'permissions' structure with: owner: 'desired_owner:desired_group' Closes-Bug: #1696095 Change-Id: Ibae9f74e2351c81a717294467aedc51ea773c41e
270 lines
11 KiB
Python
270 lines
11 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import copy
|
|
import imp
|
|
import json
|
|
import mock
|
|
import os.path
|
|
import sys
|
|
|
|
from oslotest import base
|
|
|
|
# nasty: to import set_config (not a part of the kolla package)
|
|
this_dir = os.path.dirname(sys.modules[__name__].__file__)
|
|
set_configs_file = os.path.abspath(
|
|
os.path.join(this_dir, '..',
|
|
'docker', 'base', 'set_configs.py'))
|
|
|
|
set_configs = imp.load_source('set_configs', set_configs_file)
|
|
|
|
|
|
class LoadFromFile(base.BaseTestCase):
|
|
|
|
def test_load_ok(self):
|
|
in_config = json.dumps({'command': '/bin/true',
|
|
'config_files': {}})
|
|
|
|
mo = mock.mock_open(read_data=in_config)
|
|
with mock.patch.object(set_configs, 'open', mo):
|
|
config = set_configs.load_config()
|
|
set_configs.copy_config(config)
|
|
self.assertEqual([
|
|
mock.call('/var/lib/kolla/config_files/config.json'),
|
|
mock.call().__enter__(),
|
|
mock.call().read(),
|
|
mock.call().__exit__(None, None, None),
|
|
mock.call('/run_command', 'w+'),
|
|
mock.call().__enter__(),
|
|
mock.call().write(u'/bin/true'),
|
|
mock.call().__exit__(None, None, None)], mo.mock_calls)
|
|
|
|
|
|
class LoadFromEnv(base.BaseTestCase):
|
|
|
|
def test_load_ok(self):
|
|
in_config = json.dumps({'command': '/bin/true',
|
|
'config_files': {}})
|
|
|
|
mo = mock.mock_open()
|
|
with mock.patch.object(set_configs, 'open', mo):
|
|
with mock.patch.dict('os.environ', {'KOLLA_CONFIG': in_config}):
|
|
config = set_configs.load_config()
|
|
set_configs.copy_config(config)
|
|
self.assertEqual([mock.call('/run_command', 'w+'),
|
|
mock.call().__enter__(),
|
|
mock.call().write(u'/bin/true'),
|
|
mock.call().__exit__(None, None, None)],
|
|
mo.mock_calls)
|
|
|
|
FAKE_CONFIG_FILES = [
|
|
set_configs.ConfigFile(
|
|
'/var/lib/kolla/config_files/bar.conf',
|
|
'/foo/bar.conf', 'user1', '0644')
|
|
]
|
|
|
|
FAKE_CONFIG_FILE = FAKE_CONFIG_FILES[0]
|
|
|
|
|
|
class ConfigFileTest(base.BaseTestCase):
|
|
|
|
@mock.patch('os.path.exists', return_value=False)
|
|
def test_delete_path_not_exists(self, mock_exists):
|
|
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
config_file._delete_path(config_file.dest)
|
|
|
|
mock_exists.assert_called_with(config_file.dest)
|
|
|
|
@mock.patch('os.path.exists', return_value=True)
|
|
@mock.patch('os.path.isdir', return_value=True)
|
|
@mock.patch('shutil.rmtree')
|
|
def test_delete_path_exist_dir(self,
|
|
mock_rmtree,
|
|
mock_isdir,
|
|
mock_exists):
|
|
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
config_file._delete_path(config_file.dest)
|
|
|
|
mock_exists.assert_called_with(config_file.dest)
|
|
mock_isdir.assert_called_with(config_file.dest)
|
|
mock_rmtree.assert_called_with(config_file.dest)
|
|
|
|
@mock.patch('os.path.exists', return_value=True)
|
|
@mock.patch('os.path.isdir', return_value=False)
|
|
@mock.patch('os.remove')
|
|
def test_delete_path_exist_file(self,
|
|
mock_remove,
|
|
mock_isdir,
|
|
mock_exists):
|
|
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
config_file._delete_path(config_file.dest)
|
|
|
|
mock_exists.assert_called_with(config_file.dest)
|
|
mock_isdir.assert_called_with(config_file.dest)
|
|
mock_remove.assert_called_with(config_file.dest)
|
|
|
|
@mock.patch('os.chmod')
|
|
@mock.patch.object(set_configs, 'handle_permissions')
|
|
def test_set_permission(self,
|
|
mock_handle_permissions,
|
|
mock_chmod):
|
|
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
config_file._set_permission(config_file.dest)
|
|
mock_handle_permissions.assert_called_with({'owner': 'user1',
|
|
'path': config_file.dest,
|
|
'perm': '0644'})
|
|
|
|
@mock.patch('glob.glob', return_value=[])
|
|
def test_copy_no_source_not_optional(self,
|
|
mock_glob):
|
|
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
|
|
self.assertRaises(set_configs.MissingRequiredSource,
|
|
config_file.copy)
|
|
|
|
@mock.patch('glob.glob', return_value=[])
|
|
def test_copy_no_source_optional(self, mock_glob):
|
|
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
config_file.optional = True
|
|
|
|
config_file.copy()
|
|
|
|
mock_glob.assert_called_with(config_file.source)
|
|
|
|
@mock.patch.object(set_configs.ConfigFile, '_copy_file')
|
|
@mock.patch('os.path.isdir', return_value=False)
|
|
@mock.patch.object(set_configs.ConfigFile, '_create_parent_dirs')
|
|
@mock.patch.object(set_configs.ConfigFile, '_delete_path')
|
|
@mock.patch('glob.glob')
|
|
def test_copy_one_source_file(self, mock_glob, mock_delete_path,
|
|
mock_create_parent_dirs, mock_isdir,
|
|
mock_copy_file):
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
|
|
mock_glob.return_value = [config_file.source]
|
|
|
|
config_file.copy()
|
|
|
|
mock_glob.assert_called_with(config_file.source)
|
|
mock_delete_path.assert_called_with(config_file.dest)
|
|
mock_create_parent_dirs.assert_called_with(config_file.dest)
|
|
mock_isdir.assert_called_with(config_file.source)
|
|
mock_copy_file.assert_called_with(config_file.source,
|
|
config_file.dest)
|
|
|
|
@mock.patch.object(set_configs.ConfigFile, '_copy_dir')
|
|
@mock.patch('os.path.isdir', return_value=True)
|
|
@mock.patch.object(set_configs.ConfigFile, '_create_parent_dirs')
|
|
@mock.patch.object(set_configs.ConfigFile, '_delete_path')
|
|
@mock.patch('glob.glob')
|
|
def test_copy_one_source_dir(self, mock_glob, mock_delete_path,
|
|
mock_create_parent_dirs, mock_isdir,
|
|
mock_copy_dir):
|
|
config_file = copy.deepcopy(FAKE_CONFIG_FILE)
|
|
|
|
mock_glob.return_value = [config_file.source]
|
|
|
|
config_file.copy()
|
|
|
|
mock_glob.assert_called_with(config_file.source)
|
|
mock_delete_path.assert_called_with(config_file.dest)
|
|
mock_create_parent_dirs.assert_called_with(config_file.dest)
|
|
mock_isdir.assert_called_with(config_file.source)
|
|
mock_copy_dir.assert_called_with(config_file.source,
|
|
config_file.dest)
|
|
|
|
@mock.patch.object(set_configs.ConfigFile, '_copy_file')
|
|
@mock.patch('os.path.isdir', return_value=False)
|
|
@mock.patch.object(set_configs.ConfigFile, '_create_parent_dirs')
|
|
@mock.patch.object(set_configs.ConfigFile, '_delete_path')
|
|
@mock.patch('glob.glob')
|
|
def test_copy_glob_source_file(self, mock_glob, mock_delete_path,
|
|
mock_create_parent_dirs, mock_isdir,
|
|
mock_copy_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.conf',
|
|
'/var/lib/kolla/config_files/bar.yml']
|
|
|
|
config_file.copy()
|
|
|
|
mock_glob.assert_called_with(config_file.source)
|
|
|
|
self.assertEqual(mock_delete_path.mock_calls,
|
|
[mock.call('/foo/bar.conf'),
|
|
mock.call('/foo/bar.yml')])
|
|
self.assertEqual(mock_create_parent_dirs.mock_calls,
|
|
[mock.call('/foo/bar.conf'),
|
|
mock.call('/foo/bar.yml')])
|
|
self.assertEqual(mock_isdir.mock_calls,
|
|
[mock.call('/var/lib/kolla/config_files/bar.conf'),
|
|
mock.call('/var/lib/kolla/config_files/bar.yml')])
|
|
self.assertEqual(mock_copy_file.mock_calls,
|
|
[mock.call('/var/lib/kolla/config_files/bar.conf',
|
|
'/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('os.path.isdir', return_value=False)
|
|
@mock.patch('glob.glob')
|
|
def test_check_glob_source_file(self, mock_glob, mock_isdir,
|
|
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.conf',
|
|
'/var/lib/kolla/config_files/bar.yml']
|
|
mock_cmp_file.return_value = True
|
|
|
|
config_file.check()
|
|
|
|
self.assertEqual(mock_isdir.mock_calls,
|
|
[mock.call('/var/lib/kolla/config_files/bar.conf'),
|
|
mock.call('/var/lib/kolla/config_files/bar.yml')])
|
|
self.assertEqual(mock_cmp_file.mock_calls,
|
|
[mock.call('/var/lib/kolla/config_files/bar.conf',
|
|
'/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('os.path.isdir', return_value=False)
|
|
@mock.patch('glob.glob')
|
|
def test_check_glob_source_file_no_equal(self, mock_glob, mock_isdir,
|
|
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.conf',
|
|
'/var/lib/kolla/config_files/bar.yml']
|
|
mock_cmp_file.side_effect = [True, False]
|
|
|
|
self.assertRaises(set_configs.ConfigFileBadState,
|
|
config_file.check)
|
|
|
|
self.assertEqual(mock_isdir.mock_calls,
|
|
[mock.call('/var/lib/kolla/config_files/bar.conf'),
|
|
mock.call('/var/lib/kolla/config_files/bar.yml')])
|
|
self.assertEqual(mock_cmp_file.mock_calls,
|
|
[mock.call('/var/lib/kolla/config_files/bar.conf',
|
|
'/foo/bar.conf'),
|
|
mock.call('/var/lib/kolla/config_files/bar.yml',
|
|
'/foo/bar.yml')])
|