Project

Profile

Help

Issue #6018

Updated by dalley about 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

Back