From 0113b0a177433985fe537f873d54fa187e1bfa4e Mon Sep 17 00:00:00 2001 From: Kyr Shatskyy Date: Thu, 16 Oct 2025 00:41:21 +0200 Subject: [PATCH] task/install: allow both list and dicts for extra_system_packages Fixes: https://tracker.ceph.com/issues/73527 Signed-off-by: Kyr Shatskyy --- teuthology/task/install/__init__.py | 36 ++++++------ teuthology/test/task/test_install.py | 83 ++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 17 deletions(-) diff --git a/teuthology/task/install/__init__.py b/teuthology/task/install/__init__.py index 8d6c15988..0e5604eac 100644 --- a/teuthology/task/install/__init__.py +++ b/teuthology/task/install/__init__.py @@ -9,7 +9,6 @@ from teuthology import misc as teuthology from teuthology import contextutil, packaging from teuthology.parallel import parallel from teuthology.task import ansible -from teuthology.exceptions import ConfigError from distutils.version import LooseVersion from teuthology.task.install.util import ( @@ -417,6 +416,21 @@ def ceph_deploy_upgrade(ctx, config): ceph_deploy_upgrade.__doc__ = docstring_for_upgrade.format( cmd_parameter='ceph_deploy_upgrade') +def _override_extra_system_packages(config, project, install_overrides): + teuthology.deep_merge(config, install_overrides.get(project, {})) + extra_overrides = install_overrides.get('extra_system_packages') + if extra_overrides: + extra = config.get('extra_system_packages') + if extra is None: + e = dict(deb=[], rpm=[]) + elif isinstance(extra, list): + e = dict(deb=copy.deepcopy(extra), rpm=copy.deepcopy(extra)) + elif isinstance(extra, dict): + e = copy.deepcopy(extra) + elif isinstance(extra, str): + e = dict(deb=[extra], rpm=[extra]) + + config['extra_system_packages'] = teuthology.deep_merge(e, extra_overrides) @contextlib.contextmanager def task(ctx, config): @@ -568,22 +582,10 @@ def task(ctx, config): repos = None if overrides: - try: - install_overrides = overrides.get('install', {}) - log.debug('INSTALL overrides: %s' % install_overrides) - teuthology.deep_merge(config, install_overrides.get(project, {})) - overrides_extra_system_packages = install_overrides.get('extra_system_packages') - if overrides_extra_system_packages: - extra_system_packages = config.get('extra_system_packages') - config['extra_system_packages'] = teuthology.deep_merge(extra_system_packages, overrides_extra_system_packages) - repos = install_overrides.get('repos', None) - except AssertionError: - raise ConfigError( - "'install' task config and its overrides contain" \ - "conflicting types for the same config key. Ensure that " \ - "the configuration is of the same type (dict, list, etc.) " \ - "in both the task definition and its overrides." - ) + install_overrides = overrides.get('install', {}) + log.debug('INSTALL overrides: %s' % install_overrides) + _override_extra_system_packages(config, project, install_overrides) + repos = install_overrides.get('repos', None) log.debug('config %s' % config) diff --git a/teuthology/test/task/test_install.py b/teuthology/test/task/test_install.py index 3c5be9048..fd44ac58a 100644 --- a/teuthology/test/task/test_install.py +++ b/teuthology/test/task/test_install.py @@ -3,6 +3,7 @@ import pytest import yaml from mock import patch, Mock +from pytest import mark from teuthology.task import install @@ -335,3 +336,85 @@ class TestInstall(object): with pytest.raises(RuntimeError) as e: install.redhat.install_pkgs(ctx, remote, version, rh_ds_yaml) assert "Version check failed" in str(e) + + @mark.parametrize( + 'conf, expect', + [ + [ + { + 'tasks': [ { 'install': { 'clean': True, }, }, ], + 'overrides': { + 'install': { + 'ceph': { + 'extra_system_packages': ['alpha'], + 'flavor': 'default', + 'sha1': '0123456789abcdef0123456789abcdef01234567', + }, + 'extra_system_packages': { + 'deb': [], + 'rpm': ['xerxes', 'yellow'], + }, + }, + }, + }, + { + 'deb': ['alpha'], + 'rpm': ['alpha', 'xerxes', 'yellow'], + } + ], + [ + { + 'tasks': [ { 'install': { 'clean': True, }, }, ], + 'overrides': { + 'install': { + 'ceph': { + 'flavor': 'default', + 'sha1': '0123456789abcdef0123456789abcdef01234567', + }, + 'extra_system_packages': { + 'deb': [], + 'rpm': ['xerxes', 'yellow'], + }, + }, + }, + }, + { + 'deb': [], + 'rpm': ['xerxes', 'yellow'], + } + ], + [ + { + 'tasks': [ { 'install': { 'clean': True, }, }, ], + 'overrides': { 'install': { + 'ceph': { 'flavor': 'default', 'sha1': '012345', }, + 'extra_system_packages': { 'rpm': ['xerxes', 'yellow'], }, + }, + }, + }, + { 'deb': [], 'rpm': ['xerxes', 'yellow'], } + + ], + [ + { + 'tasks': [ { 'install': { 'clean': True, + 'extra_system_packages': { 'deb': ['alpha'], 'rpm': ['bravo'] }, + }, }, ], + 'overrides': { 'install': { + 'ceph': { 'flavor': 'default', 'sha1': '012345', }, + 'extra_system_packages': { 'rpm': ['xerxes', 'yellow'], }, + }, + }, + }, + { 'deb': ['alpha'], 'rpm': ['bravo', 'xerxes', 'yellow'], } + + ], + + ] + ) + def test_install_extra_system_packages(self, conf, expect): + install_task = conf.get('tasks')[0].get('install') + install_overrides = conf.get('overrides').get('install', {}) + install._override_extra_system_packages(install_task, 'ceph', install_overrides) + + assert install_task.get('extra_system_packages') == expect -- 2.47.3