Story #4072
closedAs a plugin writer I can have digest and size information validated and populated easily via a staticmethod
100%
Description
Problem¶
While making an upload API for pulp_ansible, I receive only a sha256 from the user to validate the uploaded data. To save an Artifact I need the other digests and the size. This causes me to manually compute all the digest info and perform any validation.
This is going to be a common problem for plugin writers receiving Artifact data and not using the downloaders, e.g. upload.
Solution¶
Add a static method to Artifact named create_and_validate
that can create an in-memory Artifact from an on-disk asset with the following signature:
def create_and_validate(file, expected_digests=None, expected_size=None):
These params are the same type/names as the ones used by BaseDownloader here
Usage¶
For example I can call it with:
my_artifact = Artifact.create_and_validate('/path/to/file', expected_digests={'sha256': 'long_digest_value_goes_here'})
Exception Raising¶
If the sha256 doesn't match, I expect it to raise a DigestValidationError or a SizeValidationError, just like the downloaders. See this docstring:
:class:`~pulpcore.plugin.download.DigestValidationError`: When any of the
``expected_digest`` values don't match the digest of the data passed to
:meth:`~pulpcore.plugin.download.BaseDownloader.handle_data`.
:class:`~pulpcore.plugin.download.SizeValidationError`: When the
``expected_size`` value doesn't match the size of the data passed to
:meth:`~pulpcore.plugin.download.BaseDownloader.handle_data`.
^ is from here
Make an Artifact from a PulpTemporaryUploadedFile
Adds the Artifact.create_and_validate staticmethod that creates an in-memory, unsaved Artifact from a PulpTemporaryUploadedFile. Uploaded files to Pulp show up with that type so that is convenient for plugin writers. Also as the file is received by Django it auto-computes all of the digest types.
This PR also moves SizeValidationError and DigestValidation error to pulpcore.exceptions instead of living in pulpcore.plugin.downloads.
The ArtifactSerializer is also exposed via the plugin API with this change also.
https://pulp.plan.io/issues/4072 closes #4072