64 lines
2 KiB
Python
64 lines
2 KiB
Python
|
import logging
|
||
|
import re
|
||
|
import hashlib
|
||
|
|
||
|
from flask import make_response, request
|
||
|
|
||
|
from app import storage
|
||
|
from auth.jwt_auth import process_jwt_auth
|
||
|
from auth.permissions import ReadRepositoryPermission
|
||
|
from endpoints.decorators import anon_protect
|
||
|
from endpoints.v2 import (v2_bp, require_repo_read, require_repo_write, require_repo_admin,
|
||
|
get_input_stream)
|
||
|
from endpoints.v2 import digest_tools
|
||
|
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
VALID_TAG_PATTERN = r'[\w][\w.-]{0,127}'
|
||
|
VALID_TAG_REGEX = re.compile(VALID_TAG_PATTERN)
|
||
|
|
||
|
|
||
|
def is_tag_name(reference):
|
||
|
match = VALID_TAG_REGEX.match(reference)
|
||
|
return match is not None and match.end() == len(reference)
|
||
|
|
||
|
|
||
|
@v2_bp.route('/<namespace>/<repo_name>/manifests/<regex("' + VALID_TAG_PATTERN + '"):tag_name>',
|
||
|
methods=['GET'])
|
||
|
@process_jwt_auth
|
||
|
@require_repo_read
|
||
|
@anon_protect
|
||
|
def fetch_manifest_by_tagname(namespace, repo_name, tag_name):
|
||
|
logger.debug('Fetching tag manifest with name: %s', tag_name)
|
||
|
return make_response('Manifest {0}'.format(tag_name))
|
||
|
|
||
|
|
||
|
@v2_bp.route('/<namespace>/<repo_name>/manifests/<regex("' + VALID_TAG_PATTERN + '"):tag_name>',
|
||
|
methods=['PUT'])
|
||
|
@process_jwt_auth
|
||
|
@require_repo_write
|
||
|
@anon_protect
|
||
|
def write_manifest_by_tagname(namespace, repo_name, tag_name):
|
||
|
manifest_data = request.data
|
||
|
logger.debug('Manifest data: %s', manifest_data)
|
||
|
response = make_response('OK', 202)
|
||
|
response.headers['Docker-Content-Digest'] = digest_tools.sha256_digest(manifest_data)
|
||
|
response.headers['Location'] = 'https://fun.com'
|
||
|
return response
|
||
|
|
||
|
|
||
|
@v2_bp.route('/<namespace>/<repo_name>/manifests/<regex("' + digest_tools.DIGEST_PATTERN + '"):tag_digest>',
|
||
|
methods=['PUT'])
|
||
|
@process_jwt_auth
|
||
|
@require_repo_write
|
||
|
@anon_protect
|
||
|
def write_manifest(namespace, repo_name, tag_digest):
|
||
|
logger.debug('Writing tag manifest with name: %s', tag_digest)
|
||
|
|
||
|
manifest_path = digest_tools.content_path(tag_digest)
|
||
|
storage.stream_write('local_us', manifest_path, get_input_stream(request))
|
||
|
|
||
|
return make_response('Manifest {0}'.format(tag_digest))
|