]> git-server-git.apps.pok.os.sepia.ceph.com Git - teuthology.git/commitdiff
task/install: allow both list and dicts for extra_system_packages 2092/head
authorKyr Shatskyy <kyrylo.shatskyy@clyso.com>
Wed, 15 Oct 2025 22:41:21 +0000 (00:41 +0200)
committerKyr Shatskyy <kyrylo.shatskyy@clyso.com>
Fri, 17 Oct 2025 23:11:50 +0000 (01:11 +0200)
Fixes: https://tracker.ceph.com/issues/73527
Signed-off-by: Kyr Shatskyy <kyrylo.shatskyy@clyso.com>
teuthology/task/install/__init__.py
teuthology/test/task/test_install.py

index 8d6c159888b7af3298abc482a12ef320fe01f1d2..0e5604eacb185254b7c8e527bca9bd78f734429b 100644 (file)
@@ -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)
 
index 3c5be90484bce4abfd0c91b1d481b93f483b0faa..fd44ac58a462f97baaf15c57adff8fb86d0cf045 100644 (file)
@@ -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