From db46c63a40f3aae8da04ca61a6677226b81be4d4 Mon Sep 17 00:00:00 2001 From: Andrej Luptak Date: Wed, 12 Aug 2026 10:02:25 +0200 Subject: [PATCH 1/2] fix: omit releasever for rhel <= 7.y vmaas_json Ommit releasever in vmaas_json for rhel major versions <= 7 when matching repos so rhel repolist is closer to yum. RHINENG-26908 --- listener/common.py | 22 ++++++++++++++++++++++ listener/inventory_processor.py | 3 ++- tests/listener_tests/test_common.py | 13 +++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/listener/common.py b/listener/common.py index a856608b1..b444e3200 100644 --- a/listener/common.py +++ b/listener/common.py @@ -68,6 +68,28 @@ LOGGER = get_logger(__name__) +def adapt_releasever(releasever: str | None) -> str | None: + """ + Drop RHEL <= 7 numeric releasevers. + This suppresses user ``subscription-manager release --set=...`` + setup, which is intended in this case + to match xServer yum repos for x.y releasever. + This can be removed once RHEL 7 reaches end of life. + """ + if not releasever: + return releasever + dot = releasever.find(".") + if dot <= 0: + return releasever + try: + major = int(releasever[:dot]) + except ValueError: + return releasever + if major > 7: + return releasever + return None + + class ImportStatus(flags.Flags): """Import to database status.""" diff --git a/listener/inventory_processor.py b/listener/inventory_processor.py index a1cd6385d..c8ec7c607 100644 --- a/listener/inventory_processor.py +++ b/listener/inventory_processor.py @@ -38,6 +38,7 @@ from .common import ImportStatus from .common import InventoryMsg from .common import InventoryMsgType +from .common import adapt_releasever from .common import reporter_allowed from .processor import BaseProcessor @@ -150,7 +151,7 @@ def _parse_system_data(self, msg: InventoryMsg) -> (str, list): if installed_packages: basearch = system_profile.get("basearch") or system_profile.get("arch") rhsm_ver = system_profile.get("rhsm", {}).get("version") - releasever = rhsm_ver or system_profile.get("releasever") + releasever = adapt_releasever(rhsm_ver or system_profile.get("releasever")) repo_list, repo_paths = self._format_repo_list(system_profile.get("yum_repos", ()), basearch=basearch, releasever=releasever) modules_list = [{"module_name": m["name"], "module_stream": m["stream"]} for m in system_profile.get("dnf_modules", [])] diff --git a/tests/listener_tests/test_common.py b/tests/listener_tests/test_common.py index 8edb85dda..8909e7578 100644 --- a/tests/listener_tests/test_common.py +++ b/tests/listener_tests/test_common.py @@ -18,3 +18,16 @@ def test_reporter_not_allowed(self): msg_dict = {"input": {"host": {"reporter": "invalid"}}} res = common.reporter_allowed(msg_dict) assert res is False + + def test_adapt_releasever(self): + """RHEL <= 7 numeric -> None and stream labels and RHEL 8+ unchanged""" + # numeric RHEL <= - None (omit from VMaaS request) + assert common.adapt_releasever("7.9") is None + assert common.adapt_releasever("6.9") is None + # already a stream label - pass through + assert common.adapt_releasever("7Server") == "7Server" + assert common.adapt_releasever("7Client") == "7Client" + # no dot / RHEL 8+ / None - unchanged + assert common.adapt_releasever("7") == "7" + assert common.adapt_releasever("8.0") == "8.0" + assert common.adapt_releasever(None) is None From df1624ae53c9a207e636bcb766ad2d5bfc5a7619 Mon Sep 17 00:00:00 2001 From: Andrej Luptak Date: Wed, 12 Aug 2026 10:10:44 +0200 Subject: [PATCH 2/2] chore: debug unleash for releasever values Added an unleash debug log so we can better see what is being passed to releasever so we can possibly make the decission process of releasever more accurate for rhel <= 7 as I am not able to access inventory. --- common/feature_flags.py | 1 + listener/inventory_processor.py | 9 +++++++++ listener/listener.py | 2 ++ 3 files changed, 12 insertions(+) diff --git a/common/feature_flags.py b/common/feature_flags.py index da7c3c5af..8b5c86829 100644 --- a/common/feature_flags.py +++ b/common/feature_flags.py @@ -22,6 +22,7 @@ OS_EXPOSURE_REPORT_FEATURE = "vulnerability.os_exposure_report" NEW_NOTIFICATIONS_FEATURE = "vulnerability.new_notifications" TIMING_LOG_FEATURE = "vulnerability.timing_log" +RELEASEVER_LOG_FEATURE = "vulnerability.releasever_log" class UnleashClientProxy: diff --git a/listener/inventory_processor.py b/listener/inventory_processor.py index c8ec7c607..f961ff587 100644 --- a/listener/inventory_processor.py +++ b/listener/inventory_processor.py @@ -14,6 +14,8 @@ from common.constants import SATELLITE_TAG_KEY from common.constants import SATELLITE_TAG_NAMESPACE from common.constants import HostType +from common.feature_flags import RELEASEVER_LOG_FEATURE +from common.feature_flags import UNLEASH from common.logging import get_logger from common.mqueue import MQWriter from common.mqueue import Partitioners @@ -152,6 +154,13 @@ def _parse_system_data(self, msg: InventoryMsg) -> (str, list): basearch = system_profile.get("basearch") or system_profile.get("arch") rhsm_ver = system_profile.get("rhsm", {}).get("version") releasever = adapt_releasever(rhsm_ver or system_profile.get("releasever")) + if UNLEASH.is_enabled(RELEASEVER_LOG_FEATURE): + LOGGER.info( + "releasever sources: rhsm_ver=%s, sp_releasever=%s, result_releasever=%s", + rhsm_ver, + system_profile.get("releasever"), + releasever, + ) repo_list, repo_paths = self._format_repo_list(system_profile.get("yum_repos", ()), basearch=basearch, releasever=releasever) modules_list = [{"module_name": m["name"], "module_stream": m["stream"]} for m in system_profile.get("dnf_modules", [])] diff --git a/listener/listener.py b/listener/listener.py index dab63bdb6..93aca95b0 100644 --- a/listener/listener.py +++ b/listener/listener.py @@ -10,6 +10,7 @@ from psycopg_pool import AsyncConnectionPool from common.database_handler import setup_async_db_pool +from common.feature_flags import initialize_unleash from common.logging import get_logger from common.logging import init_logging from common.mqueue import MQReader @@ -250,6 +251,7 @@ async def run(self): def main(): """Main""" init_logging() + initialize_unleash() loop = asyncio.new_event_loop() loop.run_until_complete(a_ensure_minimal_schema_version())