Issue #6018
closedStory #4762: [Epic] As a user, I can copy content
As a user, I have an API for copying content between repositories
Description
API Design¶
The problems created by multi-repo-copy and repository versions in particular necessitates an entirely JSON-blob-based copy configuration.
- We must support an arbitrary number of source and destination repositories (multi-repo-copy)
- We must be able to simultaneously filter and copy from all of the source repos (not just the "primary" one like in Pulp 2) for performance reasons
- We can't provide a global content list/criteria to search the source repos for for correctness reasons [0], each pair of source/destination must have its own content list/criteria to use
- We must support setting "base_version" on each of the created repository versions in the destination repositories
- Katello can't just use the latest versions, sometimes they have to pick different versions of the destination repositories to use as bases.
So for every pair of source and destination repos, of which there can be an artibtrary number, you also have to be able to (optionally) provide a list of content/criteria to use for the copy and (optionally) use a different "base_version". Trying to do all of those things at once with combinations of parameters would be not be a reasonable thing to do, but, it's not so difficult with JSON.
[0] If multiple repos contain the same content unit, Pulp can't decide which one to copy from. With multiple destination repositories, this is important because the source repository determines the destination repository
MVP Copy API Concept¶
POST /pulp/api/v3/rpm/copy/
config:=[
{"source_repo_version": "$SRC_REPO_VERS_HREF", "dest_repo": "$DEST_REPO_HREF", "content": [$HREF1, $HREF2]},
{"source_repo_version": "$SRC_REPO_VERS_HREF", "dest_repo": "$DEST_REPO_HREF", "dest_base_version": "$DEST_BASE_VERSION", "content": []},
]
dependency_solving=False
There are some obvious extensions that could be made for ergonomics and usability but they are not strictly necessary for the MVP, and they're pure extensions. Due to time constraints on integration, we should probably stick to the MVP and add the other niceties later.
Endpoint schema¶
"config" (required, list): Complex configuration object "dependency_solving" (optional, bool): Enable or disable dependency solving for the copy operation. Default TBD based on performance.
JSON config schema¶
The config is a list of dictionaries where the keys are roughly the parameters you would normally expect for a copy operation
"source_repo_version" (required, repository version href): If provided, uses this repository version as the source content set "dest_repo" (required, repository href): The repository to create a new version in (copy content into) "dest_base_version" (optional, int): The base version to use for the destination repository "content" (TBD, list): The list of content hrefs to be copied
Initial copy implementation
Criteria and depsolving are no-op -- copies everything
Also includes a basic smash test
re: #6018 https://pulp.plan.io/issues/6018