Make blob upload errors more specific

This commit is contained in:
Joseph Schorr 2018-10-29 12:21:18 -04:00
parent d18a7935e1
commit 88f19ee0b9
2 changed files with 10 additions and 3 deletions

View file

@ -24,6 +24,9 @@ BLOB_CONTENT_TYPE = 'application/octet-stream'
class BlobUploadException(Exception): class BlobUploadException(Exception):
""" Base for all exceptions raised when uploading blobs. """ """ Base for all exceptions raised when uploading blobs. """
class BlobRangeMismatchException(BlobUploadException):
""" Exception raised if the range to be uploaded does not match. """
class BlobDigestMismatchException(BlobUploadException): class BlobDigestMismatchException(BlobUploadException):
""" Exception raised if the digest requested does not match that of the contents uploaded. """ """ Exception raised if the digest requested does not match that of the contents uploaded. """
@ -134,7 +137,7 @@ class _BlobUploadManager(object):
if start_offset > 0 and start_offset > self.blob_upload.byte_count: if start_offset > 0 and start_offset > self.blob_upload.byte_count:
logger.error('start_offset provided greater than blob_upload.byte_count') logger.error('start_offset provided greater than blob_upload.byte_count')
raise BlobUploadException() raise BlobRangeMismatchException()
# Ensure that we won't go over the allowed maximum size for blobs. # Ensure that we won't go over the allowed maximum size for blobs.
max_blob_size = bitmath.parse_string_unsafe(self.settings.maximum_blob_size) max_blob_size = bitmath.parse_string_unsafe(self.settings.maximum_blob_size)

View file

@ -10,7 +10,8 @@ from data import database
from data.registry_model import registry_model from data.registry_model import registry_model
from data.registry_model.blobuploader import (create_blob_upload, retrieve_blob_upload_manager, from data.registry_model.blobuploader import (create_blob_upload, retrieve_blob_upload_manager,
complete_when_uploaded, BlobUploadSettings, complete_when_uploaded, BlobUploadSettings,
BlobUploadException, BlobTooLargeException) BlobUploadException, BlobTooLargeException,
BlobRangeMismatchException)
from digest import digest_tools from digest import digest_tools
from endpoints.decorators import anon_protect, parse_repository_name from endpoints.decorators import anon_protect, parse_repository_name
from endpoints.v2 import v2_bp, require_repo_read, require_repo_write, get_input_stream from endpoints.v2 import v2_bp, require_repo_read, require_repo_write, get_input_stream
@ -428,7 +429,10 @@ def _upload_chunk(blob_uploader, commit_digest=None):
return blob_uploader.commit_to_blob(app.config, commit_digest) return blob_uploader.commit_to_blob(app.config, commit_digest)
except BlobTooLargeException as ble: except BlobTooLargeException as ble:
raise LayerTooLarge(uploaded=ble.uploaded, max_allowed=ble.max_allowed) raise LayerTooLarge(uploaded=ble.uploaded, max_allowed=ble.max_allowed)
except BlobUploadException: except BlobRangeMismatchException:
logger.exception('Exception when uploading blob to %s', blob_uploader.blob_upload_id) logger.exception('Exception when uploading blob to %s', blob_uploader.blob_upload_id)
_abort_range_not_satisfiable(blob_uploader.blob_upload.byte_count, _abort_range_not_satisfiable(blob_uploader.blob_upload.byte_count,
blob_uploader.blob_upload_id) blob_uploader.blob_upload_id)
except BlobUploadException:
logger.exception('Exception when uploading blob to %s', blob_uploader.blob_upload_id)
raise BlobUploadInvalid()