Skip to content

Commit

Permalink
display chunks on upload payload
Browse files Browse the repository at this point in the history
closes #5150
  • Loading branch information
fao89 authored and daviddavis committed Jul 19, 2019
1 parent 6865f68 commit 61c3fcd
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 11 deletions.
7 changes: 6 additions & 1 deletion pulpcore/app/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,9 @@
TaskSerializer,
WorkerSerializer,
)
from .upload import UploadChunkSerializer, UploadCommitSerializer, UploadSerializer # noqa
from .upload import ( # noqa
UploadChunkSerializer,
UploadCommitSerializer,
UploadSerializer,
UploadDetailSerializer
)
33 changes: 25 additions & 8 deletions pulpcore/app/serializers/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,24 @@
from pulpcore.app.serializers import base


class UploadChunkSerializer(serializers.Serializer):
file = serializers.FileField(
help_text=_("A chunk of the uploaded file."),
)

sha256 = serializers.CharField(
help_text=_("The SHA-256 checksum of the chunk if available."),
required=False,
allow_null=True,
)


class UploadChunkDetailSerializer(base.ModelSerializer):
class Meta:
model = models.UploadChunk
fields = ('offset', 'size')


class UploadSerializer(base.ModelSerializer):
"""Serializer for chunked uploads."""
_href = base.IdentityField(
Expand All @@ -25,16 +43,15 @@ class Meta:
fields = base.ModelSerializer.Meta.fields + ('size', 'completed')


class UploadChunkSerializer(serializers.Serializer):
file = serializers.FileField(
help_text=_("A chunk of the uploaded file."),
class UploadDetailSerializer(UploadSerializer):
chunks = UploadChunkDetailSerializer(
many=True,
read_only=True,
)

sha256 = serializers.CharField(
help_text=_("The SHA-256 checksum of the chunk if available."),
required=False,
allow_null=True,
)
class Meta:
model = models.Upload
fields = base.ModelSerializer.Meta.fields + ('size', 'completed', 'chunks')


class UploadCommitSerializer(serializers.Serializer):
Expand Down
13 changes: 11 additions & 2 deletions pulpcore/app/viewsets/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@
from rest_framework.response import Response

from pulpcore.app.models import Upload
from pulpcore.app.serializers import UploadChunkSerializer, UploadCommitSerializer, UploadSerializer
from pulpcore.app.serializers import (
UploadChunkSerializer,
UploadCommitSerializer,
UploadSerializer,
UploadDetailSerializer
)
from pulpcore.app.viewsets import BaseFilterSet
from pulpcore.app.viewsets.base import DATETIME_FILTER_OPTIONS, NamedModelViewSet
from pulpcore.app.viewsets.custom_filters import IsoDateTimeFilter
Expand All @@ -34,7 +39,6 @@ class UploadViewSet(NamedModelViewSet,
"""View for chunked uploads."""
endpoint_name = 'uploads'
queryset = Upload.objects.all()
serializer_class = UploadSerializer
filterset_class = UploadFilter
http_method_names = ['get', 'post', 'head', 'put', 'delete'] # remove PATCH

Expand All @@ -45,6 +49,11 @@ class UploadViewSet(NamedModelViewSet,
description='The Content-Range header specifies the location of the file chunk '
'within the file.')

def get_serializer_class(self):
if self.action == 'retrieve':
return UploadDetailSerializer
return UploadSerializer

@swagger_auto_schema(operation_summary="Upload a file chunk",
request_body=UploadChunkSerializer,
manual_parameters=[content_range_parameter],
Expand Down
36 changes: 36 additions & 0 deletions pulpcore/tests/functional/api/test_upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class ChunkedUploadTestCase(unittest.TestCase):
* `Pulp #4197 <https://pulp.plan.io/issues/4197>`_
* `Pulp #5092 <https://pulp.plan.io/issues/5092>`_
* `Pulp #4982 <https://pulp.plan.io/issues/4982>`_
* `Pulp #5150 <https://pulp.plan.io/issues/5150>`_
"""

@classmethod
Expand Down Expand Up @@ -123,6 +124,41 @@ def test_upload_chunk_wrong_checksum(self):

assert response.status_code == 400

def test_upload_response(self):
"""Test upload responses when creating an upload and uploading chunks."""
self.client.response_handler = api.echo_handler

upload_request = self.client.post(
UPLOAD_PATH, {'size': self.size_file}
)

expected_keys = ['_href', '_created', 'size', 'completed']

self.assertEquals([*upload_request.json()], expected_keys)

for data in self.chunked_data:
response = self.client.put(
upload_request.json()['_href'],
files={'file': data[0]},
headers=data[1],
)

self.assertEquals([*response.json()], expected_keys)

response = self.client.get(upload_request.json()['_href'])

expected_keys = ['_href', '_created', 'size', 'completed', 'chunks']

self.assertEquals([*response.json()], expected_keys)

This comment has been minimized.

Copy link
@nixocio

expected_chunks = [
{'offset': 0, 'size': 6291456},
{'offset': 6291456, 'size': 4194304}
]

sorted_chunks_response = sorted(response.json()['chunks'], key=lambda i: i['offset'])
self.assertEquals(sorted_chunks_response, expected_chunks)

def test_delete_upload(self):
"""Test a deletion of an upload using upload of files in chunks."""

Expand Down

0 comments on commit 61c3fcd

Please sign in to comment.