Add support for creating schema 2 manifests and manifest lists via the OCI model

This commit is contained in:
Joseph Schorr 2018-11-12 23:27:49 +02:00
parent e344d4a5cf
commit 30f072aeff
16 changed files with 398 additions and 110 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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()