From 4662a3d342de4be584812267c5b59ed9c1f9c44e Mon Sep 17 00:00:00 2001 From: Jaroslav Mracek Date: Tue, 25 Jun 2019 18:54:54 +0200 Subject: [PATCH] Report missing default profile as an error (RhBug:1669527,1724564) The behavior where module install command doesn't install any package when there are no default profiles was recognized by users as an unexpected behavior. The patch allows DNF to fail when no default profile is available. https://bugzilla.redhat.com/show_bug.cgi?id=1669527 https://bugzilla.redhat.com/show_bug.cgi?id=1724564 --- dnf/module/module_base.py | 27 +++++++++++++++++++++++---- tests/test_modules.py | 12 ++---------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/dnf/module/module_base.py b/dnf/module/module_base.py index 83e5e4a..ea56ad0 100644 --- a/dnf/module/module_base.py +++ b/dnf/module/module_base.py @@ -83,21 +83,40 @@ class ModuleBase(object): if nsvcap.profile: profiles.extend(latest_module.getProfiles(nsvcap.profile)) if not profiles: - logger.error(_("Unable to match profile in argument {}").format(spec)) + available_profiles = latest_module.getProfiles() + if available_profiles: + profile_names = ", ".join( + [profile.getName() for profile in available_profiles]) + msg = _("Unable to match profile for argument {}. Available " + "profiles for '{}:{}': {}").format( + spec, name, stream, profile_names) + else: + msg = _("Unable to match profile for argument {}").format(spec) + logger.error(msg) no_match_specs.append(spec) continue else: profiles_strings = self.base._moduleContainer.getDefaultProfiles( name, stream) if not profiles_strings: - logger.error(_("No default profiles for module {}:{}").format( - name, stream)) + available_profiles = latest_module.getProfiles() + if available_profiles: + profile_names = ", ".join( + [profile.getName() for profile in available_profiles]) + msg = _("No default profiles for module {}:{}. Available profiles" + ": {}").format( + name, stream, profile_names) + else: + msg = _("No default profiles for module {}:{}").format(name, stream) + logger.error(msg) + no_match_specs.append(spec) for profile in set(profiles_strings): module_profiles = latest_module.getProfiles(profile) if not module_profiles: logger.error( - _("Profile {} not matched for module {}:{}").format( + _("Default profile {} not available in module {}:{}").format( profile, name, stream)) + no_match_specs.append(spec) profiles.extend(module_profiles) for profile in profiles: diff --git a/tests/test_modules.py b/tests/test_modules.py index d5fde4f..49e7718 100644 --- a/tests/test_modules.py +++ b/tests/test_modules.py @@ -274,16 +274,8 @@ class ModuleTest(unittest.TestCase): def test_install_implicit_empty_default_profile(self): # install module without a 'default' profile - # -> no packages should be installed, just module enablement - self.module_base.install(["m4:1.4.18"]) - - self.assertEqual(self.base._moduleContainer.getModuleState("m4"), - libdnf.module.ModulePackageContainer.ModuleState_ENABLED) - self.assertEqual(self.base._moduleContainer.getEnabledStream("m4"), "1.4.18") - self.assertEqual(list(self.base._moduleContainer.getInstalledProfiles("m4")), []) - - self.base.resolve() - self.assertInstalls([]) + # -> It should raise an error + self.assertRaises(dnf.exceptions.MarkingErrors, self.module_base.install, ["m4:1.4.18"]) # dnf module upgrade / dnf upgrade @ -- libgit2 0.28.2