From 3de42f288e6ecdc79d932a5e0f10ff8495a4b707 Mon Sep 17 00:00:00 2001 From: bachmanity1 Date: Fri, 19 Sep 2025 16:52:15 +0900 Subject: [PATCH] cephadm: support custom distros by falling back to ID_LIKE This change enables cephadm to work on custom or derivative distributions that are based on supported distros without requiring code changes for each new custom/derivative distro. Signed-off-by: bachmanity1 (cherry picked from commit 35323380403eebe69ad8650a2036afa87569d1a2) --- src/cephadm/cephadmlib/packagers.py | 22 +++++++++++++ src/cephadm/tests/test_util_funcs.py | 48 ++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/src/cephadm/cephadmlib/packagers.py b/src/cephadm/cephadmlib/packagers.py index df015771650b5..a353fbe79a08d 100644 --- a/src/cephadm/cephadmlib/packagers.py +++ b/src/cephadm/cephadmlib/packagers.py @@ -19,6 +19,7 @@ logger = logging.getLogger() def get_distro(): # type: () -> Tuple[Optional[str], Optional[str], Optional[str]] distro = None + distro_like: List[str] = [] distro_version = None distro_codename = None with open('/etc/os-release', 'r') as f: @@ -31,13 +32,34 @@ def get_distro(): val = val[1:-1] if var == 'ID': distro = val.lower() + elif var == 'ID_LIKE': + # ID_LIKE can be space-separated or comma-separated + for token in val.replace(',', ' ').split(): + distro_like.append(token.strip().lower()) elif var == 'VERSION_ID': distro_version = val.lower() elif var == 'VERSION_CODENAME': distro_codename = val.lower() + + if not is_known_distro(distro): + for candidate_distro in distro_like: + if is_known_distro(candidate_distro): + distro = candidate_distro + break + return distro, distro_version, distro_codename +def is_known_distro(distro: Optional[str]) -> bool: + if not distro: + return False + return ( + distro in YumDnf.DISTRO_NAMES + or distro in Apt.DISTRO_NAMES + or distro in Zypper.DISTRO_NAMES + ) + + class Packager(object): def __init__( self, diff --git a/src/cephadm/tests/test_util_funcs.py b/src/cephadm/tests/test_util_funcs.py index d2aa39aca4bf8..e5b88fcf83989 100644 --- a/src/cephadm/tests/test_util_funcs.py +++ b/src/cephadm/tests/test_util_funcs.py @@ -517,6 +517,54 @@ VERSION_CODENAME=hpec nimda """, ("hpec", "33", "hpec nimda"), ), + ( + """# Fallback: unknown distro with comma-separated ID_LIKE +ID="custom-rhel" +ID_LIKE="rhel,centos,fedora" +VERSION_ID="8" + """, + ("rhel", "8", None), + ), + ( + """# Fallback: unknown distro with space-separated ID_LIKE +ID="custom-rhel" +ID_LIKE="rhel centos fedora" +VERSION_ID="8" + """, + ("rhel", "8", None), + ), + ( + """# Fallback: picks first known distro from mixed ID_LIKE +ID="custom-distro" +ID_LIKE="unknown-distro,centos,fedora" +VERSION_ID="8" + """, + ("centos", "8", None), + ), + ( + """# No fallback: unknown distro with unknown ID_LIKE values +ID="unknown-distro" +ID_LIKE="also-unknown another-unknown" +VERSION_ID="1.0" + """, + ("unknown-distro", "1.0", None), + ), + ( + """# No fallback: unknown distro with empty ID_LIKE +ID="unknown-distro" +ID_LIKE="" +VERSION_ID="1.0" + """, + ("unknown-distro", "1.0", None), + ), + ( + """# No fallback: known distro stays unchanged +ID="rocky" +ID_LIKE="rhel centos fedora" +VERSION_ID="8.5" + """, + ("rocky", "8.5", None), + ), ], ) def test_get_distro(monkeypatch, content, expected): -- 2.39.5