Raise a 409 if we try to insert a tag twice at the same time
Also fixes handling of labels for existing manifests Fixes #1775
This commit is contained in:
parent
3f459523c4
commit
357005e33f
5 changed files with 36 additions and 12 deletions
|
@ -20,13 +20,14 @@ from endpoints.common import parse_repository_name
|
|||
from endpoints.decorators import anon_protect
|
||||
from endpoints.v2 import v2_bp, require_repo_read, require_repo_write
|
||||
from endpoints.v2.errors import (BlobUnknown, ManifestInvalid, ManifestUnknown, TagInvalid,
|
||||
NameInvalid)
|
||||
NameInvalid, TagAlreadyExists)
|
||||
from endpoints.trackhelper import track_and_log
|
||||
from endpoints.notificationhelper import spawn_notification
|
||||
from util.registry.replication import queue_storage_replication
|
||||
from util.names import VALID_TAG_PATTERN
|
||||
from digest import digest_tools
|
||||
from data import model
|
||||
from data.model import TagAlreadyCreatedException
|
||||
from data.database import RepositoryTag
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -451,9 +452,16 @@ def _write_manifest_itself(namespace_name, repo_name, manifest):
|
|||
# Store the manifest pointing to the tag.
|
||||
manifest_digest = manifest.digest
|
||||
leaf_layer_id = images_map[layers[-1].v1_metadata.docker_id].docker_image_id
|
||||
tag_manifest, manifest_created = model.tag.store_tag_manifest(namespace_name, repo_name, tag_name,
|
||||
leaf_layer_id, manifest_digest,
|
||||
manifest.bytes)
|
||||
|
||||
try:
|
||||
tag_manifest, manifest_created = model.tag.store_tag_manifest(namespace_name, repo_name,
|
||||
tag_name, leaf_layer_id,
|
||||
manifest_digest, manifest.bytes)
|
||||
except TagAlreadyCreatedException:
|
||||
logger.warning('Tag %s was already created under repository %s/%s pointing to image %s',
|
||||
tag_name, namespace_name, repo_name, leaf_layer_id)
|
||||
raise TagAlreadyExists()
|
||||
|
||||
if manifest_created:
|
||||
for key, value in layers[-1].v1_metadata.labels.iteritems():
|
||||
model.label.create_manifest_label(tag_manifest, key, value, 'manifest')
|
||||
|
|
Reference in a new issue