Story #3740

Updated by milan over 2 years ago

h2. Motivation

In order for the user to be able to "consume modular content": provided by Pulp, while still enabling the Pulp administrator to copy modular content, including it's dependencies, between repositories and, at the same time, adhering to the "expected modular content upgrade semantics":, Pulp should provide a dependency solving mechanism for the modular content, during the content--repository association workflow.

Pulp (@2.17) doesn't support inter-module dependencies when associating units recursively, neither does Pulp distinguish between modular and non-modular artifacts when recursively copying modules to a repository. Pulp however always copies all module artifacts, including the artifacts rpm dependencies. In a rare case --- there has to be a mixture of modular and non-modular packages with the same name and unlucky coincidence with version for the problem to happen --- what gets copied over might render the target repository broken for a module consumer.

h2. Proposed solution

"Modules": are content units, that ship RPM content with respect to a declared policy, such as backwards compatibility. For this reason, resolving dependencies of a module is slightly different than that of the generic RPM content, especially and unlike described in the "Support more conservative dependency solving": for RPM units, "the preference of the content dependency version goes within the module": i.e in case the target repository already contains units newer than a module requires, the module-required units need to be copied in the older version, in addition to the already present units.

Modules have a concept of "installation profile": that e.g addresses mutual compatibility of client and server software by shipping them together. Selectively copying just a subset of these profiles would break the purpose of the profiles. Therefore, Pulp should copy all the profiles of a module all the time.

"Modules may depend on other modules":, either for the build- or the run-time.

To support these usecases, a fake @libsolv@ solvable can be created for each module unit. This will allow tracking dependencies between the modules. To prevent non-modular content from satisfying dependencies in target repository, it seems exposing the @pool->considered@ bitmap from the @libsolv@ library to its Python binding will be required. This is how DNF deals with solving modular dependencies when installing and upgrading content. This effort is tracked in the sub-task #3741.

h2. References

* the base pulp_modularity support tracker; Issue #3206
* the "Modularity project docs page":
* the depsolving library investigation #3528 "POC":
* "libsolv":
* "modular errata":
* A cross-team, "modular-depsolving document":