Add support for creating schema 2 manifests and manifest lists via the OCI model
This commit is contained in:
parent
e344d4a5cf
commit
30f072aeff
16 changed files with 398 additions and 110 deletions
|
@ -3,6 +3,7 @@
|
|||
from datetime import datetime
|
||||
from flask import request, abort
|
||||
|
||||
from app import storage
|
||||
from auth.auth_context import get_authenticated_user
|
||||
from data.registry_model import registry_model
|
||||
from endpoints.api import (resource, nickname, require_repo_read, require_repo_write,
|
||||
|
@ -154,7 +155,7 @@ class RepositoryTag(RepositoryParamResource):
|
|||
if image is None:
|
||||
raise NotFound()
|
||||
|
||||
if not registry_model.retarget_tag(repo_ref, tag, image):
|
||||
if not registry_model.retarget_tag(repo_ref, tag, image, storage):
|
||||
raise InvalidRequest('Could not move tag')
|
||||
|
||||
username = get_authenticated_user().username
|
||||
|
@ -287,7 +288,8 @@ class RestoreTag(RepositoryParamResource):
|
|||
if manifest_or_legacy_image is None:
|
||||
raise NotFound()
|
||||
|
||||
if not registry_model.retarget_tag(repo_ref, tag, manifest_or_legacy_image, is_reversion=True):
|
||||
if not registry_model.retarget_tag(repo_ref, tag, manifest_or_legacy_image, storage,
|
||||
is_reversion=True):
|
||||
raise InvalidRequest('Could not restore tag')
|
||||
|
||||
log_action('revert_tag', namespace, log_data, repo_name=repository)
|
||||
|
|
|
@ -6,7 +6,7 @@ from functools import wraps
|
|||
|
||||
from flask import request, make_response, jsonify, session
|
||||
|
||||
from app import userevents, metric_queue
|
||||
from app import userevents, metric_queue, storage
|
||||
from auth.auth_context import get_authenticated_context, get_authenticated_user
|
||||
from auth.credentials import validate_credentials, CredentialKind
|
||||
from auth.decorators import process_auth
|
||||
|
@ -217,7 +217,7 @@ def create_repository(namespace_name, repo_name):
|
|||
|
||||
# Start a new builder for the repository and save its ID in the session.
|
||||
assert repository_ref
|
||||
builder = create_manifest_builder(repository_ref)
|
||||
builder = create_manifest_builder(repository_ref, storage)
|
||||
logger.debug('Started repo push with manifest builder %s', builder)
|
||||
if builder is None:
|
||||
abort(404, message='Unknown repository', issue='unknown-repo')
|
||||
|
@ -243,7 +243,7 @@ def update_images(namespace_name, repo_name):
|
|||
# Make sure the repo actually exists.
|
||||
abort(404, message='Unknown repository', issue='unknown-repo')
|
||||
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'))
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'), storage)
|
||||
if builder is None:
|
||||
abort(400)
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@ def put_image_layer(namespace, repository, image_id):
|
|||
exact_abort(409, 'Image already exists')
|
||||
|
||||
logger.debug('Checking for image in manifest builder')
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'))
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'), store)
|
||||
if builder is None:
|
||||
abort(400)
|
||||
|
||||
|
@ -268,7 +268,7 @@ def put_image_checksum(namespace, repository, image_id):
|
|||
image_id=image_id)
|
||||
|
||||
logger.debug('Checking for image in manifest builder')
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'))
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'), store)
|
||||
if builder is None:
|
||||
abort(400)
|
||||
|
||||
|
@ -361,7 +361,7 @@ def put_image_json(namespace, repository, image_id):
|
|||
if repository_ref is None:
|
||||
abort(403)
|
||||
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'))
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'), store)
|
||||
if builder is None:
|
||||
abort(400)
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ import json
|
|||
|
||||
from flask import abort, request, jsonify, make_response, session
|
||||
|
||||
from app import storage
|
||||
from auth.decorators import process_auth
|
||||
from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission)
|
||||
from data.registry_model import registry_model
|
||||
|
@ -70,7 +71,7 @@ def put_tag(namespace_name, repo_name, tag):
|
|||
image_id = json.loads(request.data)
|
||||
|
||||
# Check for the image ID first in a builder (for an in-progress push).
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'))
|
||||
builder = lookup_manifest_builder(repository_ref, session.get('manifest_builder'), storage)
|
||||
if builder is not None:
|
||||
layer = builder.lookup_layer(image_id)
|
||||
if layer is not None:
|
||||
|
@ -86,7 +87,7 @@ def put_tag(namespace_name, repo_name, tag):
|
|||
if legacy_image is None:
|
||||
abort(400)
|
||||
|
||||
if registry_model.retarget_tag(repository_ref, tag, legacy_image) is None:
|
||||
if registry_model.retarget_tag(repository_ref, tag, legacy_image, storage) is None:
|
||||
abort(400)
|
||||
|
||||
return make_response('Created', 200)
|
||||
|
|
|
@ -6,7 +6,7 @@ from flask import request, url_for, Response
|
|||
|
||||
import features
|
||||
|
||||
from app import app, metric_queue
|
||||
from app import app, metric_queue, storage
|
||||
from auth.registry_jwt_auth import process_registry_jwt_auth
|
||||
from digest import digest_tools
|
||||
from data.registry_model import registry_model
|
||||
|
@ -227,7 +227,8 @@ def _write_manifest(namespace_name, repo_name, manifest_impl):
|
|||
raise NameUnknown()
|
||||
|
||||
manifest, tag = registry_model.create_manifest_and_retarget_tag(repository_ref, manifest_impl,
|
||||
manifest_impl.tag)
|
||||
manifest_impl.tag,
|
||||
storage)
|
||||
if manifest is None:
|
||||
raise ManifestInvalid()
|
||||
|
||||
|
|
Reference in a new issue