From ebc7eb82969af107f5a54b29b8ef898cd759a997 Mon Sep 17 00:00:00 2001 From: Michal Arbet Date: Mon, 25 May 2026 09:56:17 +0200 Subject: set_configs: Add support for creating files and setting perms Change-Id: I74a6d05007488b69fa040c40d01a07afae369794 Needed-By: https://review.opendev.org/c/openstack/kolla-ansible/+/989850 Signed-off-by: Michal Arbet --- docker/base/set_configs.py | 49 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) (limited to 'docker/base') diff --git a/docker/base/set_configs.py b/docker/base/set_configs.py index c0a4af76c..4b025d55a 100644 --- a/docker/base/set_configs.py +++ b/docker/base/set_configs.py @@ -258,7 +258,7 @@ class ConfigFile(object): def validate_config(config): required_keys = {'source', 'dest'} - required_dir_keys = {'path', 'owner', 'perm'} + required_path_keys = {'path', 'owner', 'perm'} if 'command' not in config: raise InvalidConfig('Config is missing required "command" key') @@ -274,11 +274,24 @@ def validate_config(config): raise InvalidConfig( 'Config needs preserve_properties or owner and perm') - for data in config.get('directories', list()): - if not set(data.keys()) >= required_dir_keys: - message = ('directories config is missing required keys: %s' - % (required_dir_keys - set(data.keys()))) - raise InvalidConfig(message) + for section in ('directories', 'files'): + for data in config.get(section, list()): + missing = required_path_keys - set(data.keys()) + if missing: + raise InvalidConfig( + '%s config is missing required keys: %s' + % (section, missing)) + + for key in required_path_keys: + if data.get(key) is None: + raise InvalidConfig( + '%s config key "%s" must not be null' + % (section, key)) + + if glob.has_magic(data['path']): + raise InvalidConfig( + '%s config does not support glob paths: %s' + % (section, data['path'])) def validate_source(data): @@ -375,6 +388,28 @@ def create_directories(config): handle_permissions({'permissions': [data]}) +def create_files(config): + if 'files' not in config: + return + LOG.info('Creating files') + for data in config['files']: + path = data['path'] + if os.path.islink(path): + raise OSError( + "Path is a symbolic link, expected regular file (%s)" % path) + if os.path.isdir(path): + raise OSError( + "Path is a directory, expected file (%s)" % path) + parent = os.path.dirname(path) + if parent and not os.path.isdir(parent): + raise OSError( + "Parent directory does not exist (%s)" % parent) + if not os.path.exists(path): + with open(path, 'a'): + pass + handle_permissions({'permissions': [data]}) + + def user_group(owner): if ':' in owner: user, group = owner.split(':', 1) @@ -611,6 +646,7 @@ def execute_config_strategy(config): LOG.info("Kolla config strategy set to: %s", config_strategy) if config_strategy == "COPY_ALWAYS": create_directories(config) + create_files(config) handle_defaults(config) copy_config(config) handle_permissions(config) @@ -621,6 +657,7 @@ def execute_config_strategy(config): exit_code=0) else: create_directories(config) + create_files(config) handle_defaults(config) copy_config(config) handle_permissions(config) -- cgit v1.2.3