Issue #6018
Updated by dalley over 4 years ago
## 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 version**s**, sometimes they have to pick different version**s** of the destination repositor**ies** 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