Change revert tag into restore tag and add manifest support
This commit is contained in:
parent
35752176b5
commit
e90cab4d77
4 changed files with 137 additions and 56 deletions
|
@ -180,15 +180,15 @@ class RepositoryTagImages(RepositoryParamResource):
|
|||
|
||||
|
||||
|
||||
@resource('/v1/repository/<apirepopath:repository>/tag/<tag>/revert')
|
||||
@resource('/v1/repository/<apirepopath:repository>/tag/<tag>/restore')
|
||||
@path_param('repository', 'The full path of the repository. e.g. namespace/name')
|
||||
@path_param('tag', 'The name of the tag')
|
||||
class RevertTag(RepositoryParamResource):
|
||||
""" Resource for reverting a repository tag back to a previous image. """
|
||||
class RestoreTag(RepositoryParamResource):
|
||||
""" Resource for restoring a repository tag back to a previous image. """
|
||||
schemas = {
|
||||
'RevertTag': {
|
||||
'RestoreTag': {
|
||||
'type': 'object',
|
||||
'description': 'Reverts a tag to a specific image',
|
||||
'description': 'Restores a tag to a specific image',
|
||||
'required': [
|
||||
'image',
|
||||
],
|
||||
|
@ -197,32 +197,45 @@ class RevertTag(RepositoryParamResource):
|
|||
'type': 'string',
|
||||
'description': 'Image identifier to which the tag should point',
|
||||
},
|
||||
'manifest_digest': {
|
||||
'type': 'string',
|
||||
'description': 'If specified, the manifest digest that should be used',
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@require_repo_write
|
||||
@nickname('revertTag')
|
||||
@validate_json_request('RevertTag')
|
||||
@nickname('restoreTag')
|
||||
@validate_json_request('RestoreTag')
|
||||
def post(self, namespace, repository, tag):
|
||||
""" Reverts a repository tag back to a previous image in the repository. """
|
||||
try:
|
||||
tag_image = model.tag.get_tag_image(namespace, repository, tag)
|
||||
except model.DataModelException:
|
||||
raise NotFound()
|
||||
""" Restores a repository tag back to a previous image in the repository. """
|
||||
repo = model.repository.get_repository(namespace, repository)
|
||||
|
||||
# Revert the tag back to the previous image.
|
||||
# Restore the tag back to the previous image.
|
||||
image_id = request.get_json()['image']
|
||||
model.tag.revert_tag(tag_image.repository, tag, image_id)
|
||||
manifest_digest = request.get_json().get('manifest_digest', None)
|
||||
if manifest_digest is not None:
|
||||
existing_image = model.tag.restore_tag_to_manifest(repo, tag, manifest_digest)
|
||||
else:
|
||||
existing_image = model.tag.restore_tag_to_image(repo, tag, image_id)
|
||||
|
||||
# Log the reversion.
|
||||
# Log the reversion/restoration.
|
||||
username = get_authenticated_user().username
|
||||
log_data = {
|
||||
'username': username,
|
||||
'repo': repository,
|
||||
'tag': tag,
|
||||
'image': image_id,
|
||||
}
|
||||
|
||||
if existing_image is not None:
|
||||
log_data['original_image'] = existing_image.docker_image_id
|
||||
|
||||
log_action('revert_tag', namespace,
|
||||
{'username': username, 'repo': repository, 'tag': tag,
|
||||
'image': image_id, 'original_image': tag_image.docker_image_id},
|
||||
repo=model.repository.get_repository(namespace, repository))
|
||||
log_data, repo=model.repository.get_repository(namespace, repository))
|
||||
|
||||
return {
|
||||
'image_id': image_id,
|
||||
'original_image_id': tag_image.docker_image_id
|
||||
'original_image_id': existing_image.docker_image_id if existing_image else None,
|
||||
}
|
||||
|
|
Reference in a new issue