diff --git a/CHANGES/483.feature b/CHANGES/483.feature new file mode 100644 index 000000000..d751ba52a --- /dev/null +++ b/CHANGES/483.feature @@ -0,0 +1 @@ +Added support for retrieving blob upload status via `GET /v2//blobs/uploads/`. diff --git a/pulp_container/app/registry_api.py b/pulp_container/app/registry_api.py index 92adfcbc9..78ae07437 100644 --- a/pulp_container/app/registry_api.py +++ b/pulp_container/app/registry_api.py @@ -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. diff --git a/pulp_container/tests/functional/api/test_push_content.py b/pulp_container/tests/functional/api/test_push_content.py index 3c1ce607f..74804ce4f 100644 --- a/pulp_container/tests/functional/api/test_push_content.py +++ b/pulp_container/tests/functional/api/test_push_content.py @@ -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)