Skip to content

Commit

Permalink
Change mechanism of modular errata applicability (RhBug:1804234)
Browse files Browse the repository at this point in the history
It changes the behavior when there is no modular data but errata
includes a module for which it was created. In this case the code will
not recognize it as applicable.

Originally the test recognized errata as applicable when module
stream was enabled. It resulted in problems (false positive) for
multicontext streams. The new algorithm uses name, stream, and context
for the search pattern to prevent false positive. This approach is 100%
functional with static_context modules. For other modules it could
create problems when errata is not shipped together with related yamls.

https://bugzilla.redhat.com/show_bug.cgi?id=1804234
  • Loading branch information
j-mracek authored and kontura committed Mar 11, 2021
1 parent 38942d4 commit 68dc5d5
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 28 deletions.
10 changes: 6 additions & 4 deletions libdnf/sack/advisorymodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,16 @@ bool
AdvisoryModule::isApplicable() const {
auto moduleContainer = dnf_sack_get_module_container(pImpl->sack);
if (!moduleContainer) {
return true;
return false;
}

if (!moduleContainer->isEnabled(getName(), getStream())) {
return false;
for (auto & module : moduleContainer->query(getName(), getStream(), {}, getContext(), {})) {
if (moduleContainer->isModuleActive(module)) {
return true;
}
}

return true;
return false;
}

Advisory * AdvisoryModule::getAdvisory() const
Expand Down
26 changes: 18 additions & 8 deletions tests/libdnf/sack/AdvisoryTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ void AdvisoryTest::setUp()
hy_repo_set_string(repo, MODULES_FN, (repodata + "modules.yaml.gz").c_str());
dnf_sack_load_repo(sack, repo, DNF_SACK_LOAD_FLAG_USE_UPDATEINFO, &error);

// loads modular data into ModulePackageContainer (No module enabled)
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, "platform_id:f33", false, false, false);

libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master", false));
CPPUNIT_ASSERT(modules->enable("perl", "5.23", false));
// Modify modular data and make modules active (enabled - "perl-DBI:master", "perl:5.23")
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);
HyQuery query = new libdnf::Query(sack);
std::vector<libdnf::AdvisoryPkg> advisoryPkgs;
query->getAdvisoryPkgs(HY_EQ, advisoryPkgs);
Expand Down Expand Up @@ -101,7 +109,11 @@ void AdvisoryTest::testGetApplicablePackagesModulesSetupNoneEnabled()
std::vector<libdnf::AdvisoryPkg> pkgsvector;

// When module are setup but none are enabled no collections are applicable -> no packages
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, nullptr, false, false, false);
libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
modules->reset("perl", false);
modules->reset("perl-DBI", false);
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

advisory->getApplicablePackages(pkgsvector);
CPPUNIT_ASSERT(pkgsvector.size() == 0);
}
Expand All @@ -110,10 +122,11 @@ void AdvisoryTest::testGetApplicablePackagesOneApplicableCollection()
{
std::vector<libdnf::AdvisoryPkg> pkgsvector;

// When I enable a module I get packages from all collections that contain that module
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, nullptr, false, false, false);
// When I keep enabled only perl-DBI module I get packages from all collections that contain that module
libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master"));
modules->reset("perl");
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

advisory->getApplicablePackages(pkgsvector);
CPPUNIT_ASSERT(pkgsvector.size() == 3);
CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "test-perl-DBI"));
Expand All @@ -126,10 +139,7 @@ void AdvisoryTest::testGetApplicablePackagesMultipleApplicableCollections()
std::vector<libdnf::AdvisoryPkg> pkgsvector;

// When I enable modules from multiple collections -> I get packages from all applicable collections
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, nullptr, false, false, false);
libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
CPPUNIT_ASSERT(modules->enable("perl", "5.23"));
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master"));
// Enabled - "perl-DBI:master", "perl:5.23"
advisory->getApplicablePackages(pkgsvector);
CPPUNIT_ASSERT(pkgsvector.size() == 4);
CPPUNIT_ASSERT(!g_strcmp0(pkgsvector[0].getNameString(), "test-perl-DBI"));
Expand Down
23 changes: 18 additions & 5 deletions tests/libdnf/sack/DnfPackageTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ void DnfPackageTest::setUp()
hy_repo_set_string(repo, MODULES_FN, (repodata + "modules.yaml.gz").c_str());
dnf_sack_load_repo(sack, repo, DNF_SACK_LOAD_FLAG_USE_UPDATEINFO, &error);

// loads modular data into ModulePackageContainer (No module enabled)
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, "platform_id:f33", false, false, false);

libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master", false));
CPPUNIT_ASSERT(modules->enable("perl", "5.23", false));
// Modify modular data and make modules active (enabled - "perl-DBI:master", "perl:5.23")
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

