Project

Profile

Help

Story #2843

closed

As an authenticated user, I can create an Artifact by uploading a file

Added by dkliban@redhat.com almost 7 years ago. Updated over 4 years ago.

Status:
CLOSED - CURRENTRELEASE
Priority:
High
Category:
-
Sprint/Milestone:
Start date:
Due date:
% Done:

100%

Estimated time:
Platform Release:
Groomed:
Yes
Sprint Candidate:
Yes
Tags:
Sprint:
Sprint 23
Quarter:

Description

For an API user to create an Artifact, Pulp 3 needs to have the following:

- updated Artifact[0] model without a 'content' foreign key nor the 'relative_path' field. A uniqueness constraint should be added on the sha256 field.
- viewset that can handle CRD operations for Artifacts. It most likely needs to use the FileUploadParser[1] and a custom Django Upload Handler[2].
- serializer for the viewset which will return all serialized fields of the Artifact model. The file field should be it's full path on disk.
- API endpoint at /api/v3/content/artifacts
- POST request to the /api/v3/content/artifacts/ endpoint creates an Artifact. The body of the request contains multipart form data with the following:

file - The file being uploaded
size - The size of the file in bytes.
md5 - The MD5 checksum of the file.
sha1 - The SHA-1 checksum of the file.
sha224 - The SHA-224 checksum of the file.
sha256 - The SHA-256 checksum of the file.
sha384 - The SHA-384 checksum of the file.
sha512 - The SHA-512 checksum of the file.

Before the model is saved, a SHA-256 checksum (digest) of the uploaded file is generated.
If a sha256 was specified in POST parameters, the generated hash is validated against the value specified as the POST parameter. If the values don't match a validation exception is raised.
If an Artifact with the same sha256 checksum already exists, a 400 response is returned to the user.
When the model is saved, the file is written to MEDIA_ROOT/content/units/digest[0:2]/digest[2:]
After a successful save, a serialized version of the Artifact is returned.

- GET request to the /api/v3/content/artifacts/<artifact id> returns serialized Artifact

- DELETE request to the /api/v3/content/artifacts/<artifact id>/ raises an exception if the Artifact is still associated with any ContentUnit. The exception should provide a list of content units still associated with the Artifact. If an exception is not raised, Artifact is removed from the database and the file is removed from disk.

[0] https://github.com/pulp/pulp/blob/3.0-dev/platform/pulpcore/app/models/content.py#L72
[1] http://www.django-rest-framework.org/api-guide/parsers/#fileuploadparser
[2] https://docs.djangoproject.com/en/1.11/topics/http/file-uploads/#upload-handlers

Also available in: Atom PDF