From b4c3de448324a35da8b92905c04cc169430cf4a0 Mon Sep 17 00:00:00 2001 From: PeterMocary Date: Sun, 26 Jun 2022 13:56:24 +0200 Subject: [PATCH 16/32] Merge of the yumconfigscanner actor into the scanpkgmanager actor --- .../actors/checkyumpluginsenabled/actor.py | 8 ++-- .../libraries/checkyumpluginsenabled.py | 6 +-- .../tests/test_checkyumpluginsenabled.py | 6 +-- .../libraries/pluginscanner.py} | 48 +++++++------------ .../libraries/scanpkgmanager.py | 6 ++- .../tests/test_pluginscanner.py} | 26 +++++----- .../tests/test_scanpkgmanager.py | 2 +- .../common/actors/yumconfigscanner/actor.py | 18 ------- .../common/models/packagemanagerinfo.py | 2 + .../system_upgrade/common/models/yumconfig.py | 8 ---- 10 files changed, 48 insertions(+), 82 deletions(-) rename repos/system_upgrade/common/actors/{yumconfigscanner/libraries/yumconfigscanner.py => scanpkgmanager/libraries/pluginscanner.py} (56%) rename repos/system_upgrade/common/actors/{yumconfigscanner/tests/test_yumconfigscanner.py => scanpkgmanager/tests/test_pluginscanner.py} (74%) delete mode 100644 repos/system_upgrade/common/actors/yumconfigscanner/actor.py delete mode 100644 repos/system_upgrade/common/models/yumconfig.py diff --git a/repos/system_upgrade/common/actors/checkyumpluginsenabled/actor.py b/repos/system_upgrade/common/actors/checkyumpluginsenabled/actor.py index c6872fa7..fbc2f8bc 100644 --- a/repos/system_upgrade/common/actors/checkyumpluginsenabled/actor.py +++ b/repos/system_upgrade/common/actors/checkyumpluginsenabled/actor.py @@ -1,6 +1,6 @@ from leapp.actors import Actor from leapp.libraries.actor.checkyumpluginsenabled import check_required_yum_plugins_enabled -from leapp.models import YumConfig +from leapp.models import PkgManagerInfo from leapp.reporting import Report from leapp.tags import ChecksPhaseTag, IPUWorkflowTag @@ -11,10 +11,10 @@ class CheckYumPluginsEnabled(Actor): """ name = 'check_yum_plugins_enabled' - consumes = (YumConfig,) + consumes = (PkgManagerInfo,) produces = (Report,) tags = (ChecksPhaseTag, IPUWorkflowTag) def process(self): - yum_config = next(self.consume(YumConfig)) - check_required_yum_plugins_enabled(yum_config) + pkg_manager_info = next(self.consume(PkgManagerInfo)) + check_required_yum_plugins_enabled(pkg_manager_info) diff --git a/repos/system_upgrade/common/actors/checkyumpluginsenabled/libraries/checkyumpluginsenabled.py b/repos/system_upgrade/common/actors/checkyumpluginsenabled/libraries/checkyumpluginsenabled.py index 7c7398df..48f38d0a 100644 --- a/repos/system_upgrade/common/actors/checkyumpluginsenabled/libraries/checkyumpluginsenabled.py +++ b/repos/system_upgrade/common/actors/checkyumpluginsenabled/libraries/checkyumpluginsenabled.py @@ -10,16 +10,16 @@ REQUIRED_YUM_PLUGINS = {'subscription-manager', 'product-id'} FMT_LIST_SEPARATOR = '\n - ' -def check_required_yum_plugins_enabled(yum_config): +def check_required_yum_plugins_enabled(pkg_manager_info): """ Checks whether the yum plugins required by the IPU are enabled. If they are not enabled, a report is produced informing the user about it. - :param yum_config: YumConfig + :param pkg_manager_info: PkgManagerInfo """ - missing_required_plugins = REQUIRED_YUM_PLUGINS - set(yum_config.enabled_plugins) + missing_required_plugins = REQUIRED_YUM_PLUGINS - set(pkg_manager_info.enabled_plugins) if skip_rhsm(): missing_required_plugins -= {'subscription-manager', 'product-id'} diff --git a/repos/system_upgrade/common/actors/checkyumpluginsenabled/tests/test_checkyumpluginsenabled.py b/repos/system_upgrade/common/actors/checkyumpluginsenabled/tests/test_checkyumpluginsenabled.py index 896d31d5..9bf9a3ba 100644 --- a/repos/system_upgrade/common/actors/checkyumpluginsenabled/tests/test_checkyumpluginsenabled.py +++ b/repos/system_upgrade/common/actors/checkyumpluginsenabled/tests/test_checkyumpluginsenabled.py @@ -4,7 +4,7 @@ from leapp import reporting from leapp.libraries.actor.checkyumpluginsenabled import check_required_yum_plugins_enabled from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked from leapp.libraries.stdlib import api -from leapp.models import YumConfig +from leapp.models import PkgManagerInfo from leapp.utils.report import is_inhibitor @@ -38,7 +38,7 @@ def test__create_report_mocked(monkeypatch): def test_report_when_missing_required_plugins(monkeypatch): """Test whether a report entry is created when any of the required YUM plugins are missing.""" - yum_config = YumConfig(enabled_plugins=['product-id', 'some-user-plugin']) + yum_config = PkgManagerInfo(enabled_plugins=['product-id', 'some-user-plugin']) actor_reports = create_report_mocked() @@ -62,7 +62,7 @@ def test_nothing_is_reported_when_rhsm_disabled(monkeypatch): monkeypatch.setattr(api, 'current_actor', actor_mocked) monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) - yum_config = YumConfig(enabled_plugins=[]) + yum_config = PkgManagerInfo(enabled_plugins=[]) check_required_yum_plugins_enabled(yum_config) assert not reporting.create_report.called, 'Report was created even if LEAPP_NO_RHSM was set' diff --git a/repos/system_upgrade/common/actors/yumconfigscanner/libraries/yumconfigscanner.py b/repos/system_upgrade/common/actors/scanpkgmanager/libraries/pluginscanner.py similarity index 56% rename from repos/system_upgrade/common/actors/yumconfigscanner/libraries/yumconfigscanner.py rename to repos/system_upgrade/common/actors/scanpkgmanager/libraries/pluginscanner.py index 0b7d5fe6..7bb03996 100644 --- a/repos/system_upgrade/common/actors/yumconfigscanner/libraries/yumconfigscanner.py +++ b/repos/system_upgrade/common/actors/scanpkgmanager/libraries/pluginscanner.py @@ -1,26 +1,25 @@ import re from leapp.libraries.common.config.version import get_source_major_version -from leapp.libraries.stdlib import api, run -from leapp.models import YumConfig +from leapp.libraries.stdlib import run # When the output spans multiple lines, each of the lines after the first one # start with a ' : ' -YUM_LOADED_PLUGINS_NEXT_LINE_START = ' +: ' +LOADED_PLUGINS_NEXT_LINE_START = ' +: ' -def _parse_loaded_plugins(yum_output): +def _parse_loaded_plugins(package_manager_output): """ - Retrieves a list of plugins that are being loaded when calling yum. + Retrieves a list of plugins that are being loaded when calling dnf/yum. - :param dict yum_output: The result of running the yum command. + :param dict package_manager_output: The result of running the package manager command. :rtype: list - :returns: A list of plugins that are being loaded when calling yum. + :returns: A list of plugins that are being loaded by the package manager. """ - # YUM might break the information about loaded plugins into multiple lines, + # Package manager might break the information about loaded plugins into multiple lines, # we need to concaternate the list ourselves loaded_plugins_str = '' - for line in yum_output['stdout']: + for line in package_manager_output['stdout']: if line.startswith('Loaded plugins:'): # We have found the first line that contains the plugins plugins_on_this_line = line[16:] # Remove the `Loaded plugins: ` part @@ -32,7 +31,7 @@ def _parse_loaded_plugins(yum_output): continue if loaded_plugins_str: - if re.match(YUM_LOADED_PLUGINS_NEXT_LINE_START, line): + if re.match(LOADED_PLUGINS_NEXT_LINE_START, line): # The list of plugins continues on this line plugins_on_this_line = line.lstrip(' :') # Remove the leading spaces and semicolon @@ -49,39 +48,28 @@ def _parse_loaded_plugins(yum_output): return loaded_plugins_str.split(', ') -def scan_enabled_yum_plugins(): +def scan_enabled_package_manager_plugins(): """ - Runs the `yum` command and parses its output for enabled/loaded plugins. + Runs package manager (yum/dnf) command and parses its output for enabled/loaded plugins. :return: A list of enabled plugins. :rtype: List """ - # We rely on yum itself to report what plugins are used when it is invoked. - # An alternative approach would be to check /usr/lib/yum-plugins/ (install - # path for yum plugins) and parse corresponding configurations from - # /etc/yum/pluginconf.d/ + # We rely on package manager itself to report what plugins are used when it is invoked. + # An alternative approach would be to check the install path for package manager plugins + # and parse corresponding plugin configuration files. if get_source_major_version() == '7': # in case of yum, set debuglevel=2 to be sure the output is always # same. The format of data is different for various debuglevels - yum_cmd = ['yum', '--setopt=debuglevel=2'] + cmd = ['yum', '--setopt=debuglevel=2'] else: # the verbose mode in dnf always set particular debuglevel, so the # output is not affected by the default debug level set on the # system - yum_cmd = ['dnf', '-v'] # On RHEL8 we need to supply an extra switch + cmd = ['dnf', '-v'] # On RHEL8 we need to supply an extra switch - yum_output = run(yum_cmd, split=True, checked=False) # The yum command will certainly fail (does not matter). + pkg_manager_output = run(cmd, split=True, checked=False) # The command will certainly fail (does not matter). - return _parse_loaded_plugins(yum_output) - - -def scan_yum_config(): - """ - Scans the YUM configuration and produces :class:`YumConfig` message with the information found. - """ - config = YumConfig() - config.enabled_plugins = scan_enabled_yum_plugins() - - api.produce(config) + return _parse_loaded_plugins(pkg_manager_output) diff --git a/repos/system_upgrade/common/actors/scanpkgmanager/libraries/scanpkgmanager.py b/repos/system_upgrade/common/actors/scanpkgmanager/libraries/scanpkgmanager.py index 7c97fb1a..bf7ec0be 100644 --- a/repos/system_upgrade/common/actors/scanpkgmanager/libraries/scanpkgmanager.py +++ b/repos/system_upgrade/common/actors/scanpkgmanager/libraries/scanpkgmanager.py @@ -1,6 +1,7 @@ import os import re +from leapp.libraries.actor import pluginscanner from leapp.libraries.common.config.version import get_source_major_version from leapp.libraries.stdlib import api from leapp.models import PkgManagerInfo @@ -43,9 +44,9 @@ def _get_proxy_if_set(manager_config_path): """ Get proxy address from specified package manager config. - :param manager_config_path: path to a package manager config + :param str manager_config_path: path to a package manager config :returns: proxy address or None when not set - :rtype: String + :rtype: str """ config = _get_config_contents(manager_config_path) @@ -79,5 +80,6 @@ def process(): pkg_manager_info = PkgManagerInfo() pkg_manager_info.etc_releasever = get_etc_releasever() pkg_manager_info.configured_proxies = get_configured_proxies() + pkg_manager_info.enabled_plugins = pluginscanner.scan_enabled_package_manager_plugins() api.produce(pkg_manager_info) diff --git a/repos/system_upgrade/common/actors/yumconfigscanner/tests/test_yumconfigscanner.py b/repos/system_upgrade/common/actors/scanpkgmanager/tests/test_pluginscanner.py similarity index 74% rename from repos/system_upgrade/common/actors/yumconfigscanner/tests/test_yumconfigscanner.py rename to repos/system_upgrade/common/actors/scanpkgmanager/tests/test_pluginscanner.py index 8406ef00..f0260e54 100644 --- a/repos/system_upgrade/common/actors/yumconfigscanner/tests/test_yumconfigscanner.py +++ b/repos/system_upgrade/common/actors/scanpkgmanager/tests/test_pluginscanner.py @@ -1,6 +1,6 @@ import pytest -from leapp.libraries.actor import yumconfigscanner +from leapp.libraries.actor import pluginscanner CMD_YUM_OUTPUT = '''Loaded plugins: langpacks, my plugin, subscription-manager, product-id Usage: yum [options] COMMAND @@ -16,23 +16,23 @@ Usage: yum [options] COMMAND def assert_plugins_identified_as_enabled(expected_plugins, identified_plugins): - fail_description = 'Failed to parse a plugin from the yum output.' + fail_description = 'Failed to parse a plugin from the package manager output.' for expected_enabled_plugin in expected_plugins: assert expected_enabled_plugin in identified_plugins, fail_description @pytest.mark.parametrize( - ('source_major_version', 'yum_command'), + ('source_major_version', 'command'), [ ('7', ['yum', '--setopt=debuglevel=2']), ('8', ['dnf', '-v']), ] ) -def test_scan_enabled_plugins(monkeypatch, source_major_version, yum_command): - """Tests whether the enabled plugins are correctly retrieved from the yum output.""" +def test_scan_enabled_plugins(monkeypatch, source_major_version, command): + """Tests whether the enabled plugins are correctly retrieved from the package manager output.""" def run_mocked(cmd, **kwargs): - if cmd == yum_command: + if cmd == command: return { 'stdout': CMD_YUM_OUTPUT.split('\n'), 'stderr': 'You need to give some command', @@ -45,10 +45,10 @@ def test_scan_enabled_plugins(monkeypatch, source_major_version, yum_command): # The library imports `run` all the way into its namespace (from ...stdlib import run), # we must overwrite it there then: - monkeypatch.setattr(yumconfigscanner, 'run', run_mocked) - monkeypatch.setattr(yumconfigscanner, 'get_source_major_version', get_source_major_version_mocked) + monkeypatch.setattr(pluginscanner, 'run', run_mocked) + monkeypatch.setattr(pluginscanner, 'get_source_major_version', get_source_major_version_mocked) - enabled_plugins = yumconfigscanner.scan_enabled_yum_plugins() + enabled_plugins = pluginscanner.scan_enabled_package_manager_plugins() assert_plugins_identified_as_enabled( ['langpacks', 'my plugin', 'subscription-manager', 'product-id'], enabled_plugins @@ -63,7 +63,7 @@ def test_scan_enabled_plugins(monkeypatch, source_major_version, yum_command): (CMD_YUM_OUTPUT_MULTILINE_BREAK_ON_WHITESPACE,) ]) def test_yum_loaded_plugins_multiline_output(yum_output, monkeypatch): - """Tests whether the library correctly handles yum plugins getting reported on multiple lines.""" + """Tests whether the library correctly handles plugins getting reported on multiple lines.""" def run_mocked(cmd, **kwargs): return { 'stdout': yum_output.split('\n'), @@ -71,10 +71,10 @@ def test_yum_loaded_plugins_multiline_output(yum_output, monkeypatch): 'exit_code': 1 } - monkeypatch.setattr(yumconfigscanner, 'run', run_mocked) - monkeypatch.setattr(yumconfigscanner, 'get_source_major_version', lambda: '7') + monkeypatch.setattr(pluginscanner, 'run', run_mocked) + monkeypatch.setattr(pluginscanner, 'get_source_major_version', lambda: '7') - enabled_plugins = yumconfigscanner.scan_enabled_yum_plugins() + enabled_plugins = pluginscanner.scan_enabled_package_manager_plugins() assert len(enabled_plugins) == 4, 'Identified more yum plugins than available in the mocked yum output.' assert_plugins_identified_as_enabled( diff --git a/repos/system_upgrade/common/actors/scanpkgmanager/tests/test_scanpkgmanager.py b/repos/system_upgrade/common/actors/scanpkgmanager/tests/test_scanpkgmanager.py index e78b532f..75c5c5ba 100644 --- a/repos/system_upgrade/common/actors/scanpkgmanager/tests/test_scanpkgmanager.py +++ b/repos/system_upgrade/common/actors/scanpkgmanager/tests/test_scanpkgmanager.py @@ -3,7 +3,7 @@ import os import pytest from leapp.libraries import stdlib -from leapp.libraries.actor import scanpkgmanager +from leapp.libraries.actor import pluginscanner, scanpkgmanager from leapp.libraries.common import testutils from leapp.libraries.common.testutils import CurrentActorMocked, produce_mocked from leapp.libraries.stdlib import api diff --git a/repos/system_upgrade/common/actors/yumconfigscanner/actor.py b/repos/system_upgrade/common/actors/yumconfigscanner/actor.py deleted file mode 100644 index 95aee415..00000000 --- a/repos/system_upgrade/common/actors/yumconfigscanner/actor.py +++ /dev/null @@ -1,18 +0,0 @@ -from leapp.actors import Actor -from leapp.libraries.actor.yumconfigscanner import scan_yum_config -from leapp.models import YumConfig -from leapp.tags import ChecksPhaseTag, IPUWorkflowTag - - -class YumConfigScanner(Actor): - """ - Scans the configuration of the YUM package manager. - """ - - name = 'yum_config_scanner' - consumes = () - produces = (YumConfig,) - tags = (IPUWorkflowTag, ChecksPhaseTag) - - def process(self): - scan_yum_config() diff --git a/repos/system_upgrade/common/models/packagemanagerinfo.py b/repos/system_upgrade/common/models/packagemanagerinfo.py index aa450978..bf969338 100644 --- a/repos/system_upgrade/common/models/packagemanagerinfo.py +++ b/repos/system_upgrade/common/models/packagemanagerinfo.py @@ -22,3 +22,5 @@ class PkgManagerInfo(Model): """ A sorted list of proxies present in yum and dnf configuration files. """ + + enabled_plugins = fields.List(fields.String(), default=[]) diff --git a/repos/system_upgrade/common/models/yumconfig.py b/repos/system_upgrade/common/models/yumconfig.py deleted file mode 100644 index 506ce47e..00000000 --- a/repos/system_upgrade/common/models/yumconfig.py +++ /dev/null @@ -1,8 +0,0 @@ -from leapp.models import fields, Model -from leapp.topics import SystemFactsTopic - - -class YumConfig(Model): - topic = SystemFactsTopic - - enabled_plugins = fields.List(fields.String(), default=[]) -- 2.38.1