Story #4716
closedAs a user, I have simple content copy between repositories
100%
Description
Simple content copy means that content units can be copied from one repository into another repository without considering content-type-specific invariants, such as making sure dependencies are satisfied.
The most straightforwards current design is to model this after one-shot upload. A new URL endpoint will be defined at /api/v3/rpm/copy/. POSTing to that endpoint with valid parameters will yield an asynchronous task, which will result in a new repository version in the target repository.
The user workflow should look like this:
http --form POST http://localhost:24817/pulp/api/v3/rpm/copy/ source_repository=${S_REPO_HREF} destination_repository=${D_REPO_HREF}
Both the repository parameters are required. When called, all content will be copied.
The additions to Django boilerplate will look something like this (see also: copy.py for an example of the function that does the work, and OneShotUploadSerializer in serializers.py)
urls.py
urlpatterns = [
url(r'rpm/upload/$', OneShotUploadView.as_view()),
url(r'rpm/copy/$', CopyView.as_view())
]
viewsets.py
class CopyView(views.APIView):
def post(self, request):
serializer = CopySerializer(data=request.data, context={'request': request})
serializer.is_valid(raise_exception=True)
# .....
async_result = enqueue_with_reservation(
copy_content, [source_repo, dest_repo], # lock both repositories
args=[source_repo, dest_repo],
kwargs={}
)
return OperationPostponedResponse(async_result, request)
Related issues
Add content copy feature
Also moved upload under app/tasks, because it's a task
closes #4716 https://pulp.plan.io/issues/4716