Skip to content

Commit

Permalink
Have appr blob redirect to storage when possible (#466)
Browse files Browse the repository at this point in the history
  • Loading branch information
josephschorr committed Jul 1, 2020
1 parent a4adce1 commit 75276fd
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
13 changes: 13 additions & 0 deletions endpoints/appr/cnr_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

from flask import request
from app import storage
from digest.digest_tools import Digest, InvalidDigestException
from endpoints.appr.models_cnr import model
from util.request import get_request_ip

Expand Down Expand Up @@ -119,6 +120,12 @@ def __init__(self, package_name, blob, b64_encoded=True):

@classmethod
def upload_url(cls, digest):
# Ensure we have a valid digest.
try:
Digest.parse_digest("sha256:%s" % digest)
except InvalidDigestException:
return None

return "cnr/blobs/sha256/%s/%s" % (digest[0:2], digest)

def save(self, content_media_type):
Expand All @@ -131,6 +138,9 @@ def delete(cls, package_name, digest):
@classmethod
def _fetch_b64blob(cls, package_name, digest):
blobpath = cls.upload_url(digest)
if blobpath is None:
raise_package_not_found(package_name, digest)

locations = model.get_blob_locations(digest)
if not locations:
raise_package_not_found(package_name, digest)
Expand All @@ -139,6 +149,9 @@ def _fetch_b64blob(cls, package_name, digest):
@classmethod
def download_url(cls, package_name, digest):
blobpath = cls.upload_url(digest)
if blobpath is None:
raise_package_not_found(package_name, digest)

locations = model.get_blob_locations(digest)
if not locations:
raise_package_not_found(package_name, digest)
Expand Down
8 changes: 6 additions & 2 deletions endpoints/appr/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
UnauthorizedAccess,
Unsupported,
)
from flask import jsonify, request
from flask import jsonify, request, redirect

from app import app, model_cache
from auth.auth_context import get_authenticated_user
Expand Down Expand Up @@ -78,7 +78,6 @@ def login():
return jsonify({"token": "basic " + auth.decode("ascii")})


# @TODO: Redirect to S3 url
@appr_bp.route(
"/api/v1/packages/<string:namespace>/<string:package_name>/blobs/sha256/<string:digest>",
methods=["GET"],
Expand All @@ -92,6 +91,11 @@ def blobs(namespace, package_name, digest):
reponame = repo_name(namespace, package_name)
data = cnr_registry.pull_blob(reponame, digest, blob_class=Blob)
json_format = request.args.get("format", None) == "json"
if not json_format:
download_url = Blob.download_url(reponame, digest)
if download_url:
return redirect(download_url)

return _pull(data, json_format=json_format)


Expand Down

0 comments on commit 75276fd

Please sign in to comment.