Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES/483.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Added support for retrieving blob upload status via `GET /v2/<name>/blobs/uploads/<uuid>`.
12 changes: 12 additions & 0 deletions pulp_container/app/registry_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1014,6 +1014,18 @@ def partial_update(self, request, path, pk=None):

return UploadResponse(upload=upload, path=path, request=request)

def get(self, request, path, pk=None):
"""
Retrieve the status of an upload.
"""
_, repository = self.get_dr_push(request, path)
upload = get_object_or_404(models.Upload, repository=repository, pk=pk)
return UploadResponse(upload=upload, path=path, request=request, status=204)

def head(self, request, path, pk=None):
"""Respond to HEAD requests about blob uploads."""
return self.get(request, path, pk=pk)

def put(self, request, path, pk=None):
"""
Create a blob from uploaded chunks.
Expand Down
28 changes: 28 additions & 0 deletions pulp_container/tests/functional/api/test_push_content.py
Original file line number Diff line number Diff line change
Expand Up @@ -605,3 +605,31 @@ def test_push_empty_manifest_list(
assert manifest_list.media_type == MEDIA_TYPE.MANIFEST_LIST
assert manifest_list.schema_version == 2
assert manifest_list.listed_manifests == []


def test_blob_upload_status(local_registry, container_bindings, full_path, add_to_cleanup):
"""Test GET blob upload status returns current upload progress."""
repo_name = "test/upload_status"
upload_path = f"/v2/{full_path(repo_name)}/blobs/uploads/"

response, auth = local_registry.get_response("POST", upload_path)
response.raise_for_status()
assert response.status_code == 202
upload_uuid = response.headers["Docker-Upload-UUID"]
location = response.headers["Location"]

status_url = urljoin(container_bindings.client.configuration.host, location)
response = requests.get(status_url, auth=auth)
response.raise_for_status()
assert response.status_code == 204
assert response.headers["Docker-Upload-UUID"] == upload_uuid
assert response.headers["Range"] == "0-0"
assert response.headers["Content-Length"] == "0"

response = requests.head(status_url, auth=auth)
response.raise_for_status()
assert response.status_code == 204
assert response.headers["Docker-Upload-UUID"] == upload_uuid

namespace = container_bindings.PulpContainerNamespacesApi.list(name="test").results[0]
add_to_cleanup(container_bindings.PulpContainerNamespacesApi, namespace.pulp_href)
Loading