HyQuery query = new libdnf::Query(sack);
std::vector<libdnf::AdvisoryPkg> advisoryPkgs;
query->getAdvisoryPkgs(HY_EQ, advisoryPkgs);
Expand Down Expand Up @@ -58,21 +67,25 @@ void DnfPackageTest::testDnfPackageGetAdvisories()
advisories = dnf_package_get_advisories(p, HY_EQ);
CPPUNIT_ASSERT(advisories->len == 1);

dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, nullptr, false, false, false);
// When module are setup but none are enabled all collections are not applicable
libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
modules->reset("perl", false);
modules->reset("perl-DBI", false);
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

// When module are setup but none are enabled all collections are not applicable
advisories = dnf_package_get_advisories(p, HY_EQ);
CPPUNIT_ASSERT(advisories->len == 0);

libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);

// When I enable module from collection that doesn't contain p package I don't get the advisory
CPPUNIT_ASSERT(modules->enable("perl", "5.23"));
CPPUNIT_ASSERT(modules->enable("perl", "5.23", false));
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);
advisories = dnf_package_get_advisories(p, HY_EQ);
CPPUNIT_ASSERT(advisories->len == 0);

// When I enable module from collection that contains p package I get the advisory
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master"));
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master", false));
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);
advisories = dnf_package_get_advisories(p, HY_EQ);
CPPUNIT_ASSERT(advisories->len == 1);

Expand Down
36 changes: 25 additions & 11 deletions tests/libdnf/sack/QueryTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ void QueryTest::setUp()
hy_repo_set_string(repo, MODULES_FN, (repodata + "modules.yaml.gz").c_str());
dnf_sack_load_repo(sack, repo, DNF_SACK_LOAD_FLAG_USE_UPDATEINFO, &error);

// loads modular data into ModulePackageContainer (No module enabled)
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, "platform_id:f33", false, false, false);

libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master", false));
CPPUNIT_ASSERT(modules->enable("perl", "5.23", false));
// Modify modular data and make modules active (enabled - "perl-DBI:master", "perl:5.23")
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

HyQuery query = new libdnf::Query(sack);
std::vector<libdnf::AdvisoryPkg> advisoryPkgs;
query->getAdvisoryPkgs(HY_EQ, advisoryPkgs);
Expand Down Expand Up @@ -57,23 +66,28 @@ void QueryTest::testQueryGetAdvisoryPkgs()
CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[0].getNameString(), "test-perl-DBI"));
CPPUNIT_ASSERT(!g_strcmp0(advisoryPkgs[1].getNameString(), "test-perl-DBI"));

dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, nullptr, false, false, false);
// When modules are setup but none are enabled all collections are not applicable - no enabled module
libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
modules->reset("perl", false);
modules->reset("perl-DBI", false);
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

// When module are setup but none are enabled all collections are not applicable
advisoryPkgs.clear();
query->getAdvisoryPkgs(HY_EQ, advisoryPkgs);
CPPUNIT_ASSERT(advisoryPkgs.size() == 0);

libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);

// When I enable module from collection that contains non present pkg it doesn't show up
CPPUNIT_ASSERT(modules->enable("perl", "5.23"));
CPPUNIT_ASSERT(modules->enable("perl", "5.23", false));
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

advisoryPkgs.clear();
query->getAdvisoryPkgs(HY_EQ, advisoryPkgs);
CPPUNIT_ASSERT(advisoryPkgs.size() == 0);

// When I enable a module from multiple collections that contain a present package I get them
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master"));
CPPUNIT_ASSERT(modules->enable("perl-DBI", "master", false));
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);

advisoryPkgs.clear();
query->getAdvisoryPkgs(HY_EQ, advisoryPkgs);
CPPUNIT_ASSERT(advisoryPkgs.size() == 2);
Expand All @@ -100,16 +114,16 @@ void QueryTest::testQueryFilterAdvisory()
g_object_unref(pkg);
delete query;

// First call creates module container, it also uses installroot: 'TESTDATADIR "/advisories/"'
dnf_sack_filter_modules_v2(sack, nullptr, nullptr, tmpdir, nullptr, false, false, false);

// When module are setup but none are enabled all collections are not applicable
// When module are setup but none are enabled all collections are not applicable - no enabled module
libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
modules->reset("perl", false);
modules->reset("perl-DBI", false);
dnf_sack_filter_modules_v2(sack, modules, nullptr, tmpdir, nullptr, true, false, false);
query = new libdnf::Query(sack);
query->addFilter(HY_PKG_ADVISORY_TYPE, HY_EQ, "enhancement");
CPPUNIT_ASSERT(query->size() == 0);
delete query;

libdnf::ModulePackageContainer * modules = dnf_sack_get_module_container(sack);
// When I enable module from collection that contains non present pkg it doesn't show up
CPPUNIT_ASSERT(modules->enable("perl", "5.23"));
modules->save();
Expand Down

0 comments on commit 68dc5d5

Please sign in to comment.