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/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..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 @@ -38,6 +40,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 +153,14 @@ 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")) + 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()) 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